Ein- und Ausgabe I/O
Ein- und Ausgabe I/O
Ein- und Ausgabe I/O
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
<strong>Ein</strong>- <strong>und</strong> <strong>Ausgabe</strong><br />
I/O<br />
Kapitel 5<br />
WS 07/08<br />
IAIK 1
I/O<br />
• Überwachung der I/O eine der<br />
Hauptaufgaben<br />
• Kommandos<br />
• Interrupts<br />
• Fehlerbehandlung<br />
• <strong>Ein</strong>fache, einheitliche Schnittstelle<br />
zur HW für Applikationen<br />
• Geräteunabhängigkeit<br />
IAIK 2
Hardware<br />
• Aus dem Gesichtspunkt der<br />
Programmierung<br />
• Hängt mit Aufbau <strong>und</strong> Arbeitsweise<br />
der Hardware zusammen<br />
IAIK 3
Kategorisierung<br />
• Blockorientierte Geräte<br />
(block devices)<br />
• Speichert Informationen in Blöcken<br />
fixer Größe<br />
• Können unabhängig voneinander<br />
gelesen/geschrieben werden<br />
• Beispiel: Festplatten<br />
IAIK 4
Kategorisierung<br />
• Zeichenorientierte Geräte<br />
(character devices)<br />
• Erzeugt <strong>und</strong> akzeptiert<br />
Zeichenströme (character streams)<br />
ohne Rücksicht auf Blockstruktur<br />
• Nicht adressierbar, keine<br />
Suchfunktion<br />
• Beispiel: Drucker, Keyboard, Mäuse,<br />
Netzwerk<br />
IAIK 5
Kategorisierung<br />
• Sonstige Devices<br />
• Uhren<br />
• Bildschirme<br />
• …<br />
• Allgemeines Modell, erlaubt es<br />
Teile des BS geräteunabhängig zu<br />
gestalten<br />
IAIK 6
I/O-Design-Kriterien<br />
IAIK 23
Ziele von I/O-Software<br />
• Geräteunabhängigkeit<br />
• Programme sollten mit Daten von<br />
Festplatte, Band, CD, Diskette etc –<br />
<strong>und</strong> das ohne Änderung<br />
sort < input > output<br />
egal wo input <strong>und</strong> output herkommen<br />
IAIK 24
Ziele von I/O-Software<br />
• <strong>Ein</strong>heitliches Namensschema<br />
• unabhängig vom Gerät<br />
• Unix: alles unter /<br />
• Fehlerbehandlung<br />
• möglichst Controller<br />
• oder das Betriebssystem<br />
• transiente Fehler transparent<br />
IAIK 25
I/O-Software<br />
• synchron/asynchron<br />
• I/O ist asynchron<br />
• Software will aber bei read warten bis<br />
was da ist<br />
• Pufferung<br />
• Daten können nicht immer am<br />
Speicherziel abgelegt werden<br />
• gemeinsam/exklusiv benutzbare<br />
Geräte<br />
IAIK 26
I/O-Durchführung<br />
• Drei Arten<br />
• Programmiert<br />
• mit Interrupts<br />
• mit DMA<br />
IAIK 27
Programmierte I/O<br />
• Prozess will Zeichen am Drucker<br />
ausgeben<br />
• Systemcall<br />
• Drucker belegt<br />
• return mit Fehler<br />
• Prozess blockiert bis Drucker frei<br />
• (Spooling)<br />
IAIK 28
Programmierte I/O<br />
IAIK 29
Programmierte I/O<br />
• Betriebssystem kopiert Zeichen in<br />
Kernel-Puffer<br />
• leichter adressierbar<br />
• Warten bis Drucker verfügbar<br />
• erstes Zeichen in Datenregister des<br />
Druckers<br />
• Drucker bereit für zweites Zeichen?<br />
• …<br />
IAIK 30
Programmierte I/O<br />
IAIK 31
Programmierte I/O<br />
• Nachteil: Prozessor belegt bis<br />
Drucken fertig<br />
• ok, wenn<br />
• Wartezeit zwischen den einzelnen<br />
Zeichen sehr klein<br />
• Prozessor nichts anderes zu tun (z.B.<br />
embedded systems)<br />
• in komplexeren Systemen nicht<br />
ok!<br />
IAIK 32
Interruptgesteuerte I/O<br />
• Wartezeit zwischen den Zeichen<br />
lang programmierte I/O nicht<br />
gut<br />
• während der Wartezeit soll was<br />
anderes getan werden<br />
• Idee: erstes Zeichen zum Drucker<br />
• dann Scheduler<br />
IAIK 33
Interruptgesteuerte I/O<br />
• Drucker sendet Interrupt wenn für<br />
nächstes Zeichen bereit<br />
• Interruptbehandlungsroutine stellt<br />
nächstes Zeichen zur Verfügung<br />
IAIK 34
Interruptgesteuerte I/O<br />
IAIK 35
I/O mit DMA<br />
• Nachteil der Interrupt-Methode:<br />
Interrupts kosten Zeit<br />
• DMA als Alternative<br />
• DMA-Controller erledigt die Arbeit<br />
• nur mehr ein Interrupt pro Puffer<br />
IAIK 36
I/O mit DMA<br />
IAIK 37
I/O-Schichtenmodell<br />
IAIK 38
I/O-Schichten<br />
IAIK 39
Interrupt-Handler<br />
• Interrupts sollen möglichst<br />
„unsichtbar“ bleiben<br />
• Modell: Prozess blockiert bis<br />
Operation beendet <strong>und</strong> Interrupt<br />
auftritt<br />
• Möglich beispielsweise durch<br />
Verwendung von down(s),<br />
wait(v) oder receive(m)<br />
IAIK 40
Interrupt-Handler<br />
• Interruptbehandlung deblockiert<br />
Prozess<br />
up(s), signal(v) oder send(m)<br />
• Ideal, wenn Treiber als Prozess<br />
ausgeführt<br />
• was ist bei Interrupt alles zu tun<br />
(Achtung: plattformabhängig!)<br />
IAIK 41
Interrupt-Handler<br />
1. Sicherung aller Register, die nicht<br />
schon durch Hardware gesichert<br />
2. Aufbau des Kontext für<br />
Interruptbehandlung (kann<br />
initialisieren des TLB, der MMU<br />
<strong>und</strong> der Pagetables bedeuten)<br />
3. Erzeugen eines Stacks für<br />
Interruptbehandlungsroutine<br />
IAIK 42
Interrupt-Handler<br />
3. Kopieren der Register (des<br />
unterbrochenen Prozesses) in die<br />
Prozesstabelle<br />
4. Interrupt-Controller informieren<br />
(interrupts wieder erlauben)<br />
5. Interruptbehandlungsroutine<br />
aufrufen (lesen Infos der<br />
betroffenen Geräte aus)<br />
IAIK 43
Interrupt-Handler<br />
7. Nächsten Prozess aussuchen<br />
8. MMU-Kontext für neuen Prozess<br />
initialisieren<br />
9. Laden der Prozessregister <strong>und</strong><br />
PSW<br />
10.Neuen Prozess starten<br />
IAIK 44
Gerätetreiber<br />
• Jedes I/O-Geräte benötigt<br />
geräteabhängige Steuersoftware <br />
Treiber<br />
• für jedes Betriebssystem<br />
unterschiedlich<br />
• Treiber steuert meist Klasse<br />
ähnlicher Geräte<br />
IAIK 45
Treiber<br />
• Muss auf HW Zugriff haben können<br />
• daher normalerweise Teil des<br />
Betriebssystems<br />
• möglich:<br />
• Treiber im Userspace laufen lassen<br />
• Systemcalls für Lesen / Schreiben der<br />
Geräteregister<br />
• … leider nicht der Fall …<br />
IAIK 46
Gerätetreiber<br />
• also Teil des Betriebssystems<br />
• … aber von „Außenstehenden“<br />
geschrieben<br />
• erfordert klares Modell<br />
• <strong>und</strong> klare Schnittstellen<br />
IAIK 47
Modell<br />
IAIK 48
Gerätetreiber-Kategorien<br />
• Blockgeräte (block devices)<br />
• zeichenorientierte Geräte<br />
(character devices)<br />
• oft zwei Standardschnittstellen<br />
• eine für alle Blockgeräte<br />
• eine für alle zeichenorientierten<br />
Geräte<br />
IAIK 49
Struktur<br />
• trad. Unix: eine große Objektdatei<br />
• alle notwendigen Treiber enthalten<br />
• neuer Treiber: BS neu übersetzen<br />
• unpraktisch – nicht jeder Benutzer<br />
kann das (speziell bei PC‘s)<br />
• daher dynamisches Laden nötig<br />
IAIK 50
Aufgaben eines Treibers<br />
• Bearbeiten von Schreib- <strong>und</strong><br />
Lesebefehlen<br />
• Initialisieren<br />
• Energiemanagement<br />
• Ereignisverwaltung<br />
IAIK 51
Treiberstruktur<br />
• Prüfen der <strong>Ein</strong>gabeparameter<br />
• u.U. Übersetzung abstrakter in<br />
reelle Werte<br />
• lineare Blockadresse <br />
Kopf/Spur/Sektor<br />
• prüfen, ob Gerät frei<br />
• nein: Anfrage speichern<br />
• ja: prüfen, ob Anfrage durchführbar<br />
(z.B. Motor eingeschaltet)<br />
IAIK 52
Treiberstruktur<br />
• Kontrolle: Sequenz von Befehlen<br />
an Controller schicken<br />
• Befehl in Steuerregister schreiben<br />
• dann im Statusregister prüfen, ob<br />
Befehl akzeptiert<br />
IAIK 53
Treiberstruktur<br />
• Serie von Befehlen:<br />
• einer nach dem anderen<br />
• verkettete Liste in Speicher,<br />
Controller liest Befehle aus<br />
• meist:<br />
• warten, bis Befehl ausgeführt<br />
Blockieren<br />
• manchmal:<br />
• Befehl gleich erledigt<br />
IAIK 54
Treiberstruktur<br />
• Wenn blockiert: irgendwann<br />
wieder aufgeweckt<br />
• Untersuchen, ob Fehler<br />
aufgetreten<br />
• eventuell Daten an aufrufende<br />
Software übergeben<br />
• Statusinfo an Aufrufer übergeben<br />
IAIK 55
Treiberstruktur<br />
• Treiber kann durch Interrupt des<br />
gesteuerten Geräts unterbrochen<br />
werden<br />
• Treiber wird wieder aufgerufen<br />
• muss daher reentrant<br />
(wiedereintrittsfähig sein)<br />
• muss erwarten, dass er aufgerufen<br />
wird, bevor ein Aufruf beendet ist<br />
IAIK 56
Sonderfälle<br />
• Treiber muss mit Entfernen des<br />
Gerätes umgehen können<br />
• aktuelle I/O abbrechen<br />
• wartende Anfragen entfernen<br />
• alle Aufrufer informieren<br />
• neue Geräte können dazukommen<br />
IAIK 57
Geräteunabhängige SW<br />
IAIK 58
Geräteunabhängige SW<br />
• Teile der I/O geräteunabhängig<br />
durchführbar<br />
• Funktionen (typisch)<br />
• <strong>Ein</strong>heitliches Interface<br />
• Pufferung<br />
• Fehlerbericht<br />
• Anforderung/Freigabe von Geräten<br />
• geräteunabhängige Blockgröße<br />
IAIK 59
Schnittstellen<br />
• <strong>Ein</strong>e Hauptaufgabe: einheitliche<br />
Darstellung unterschiedlicher I/O-<br />
Geräte <strong>und</strong> Treiber<br />
sonst BS bei jedem neuen Gerät<br />
neu anpassen!<br />
• Interface Treiber/Betriebssystem<br />
ein Aspekt davon<br />
IAIK 60
Schnittstellen<br />
IAIK 61
Schnittstellen<br />
• <strong>Ein</strong>heitliche Schnittstellen – Treiber<br />
leichter einbindbar<br />
• Abbildung Namen – Device<br />
allgemein möglich<br />
• Unix: /dev/xxx – special file<br />
• major/minor device number<br />
identifiziert Gerät<br />
• Schutzmöglichkeit über Standard-<br />
File-Mechanismen<br />
IAIK 62
Pufferung<br />
• Generell wichtig<br />
• Beispiel: Prozess<br />
will Zeichen von<br />
Modem lesen<br />
• Strategie 1:<br />
• ein Zeichen<br />
anfordern<br />
• Blockieren<br />
IAIK 63
Pufferung<br />
• Problem: pro Zeichen einmal<br />
Prozess starten – viele<br />
Kontextwechsel. Ineffizient<br />
• Variante 2:<br />
• Prozess stellt Puffer (n Zeichen)<br />
zur Verfügung<br />
• Lesebefehl für n Zeichen<br />
• Erst wenn Puffer voll, Prozess<br />
aufwecken<br />
IAIK 64
Pufferung<br />
• Effizienter<br />
• Nachteile: Pufferspeicher darf nicht<br />
ausgelagert sein Seiten „locken“<br />
• Wenn zu viele Seiten gelockt <br />
Menge der freien Seiten wird<br />
kleiner<br />
IAIK 65
Pufferung<br />
• Strategie 3:<br />
Puffer im<br />
Kernelspace<br />
• Wenn gefüllt: ev.<br />
Seite einlagern<br />
<strong>und</strong> Daten in<br />
Userspace<br />
kopieren<br />
IAIK 66
Pufferung<br />
• Problem: Was<br />
tun, wenn Daten<br />
ankommen,<br />
während kopiert<br />
wird?<br />
• Strategie 4:<br />
zweiter Puffer im<br />
kernel – doppelte<br />
Pufferung<br />
IAIK 67
Pufferung bei <strong>Ausgabe</strong><br />
• N Zeichen an Modem<br />
• Strategie 1: Prozess blockieren bis<br />
Daten weg – kann lange dauern!<br />
• Strategie 2: I/O parallel<br />
durchführen – wie weiß Prozess,<br />
wann I/O fertig ist?<br />
• Strategie 3: Daten in Kernel-Puffer<br />
kopieren <strong>und</strong> parallel bearbeiten<br />
IAIK 68
Fehlerbericht<br />
• Fehler sind bei I/O häufig<br />
• Viele Fehler gerätespezifisch –<br />
müssen vom Treiber behandelt<br />
werden<br />
• Wenn Treiber nicht weiß, was zu<br />
tun: Fehler an Software<br />
weiterreichen<br />
IAIK 69
I/O Software im User Space<br />
• Kleinerer Teil, zT<br />
Bibliotheken<br />
• I/O-Routinen (open,<br />
read, write, …)<br />
• Formatierung (printf)<br />
• Spooling-Systeme<br />
I/O<br />
Anforderung<br />
I/O-Antwort<br />
IAIK 70
Devices<br />
• nur ausgewählte Teile<br />
• Plattenspeicher<br />
• Timer<br />
• Terminals<br />
• Energieverwaltung<br />
IAIK 71
Plattenspeicher<br />
• Wesentliche Eigenschaft:<br />
Fehlertoleranz<br />
• z.T. auf Filesystemebene nötig<br />
(plötzliches Abschalten)<br />
• z.T. auf Hardwareebene<br />
IAIK 72
RAID<br />
• Red<strong>und</strong>ant Array of Inexpensive<br />
(Independent) Disks (Patterson<br />
1988)<br />
• mehrere zusammengeschaltete<br />
Platten, sieht für das System wie<br />
eine physische Festplatte aus<br />
IAIK 73
RAID 0<br />
• Festplatte in Strips zu k Sektoren teilen<br />
• striping<br />
• gut bei großen Anfragen – Parallele<br />
Bearbeitung schneller<br />
• Nachteil: Fehleranfällig<br />
IAIK 74
RAID 1<br />
• Platten werden dupliziert<br />
• mirroring<br />
• gute Ausfallssicherheit<br />
• mit RAID 0 kombinierbar (RAID 0+1)<br />
Strip 0<br />
Strip 3<br />
Strip 0<br />
Strip 3<br />
Strip 1<br />
Strip 4<br />
Strip 1<br />
Strip 4<br />
Strip 2<br />
Strip 5<br />
Strip 2<br />
Strip 5<br />
IAIK 75
RAID 4<br />
• XOR mehrerer Strips Paritätsstrip<br />
• Platte kaputt fehlende Bytes berechenbar<br />
• Sicherheitsgewinn, kein Performancegewinn –<br />
Parität muss neu berechnet werden (erfordert<br />
lesen der alten Daten <strong>und</strong> alten Parität)<br />
IAIK 76
RAID 5<br />
• verhindert Flaschenhals Parity-Platte<br />
• Parity-Info auf alle Platten verteilt<br />
IAIK 77
Fehlerbehandlung<br />
• Festplatten haben Defekte<br />
• Fehlerhafte Sektoren:<br />
read(write(X)) != X<br />
• Fehlerbehandlung<br />
• im Controller<br />
• im Betriebssystem<br />
IAIK 88
Fehlerbehandlung<br />
• Controller:<br />
• Liste fehlerhafter Sektoren auf Festplatte<br />
schreiben (Produktion)<br />
• fehlerhafte Sektoren durch Reservesektoren<br />
ersetzen<br />
IAIK 89
Fehler im Betrieb<br />
• transiente Fehler<br />
• verursacht durch feine Staubpartikel<br />
• erneutes Lesen funktioniert<br />
• Sektor wird kaputt: auf<br />
Reservesektor ausweichen<br />
• Verwaltung auch im Betriebssysem<br />
möglich<br />
IAIK 90
Stable Storage<br />
(Zuverlässiger Speicher)<br />
• Festplatten können Fehler machen<br />
oder kaputt werden<br />
• Weder Sicherungen noch RAID<br />
schützen vor Abstürzen beim<br />
Schreiben<br />
• Manchmal wichtig, dass Daten nie<br />
verloren gehen – geht nur mit<br />
<strong>Ein</strong>schränkungen.<br />
IAIK 91
Stable Storage<br />
• Eigenschaft:<br />
Schreibvorgänge werden korrekt<br />
oder nicht ausgeführt<br />
IAIK 92
Voraussetzungen<br />
• Schreibvorgang korrekt oder falsch<br />
• Fehler werden beim Lesen erkannt<br />
• korrekt geschriebener Sektor kann<br />
spontan fehlerhaft werden<br />
• Fehler auf einer Platte auf zweiter Platte<br />
frühestens nach Δt (1 Tag)<br />
• Prozessor kann beliebig ausfallen<br />
• Speicher kann 100% zuverlässig<br />
gemacht werden!<br />
IAIK 93
Stable Storage<br />
• Paar identischer Festplatten<br />
• korresponierende Blöcke bilden<br />
zusammen einen fehlerfreien Block<br />
• kein Fehler: Beide Blöcke gleich<br />
• Drei Operationen<br />
• stable write<br />
• stable read<br />
• crash recovery<br />
IAIK 94
stable write<br />
• Schreiben auf Laufwerk 1<br />
• Lesen <strong>und</strong> Überprüfen<br />
• ev. bis zu n mal wiederholen<br />
• eventuell Reservesektor<br />
• Schreiben auf Laufwerk 2<br />
• wie oben, bis funktioniert<br />
IAIK 95
stable read<br />
• lies Block von Laufwerk 1<br />
• falscher Fehlerkorrekturcode<br />
• Lesen wiederholen (n mal)<br />
• immer noch fehlerhaft: von Laufwerk<br />
2 lesen<br />
• Erinnerung: Annahme, dass nicht<br />
2 Blöcke zum gleichen Zeitpunkt<br />
kaputt werden<br />
IAIK 96
crash recovery<br />
• Nach Absturz: Durchsuchen beider<br />
Festplatten <strong>und</strong> Vergleich der<br />
Blöcke<br />
• Blöcke ident: passt<br />
• einer fehlerhaft: durch anderen<br />
überschreiben<br />
• korrekt aber unterschiedlich: Block<br />
LW 1 über den von LW2 schreiben<br />
IAIK 97
Prozessorabstürze<br />
IAIK 98
Uhren<br />
• wichtig für Funktion des<br />
Betriebssystems<br />
• Uhrzeit<br />
• ermöglicht preemption<br />
• wie Gerätetreiber<br />
• unterbricht in vorgegebenen<br />
Intervallen<br />
IAIK 99
Uhren-Software<br />
• Aufgaben<br />
• Verwalten der Uhrzeit<br />
• Unterbrechen von Prozessen<br />
• Buchführung Prozessornutzung<br />
• Behandlung des alarm-Syscalls<br />
• Timer<br />
• Profiling etc<br />
IAIK 100
Uhrzeit<br />
• Zähler, pro Tick Inkrementieren<br />
• 32 bit: Laufzeit nur etwa 2 Jahre<br />
• Lösungen<br />
• 64 bit: Inkrement aufwändiger<br />
• Sek<strong>und</strong>enteile in Hilfszähler, Sek<strong>und</strong>en in<br />
Hauptzähler 136 Jahre<br />
• Zeit ab Systemstart im Zähler, Basiswert<br />
dazuzählen alle 2 Jahre booten<br />
notwendig<br />
IAIK 101
Prozessunterbrechung<br />
• Uhr mit quantum laden<br />
• bei jedem tick dekrementieren<br />
• wenn 0: Scheduler aufrufen<br />
IAIK 102
Buchführung<br />
• zweite Uhr für Messungen<br />
• wenn Prozess unterbrochen: gibt<br />
an, wie lange Prozess aktiv war<br />
• Interruptbehandlungen sind dabei<br />
auszublenden<br />
• Zeitmessung wegen Interrupts nie<br />
exakt<br />
IAIK 103