Input/Output
Zu den Hauptaufgaben eines Betriebssystems gehört die Steuerung und Überwachung aller Input/Output-Geräte. Es müssen Befehle an die Geräte gesendet werden, Antworten von ihnen empfangen werden und es muss mit eventuell auftretenden Fehlern in geeigneter Weise umgegangen werden. Zusätzlich stellt das Betriebssystem eine Schnittstelle zu den Geräten zur Verfügung, die nach Möglichkeit für alle Geräte einigermaßen einheitlich sein sollte (Geräteunabhängigkeit).
Diese Ausarbeitung zum Thema wird sowohl die Hardware- als auch die Softwareseite des I/O-Systems beleuchten und diese am Ende an einem Beispiel erläutern.
I/O-Hardware
Bei Input/Output-Geräten kann zwischen zeichen- und blockorientierten Geräten unterschieden werden. Blockorientierte Geräte sind adressierbar, das heißt, man kann wahlfrei auf sie zugreifen. Festplatten und Disketten zählen neben anderen dazu. Die zeichenorientierten Geräte sind im Gegensatz dazu nicht adressierbar und es wird sequentiell auf sie zugegriffen. Beispiele für zeichenorientierte Geräte sind Terminals, Drucker, Magnetbänder ... Diese Trennung in zeichen- und blockorientiert stößt aber auch an ihre Grenzen. So gibt es Geräte, die sich in keine der beiden Kategorien einordnen lasssen, wie beispielsweise der Bildschirm oder auch Uhren. Daneben gibt es auch noch Möglichkeiten, zeichenorientierte Geräte als blockorientiert zu betrachten und umgekehrt. So ist es z.B. möglich, auf Magnetbänder mittels eines Filesystems (also mit einer abstrakten Schnittstelle) blockorientiert zuzugreifen.
Input/Output-Geräte bestehen meistens aus mechanischen und elektronischen Teilen. Diese Trennung ermöglicht eine Modularisierung. Der mechanische Teil ist zum Beispiel die Festplatte, während der elektonische Teil durch das Steuerwerk (Controller) repräsentiert wird. Das Steuerwerk ist über ein Kabel mit dem eigentlichen Gerät verbunden und oftmals bedient ein Steuerwerk mehrere Geräte (siehe z.B. IDE-Controller).
Das Betriebssystem "sieht" meist nur den Controller und muss in den meisten Fällen nichts über das eigentliche Gerät "wissen". Das bedeutet, dass das Betriebssystem seine Kommandos (zum Beispiel Anfragen zum lesenden Zugriff) nur an den Controller schickt und auch von ihm entsprechende Antworten bekommt. Das Steuerwerk hat die Aufgabe, den seriellen Datenstrom von den Geräten in Byte-Blöcke zu konvertieren und eine erste Fehlerbehandlung zu realisieren, also eventuell die Daten neu von der Platte zu lesen. Die Byte-Blöcke werden im Controller gepuffert und anschließend in den Hauptspeicher des Rechners kopiert (wer das macht, wird später geklärt).
Der Controller besitzt einige Register zur Kommunikation mit der CPU. Diese können entweder im normalen Adressraum liegen (z.B. bei Prozessoren der Reihe 680x0). Dann wird von memory-mapped I/O gesprochen. Andere Rechnerarchitekturen haben dagegen einen speziellen Adressraum für die I/O-Register. Das ist unter anderem beim Z80 und auch bei 80x86 und kompatiblen der Fall.
Die Kommunikation des Prozessors mit einem Controller soll im Folgenden kurz skizziert werden (siehe auch Abb. 1, Folie 2). Der Prozessor sendet an das Steuerwerk Kommandos und möglicherweise auch entsprechende Parameter, indem er sie in die erwähnten I/O- Register schreibt. Der Controller kann diese Kommandos akzeptieren - das teilt er dem Prozessor mit, der sich dann anderen Aufgaben zuwenden kann. Der Controller führt dann die Kommandos in geeigneter Weise aus und signaliesiert dem Prozessor die Beendigung seiner Aufgabe (also, wenn zum Beispiel geforderte Daten von der Festplatte gelesen worden sind) durch einen Interrupt. Die CPU liest dann die Ergebnisse aus den I/O-Registern.
Bei Speichermedien wie Festplatten oder CD-ROM-Laufwerken gibts es zwei verschiedene Möglichkeiten, Daten vom Gerät in den Hauptspeicher zu bekommen (oder umgekehrt). Der einfachere Ansatz ist, dass der Controller die Daten in einem eigenen Speicher puffert und es dem Prozessor überlässt, sie von dort abzuholen. Dabei ist der Prozessor dann mit dem Kopieren der Daten beschäftigt. Eine andere Möglichkeit ist, dass der Controller die Daten, die er gepuffert hat, selbst an eine ihm vorher mitgeteilte Stelle des Hauptspeichers schreibt und die Beendigung dieser Aufgabe dann der CPU mitteilt. Dieses Verfahren wird Direct Memory Access, oder kurz DMA, genannt. Der Vorteil von DMA ist, dass der Prozessor von der Notwendigkeit befreit wird, sich um diese Datenübertragung zu kümmern. Dadurch erhält der Prozessor die Möglichkeit, andere Aufgaben zu bewältigen (Rechnen statt Datenschaufeln).
I/O-Software
Die Software für die Behandlung von Input/Output ist schichtweise aufgebaut, wobei die unteren Schichten die Eigenschaften der Hardware vor den oberen Schichten zu verbergen suchen, und dadurch dem Benutzer eine einheitliche Schnittstelle zu unterschiedlichen Geräten anbieten. Im Folgenden wird von einer Unterteilung in vier Schichten ausgegangen.
Die vier Schichten sind die Unterbrechungsbehandlung, die Gerätetreiber, geräte-unabhängige Betriebssystemsoftware sowie die Benutzer-Software.
Die Unterbrechungsbehandlung (Interrupt handling) ist dafür zuständig, Prozesse, die sich nach Veranlassung einer I/O-Aktion selbst blockiert haben, wieder "aufzuwecken", wenn die I/O-Aktion beendet ist und die Ergebnisse bereitstehen. Das heisst, dass der Prozess dann irgendwann (wenn ihm wieder Rechenzeit zusteht) fortgesetzt wird.
Die verschiedenen Gerätetreiber sind die einzigen Teile des Betriebssytems, die spezielle Informationen über die einzelnen Geräte haben müssen. Die Treiber schaffen eine einheitliche Schnittstelle zwischen der eigentlichen Hardware und der geräteunabhängigen Software. Die Treiber nehmen Anfragen für die Geräte entgegen. Diese Anfragen können dann entweder sofort bearbeitet werden oder aber in eine Warteschlange eingereiht werden, die nach entsprechenden Kriterien später abgearbeitet wird. Die abstrakten Anfragen der geräteunabhängigen Software werden von den Gerätetreibern in Kommandos übersetzt, die die Controller verstehen können.
Die nächsthöhere Schicht ist dann die geräteunabhänhgige Software, die Benutzerprogrammen eine einheitliche Schnittstelle zu den Treibern bietet (unter Unix werden z.B. fast alle Geräte über die Spezialdateien /dev/* angesprochen). Von der Software in dieser Schicht wird auch die Zuteilung und Freigabe von Geräten realisiert, also unter Unix z.B. der Zugriffsschutz für bestimmte Benutzer(-gruppen). Ebenfalls hier werden die Fehlermeldung, die die Benutzer bekommen, vereinheitlicht. Diese Schicht soll also die Verschiedenartigkeit der Geräte verbergen (bei Festplatten z.B. Anzahl der Sektoren, Blockgröße ...) Teil der geräteunabhängigen Software sind auch Algorithmen zum Auffinden freier Blöcke auf Speichermedien.
Die Benutzer-Software besteht aus Bibliotheksroutinen fuer den Zugriff auf die Hardware und aus Spoolingsystemen. Die Bibliotheksroutinen sind eine abstrakte Schnittstelle zu den Systemroutinen (die Ausgabefunktion printf(3) greift z.B. unter anderem auf die Systemroutine write(2) zu (zumindest in Unix, andere Systeme kenne ich nicht näher)). Das Spoolingsystem wird z.B. bei Druckaufträgen und bei Mailsystemen verwendet. Spooling ist eine Möglichkeit, in einem Multiprogrammsystem exklusiv benutzbare Geräte zu handhaben. Dabei wird die das Gerät repräsentierende Spezialdatei vom Benutzer-Programm nicht direkt angesprochen. Stattdessen wird der Auftrag (z.B. der Druckauftrag) einem besonderen Prozess (Dämon) übergeben, der die verschiedenen Aufträge nacheinander an die Geräte weiterleitet.
Beispiel
Im Folgenden sollen Festplatten beispielhaft für ein I/O-System betrachtet werden. Von Seiten der Hardware aus sind Festplatten organisiert in Zylinder, Spuren und Sektoren. Jeder Zylinder enthält soviele Spuren, wie Schreib-Lese-Köpfe vorhanden sind. Alle Spuren sind unterteilt in Sektoren und die Anzahl der Sektoren liegt in der Regel zwischen 8 und 32. Alle Sektoren enthalten die gleiche Anzahl Bytes, obwohl die Sektoren am äußeren Rand länger sind als die inneren. Eine wichtige Eigenschaft von Controllern ist, dass sie die Fähigkeit haben, gleichzeitig auf mehreren Festplatten Suchvorgänge auszuführen. (Es sei daran erinnert, dass ein Steuerwerk mehrere Geräte bedienen kann.) Es wird in diesem Zusammenhang von überlappenden Suchvorgängen (overlapped seeks) gesprochen. Das Steuerwerk kann auf einer Platte einen Suchvorgang starten, während es noch auf die Beendigung des Suchvorgangs auf einer anderen Platte wartet. Unter Suchvorgang ist dabei die Bewegung des Plattenarms von einem Zylinder zu einem anderen zu verstehen. Während es viele Steuerwerke gibt, die Daten von einer Platte lesen oder auf sie schreiben können und gleichzeitig auf einer anderen Platte einen Suchvorgang durchzuführen, gibt es kein Steuerwerk, dass auf mehreren Platten gleichzeitig lesen oder schreiben kann.
Eine Anfrage an das Steuerwerk könnte lauten "Gib mir die Daten aus Sektor x, Spur y, Zylinder z!" Der Controller muss nun den Plattenarm vom aktuellen Zylinder an den geforderten Zylinder bewegen, dort warten, bis die sich drehende Platte so eine Lage hat, dass der Sektor x unter dem Schreib-Lese-Kopf vorbei kommt und die Daten dort auslesen. Anschließend müssen die Daten in den Hauptspeicher übertragen werden. Die Zugriffszeit setzt sich also zusammen aus der Zeit für die Armbewegung, der Umdrehungsverzögerung sowie der Übertragungszeit. Gegenwärtig dominiert noch die Zeit für die Armbewegung, also sollte sie optimiert werden. Das heissst, bei Betriebssystemen, die jeweils nur einen Prozess gleichzeitig verarbeiten können, also bei solchen Systemen, wo immer nur eine Anfrage auf einmal an das Steuerwerk kommt, ist eine Optimierung der Zugriffszeit nicht möglich. (Zumindest nicht während des Zugriffs. Beim Speichern können die Daten eventuell strategisch abgelegt werden, dass schnell auf sie zugegriffen werden kann, aber das soll hier nicht näher betrachtet werden.) Hingegen bei Multiprozesssystemen, bei denen verschiedene Prozesse gleichzeitig Anfragen an die Hardware stellen, kann die mittlere Zugriffszeit über die Reihenfolge der Abarbeitung der Anfragen optimiert werden. Bei Systemen, wo Plattenanfragen eintreffen können während vorangegangene noch abgearbeitet werden, werden die neuhinzukommenden in Tabellen verwaltet. Verschiedene Plattenarm-Scheduling- Algorithmen sollen erläutert werden.
Der einfachste Algorithmus bedient sich der Strategie First-Come, First-Serve (FCFS). Das bedeutet, dass die Anfragen in der Reihenfolge ihres Eintreffens behandelt werden. Dieser Algorithmus ist sehr gerecht, aber da der Plattenarm zuweilen recht große Strecken hintereinander zurücklegen muss und damit die Zugriffszeit groß ist, ist er nicht optimal, sprich, er ist langsam.
Eine andere Strategie ist es, aus den gegenwärtig in der Tabelle gespeicherten Plattenanfragen, jene zur nächsten Bearbeitung auszuwählen, die zum aktuellen Zylinder am nächsten liegt. Diese Strategie wird Shortest seek first (SSF) genannt. Das Problem bei diesem Algorithmus ist, dass sich bei stark belasteten Festplatten der Arm die meiste Zeit bei den mittleren Zylindern aufhält (mittlere Zylinder meint nicht jene, die der Spindel an nächsten sind, sondern solche, die in der Mitte zwischen dem äußeren Rand und dem Zentrum der Platte liegen). Dieser Algorithmus ist nicht gerecht, da Anfragen für innere oder äußere Zylinder tendenziell sehr spät bearbeitet werden.
Ein Problem, dass dem Festplatten-Scheduling ähnlich ist, gibt es auch bei Aufzügen. Die dort verwendete Strategie, schnell ans Ziel zu kommen, lässt sich auch auf Festplatten anwenden. Man spricht vom Aufzugsalgorithmus (elevator algorithm). Dabei bewegt sich der Plattenarm nur in eine Richtung und hält bei den Zylindern an, für die es in der Tabelle Anfragen gibt. Wenn es in der aktellen Beweungsrichtung keine unerfüllten Anfragen mehr gibt, dann wechselt er seine Richtung. Eine positive Eigenschaft des Aufzugsalgorithmus ist, dass es bei ihm eine obere Grenze der Summe der Armbewegungen gibt, die gleich der doppelten Anzahl der Zylinder ist.
Eine Abwandlung des Aufzugsalgorithmus, die eine geringere Varianz der Antwortzeit hat, ist, den Plattenarm stehts in die selbe Richtung zu bewegen und, an einem Ende angekommen, zum anderen Ende zu bewegen ohne dabei Plattenanfragen zu behandeln.
Einige moderne Steuerwerke gestatten die Abfrage der Nummer des Zylinders, der sich aktuell unter dem sich bewegenden Arm befindet. Mit solchen Controllern sind weitere Optimierungen möglich.
Durch neue Plattentechnologie verringerte sich die Dauer von Suchvorgängen, während die Umdrehungsverzögerung konstant blieb (es gibt physikalische Grenzen für die maximale Drehzahl). Es ist desshalb abzusehen, dass die Umdrehungsverzögerung die dominierenden Kosten bei bei der Zugriffszeit verursachen wird. Dann wird es notwendig, die Algorithmen so anzupassen, dass auch die aktuelle Umdrehungsposition berücksichtigt wird.
Folien
Abbildung in dieser Leseprobe nicht enthalten
- Arbeit zitieren
- Sascha Schimke (Autor:in), 2000, Input-/Output-System in Betriebssystemen, München, GRIN Verlag, https://www.grin.com/document/96618
-
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen. -
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen. -
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen. -
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen. -
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen. -
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen. -
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen.