bs-6.31 6.3 implementierung der dateiverwaltung für hohe effizienz: caching – vielfach werden...
TRANSCRIPT
bs-6.3 1
6.3 Implementierung der Dateiverwaltung
Für hohe Effizienz: Caching –
vielfach werden Kopien von Plattendaten für längere Zeit im Arbeitsspeicher gehalten:
Dateitabelle (Unix: i-node table)enthält aktive Deskriptoren, d.h. vonDateien, die gerade in Benutzung sind( Dateitabelle auf dem Datenträger!)
Blockpuffer (Unix: buffer cache)enthält Kopien von Datenblöcken,
Deskriptorblöcken,Superblöcken
bs-6.3 2
Temporäre Verwaltungsdaten, die kein Äquivalent auf dem Datenträger haben:
Kanaltabelle enthält die Iteratoren für „offene“ sequentielle Dateien(6.1.2)
Mount-Tabelle enthält Einträge für die in denDateibaum eingehängten Dateisysteme
bs-6.3 3
Temporäre Verwaltungsdaten, die kein Äquivalent auf dem Datenträger haben:
Kanaltabelle enthält die Iteratoren für „offene“ sequentielle Dateien(6.1.2)
Mount-Tabelle enthält Einträge für die in denDateibaum eingehängten Dateisysteme
Verweisstruktur:
Kanal-tabelle
Mount-Tabelle
Blockpuffer
Datei-tabelle
bs-6.3 4
öffentlich
6.3.1 Blockpuffer
devno blkno owner block dirty
Operationen geeignet synchronisiert !weil Prozesse nebenläufig auf denPuffer und seine Einträge zugreifen
B
012...
(Alles folgende für Beispiel Unix)
bs-6.3 5
bufno = reqBlock(devno,blkno)stellt sicher, dass der gewünschte Block sich im Puffer bufno befindet, und sperrt ihn; abstrahiert dabei vonPufferverwaltung, Ein/Ausgabe, Synchronisation
Vor. (mit Warten!) Bdevno,blkno.owner == null,falls Eintrag vorhanden; sonst: es existiert Eintrag mit owner == null
Eff.: falls Bdevno,blkno vorhanden,B[bufno] == Bdevno,blkno &&B[bufno].owner == current; sonstB[bufno] == (devno,blkno,current,
DISK[devno,blkno],false)
bs-6.3 6
Implementierung:
benutzt Hilfsroutine getBlock(devno,blkno), die für Eintrag (devno,blkno,current,_,_) sorgt.
bufno = req2Blocks(devno1,blkno1,devno2,blkno2)Vor./Eff. wie bufno = reqBlock(devno,blkno)- und evtl. Einlagerung gestartet für 2. Block
bs-6.3 7
saveBlock(bufno,sync)
erzwingt sofortige Auslagerung von B[bufno].block
Vor.: B[bufno].owner == current
Eff.: wenn nicht sync : Auslagerung ist gestartet; sonst mit d == B[bufno].devno
b == B[bufno].blkno : DISK[d,b] == B[bufno].block &&
B[bufno].owner==null && !B[bufno].dirty
bs-6.3 8
relBlock(bufno)
gibt Position bufno im Blockpuffer frei (Entsperren)
Vor.: B[bufno].owner == current
Eff.: B[bufno].owner == null &&
Wenn Gerätetreiber mitteilt, dass Auslagerung des Blocksin Position bufno abgeschlossen ist:
B[bufno].dirty löschenB[bufno].owner löschen
Höhere Schichten modifizieren gepufferte Blöcke und dirty
bs-6.3 9
6.3.2 Dateitabelle
(interne Dateitabelleexterne Dateitabelle auf Datenträger!)
dient zur Aufnahme der aktiven Dateideskriptoren,d.h. für diejenigen Dateien, auf die sich ein Kanalbezieht („offene“ Dateien).
Aktiver Deskriptor = Deskriptor +Gerätenummer,Dateinummer,Verweiszähler *(Verweise aus Kanaltabelle),Status: file modified, descriptor modified,
is mount point, owner, .....
bs-6.3 10
Verwaltung ähnlich wie beim Blockpuffer,allerdings ohne Verdrängung
devno filno refcnt status type . . . . . . . . . . . . . . . . . file map
öffentlich
D
012...
bs-6.3 11
dno = reqDesc(devno,filno)
stellt sicher, dass der gewünschte Deskriptorsich in der Tabelle befindet, und sperrt ihn; abstrahiert dabei von Tabellenverwaltung, Ein/Ausgabe von Deskriptoren, Synchronisation;liefert die Position des Deskriptors in der Tabelle.
Vor.: Ddevno,filno.owner == null,falls Eintrag vorhanden (mit Warten!) ; sonst: es existieren freie Positionen (refcnt==0)
Eff.:
bs-6.3 12
Eff.: falls Ddevno,filno vorhanden:D[dno] == Ddevno,filno &&D[dno].owner == current &&D[dno].refcnt == 'D[dno].refcnt+1
sonst* 'D[dno].refcnt == 0 &&D[dno] == (devno,filno,1,current,...,DISK[devno,S+filno/N][filno%N])
mit S = Nummer des ersten Blocks der Dateitabelle auf dem Datenträger,
N = Anzahl der Deskriptoren je Block
Implementierung: Falls Eintrag nicht vorhanden,reqBlock(devno,S+filno/N) usw.
bs-6.3 13
relDesc(dno)
gibt Deskriptor frei, ggfls. – wenn nicht mehr aktiv – mit Zurückschreiben auf den Datenträgerund ggfls. – wenn Verweiszähler für Datei gleich 0 –mit Löschen von Deskriptor und Datei auf Datenträger
Vor.: D[dno].owner == current ||D[dno].owner == null
Eff.: D[dno].owner == null &&D[dno].refcnt == 'D[dno].refcnt-1und wenn D[dno].refcnt == 0, dann
wenn link count = 0,Löschen von .devno,.filno undLöschen auf Datenträger,
sonst Deskriptor auf Datenträger ändern(Deskriptor bleibt zunächst in Tabelle!)
bs-6.3 14
Implementierung:
evtl. reqBlock, saveBlock für den Block,der den Deskriptor enthält,
evtl. Platzfreigabe auf Datenträger mitdeallocateBlock(devno,blkno)deallocateDesc (devno,filno)(6.3.3)
bs-6.3 15
6.3.3 Tertiärspeicherverwaltung
für Blöcke und Deskriptoren mit Hilfe von
Mount-Tabelle mit Einträgen für die bekannten Dateisysteme:
devno root mtpt super block012 . . .
Blockpuffer(6.3.1)
Dateitabelle(6.3.2)
Mount-Tabelle
bs-6.3 16
Blockverwaltung:
bufno = allocateBlock(devno)
reserviert Block auf Gerät devno (Blocknummer sei blkno),trägt im Blockpuffer ein: (devno,blkno,current,0,1),markiert Superblock von devno als dirty;liefert Nummer des Blockpuffer-Eintrags.
Implementierung:
bufno = getBlock(devno,blkno) sorgt für Eintrag (devno,blkno,current,_,_);
evtl. req/relBlock für Block, der auf weitere freieBlöcke verweist *.
bs-6.3 17
deallocateBlock(devno,blkno)
gibt Block blkno auf Gerät devno frei(der Block vermodert im Blockpuffer)
Implementierung:
evtl. req/relBlock analog zu allocateBlock
bs-6.3
Deskriptorverwaltung:
dno = allocateDesc(devno)
reserviert freie Position filno in der Dateitabelle auf devno,erzeugt und initialisiert entsprechenden aktiven Deskriptor
(devno,filno,1,current,...)und liefert dessen Position.
Implementierung:
evtl. req/relBlock für externe Dateitabelle auf Gerät,um freie Stelle filno zu finden;
dno = reqDesc(devno,filno) schafft Eintrag in interner Dateitabelle;
partielle Initialisierung des Deskriptors (extern und intern)(z.B. type 0 bedeutet „belegt“).
bs-6.3 19
deallocateDesc(devno,filno)
gibt die Position für filno in der externen Dateitabelle von devno frei
Implementierung:
Übung!
bs-6.3 20
6.3.4 Auflösung eines Wegnamens
hat die Aufgabe, zu einem vorgegebenen, syntaktischkorrekten Wegnamen den zugehörigen Dateideskriptorin der internen Dateitabelle bereitzustellen:
dno = path2dno(path)
Vor.: path syntaktisch korrekt
Eff.: D[dno] ist der Deskriptor der gesuchten Datei,gesperrt mit .owner = current
bs-6.3 21
Implementierung:
Die Einträge in einem Verzeichnis sind Paare(name, fileIndex).
Ein mount point, d.h. eine Datei, die mit der Wurzel eines fremden Dateisystems überlagert wurde, ist am Status ihres Deskriptors erkennbar.In der Mount-Tabelle kann dann der Eintraggefunden werden, der auf diesen Deskriptorverweist, und aus diesem Eintrag kann der Verweisauf den Deskriptor der Wurzel entnommen werden.
bs-6.3 22
Implementierung – erfolgreiche Suche vorausgestzt:
d = reqDesc(root) oder d = reqDesc(curdir) ;i = 0;b = reqBlock(devno, getblkno(i++,d));
search block b for name ;relBlock(b);
(name, next file) found ?
relDesc(d);d = reqDesc(next file);
path exhausted ?
dno = d;
no yes
no yes