17.01.2014 Aufrufe

Ein- und Ausgabe I/O

Ein- und Ausgabe I/O

Ein- und Ausgabe I/O

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!