Betriebssystemtheorie/ Einleitung

Aus Wikibooks

Wechseln zu: Navigation, Suche
Go-up.svg Hoch zum Inhaltsverzeichnis | Vor zu Hardwaregrundlagen Go-next.svg


Nuvola apps important.svg ACHTUNG: Dieser Artikel bedarf dringend einer Überarbeitung oder Erweiterung. Wenn du Lust hast, beteilige dich daran!


Inhaltsverzeichnis

[Bearbeiten] Was ist ein Betriebssystem?

Das Betriebssystem zwischen Hardware- und Software-Schicht

Das Betriebssystem ist das grundlegendste Programm eines Rechensystems. Es verwaltet die vorhandenen Hardware-Ressourcen und stellt sie dem Anwender beziehungsweise den Anwendungsprogrammen bereit. Es stellt den Anwendungsprogrammen bzw. deren Programmierern Schnittstellen zur Verwendung der Ressourcen und der grundlegenden Betriebssystem-Dienste bereit.

Meist ist ein Betriebssystem in unterschiedliche Schichten unterteilt. Grob gesehen einerseits in den Kernel, der nur die grundlegenden Mechanismen zum Ansprechen, Verwalten und Benutzen der Hardware beinhaltet und darauf aufsetzend dann die Schicht der System-Dienste die weitere Funktionalitäten bereitstellen.

Es wird außerdem unterschieden zwischen Ein-Benutzer und Mehr-Benutzer-, sowie Ein-Prozess- und Mehr-Prozess-Betriebssystemen (Multitasking). Falls ein Betriebssystem mehrere Benutzer und Prozesse zulässt, ist es auch die Aufgabe des Kernel eine faire und zeitlich begrenzte Zuteilung der Ressourcen an Anwender und Prozesse zu gewährleisten.

Die Hauptaufgabe des Betriebssystems aus Sicht des Programmierers ist die Abstraktion der unterliegenden Hardware. Die direkte Programmierung der Hardware mit Maschinensprache ist umständlich und komplex, daher werden die entsprechenden Routinen in den Betriebssystem-Kernel implementiert und dieser stellt dem Programmierer leichter zu handhabende Funktionen für deren Verwendung bereit. Das Betriebssystem vereinfacht also die zugrunde liegende Hardware des Rechners. Man sagt auch, es stellt eine Virtuelle Maschine bereit.

Eine weitere wichtige Aufgabe des Betriebssystems ist die Sicherheit. Es kann jedem Prozess garantieren, dass im Hauptspeicher gesicherte Daten nicht von einem anderem Prozess verändert werden können. Dadurch kann sichergestellt werden, dass kein Prozess durch andere Programme gezielt oder versehentlich gestört werden kann. Mit zunehmender Vernetzung der Rechner wird dieser Punkt immer wichtiger.

Begriffsklärungen in der Wikipedia: Kernel, Mehrbenutzersystem, Multitasking, Virtuelle Maschine

[Bearbeiten] Dienste des Betriebssystems

Damit ein Benutzer seine Anwendungen problemlos ausführen kann, muss das Betriebssystem einige Dienste zur Verfügung stellen. Leider gibt es keinen Konsens darüber, welche Dienste das genau sind und ob man sie im Kern implementiert oder als eigenständiges Benutzerprogramm ausführt. Im folgenden unterscheiden wir zwischen essentiellen Diensten, die immer im Kern sein müssen und erweiterten Diensten, die wahlweise im Kern- oder im Benutzermodus laufen können.

[Bearbeiten] Essentielle Dienste

Einige Funktionen benötigen Privilegien für den Zugriff auf Prozessorregister oder Hardwarekomponenten, die ein normales Programm nicht hat. Betriebssysteme, die versuchen, nur diese wenigen Funktionen im Kern zu implementieren nennt man Mikrokern-Systeme. Diese wesentlichen Dienste umfassen:

