Mit den vergebenen Blöcken wird Speicherplatz für eine Datei aufgebaut. Für den Programmierer ist es am einfachsten und bequemsten, innerhalb einer Datei einen linearen Adreßraum zur Verfügung zu haben. Das bedeutet, daß die Daten einfach mit 0, 1, 2, ... adressiert werden können. Die Speicherverwaltung wird daher nicht nur registrieren müssen, welcher Datei ein Block zugeteilt wurde, sondern auch an welcher Stelle im Adreßraum der Datei der Block liegt. Diese Anforderungen können mit verschiedenen Verfahren gelöst werden.
Eine Möglichkeit ist das Verketten der Blöcke in der Reihenfolge, in der sie den Adreßraum der Datei bilden. Die Kette könnte in den Blöcken gespeichert werden, aber das ist aus zwei Gründen schlecht:
1. Es wären zum Auffinden des n-ten Blockes n Zugriffe erforderlich
2. Eine fehlerhafte Stelle in der Kette würde das Auffinden weiterer Daten in der Folge sehr erschweren
Besser ist es daher, die Ketten aller Dateien zu sammeln und geordnet in einem eigenen Speicherbereich unterzubringen, der aus Sicherheitsgründen auch zweifach gespeichert werden kann.
MS-DOS legt auf jedem Datenträger eine Tabelle (File allocation table = FAT) an, in der die Verwendung jedes Blocks registriert wird. Diese Datenstruktur ist Rückrat und Achillesferse er Speicherverwaltung. Ein Fehler in einem Eintrag würde zum Abreißen der Kette und zum Verlust des Restes der Datei führen.
Der falsche Eintrag könnte an irgendeiner Stelle in der Kette einer anderen Datei führen, sodaß einige Datenblöcke gleichzeitig zu zwei Dateien gehören. Um derlei unangenehme Effekte zu vermeiden, wird die FAT auf jedem Datenträger zweimal aufgezeichnet. Die Information in einer FAT reicht sogar dazu aus, gewisse Fehler beheben zu können.
Eine vollständige Kette bei der nur der Anfang fehlt (nach der Zerstörung eines Dateiverzeichnisses) kann vollkommen hergestellt werden. Bei MS-DOS wäre das der Befehl chkdsk. Ein schadhafter Sektor führt noch nicht zum Vollständigen Verlust einer Datei. Der Befehl recover ist im Stande die Datei bis auf den schadhaften Sektor wiederherzustellen.
Ein ganz anderes Verfahren entsteht, wenn ein Index der verwendeten Blöcke aufgebaut wird. Ein Index ist eine Datenstruktur, die mit Hilfe eines Suchbegriffes - in diesem Fall die Blocknummer - das Auffinden der entsprechenden Daten ermöglicht. Das Betriebssystem UNIX verwendet einen solchen Index, der in einem eigenen Speicherbereich, dem Indexblock (Index node, Inode), gespeichert wird. Neben dem Index sich im Indexblock auch der Eigentümer der Datei, Zugriffsberechtigungen und andere Attribute eingetragen. Da ein Indexblock eine feste Größe hat, kann nur eine beschränkte Anzahl von Blocknummern eingetragen werden. Weitere Blocknummern müssen indirekt adressiert werden, wie Abb. 6.5 zeigt.
I-node Indexblöcke Datenblöcke
Indexblöcke und Datenblöcke unter UNIX
Erklärung: Die ersten zehn Einträge im Indexblock zeigen direkt auf Datenblöcke. Da UNIX den Indexblock im Arbeitsspeicher hält, können diese Datenblöcke ohne zusätzliche Plattenzugriffe erreicht werden. Der elfte Eintrag zeigt auf einen Block, in dem Adressen weiterer Datenblöcke stehen. Reicht dieser Block nicht aus, so wird im zwölften Eintrag die Adresse eines Blocks gespeichert, der Adressen von Blöcken mit Adressen von Datenblöcken enthält. Der dreizehnte Eintrag führt nach dreifach indirekter Adressierung zu den Daten.
Bei einer Blockgröße von 1024 Bytes kann auf Dateien bis zu 10KByte ohne zusätzlichen Aufwand zugegriffen werden. Größere Dateien erfordern ein bis drei zusätzliche Zugriffe, bis die Daten erreicht werden. Die Effizient des Verfahrens hängt offensichtlich von der durchschnittlichen Länge der Dateien in einem System ab.
Die Zerstörung eines Indexblocks führt zum Verlust einer einzigen Datei. Wenn durch Zerstörung eines Dateiverzeichnisses der letzte Verweis auf einen Indexblock gelöscht wird, bleibt die Datei intakt, kann aber nicht mehr aufgefunden werden. Da UNIX Blöcke aus Effizienzgründen nicht sofort auf die Magnetplatte schreibt, sind Fehler nach plötzlichen Abschalten des Systems nicht ausgeschlossen. Ein Programm zur Untersuchung des Dateisystems wird daher routinemäßig nach dem Laden des Betriebssystems ausgeführt. Gefundene Dateien werden in einem eigenen Dateiverzeichnis namens / lost+found abgelegt.
Die bisher vorgestellten Verfahren nehmen keine Rücksicht auf die tatsächliche Anordnung der Blöcke einer Datei auf der Magnetplatte, jeder Block muß daher einzeln adressiert werden. Wenn Vergabeeinheiten nicht einzeln, sondern in zusammenhängenden Bereichen zugeteilt werden, genügt pro Bereich eine Adresse und die Länge.
Am flexibelsten sind Systeme, die einerseits die Vorgabe eines bestimmten Einheit für die Zuteilung zulassen, andererseits auf Wunsch eine Datei auch in möglichst wenigen zusammenhängenden Bereichen unterzubringen versuchen, wobei auch ein einziger Bereich gefordert werden kann. Ziel dieser Methode ist es, die Zugriffszeit zu den Blöcken einer Datei zu verkürzen.
Ein Betriebssystem, das diese Technik verwendet, ist VAX/VMS. Dort wird eine Datei durch einen File-Header beschrieben, in dem - ähnlich wie im Indexblock in UNIX - der Eigentümer, Zugriffsberechtigungen, die Zeitpunkte des Anlegens und des letzten Zugriffs und ähnliches eingetragen werden. Jeder zusammenhängende Bereich von Datenblöcken ist im File-Header eingetragen.
Sollte eine Datei in zu viele Bereiche zersplittert sein, daß die Einträge eines Headers nicht ausreichen, dann wird ein zweiter Header zu dieser Datei angelegt, der Platz für weitere Bereichseinträge bietet.
Vorteilhaft wirkt sich die zusammenhängende Lage einer Datei dann aus, wenn die ganze Datei - oder zuminderst große Teile davon - auf einmal gelesen werden. Das kommt vor allem beim Laden von Programmen vor. Auf Systemen, die Dateien nicht systematisch in zusammenhängenden Speicherbereichen unterzubringen versuchen, ist es daher besser die Dateien von Zeit zu Zeit auf der Magnetplatte umzuordnen, sodaß die Blöcke der einzelnen Dateien nicht verstreut liegen.
|