Überblick Vorlesung Betriebssysteme II I Implementierung von Dateisystemen I Thema 6: Dateisysteme/Massenspeicher I I I Robert Baumgartl I Kontinuierliche Allokation Verkettete Liste Indizierte Speicherung Journaling I/O-Scheduling I I 8. Juni 2015 I I FCFS, SSTF SCAN (Elevator) und Varianten Shortest Access Time First (SATF) Verfahren im Linux-Kernel 1 / 43 2 / 43 Kontinuierliche Allokation I I I I I I Verkettete Liste fortlaufende Ablage der Daten einer Datei auf Massenspeicher Dateiparameter: Anfangsblock, Länge schneller sequentieller und wahlfreier Zugriff bei konstanter Dateilänge (ROM) vorteilhaft nachträgliche Einfüge- und Löschoperationen nur mit sehr großem Aufwand möglich Beispiel: ISO9660 Nr. 12 13 14 15 16 17 18 ... A A A A B B C I Listenelement: Nutzdatenfeld + Zeiger auf Nachfolger I verwirklicht variable Dateigröße I Dateiparameter: Anfangsblock Nr. 13 ... A 14 15 16 17 A A A B 0016 0015 FFFF 0014 ... 0042 ... Endekennzeichen Abbildung: Datei als einfach verkettete Liste Logische Speicherblöcke Abbildung: Kontinuierliche Allokation von Blöcken 3 / 43 4 / 43 Verkettete Liste Liste mit Zuordnungstabelle Nachteile wahlfreier Zugriff sehr langsam (vom Start durch Liste suchen) I Unterbrechung der Liste führt zum Verlust aller dahinter liegenden Daten I Nutzdatenteil keine Zweierpotenz (ungünstig für Transfer Hauptspeicher ↔ Massenspeicher!) → mehrfache Verkettung ? ( Ablage der Folgezeiger in separater Tabelle I Sicherungskopien der Tabelle generierbar I Totalverlust des Dateisystems, wenn Tabelle korrumpiert I wahlfreier Zugriff effizienter, da kompakte Abspeicherung der Verwaltungsinformationen I Beispiele: FAT12, FAT16, FAT32 ... I I behebt Nachteile nicht) 0016 14 0015 15 FFFF 16 0014 17 0042 Nr. ... 13 14 15 16 17 A A A A B ... ... → Trennung Nutzdaten und Verkettungsinformationen 13 Dateizuordnungstabelle Abbildung: Prinzip der Zuordnungstabelle 5 / 43 6 / 43 1 Indizierte Speicherung Speicherung mit variablen Indexblocks ... I alle zu einer Datei gehörigen Blocknummern in separaten Indexblocks abgelegt I Dateiparameter: Startadresse des Indexblocks, Länge I sequentieller und wahlfreier Zugriff effizient I Verlängern und Verkürzen von Dateien problematisch (→ Umordnung der Indexeinträge nötig) I feste Größe der Indexblocks ebenfalls ungünstig 0007 Start A 0013 Ende A Start B Ende B Start C 0016 0014 0015 0042 0047 0071 Indexblock für A Indexblock für B ... 8 / 43 7 / 43 Indirekt-indizierte Speicherung Indirekt-indizierte Speicherung ... I I I I 0015 Indexblock frei Anzahl Indexblöcke erhöhen Anzahl Indirektionsstufen erhöhen Kombination direkter mit indirekter Indexierung frei 0042 langsamerer Zugriff als direkte Indexierung (zusätzliches Lesen der Indexblocks nötig) ... I 0014 ... I Start A Start B Start C Idee: Speicherung der Indexinformationen in separaten Blöcken (gleiche Größe wie Nutzdatenblöcke) wenn ein Indexblock nicht ausreicht: 0013 0016 0047 frei ... frei 9 / 43 10 / 43 Beispiel: ISO 9660 (1988) Beispiel: ISO 9660 (1988) I keine Freispeicherverwaltung nötig I Entwurfsziel: unter jedem Betriebssystem lesbar (→ kleinster Nenner – MS-DOS) I unterstützt Sets von CDs (maximal 216 − 1), mehrere Partitionen pro CD I alle Binärfelder sowohl big- als auch little endian-kodiert I erlaubte Zeichen im Namen: Großbuchstaben, Ziffern, ’_’ Bytes 1 1 8 Startsektor 8 Dateigröße Länge des Verzeichniseintrags 7 Datum, Zeit 1 2 4 1 CD# I maximale Verschachtelungstiefe: 8 I 3 verschiedene Levels der Dateibenennung Erweiterungen: 4−15 Dateiname I Rock Ridge – ermöglicht UNIX-Attribute und -Dateinamen I Joliet – längere Dateinamen, Unicode-Zeichen, größere Tiefe Länge des Namens Flags Name . Ext ; Ver Abbildung: Verzeichniseintrag im Dateisystem ISO9660 11 / 43 12 / 43 2 Beispiel: UNIX-Dateisystem Beispiel: UNIX-Dateisystem Dateiadressierung mittels Inodes Inode I Verwaltungsstruktur jeder Datei: Indexknoten (index node, inode) enthält Attribute (Flags, Zeitstempel, Eigentümerinformationen) sowie Blockinformationen: I I I I einfach indi− rekter Block ... I direkte Adressen Attri− bute doppelt indi− rekter Block 12 direkte Blockadressen Adresse eines einfach indirekten Blockes Adresse eines doppelt indirekten Blockes Adresse eines dreifach indirekten Blockes dreifach indi− rekter Block Datenblock 13 / 43 14 / 43 Beispiel: UNIX-Dateisystem Journaling Nachteil traditioneller Dateisysteme Operationen über den Dateisystem-Metadaten müssen atomar ausgeführt werden, sonst drohen Inkonsistenzen. I Zugriff auf kurze Dateien effizient I Zugriff auf sehr lange Dateien dauert länger, da Indirektionsstufen abzuschreiten I trotzdem sehr große Dateien realisierbar I vgl. struct ext2_inode in include/linux/ext2_fs.h Beispiel: Löschen einer Datei besteht aus 2 Suboperationen. a) Löschen des Verzeichniseintrags b) Freigabe der Datenblöcke der zu löschenden Datei Was passiert bei Unterbrechung (infolge Stromausfall, Reset, Systemabsturz usw.)? nur a) → „verlorene“ Datenblöcke nur b) → „Datei ohne Inhalt“ Es resultiert ein inkonsistentes Dateisystem, das repariert werden muss (z. B. mit fsck). Konsequenzen: I Zeitaufwand I Gefahr des Datenverlusts bei Nichtbeachtung 15 / 43 16 / 43 Journaling Journaling Betriebsmodi Idee des Journals: I Schreiboperationen in einem reservierten Bereich des Massenspeichers, dem Journal, ‘loggen’ I zu bestimmten Zeitpunkten das Journal auf den Massenspeicher ‘durchschreiben’ (Commit) Writeback Mode Schreib− operationen nur Metadaten im Journal I Datenblocks werden direkt geschrieben Ordered Mode Commit Journal (on−disk) I zuerst werden Datenblocks direkt geschrieben I danach Metadaten ins Journal Data Mode Dateisystem (on−disk) Dateisystem− Reparatur I I I sowohl Daten als auch Metadaten im Journal I am sichersten (kein Datenverlust möglich), aber am langsamsten (Daten zweimal geschrieben) Bei Unterbrechung wird das Journal erneut durchgeschrieben. 17 / 43 18 / 43 3 Journaling-Dateisysteme Erweiterte Attribute Zusammenfassung Wann erfolgt Journal Commit? I bei Erreichen eines bestimmten „Füllstandes“ I zyklisch Vorteile gegenüber konventionellen Dateisystemen I kleinere Reparaturzeit nach Crash I geringere Inkonsistenzgefahr I Standardattribute: Zugriffsrechte, Zeitstempel, Eigentümer, . . . (alles, was im struct stat steht) I moderne Dateisysteme bieten dem Nutzer (oder dem System) die Möglichkeit, eigene Attribute zu definieren und mit Werten zu belegen I meist als Paare „Attributname – Attributwert“, die dem Inode assoziiert sind, realisiert Anwendungsbeispiele I I Beispiele: JFS, JFS2 (IBM), XFS (SGI), SFS (Smart File System), ext3fs, ext4fs, ReiserFS I Access Control Lists (ACL) zur feingranularen Zugriffssteuerung Alternate Data Streams in NTFS 19 / 43 20 / 43 Erweiterte Attribute in Linux-Dateisystemen Erweiterte Attribute in Linux-Dateisystemen Benötigte Systemrufe I I unterstützt im ext2, ext3, ext4, XFS (u. a.) I z. B. in ext2 muss beim Montieren die Option user_xattr angegeben werden I Kommandos getfattr und setfattr zum Auslesen bzw. Setzen der (erweiterten) Attribute #include <attr/xattr.h> Ruf getxattr() setxattr() listxattr() removexattr() I I Semantik Abfragen eines Attributwertes Setzen eines Attributwertes Abfragen der Liste aller Attributnamen Löschen eines Attributnamens Unterscheide Löschen des Wertes vs. Löschen des Attributes! jeweils 3 Varianten, die differieren in I I Behandlung von symbolischen Links, Adressierung des Inodes über Pfadangabe oder Deskriptor. 21 / 43 22 / 43 Optimierung von Massenspeicherzugriffen First Come First Serve (FCFS) Grundsätzliche Strategien: I I Beeinflussung des Datenlayouts auf Festplatte → angewandt in (strombasierten) Multimedia-Dateisystemen, z. B. CMFS1 Scheduling (Umordnen) der wartenden Massenspeicher-Operationen a) Reduzierung der Positionierungszeit b) Reduzierung der Positionierungszeit und Rotationsverzögerung I Aufträge in Reihenfolge des Eintreffens ausgeführt, I fair, I leicht zu implementieren, I ineffizient → ungünstig bei großer Last. Beispiel (40 Sektoren): Reihenfolge des Eintreffens: 11, 1, 36, 16, 9, 12, 34 Reihenfolge der Bearbeitung: 11, 1, 36, 16, 9, 12, 34 mittlere Weglänge = 10+35+20+7+3+22 = 97 6 6 = 16.2 Zielstellung: 1. Maximierung des Durchsatzes, 0 2. Minimierung der Latenz, 5 10 15 20 25 30 35 3. Fairness. 4. (Garantie der Antwortzeit ↑ Echtzeitsysteme) 1 David P. Anderson, Yoshitomo Osawa und Ramesh Govindan. “A File System for Continuous Media”. In: ACM Transactions on Computer Systems (Nov. 1992), S. 311–337. t 23 / 43 24 / 43 4 Shortest Seek/Service Time First (SSTF) Elevator-Algorithmus (SCAN) Auftrag mit der kürzesten Distanz zum aktuellen Auftrag wird ausgeführt I minimiert mittlere Antwortzeit I hoher Durchsatz I unfair, „entfernt“ liegende Aufträge werden benachteiligt, I Verhungern möglich: durch kontinuierliches Eintreffen neuer „naher“ Forderungen werden entfernte Forderungen blockiert Beispiel (identische Voraussetzungen): Reihenfolge des Eintreffens: 11, 1, 36, 16, 9, 12, 34 Reihenfolge der Bearbeitung: 11, 12, 9, 16, 1, 34, 36 = 61 mittlere Weglänge = 1+3+7+15+33+2 6 6 = 10.2 I 0 5 10 15 20 25 30 I I unidirektionale Bewegung des Kopfes, Abarbeitung aller Aufträge, die passiert werden Bewegung des Kopfes a) bis zum Ende der Platte oder b) bis keine Aufträge in dieser Richtung mehr anstehen (LOOK), 35 I danach Umkehrung der Richtung und wiederum unidirektionale Bewegung usw. I etwas schlechtere mittlere Antwortzeit als SSTF, da schlechtere Ausnutzung der Lokalität I kein Verhungern mehr möglich I Benachteiligung der äußeren Sektoren I Aufträge, die in der aktuellen Bewegungsrichtung des Kopfes liegen, werden bevorteilt 25 / 43 t 26 / 43 Elevator-Algorithmus (SCAN) Circular Scan (C-SCAN) Beispiel: Reihenfolge des Eintreffens: 11, 1, 36, 16, 9, 12, 34 Reihenfolge der Bearbeitung: 11, 12, 16, 34, 36 (U), 9, 1 (initiale Richtung: aufwärts) mittlere Weglänge = 1+4+18+2+27+8 = 60 6 6 = 10.0 0 5 10 15 20 25 30 35 I unidirektionale Bewegung des Kopfes bis keine Aufträge in dieser Richtung mehr anstehen, dann Zurückfahren des Kopfes an Anfang und erneuter Durchlauf in gleicher Richtung I geringer Zeitverlust durch Rücklauf des Kopfes (nur sinnvoll, wenn Rücklaufzeit vernachlässigt werden kann) I Benachteiligung der äußeren Sektoren eliminiert I geringere Varianz der Antwortzeit als bei SCAN Beispiel (identische Voraussetzungen): Reihenfolge des Eintreffens: 11, 1, 36, 16, 9, 12, 34 Reihenfolge der Bearbeitung: 11, 12, 16, 34, 36 (R), 1, 9 (Richtung: aufwärts) = 68 mittlere Weglänge = 1+4+18+2+35+8 6 6 = 11.3 t 27 / 43 28 / 43 SCAN und Varianten 0 5 10 Shortest Access Time First (SATF) 15 20 25 30 35 t I I SCAN und C-SCAN bei hoher Last besser als SSTF geeignet (fairer) bei SCAN und C-SCAN kein Verhungern möglich Variante: FSCAN I 2 Warteschlangen I während Abarbeitung einer Schlange (SCAN), treffen neue Anforderungen in andere Schlange ein I kein „Vordrängeln“ später eintreffender Requests mehr möglich 29 / 43 I Einbeziehung der Rotationslatenz (!) I Es wird stets der Auftrag ausgewählt, dessen Zugriffszeit ta , bezogen auf die aktuelle Kopfposition, minimal ist. I greedy I Verfahren mit der besten Performance aber höchsten Gefahr des Verhungerns „abseits gelegener“ Jobs 30 / 43 5 Shortest Access Time First (SATF) Shortest Access Time First (SATF) Überlappung von Rotation und Seek Berechnung der Access Time ta Zur Ermittlung von ta sind notwendig Drehrichtung I Rotationslatenz trot I Zeit für Seek zwischen Kopfposition und Zielsektor tseek I Zeit für eine komplette Umdrehung trev Fallunterscheidung: Zielsektor tseek I Seek beendet, bevor Zielsektor erreicht (trot ≥ tseek ): ta = trot I Seek „zu lang“, d. h. trot < tseek → ganze Umdrehung warten: ta = trot + trev I Anzahl zu wartender vollständiger Umdrehungen kann bei langen Seeks größer 1 sein tseek − trot ta = trot + trev trev trot Kopfposition 31 / 43 32 / 43 Techniken zum Verhindern des Verhungerns Techniken zum Verhindern des Verhungerns Batch-Algorithmen Erzwungenes Ausführen des ältesten Auftrags I Batched Shortest Access Time First (BSATF): Während ein Puffer (komplett) bedient wird, landen alle neu eintreffenden in einem anderen Puffer. I Je kleiner die Anzahl verbliebener Aufträge im Puffer, desto schlechter arbeitet das Verfahren I Variation: „Two-Mode“ Batching: Im Falle des Verhungerns BSATF, SATF ansonsten (limitiert negativen Performanceeinfluß des Batching) I Leaky BSATF: Wenn bei Bedienung eines Puffers noch Aufträge hinzukommen, die keinen zusätzlichen Aufwand verursachen, werden sie sogleich mit aufgenommen. I Shortest Access Time First with Urgent Forcing (SATFUF): Sobald ein Auftrag eine bestimmte Wartezeit überschritten hat, wird er ausgeführt. Alle Aufträge, die auf dem Wege zu ihm keine zusätzliche Verzögerung verursachen, werden ebenfalls ausgeführt. I Alle wartenden Aufträge müssen betrachtet werden. I Bei hoher Last (und nur dann tritt Verhungern auf) schlechte Performance: nähert sich FCFS; keine Chance der „Erholung“ der Wartezeit. I Modifikation: SATFUF(N) führt N älteste Aufträge aus, sobald Wartezeit ein Limit überschreitet (→ Erholung möglich) 33 / 43 34 / 43 I/O-Scheduling im Linux-Kern „Writes-starving-Reads“ Grundlagen I I I I Beobachtung: I Leseoperation i. a. synchron Annahme: Abbildung LBN → PBN ist sequentiell gewöhnlich write() asynchron, read() synchron I I Latenz beim Lesen kritisch, beim Schreiben nicht I Leseoperationen hängen häufig voneinander ab, Schreiboperationen gewöhnlich nicht I Phänomen: “Writes-Starving-Reads” (viele write() vs. wenige, voneinander abhängige read()) I struct request in linux/blkdev.h Schreiboperationen i. a. asynchron I I I Daten landen im Buffercache des BS Herausschreiben aus Cache erfolgt später Schreiboperationen erfolgen häufig im Strom I 35 / 43 Applikation wartet auf Komplettierung Operationen hängen voneinander ab es resultieren viele aufeinanderfolgende Schreibvorgänge benachbarter Blöcke 36 / 43 6 „Writes-starving-Reads“ Linus Elevator (Kernel 2.4) Beispiel Situation: I Kopf auf Block 15 I Schreibaufträge für Block 42 und 44 I Leseauftrag für Block 2415 I neu hinzukommende Schreibaufträge für Blöcke 47–49 LBN 0 15 ... 42 44 W W Kopfposition 47 48 49 ... W W W R 1 globale Auftragswarteschlange, geordnet nach LBN I abgearbeitet nach SCAN I empfindlich für “Writes-Starving-Reads” (Vordrängeln lokaler Schreiboperationen) I vgl. drivers/block/elevator.c Bei Eintreffen eines neuen Auftrags: 2415 ... I ... 1. Vereinigung mit benachbartem Auftrag, falls existent (1 Durchlauf durch WS) neu hinzugekommen 2. Anhängen an Ende der WS, falls wenigstens 1 Eintrag verhungert D. h. , (lokale) Schreiboperationen drängeln sich vor, lesende Applikation muss (unverhältnismäßig) lange warten. Schreiboperationen könnten aber verschoben werden. 3. Einordnen in Warteschlange 37 / 43 38 / 43 Deadline I/O Scheduler I globale Auftrags-WS wie im Linus Elevator I zwei zusätzliche Queues für Lese- und Schreiboperationen (FIFO) I jeder Auftrag wird in globale und in Read- oder Write Queue eingeordnet Bedienung von Aufträgen aus I I I I Anticipatory I/O Scheduler I Erweiterung des Deadline-I/O-Schedulers um Heuristik Idee: Nach einer Leseoperation wird kurz (≈6 ms) gewartet, ob in dieser Region weitere Leseoperationen erfolgen (Wkt. wegen Lokalität des Zugriffs ziemlich hoch), bevor ein Seek zu einer anderen Position ausgeführt wird. Bsp: ein oder mehrere (langsame, da abhängige) Leseströme, gleichzeitig sehr viele Schreiboperationen FIFO Read Queue, wenn Auftrag am Queue-Anfang länger als 500 ms wartet, FIFO Write Queue, wenn Auftrag am Queue-Ende länger als 5 s wartet, ansonsten aus geordneter WS (via SCAN) I Scheduler führt Statistik für jeden Prozess über I I I I entschärft “Writes-Starving-Reads” I im Worst Case bessere Latenz für Leseaufträge I I vgl. drivers/block/deadline-iosched.c I I “average think time” “average seek distance” Verbesserung der Reaktionsgeschwindigkeit für Leseaufträge insgesamt hoher Durchsatz Default-Scheduler im Kern 2.6 vgl. drivers/block/as-iosched.c 39 / 43 40 / 43 CFQ und Noop Praxis Completely Fair Queueing (CFQ) I pro Prozess eine eigene Warteschlange I Entnahme einer identischen Anzahl Aufträge aus jeder WS für das Scheduling I Kernel 2.6 enthält: noop, anticipatory (as), deadline, cfq I default cfq (seit 2.6.18), bis dahin as I entwickelt für Multimedia Storage Server I I Ziel: Fairneß pro Prozeß I vgl. drivers/block/cfq-iosched.c Wechsel des Schedulers (Beispiel): root@idir:˜$ echo cfq > /sys/block/hda/queue/scheduler I Auswahl eines geeigneten Schedulers a priori schwierig, aber für Desktop-Systeme unkritisch I Werkzeug iotop zur Beobachtung der I/O-Bandbreite Noop I/O Scheduler I FIFO I faßt benachbarte Aufträge zusammen I sonst keine weitere Optimierung I für Geräte, die nicht auf Platten basieren (z.B. MTD) 41 / 43 42 / 43 7 Was haben wir gelernt? I Implementationstechniken typischer Dateisysteme I Was ist Journaling? I Was sind erweiterte Attribute? I Verfahren für I/O-Scheduling I I/O-Scheduling im Linux-Kernel 43 / 43 8
© Copyright 2024 ExpyDoc