- Gelesene/zu schreibende Plattenblöcke (Inodes, Inhalt, …) im Kernadressraum „zwischenpuffern“
Buffer-Cache
-
Pufferung während Ein-/Ausgabe
⇒ vom Prozessadressraum entkoppelt -
Cache-Funktionalität
⇒ Cache-Funktionalität ⇒ Mehrfachzugriff möglich ohne weitere Plattenzugriffe -
Kerninterne Realisierung von read()/write(): Zugriff über Schnittstelle zu Buffer- Cache:

Zugriffsoperationen auf Buffer-Cache
Puffer-Belegung
Link to original
- bread (dev, blkno) Block lesen ⇒ bei read(), z.T. write()
- getblk (dev, blkno) Puffer reservieren (später unter (dev,blkno) ablegen) ⇒ bei write()
⇒ liefert Buffer Pointer (bp)
Puffer-Freigabe
brelse (bp) Puffer freigeben ⇒ bei read()
Link to original
bwrite (bp) Block schreiben ⇒ sofort auf Platte retten, bei write()
bdwrite (bp) Block schreiben ⇒ erst bei neuer Belegung auf Platte retten (ggf. vorher durch sync())
Für alle Plattenblöcke des Dateisystems genutzt:
- Datenblöcke (bei read(), write(),…)
- Inodeblöcke (bei open(), close(),…)
- Indirektblöcke (ggf. bei read(), write(), um Nummer des Datenblocks zu ermitteln)
Realisierung read()/write()
- Belegung der erforderlichen Puffer für Schreib-/Lesebereich
- Umkopieren: User-Adressraum ⟷Buffer-Cache
- Freigabe der Puffer

Weitere Schreib-/Leseoperationen auf diesem Bereich?

Neu-Belegung von Puffern (klassische Form)
-
Verdrängungsalgorithmus
⇒ z.B. FIFO / Least-Recently-Used (LRU)
(heute eher über normales Paging realisiert)
Virtueller Adressraum vs. Dateien


Alternativ: Dateien in virtuellen Adressraum des Prozesses einblenden:
mmap (addr, len, prot, flags, fd, off)

-
len Bytes ab Position off (Pagegrenze!) von Datei fd ab Adresse addr (Pagegrenze!) in Prozessadressraum einblenden
-
prot ⇒ erlaubte Operationen: lesen/schreiben/…
-
flags ⇒ Kopie/Original
⇒ „Direkter“ Zugriff über Paging (evtl. Plattenzugriff erforderlich) -
Gibt auch read()-Varianten mit automatischem „mmap“
-
Heute z.T. blockweises Lesen über Bibliothek