Verwaltung virtueller Adressräume
Hierbei geht es darum, jedem Programm einen separaten Teil des Arbeitsspeichers zuzuteilen. Diese Trennung ist einer der Grundpfeiler der Sicherheit im System und darf daher nur vom Kern ausgeführt werden. Eine Anwendung, die die Zuteilung ändern kann, könnte beliebig im Arbeitsspeicher lesen und schreiben und somit alle Sicherheitsmechanismen umgehen oder sogar sich selbst zum Betriebssystemkern machen.
Prozesse
Ein Prozess besitzt einen virtuellen Adressraum. Jeder Prozess kann nur jeweils auf seinen eigenen virtuellen Adressraum zugreifen.Ein Programm welches gestartet wird arbeitet als Prozess. Daten zwischen Prozessen können über einen gemeinsamen Speicher (Shared Memory) ausgetauscht werden (...). Jeder Prozess (in den heutigen Betriebsystemen Linux, Windows, OSX..) besitzt mindestens einen Thread, der im Adressraum des Prozesses agiert. Falls mehrere Threads vorhanden sind, arbeiten diese im Adressraum des Prozesses. Dadurch kann es zu Synchronisationsproblemen kommen.
Threads
Zum sicheren gleichzeitigen Ausführen mehrerer Programme müssen deren Threads isoliert werden. Zum einen geschieht dies schon durch die Trennung der virtuellen Adressräume (in Prozesse), zum anderen auch durch die Verwaltung der Threads im Kern.
Inter-Prozess Kommunikation (IPC)
Zum sinnvollen Arbeiten müssen Programme miteinander kommunizieren. Da sie normalerweise von einander isoliert sind, muss der Kern des Betriebssystems eine formale Möglichkeit bereitstellen, diese Trennung zu umgehen, falls Sender und Empfänger sich einig sind.
Hardwarezugriff
Programme benötigen Arbeitsspeicher und oft auch Peripherie. Für den Zugriff muss der Kern den Anwendungen und Gerätetreibern eine Möglichkeit bieten, um Speicher zu allozieren oder IRQ-Leitungen, IO-Speicher und DMA zu nutzen. Die Gerätetreiber selbst können aber als Benutzerprogramm laufen.

Beispiele für Mikrokern-Systeme sind L3- (Mach, GNU Hurd) und vor allem L4-Kernel (Fiasco, Hazelnut). Das L3-Design stellt die sogenannte 1. Generation von Mikrokernen dar und enthält neben dem Minimum an Diensten noch Gerätetreiber, Speicherverwaltung und Scheduler. Netzwerk, Dateisystem und andere höhere Dienste laufen aber bereits als Server im Benutzermodus.

Die 2. Generation der Mikrokerne wird durch L4 definiert. Dieses Design enthält nur die hier aufgeführten Dienste. In manchen Implementierungen, namentlich Fiasco, wurde der CPU-Scheduler in den Kern integriert, da die Server-Variante derzeit zu langsam ist.

[Bearbeiten] Weitere Dienste

Linux, Windows und viele andere Betriebssysteme integrieren zusätzlich zu den grundlegenden Diensten weitere Funktionen im Betriebssystemkern. Mögliche Gründe sind Geschwindigkeit bei der Verarbeitung, Kompatibilität zu bereits vorhandenen Systemen oder einfach Bequemlichkeit. Solche Systeme nennt man häufig monolithische Systeme.

Gerätetreiber
Treiber für Hardwaregeräte benötigen Zugriff auf IO-Bussysteme, Interrupt-Leitungen und DMA. Gerätetreiber im Kern zu implementieren ist sehr verbreitet, da die Privilegien für den Hardwarezugriff automatisch vorhanden sind. Mikrokern-Systeme bieten spezielle Mechanismen, um Benutzerprogrammen diesen Zugriff zu ermöglichen.
Dateisysteme
Diese Treiber organisieren die Speicherung von Daten auf Datenträgern. In UNIX-Systemen werden fast alle Teile des Systems durch Dateien dargestellt, einschließlich Hardwaregeräten, Systemparametern und Zugriffsrechten. Eine Implementierung im Kern bietet sich daher an.
Scheduler
Scheduler verteilt Ressourcen an Programme. Da Programme vom Kern verwaltet werden, liegt es nahe, auch die Scheduling-Algorithmen in Kern einzubauen. Da das Scheduling sehr häufig ausgeführt wird und noch niemand eine schnelle Möglichkeit gefunden hat, es in einen Benutzerprogramm zu implementieren, wird es häufig auch in Mikrokernen eingebaut.
Datenstrukturen für gegenseitigen Ausschluss
Viele Ressourcen sind nur begrenzt vorhanden: Dateien können nur von einem Programm zu einem bestimmten Zeitpunkt geschrieben werden, Soundkarten können nur ein Programm bedienen, usw. Beim gegenseitigen Ausschluss wird sichergestellt, dass nie mehr Nutzer als möglich eine Ressource belegen. Da dies sehr eng mit dem Scheduling verbunden ist, wird es oft auch im Kern implementiert, falls sich der Scheduler im Kern befindet.
Weitere Dienste
Im Kern befinden sich häufig auch Netzwerkprotokolle, graphische Oberflächen oder Druckdienste.

