bs-6.31 6.3 implementierung der dateiverwaltung für hohe effizienz: caching – vielfach werden...

22
bs-6.3 1 6.3 Implementierung der Dateiverwaltung 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. von Dateien, die gerade in Benutzung sind ( Dateitabelle auf dem Datenträger Blockpuffer (Unix: buffer cache) enthält Kopien von Datenblöcken, Deskriptorblöcken, Superblöcken

Upload: gisela-auttenberg

Post on 06-Apr-2016

215 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Bs-6.31 6.3 Implementierung der Dateiverwaltung Für hohe Effizienz: Caching – vielfach werden Kopien von Plattendaten für längere Zeit im Arbeitsspeicher

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

Page 2: Bs-6.31 6.3 Implementierung der Dateiverwaltung Für hohe Effizienz: Caching – vielfach werden Kopien von Plattendaten für längere Zeit im Arbeitsspeicher

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

Page 3: Bs-6.31 6.3 Implementierung der Dateiverwaltung Für hohe Effizienz: Caching – vielfach werden Kopien von Plattendaten für längere Zeit im Arbeitsspeicher

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

Page 4: Bs-6.31 6.3 Implementierung der Dateiverwaltung Für hohe Effizienz: Caching – vielfach werden Kopien von Plattendaten für längere Zeit im Arbeitsspeicher

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)

Page 5: Bs-6.31 6.3 Implementierung der Dateiverwaltung Für hohe Effizienz: Caching – vielfach werden Kopien von Plattendaten für längere Zeit im Arbeitsspeicher

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)

Page 6: Bs-6.31 6.3 Implementierung der Dateiverwaltung Für hohe Effizienz: Caching – vielfach werden Kopien von Plattendaten für längere Zeit im Arbeitsspeicher

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

Page 7: Bs-6.31 6.3 Implementierung der Dateiverwaltung Für hohe Effizienz: Caching – vielfach werden Kopien von Plattendaten für längere Zeit im Arbeitsspeicher

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

Page 8: Bs-6.31 6.3 Implementierung der Dateiverwaltung Für hohe Effizienz: Caching – vielfach werden Kopien von Plattendaten für längere Zeit im Arbeitsspeicher

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

Page 9: Bs-6.31 6.3 Implementierung der Dateiverwaltung Für hohe Effizienz: Caching – vielfach werden Kopien von Plattendaten für längere Zeit im Arbeitsspeicher

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, .....

Page 10: Bs-6.31 6.3 Implementierung der Dateiverwaltung Für hohe Effizienz: Caching – vielfach werden Kopien von Plattendaten für längere Zeit im Arbeitsspeicher

bs-6.3 10

Verwaltung ähnlich wie beim Blockpuffer,allerdings ohne Verdrängung

devno filno refcnt status type . . . . . . . . . . . . . . . . . file map

öffentlich

D

012...

Page 11: Bs-6.31 6.3 Implementierung der Dateiverwaltung Für hohe Effizienz: Caching – vielfach werden Kopien von Plattendaten für längere Zeit im Arbeitsspeicher

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.:

Page 12: Bs-6.31 6.3 Implementierung der Dateiverwaltung Für hohe Effizienz: Caching – vielfach werden Kopien von Plattendaten für längere Zeit im Arbeitsspeicher

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.

Page 13: Bs-6.31 6.3 Implementierung der Dateiverwaltung Für hohe Effizienz: Caching – vielfach werden Kopien von Plattendaten für längere Zeit im Arbeitsspeicher

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!)

Page 14: Bs-6.31 6.3 Implementierung der Dateiverwaltung Für hohe Effizienz: Caching – vielfach werden Kopien von Plattendaten für längere Zeit im Arbeitsspeicher

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)

Page 15: Bs-6.31 6.3 Implementierung der Dateiverwaltung Für hohe Effizienz: Caching – vielfach werden Kopien von Plattendaten für längere Zeit im Arbeitsspeicher

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

Page 16: Bs-6.31 6.3 Implementierung der Dateiverwaltung Für hohe Effizienz: Caching – vielfach werden Kopien von Plattendaten für längere Zeit im Arbeitsspeicher

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 *.

Page 17: Bs-6.31 6.3 Implementierung der Dateiverwaltung Für hohe Effizienz: Caching – vielfach werden Kopien von Plattendaten für längere Zeit im Arbeitsspeicher

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

Page 18: Bs-6.31 6.3 Implementierung der Dateiverwaltung Für hohe Effizienz: Caching – vielfach werden Kopien von Plattendaten für längere Zeit im Arbeitsspeicher

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“).

Page 19: Bs-6.31 6.3 Implementierung der Dateiverwaltung Für hohe Effizienz: Caching – vielfach werden Kopien von Plattendaten für längere Zeit im Arbeitsspeicher

bs-6.3 19

deallocateDesc(devno,filno)

gibt die Position für filno in der externen Dateitabelle von devno frei

Implementierung:

Übung!

Page 20: Bs-6.31 6.3 Implementierung der Dateiverwaltung Für hohe Effizienz: Caching – vielfach werden Kopien von Plattendaten für längere Zeit im Arbeitsspeicher

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

Page 21: Bs-6.31 6.3 Implementierung der Dateiverwaltung Für hohe Effizienz: Caching – vielfach werden Kopien von Plattendaten für längere Zeit im Arbeitsspeicher

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.

Page 22: Bs-6.31 6.3 Implementierung der Dateiverwaltung Für hohe Effizienz: Caching – vielfach werden Kopien von Plattendaten für längere Zeit im Arbeitsspeicher

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