• 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

  • 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)
Link to original

Puffer-Freigabe

brelse (bp) Puffer freigeben ⇒ bei read()
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())

Link to original

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