Viele heutige Betriebssysteme stammen vom monolithischen UNIX ab oder orientieren sich an dessen Design. Aus dieser Tradition heraus erklärt sich auch die Tatsache, dass die meisten dieser Systeme selbst ein monolithisches Design besitzen.

Ein interessanter Fall ist Windows NT. Die ursprüngliche Version 3.1 von NT war ein Mikrokern und ähnelt sehr dem Design von Mach. Da es allerdings vergleichsweise langsam lief, entschloss sich der Hersteller Microsoft dazu, einige Betriebssystemdienste vom Benutzermodus in den Kernmodus zu verlegen. Mit der Zeit wurde das System immer mehr zum Monolithen und gilt Vielen heutzutage als der Monolith schlechthin.

[Bearbeiten] Mikrokern vs. Monolith

Bis in die 1980er war die Welt noch in Ordnung. Es gab nur die monolithischen Systeme und UNIX beherrschte die (Betriebssystem-)Welt. Mit dem Michigan Terminal System tauchten Ansätze für Mikrokern-Systeme zwar schon in den 1960er auf, aber modern wurde die Idee vor allem durch Mach, einem Mikrokern, der ab 1985 an der Carnegie-Mellon-Universität entwickelt wurde. Seitdem gibt es einen ständigen Streit, ob und wie Treiber in einen Betriebssystemkern gehören. Dieser Streit wird bis Heute erbittert geführt und es ist auch kein Ende in Sicht. (Anm. des Autors: Die Diskussion ist zum Teil so verbissen, dass es eine endgültige Antwort auf diese Frage wohl erst geben wird, wenn sich die Vertreter beider Fraktionen auf einer Wiese treffen und der Letzte, der stehenbleibt, Recht bekommt. ;-) )

In vielen Fällen ist eine saubere Trennung gar nicht möglich. Soll man Mach zu den Monolithen zählen, da es Gerätetreiber im Kern enthält oder eher zu den Mikrokernen, da das Dateisystem als Server läuft und ab wann wurde eigentlich Window NT zum Monolithen? Die Antworten sind vielfältig und überwiegend egal. Als grobe Übersicht hier nochmal die Merkmale der beiden Typen.

Mikrokern-Systeme
Durch den kleinen Kern von teilweise weniger als 15.000 Zeilen Quelltext muss nur ein geringer Teil des Systems vertrauenswürdig sein. Außerdem ist es möglich, die Korrektheit der Implementierung zu beweisen. Zum Vergleich: Linux enthält 3-4 Millionen Zeilen Quelltext und Windows Vista geschätzte 50 Millionen. Die Aufteilung der Dienste auf Server ermöglicht ein sehr flexibles Anpassen des Systems an seine Umgebung. Man kann beliebig Server hinzufügen, weglassen oder verändern, ohne andere Dienste zu verändern. Allerdings hat es den Nachteil, dass die Designer sich schon sehr früh auf die Schnittstellen zwischen den Servern einigen müssen und diese Entscheidung später eventuell nur schwer rückgängig gemacht werden kann. Das größte Problem bei Mikrokern-Systemen ist die häufige Umschaltung zwischen Programmen während der IPC. Je nach Hardware kann das einige tausend Prozessortakte in Anspruch nehmen von Server A nach B zu gelangen; ohne dass man die eigentliche Aufgabe angegangen ist. Eine schnelle Implementierung des IPC ist daher unerlässlich. Mikrokern-Systeme sind theoretisch gut portierbar. Die Idee ist, dass nur der Kern für jede Hardware neu geschrieben werden muss, die Server hingegen unverändert weiterverwendet werden können.
Monolithische Systeme
Für viele Aufgaben benötigt man nur einen Wechsel in den Kernmodus (und einen zurück). Da sich alle Dienste im selben Adressraum befinden, können sie aufeinander zugreifen. Die langsame IPC entfällt. Da die Schnittstellen der Systeme in einem Programm sind, sind sie häufig leichter zu verwalten und zu ändern. Das macht es zumeist leichter einen Kern zu designen. Der Nachteil ist die Größe des Kerns, welcher durchaus einige Millionen Zeilen Quelltext erreichen kann. Vertrauenswürdige Systeme sind damit nur eingeschränkt konstruierbar. Ein Beweis auf Korrektheit ist absolut unmöglich. In der Theorie sind Monolithen nur schwer portierbar, da viel Quelltext an die Plattform angepasst werden muss.

