\section{Puffer} Frame = Im HS vorgesehener Platz zur Aufnahme eines Blocks $\rightarrow$ normalerweise so groß wie Block Bei Zugriff auf Blöcke im HS müssen diese ggf eingelagert werden. \subsection{Ersetzungsstrategie} \begin{itemize} \item wählt den zu verdrängenden Block aus \item Ziel: Minimierung von physischen Zugriffen \end{itemize} \subsubsection{FIFO} Block der am längsten im Puffer ist wird ersetzt.\\ $\rightarrow$ ungünstig da häufig benutzte Blöcke gerade im Puffer bleiben sollen \subsubsection{LFU (least frequently used)} Block auf den am seltensten zugegriffen wird ersetzt. \begin{itemize} \item $-$ für sequentielles Lesen nicht brauchbar \item $-$ hat ein Block einmal wieder zugegriffen bleibt der lange erhalten \end{itemize} \subsubsection{LRU (least recently used)} \begin{itemize} \item bewertetes Alter seit dem letzten Zugriff \item quasi verkettete Liste aller Blöcke im Puffer, wo bei Verdrängung letzter Block der Kette ersetzt wird \end{itemize} \begin{figure}[H] \begin{center} \includegraphics[scale=0.7]{pics/lru.png} \caption{LRU} \end{center} \end{figure} \subsubsection{Clock} LRU Verhalten mit einfacher Implementierung. \textbf{Prinzip}: \begin{itemize} \item Benutzt(Dirty)-Bit eines Blocks im Puffer wird bei Zugriff auf 1 gesetzt \item bei Verdrängung zyklischer Suche mit dem Auswahlzeiger: \begin{itemize} \item Falls Benutzt Bit = 1, wird es auf 0 gesetzt $\rightarrow$ Zeiger wandert zum nächsten Block \item Falls Benutzt Bit = 0, Block wird ersetzt \end{itemize} \end{itemize} \subsection{Dienste einer Pufferverwaltung} Einkapselung der Pufferverwaltung: \begin{lstlisting}[language=C] char * Buffer::fix (BlockFile File, int BlockNo, char Mode); \end{lstlisting} \begin{itemize} \item Block ist vor Verdrängung geschützt \item \textbf{Mode} gibt an welcher Block nur gelesen oder auch geändert werden soll \end{itemize} \begin{lstlisting} void Buffer::unix (char * BufferAddresse) \end{lstlisting} \begin{itemize} \item gibt Block im Puffer zur Ersetzung frei \end{itemize}