Die meisten Vor- und Nachteile haben sich im Laufe der Jahr relativiert. Zum Beispiel ist Linux eines der portabelsten Betriebssysteme und die Geschwindigkeit des IPC in L4-Mikrokernen ist äußerst hoch. Mikrokern-Systeme behalten den Vorteil, dass sich die Korrektheit des Kerns beweisen lässt. Interessant ist dies für Systeme, die Verfügbarkeit garantieren oder sehr sensible Daten verarbeiten. Für den täglichen Einsatz im Büro oder als Spielcomputer ist das Systemdesign in weiten Teilen unerheblich.

[Bearbeiten] Kurzer Überblick über die grundlegenden Konzepte in Betriebssystemen

Da die grundlegenden Konzepte eines Betriebssystems sich an manchen Stellen überschneiden und nicht immer klar voneinander zu trennen sind, sollen sie in diesem Abschnitt für ein besseres Gesamtverständnis kurz und im Überblick erläutert werden. Die detaillierte Vertiefung der einzelnen Prinzipien findet dann im nächsten Abschnitt statt.

[Bearbeiten] Prozesse

Das Konzept des Prozesses kann durchaus als das grundlegendste in der Betriebssystem-Theorie angesehen werden. Ein Prozess ist das Abbild eines laufenden Programms im Speicher. Das heißt es wird für das Programm ein bestimmter (geschützter) Speicherbereich reserviert in dem u. a. folgende Daten gespeichert werden:

  • das Programm selbst
  • die aktuelle Position des Program Counters
  • im Programm verwendete Variablen
  • der Zustand der Prozessor-Register

Mancher wird sich fragen, wozu es nötig ist, den Inhalt der Prozessor-Register zu speichern. Die Erklärung ist folgende: Im Grunde wird jeder Prozess auf seinem eigenen Prozessor ausgeführt. Das ist natürlich in der Praxis nicht möglich (selbst auf großen Multi-Prozessor-Systemen), daher bekommt ein laufender Prozess den Prozessor für eine Weile zugeteilt und führt das zugehörige Programm aus. Wenn ihm nun vor dem Ablauf des Programms der Prozessor wieder entzogen wird, es also noch nicht wieder beendet ist, wird der komplette momentane Zustand des Programms mit allen oben genannten Daten im Speicher abgelegt und der Prozessor wird einem anderen wartenden Prozess zugeteilt, der wiederum seinen letzten Zustand lädt und an der Stelle fortfährt, an der ihm der Prozessor das letzte Mal entzogen wurde. Dies passiert auf heutigen Rechnern viele Male pro Sekunde, weshalb der Benutzer den Eindruck hat, dass mehrere Programme parallel ablaufen. Man spricht auch von Pseudo-Parallelität (wohingegen auf Multi-Prozessor-Systemen echte Parallelität erreicht werden kann), bzw. präemptivem Multitasking. Betriebssysteme die diese Arbeitsweise unterstützen heißen Multi-Tasking-Betriebssysteme (vom engl. task - Aufgabe, Anwendung), da sie mehrere "tasks" quasi "gleichzeitig" verarbeiten können.

Im Rahmen der Prozessverwaltung eines Betriebssystems dient der Dispatcher dazu, bei einem Prozesswechsel dem derzeit aktiven Prozess die CPU zu entziehen und anschließend dem nächsten Prozess die CPU zuzuteilen. Die Entscheidung, welcher Prozess der nächste ist, wird vom Scheduler im Rahmen der Warteschlangenorganisation getroffen. Unterbrechende Scheduler teilen die CPU von vornherein nur für eine bestimmte Zeitspanne zu und entziehen dem Prozess diese daraufhin wieder.

Die Aufgabe der CPU-Zuteilung übernehmen der Dispatcher und der Scheduler. Der Dispatcher dient dazu bei einem Prozesswechsel der CPU den laufenden Prozess zu entziehen und den neuen zuzuweisen. Der Scheduler ist für die Auswahl des zu aktivierenden Prozesses zuständig. Diese Auswahl läuft nach bestimmten Algorithmen, die später im Buch näher behandelt werden.

Begriffsklärungen in der Wikipedia: Prozess, Scheduler, Präemptives Multitasking

[Bearbeiten] Speicherverwaltung

Die Speicherverwaltung ist sehr wichtig für das Betriebssystem und deren Prozesse oder Threads, da es nur einen Arbeitsspeicher im Computer gibt, kurz RAM genannt. Der RAM hat eine feste Größe, zum Beispiel 128 MB, die dem gesamten Betriebssystem zur Verfügung steht. Eine Applikation benötigt für sich selbst etwas RAM (da das Programm in den Hauptspeicher hinein geladen wird, um ausführbar zu sein) und Arbeitsspeicher, der nur der Applikation zur Verfügung steht und eine veränderliche Größe für zum Beispiel gerade in Bearbeitung befindlicher Dateien haben muss. Wenn mehrere Applikationen (Prozesse) zur selben Zeit laufen, benötigen alle verschieden viel Speicherplatz, der vom Betriebssystem zur Benutzung freigegeben werden muss. Wenn der Benutzer sehr viel zur gleichen Zeit bearbeitet und viele Programme offen hat, kann es passieren, dass der benötigte Speicherplatz der Programme größer ist als der zur Verfügung stehende RAM. Wenn dieser Fall eintreten sollte, stürzt der Computer ab. Damit dies nicht passiert, werden einige gerade nicht häufig gebrauchte Dateien, die im RAM eingelagert sind, auf die Festplatte ausgelagert. Die im RAM freigewordenen Speicherbereiche können für eventuelle Applikationen zur Verfügung gestellt werden. Wenn die auf der Festplatte zwischengespeicherten Dateien wieder gebraucht werden, müssen sie sofort wieder ins RAM eingelagert werden. Ist kein Platz im RAM verfügbar, müssen wieder andere, nicht mehr benötigte Dateien aus dem RAM auf die Festplatte ausgelagert werden, um den RAM für die Datei freizuschaufeln. In extremen Belastungssituationen des Betriebssystems kann es abhängig von der BS-Implementierung zum "Abschuss" besonders speicherintensiver Prozesse kommen, damit die Arbeitsfähigkeit des Systems erhalten bleibt. (Bei weit verbreiteten Microsoft-Produkten nicht üblich).

Begriffsklärungen in der Wikipedia: RAM

[Bearbeiten] Ein-/Ausgabe

Die Ein- und Ausgabe von Daten aller Art ermöglicht erst die Interaktion mit den Programmen und dem Betriebssystem selbst. Zur Dateneingabe gibt es die Eingabegeräte, die Daten vom Benutzer entgegennehmen und sie an den PC weiterschicken, die Ausgabegeräte machen das selbe genau umgekehrt (Der PC sendet an sie die vom Betriebssystem und seinen Programmen erzeugten Daten).

Typische Eingabegeräte:
Tastatur
Maus
Scanner

Typische Ausgabegeräte:
Bildschirm
Drucker

[Bearbeiten] Dateiverwaltung

Jede Festplatte hat ein Verzeichnis, das in einer ordnerähnlichen Struktur aufgebaut ist, in dem die Festplattenpositionen der einzelnen Dateien mit einem Namen gespeichert sind. Wenn der Benutzer eine Datei direkt öffnet, oder indirekt durch Laden eines Programmes, schaut das Betriebssystem in der Zuordnungstabelle nach, wo sich die Datei auf der Festplatte befindet. Dann wird die Datei in einen reservierten Platz im RAM geladen und in der RAM-Tabelle für das Betriebssystem eingetragen, damit es weiß, wo sich die Datei im RAM befindet und welche Größe sie hat, welche Dateiendung, ob sie noch von einem Prozess gebraucht wird oder reserviert ist, wie groß sie ist usw. Wenn die Datei ordnungsmäß geladen wurde, wird sie für alle Prozesse oder nur für den einen Prozess freigeschaltet, so dass das Programm die Datei benutzen kann.

Beim Speichern einer Datei geschieht fast das Gleiche, nur etwas anders und umgekehrt (vom RAM auf die Festplatte).

[Bearbeiten] Weiterführende Informationen

[Bearbeiten] Links

Persönliche Werkzeuge