Überblick über Betriebssysteme: Funktionen und Konzepte
Classified in Informatik
Written at on Deutsch with a size of 78,8 KB.
Grundlagen von Betriebssystemen
Das Betriebssystem besteht im Wesentlichen aus Managern für Ressourcen wie:
- Den Prozessor
- Den Speicher
- Die Eingabe/Ausgabe (E/A)
- Kommunikationsgeräte
Einige der Funktionen, die das Betriebssystem ausführt, sind:
- Bereitstellung der Benutzeroberfläche
- Ermöglichen des gleichzeitigen Zugriffs mehrerer Benutzer auf eine Ressource
- Ermöglichen des Datenaustauschs zwischen Benutzern
- Steuerung der Eingabe/Ausgabe, wie z. B. einer Festplatte oder eines Druckers
- Abrechnung der Ressourcennutzung durch Prozesse und Benutzer
- Verwaltung der Kommunikation
- Organisation der Datenspeicherung für einen sicheren und schnellen Zugriff
- Planung und Überwachung der Ausführung von Prozessen und Aufgaben
Betriebsarten des Systems
Betriebsarten des Systems: Stapelverarbeitung (Batch) und Echtzeit (Real-Time).
Die Arbeiten, die auf einem Computer ausgeführt werden, können vom Standpunkt der Prozessorauslastung und der Nutzungszeit von Peripheriegeräten eingestuft werden in:
- Prozessgebundene Aufträge: Solche, die die meiste Zeit mit der Verarbeitung von Informationen verbringen und wenig Eingabe/Ausgabe benötigen.
- Eingabe-/Ausgabe-gebundene Aufträge: Solche, die den Großteil ihrer Zeit mit Eingabe/Ausgabe verbringen, sodass der Prozessor wenig genutzt wird und für lange Zeiträume im Leerlauf bleibt.
Diese zweite Art von Prozess führte zur Technik des Multiprogrammings, bei der der Prozessor im Leerlauf genutzt wird, während ein Prozess auf Eingabe/Ausgabe wartet, um einen anderen Prozess auszuführen.
Aus der Sicht der einzelnen Prozesse, die alle virtuell von einem Prozessor bedient werden, scheint es, als könnten sie gleichzeitig laufen. In Wirklichkeit wird jedoch jeder Prozess gleich behandelt, indem ständig von einem zum anderen gewechselt wird.
Aus der Sicht des Benutzers wird angenommen, dass die Prozesse parallel laufen, ohne zu berücksichtigen, dass zu jedem Zeitpunkt nur einer von ihnen bedient wird.
Dieses System bringt mehrere Probleme mit sich:
- Der Zugriff auf den Prozessor muss Regeln oder Richtlinien folgen, die die Ausführung aller Aufträge ermöglichen.
- Es ist eine Art Speicherverwaltung notwendig, da sich alle Aufträge den Speicher teilen müssen.
- Mehrere Prozesse benötigen möglicherweise gleichzeitig exklusiven Zugriff auf eine Ressource, was zu Konkurrenzproblemen führt.
Stapelverarbeitung (Batch)
Batch-Systeme sind als Multiprogramm-Systeme konzipiert, die während der Ausführung der Arbeit kein Eingreifen des Benutzers erfordern. In diesem Fall werden lange Aufträge im Allgemeinen in eine Warteschlange nach dem FIFO-Prinzip (First In, First Served) gestellt. Abhängig von der Systemlast werden mehrere dieser Prozesse „gleichzeitig“ ausgeführt.
Das Betriebssystem, das mit dieser Technik arbeitet, verwaltet nicht nur direkt die Warteschlange, sondern ist auch dafür verantwortlich, die Aufträge aus der Warteschlange zu nehmen, auszuführen und ihre Ergebnisse zu speichern, um dem Benutzer nach Abschluss gültige Unterstützung zu bieten.
Zeitteilbetrieb (Time Sharing)
Das interaktive Multiprogramming wurde durch die Erfindung interaktiver Terminals (Bildschirm-Tastatur) entwickelt. Mit diesen musste der Benutzer nicht mehr alle Daten zu Beginn der Ausführung liefern, sondern konnte sie nach Bedarf eingeben und erhielt eine sofortige Antwort.
Diese Art der Arbeit wird in Sitzungen organisiert. Eine Sitzung umfasst die gesamte Arbeit, die ein Benutzer am Computer durchführt, bis er sich abmeldet.
Während dieser Sitzungen kann ein Benutzer viele Operationen ausführen, die von einem Prozess namens Shell gesteuert werden, der den Dialog zwischen dem Benutzer und dem Betriebssystem aufrechterhält.
Während einer Sitzung hat der Benutzer den Eindruck, alle Ressourcen der Maschine zur Verfügung zu haben, obwohl gleichzeitig auch andere Benutzer mit aktiven Sitzungen arbeiten.
Time-Sharing-Systeme sind gekennzeichnet durch:
- Sie sind dialogorientiert (konversationell).
- Sie bedienen mehrere Nutzer gleichzeitig.
- Sie haben relativ kurze Reaktionszeiten (Sekunden).
- Sie pflegen eine sequentielle Abfrage von Benutzeranfragen (Polling).
- Sie besitzen eine starke Dateiverwaltung.
- Sie verwenden Puffer- und Spooling-Techniken.
- Sie verwalten virtuellen Speicher.
Im Allgemeinen enthalten aktuelle Betriebssysteme in der Regel sowohl Stapelverarbeitungs- als auch Time-Sharing-Techniken, sodass jeder Anwender das für seine Prozesse geeignete System wählen kann.
Echtzeit (Real-Time)
Echtzeit ist eine weitere Form von Multiprogramm-Betriebssystemen. Sie wird oft verwendet, um dedizierte Systeme zur Steuerung von Anwendungen mit Sensoren auszuführen, bei denen eine sehr geringe Ansprechzeit erforderlich ist.
Die wichtigsten Merkmale der Echtzeit sind:
- Erhebliche Beschränkungen für die Reaktionszeit (im Millisekundenbereich).
- Die Informationen müssen ständig aktualisiert werden.
- Das System muss praktisch im Leerlauf bleiben, um so schnell wie möglich auf jedes Ereignis am Eingang reagieren zu können.
- Effektives Management von Unterbrechungen (Interrupts).
- Einfache Verwaltung von Prioritäten.
- Management des realen Speichers.
Beispiele für solche Betriebssysteme sind die Steuerung industrieller Prozesse, Reservierungssysteme, Bestandsmanagement, Satellitenstarts usw.
Arten von Betriebssystemen
Die verschiedenen Möglichkeiten, wie ein System genutzt und Prozesse ausgeführt werden können, hängen von der Anzahl der Benutzer, der Anzahl der gleichzeitig laufenden Prozesse, der Anzahl der Prozessoren und der benötigten Reaktionszeit ab.
Nach Anzahl der Benutzer
- Einzelbenutzer (Single-User): Nur ein Benutzer kann gleichzeitig mit dem Computer arbeiten. Alle Systemressourcen stehen ihm zur Verfügung.
- Mehrbenutzer (Multi-User): Mehrere Benutzer können gleichzeitig verschiedene Prozesse ausführen und die vorhandenen Systemressourcen teilen.
Nach Anzahl der Prozesse
- Einzelprogrammierung (Single-Tasking): Es kann nur ein Prozess ausgeführt werden. Erst nach dessen Abschluss kann der nächste gestartet werden.
- Mehrprogrammierung (Multitasking): Es können gleichzeitig mehrere Prozesse ausgeführt werden. Diese Prozesse teilen sich die Zeit auf dem Prozessor oder den Prozessoren bis zum Abschluss jedes einzelnen.
Nach Anzahl der Prozessoren
- Einprozessor (Uniprozessor): Nur ein einzelner Prozessor ist installiert. Alle Prozesse durchlaufen denselben Prozessor.
- Mehrprozessor (Multiprocessor): Mehrere Prozessoren sind in einem Computer installiert. Entweder wird derselbe Auftrag von mehreren Prozessoren bearbeitet oder, häufiger, jeder Prozessor bearbeitet einen anderen Auftrag.
Nach Reaktionszeit
- Echtzeit (Real-Time): Die Ansprechzeit für die Anforderung der sofortigen Ausführung eines Prozesses ist sehr kurz.
- Zeitteilbetrieb (Time-Sharing): Die Zeit bis zur Lösung eines Prozesses hängt von den anderen laufenden Prozessen ab. Jeder Prozess verbraucht nur einen Bruchteil der zugewiesenen Zeit (Zeitscheibe). Nach Ablauf dieser Zeit wird ein anderer Prozess ausgeführt. Ein Prozess benötigt so viele Zeitscheiben, wie er zur Fertigstellung braucht, wobei jede in seinem zugewiesenen Zeitfenster ausgeführt wird.
- Stapelverarbeitung (Batch): Prozesse, deren Ergebnisse nicht unmittelbar benötigt werden. Sie werden mit sehr niedriger Priorität ausgeführt und nutzen die Zeiten, in denen der Prozessor sonst untätig wäre (z. B. nachts).
Architekturkomponenten von Betriebssystemen
Monolithische Systeme
Das Betriebssystem wird als eine Reihe von Prozeduren erstellt, die getrennt kompiliert und zu einer einzigen ausführbaren Datei verbunden werden.
Jede Prozedur ist darauf ausgelegt, eine bestimmte Aufgabe zu erfüllen, und jede definiert eine Schnittstelle, über die sie andere Prozeduren aufrufen kann.
Hierarchische Systeme (Schichtenmodell)
Das Betriebssystem wird in eine Reihe von Schichten oder Ebenen um einen Kern herum aufgeteilt. Jede Schicht hat eine bestimmte Funktion und Priorität. Der Kern (Kernel) führt grundlegende Operationen durch, fast direkt auf den physischen Elementen. Die folgenden Schichten bauen auf diesem Kern auf und nähern sich dem Benutzer an. Funktionen in höheren Schichten (näher am Benutzer) haben eine niedrigere Priorität als Funktionen in tieferen Schichten (näher am Kern).
Im Allgemeinen kann eine solche Struktur in vier Schichten unterteilt werden:
- Kern-Ebene (Kernel Level): Wird beim Start des Computers geladen und kontrolliert alles, was geschieht. Verwaltet die auszuführenden Prozesse. Dies sind meist Mehrbenutzer-Betriebssysteme. Diese Ebene ist für grundlegende Aufgaben wie die Kommunikation mit der Hardware, Prozessplanung usw. verantwortlich.
- Exekutive Ebene (Executive Level): Auf dieser Ebene erfolgt die Administration und Verwaltung des Speichers.
- Supervisor-Ebene (Supervisor Level): Verantwortlich für die Kommunikation zwischen dem System und dem Benutzer für jeden Prozess. Steuert und koordiniert die Eingabe/Ausgabe der verschiedenen Prozesse zu den Peripheriegeräten.
- Benutzer-Ebene (User Level): Die Prozesse, die der Benutzer verwendet, ohne sich um Speicherverwaltung, E/A-Management oder andere Systemdetails kümmern zu müssen.
Eine andere Möglichkeit, diese Art von System zu betrachten, ist in Form von konzentrischen Ringen. In diesem System hat jeder Ring „Tore“, durch die höhere Schichten Aufrufe an tiefere Schichten tätigen können. Auf diese Weise sind die inneren Schichten privilegierter und vor unerwünschten Zugriffen von außen geschützt.
Diese Struktur wird in den meisten praktischen Betriebssystemen verwendet.
Virtuelle Maschinen
VM/370 war das erste Betriebssystem vom Typ Virtuelle Maschine. Es ist ein Time-Sharing-System, das bietet:
- Multiprogrammierung und
- Eine erweiterte Maschine (virtuelle Maschine) mit einer Schnittstelle, die besser geeignet ist als die reine Hardware.
Das Wesen von VM/370 besteht darin, diese beiden Funktionen vollständig zu trennen.
Client-Server-Modell
Dies ist die neueste Art von Betriebssystemarchitektur, die auf jeder Art von Maschine (groß oder klein) verwendet werden kann. Sie basiert auf der Idee, den Großteil des OS-Codes in höhere Ebenen zu verlagern, sodass nur ein minimaler Kern (Mikrokernel) übrig bleibt. Die Methode besteht darin, die meisten Funktionen des Betriebssystems als Benutzerprozesse (Server) zu implementieren.
Ein Benutzerprozess (Client-Prozess), der z. B. aus einer Datei lesen möchte, sendet eine Nachricht an einen Server-Prozess, der die Arbeit erledigt und die Antwort liefert. Währenddessen verwaltet der Kernel lediglich die Kommunikation zwischen Client- und Server-Prozessen.
Diese Art von Betriebssystem bietet Mechanismen für Speicherverwaltung, Prozessverwaltung (Prozesse können sowohl Clients als auch Server sein) und für die Kommunikation zwischen Prozessen.
Ein weiterer Vorteil des Client-Server-Modells ist, dass es in verteilten Systemen verwendet werden kann.
Wenn ein Client über Nachrichten mit einem Server kommuniziert, muss der Client nicht wissen, ob die Nachricht von der eigenen Maschine stammt oder über ein Netzwerk von einer entfernten Maschine gesendet wurde.
In beiden Fällen, verteilt oder nicht, sendet der Client eine Anfrage und erhält eine Antwort.
Systemsicherheit
Anwendungsprogramme sind nicht frei von Fehlern, und Systeme sind nicht frei von böswilligen Benutzern. Daher muss das Betriebssystem Schutzfunktionen enthalten, um Probleme zwischen Prozessen sowie zwischen Prozessen und dem Betriebssystem zu vermeiden.
Schutz der Eingabe/Ausgabe
Alle externen Geräte verfügen über spezifische Routinen zur Steuerung der Eingabe/Ausgabe, die Treiber oder Gerätetreiber genannt werden. Diese schützen vor falschem Zugriff, indem sie die Kontrolle an den Kernel des Betriebssystems übergeben, der auf die fehlerhafte Situation hinweist und entsprechend handelt.
Speicherschutz
In der Regel hat jeder Prozess einen zugewiesenen Speicherbereich für seinen Code und seine Daten, den sogenannten Adressraum. Er kann nicht auf Speicherbereiche zugreifen, die dem Betriebssystem oder anderen Prozessen zugewiesen sind. Um dies zu gewährleisten, gibt es spezielle Register (Grenzwertregister), die die Grenzen des zugewiesenen Speichers markieren.
Wenn ein Prozess versucht, auf Speicheradressen außerhalb seines Adressraums zuzugreifen, wird der Fehler vom Betriebssystem erkannt und gemeldet.
Prozessorschutz
Eine andere Art von Problem, das auftreten kann, ist das Vorhandensein von Endlosschleifen oder der dauerhafte Zugriff eines Prozesses auf den Prozessor. In diesen Fällen wäre die einzige Lösung ein Reset, d. h. das System neu zu starten.
Um dies zu vermeiden, enthält die Hardware einen Timer, der Zeitintervalle markiert. Am Ende dieser Perioden gibt es eine Unterbrechung (Interrupt), und die Kontrolle geht an das Betriebssystem zurück.
Funktionen des Betriebssystems: Ressourcenverwaltung
Der Kern (Kernel) eines Betriebssystems besteht aus einer Reihe von Routinen, deren Aufgabe es ist, den Prozessor, den Speicher, die Eingabe/Ausgabe und die anderen verfügbaren Ressourcen des Computers zu verwalten. All diese Anstrengungen sind notwendig, um die Anforderungen der Aufträge zu bearbeiten, die auf dem System laufen.
Prozess- und Prozessorverwaltung
Eines der wichtigsten Konzepte innerhalb eines Betriebssystems ist der Prozess, da er als die Einheit der Arbeit betrachtet werden kann.
Ein Betriebssystem führt nicht nur seinen eigenen Code aus, der aus einer Reihe von Systemprozessen besteht, sondern auch Benutzerprozesse, die auf Wunsch der Benutzer während ihrer Sitzungen erstellt werden.
Beide Arten von Prozessen, System- und Benutzerprozesse, können gleichzeitig ausgeführt werden.
Innerhalb des Kernels ist das Betriebssystem verantwortlich für die Verwaltung der Prozesse: Erstellung und Löschung von System- und Benutzerprozessen, Planung (Scheduling) und Bereitstellung von Mechanismen für Synchronisation, Kommunikation und Behandlung von Deadlocks zwischen Prozessen.
Definition und Konzept des Prozesses
Um zu verstehen, wie Betriebssysteme arbeiten, muss man den Unterschied zwischen einem Programm (Satz von Anweisungen) und einem Prozess (ein Programm in Ausführung) kennen.
Ein Prozess ist ein laufendes Programm mit seiner gesamten zugehörigen Umgebung (Register, Variablen, Stapel und die Anweisungen des Programms, das ausgeführt wird).
Wenn das System den Befehl zur Ausführung eines Programms erhält, erstellt es einen Prozess und führt dazu eine Reihe von Aufgaben aus:
- Platziert den Prozess in die Auftragswarteschlange (Job Queue), die alle Prozesse im Sekundärspeicher enthält, die auf die Zuteilung von Hauptspeicher warten.
- Sucht im Hauptspeicher einen Platz für die Maschinenbefehle, die definierten Variablen und den Stapel (Stack), der temporäre Daten während der Ausführung enthält.
- Lädt die Anweisungen des Programms aus dem Sekundärspeicher an die richtige Stelle im Hauptspeicher.
- Ordnet die übrigen für die Ausführung möglicherweise erforderlichen Ressourcen zu.
- Erstellt seinen Prozesskontrollblock (PCB) und fügt ihn in die Warteschlange der bereiten Prozesse (Ready Queue) ein, wo er darauf wartet, dass ihm der Prozessor zugewiesen wird.
Das bedeutet, dass ein Prozess ein Programm ist, das zu einem gegebenen Zeitpunkt bestimmte Daten und Ressourcen nutzt.
Die Umgebung eines Prozesses besteht aus:
- Registern (PC, SP, usw.)
- Daten im Stapel (Stack)
- Daten in Variablen
- Anweisungen des laufenden Programms
Der Prozesskontrollblock (PCB)
Ein Prozess wird intern im Betriebssystem durch einen Datensatz namens Prozesskontrollblock (Process Control Block, PCB) repräsentiert. Dieser enthält Informationen über den Zustand des Prozesses zu einem bestimmten Zeitpunkt, verwendete Ressourcen, Registerinhalte usw.
Im Allgemeinen sind die Informationen für jeden Prozess im PCB:
- Zustand des Prozesses: Informationen über Priorität, Ausführungsart usw. sowie Informationen über den Zustand der internen Register des Prozesses (z. B. Inhalt des Programmzählers (PC), Stapelzeiger (SP)).
- Statistiken über Belegungszeit und Ressourcen für die Planung und Verwaltung des Prozessors.
- Belegung des internen Speichers und dessen Daten.
- Verwendete Ressourcen (in der Regel E/A-Geräte wie Festplatten).
- Verwendete Dateien.
- Privilegien.
Das Betriebssystem verwaltet Listen von PCBs aller Prozesse, um:
- Den Speicherort der Informationen über jeden Prozess zu kennen.
- Die Verarbeitungsdaten jedes Prozesses zu speichern, falls dessen Ausführung vorübergehend unterbrochen oder fortgesetzt wird.
Diese Informationen befinden sich im Hauptspeicher und sind jederzeit zugänglich, wenn sie aktualisiert oder abgefragt werden müssen.
Als Kontextwechsel (Context Switch) bezeichnet man alle Maßnahmen, die das Betriebssystem durchführt, um die Ausführung von einem Prozess (z. B. Prozess A) zu einem anderen Prozess (z. B. Prozess B) zu ändern.
Zustände der Prozesse
Die Prozesskontrollblöcke werden in Warteschlangen gespeichert. Jede Warteschlange repräsentiert einen bestimmten Zustand des Prozesses. Es gibt so viele Arten von Warteschlangen, wie es unterschiedliche Prozesszustände gibt. Das bedeutet, es gibt Warteschlangen für blockierte Prozesse, bereite Prozesse usw.
Die Zustände der Prozesse und ihre Übergänge werden vom Betriebssystem verwaltet und sind für den Benutzer transparent, der glaubt, dass sein Prozess immer läuft.
Prozesszustände können in zwei Typen unterteilt werden: Aktiv und Inaktiv.
Aktive Zustände
Dies sind Zustände, in denen der Prozess um den Prozessor konkurriert oder dazu in der Lage ist. Sie werden unterteilt in:
- Laufend (Running): Der Zustand, in dem sich ein Prozess befindet, wenn er die Kontrolle über den Prozessor hat. In einem Einprozessor-System kann sich nur ein Prozess in diesem Zustand befinden.
- Bereit (Ready): Die Prozesse, die bereit zur Ausführung sind, aber aus irgendeinem Grund nicht laufen (z. B. weil ein anderer Prozess läuft, weil ihre Zeitscheibe abgelaufen ist). Sie warten auf ihre Zuteilung des Prozessors.
- Blockiert (Blocked/Waiting): Prozesse, die derzeit nicht ausgeführt werden können, weil sie auf eine Ressource warten, die nicht verfügbar ist (in der Regel E/A-Ressourcen) oder auf ein Ereignis.
Inaktive Zustände
Dies sind Zustände, in denen der Prozess nicht um den Prozessor konkurrieren kann, dies aber durch bestimmte Operationen wieder tun könnte. In diesen Zuständen wird sein PCB „geparkt“, bis er wieder aktiviert wird. Dies sind Prozesse, die ihre Arbeit aus externen Gründen unterbrochen haben (z. B. fehlende Diskette im Laufwerk, Papier im Drucker nachlegen) und möglicherweise ab dem Unterbrechungspunkt oder von Anfang an neu gestartet werden können. Es gibt zwei Arten:
- Angehalten Blockiert (Suspended Blocked): Ein Prozess, der auf ein Ereignis wartete und angehalten wurde, ohne dass die Ursache für die Blockierung verschwunden ist.
- Angehalten Bereit (Suspended Ready): Ein Prozess, der angehalten wurde, aber nicht mehr auf ein Ereignis wartet (die Blockierungsursache ist beseitigt).
Zustandsübergänge
Dies sind die Änderungen, die ein Prozess während seiner Existenz erfahren kann:
- Neu -> Bereit (Start der Ausführung): Der Prozess wird erzeugt (z. B. durch den Befehl zur Ausführung eines Programms). Der PCB wird erstellt, und der Prozess wird in die Warteschlange der bereiten Prozesse aufgenommen. Die Einreihungspolitik hängt von der Warteschlangenverwaltung ab.
- Bereit -> Laufend (Auswahl zur Ausführung): Wenn der Prozessor frei ist und sich Prozesse in der Bereit-Warteschlange befinden, wird einer von ihnen (oft der erste gemäß der Planungspolitik) ausgewählt und in den Zustand „Laufend“ versetzt.
- Laufend -> Blockiert (Warten auf E/A oder Ereignis): Ein laufender Prozess fordert eine Operation an einem externen Gerät an (E/A-Operation) oder muss auf ein Ereignis warten. Er wird in den Zustand „Blockiert“ versetzt, und sein PCB wird in die entsprechende Blockiert-Warteschlange verschoben. Der Prozessor wird dem nächsten bereiten Prozess zugewiesen.
- Blockiert -> Bereit (E/A oder Ereignis abgeschlossen): Wenn das Ereignis, auf das ein blockierter Prozess gewartet hat (z. B. Abschluss einer E/A-Operation), eintritt, wird der Prozess in den Zustand „Bereit“ versetzt und in die Bereit-Warteschlange eingereiht.
- Laufend -> Bereit (Zeitscheibe abgelaufen, Verdrängung): Wenn die Zeitscheibe eines laufenden Prozesses abläuft oder ein Prozess mit höherer Priorität bereit wird, wird der laufende Prozess unterbrochen (verdrängt) und in den Zustand „Bereit“ versetzt. Sein PCB wird in die Bereit-Warteschlange eingereiht.
- Laufend -> Beendet (Terminierung): Der Prozess hat seine Ausführung abgeschlossen oder wurde aus einem außergewöhnlichen Grund (Fehler, Benutzerbefehl, OS-Befehl) beendet. Seine Ressourcen werden freigegeben, und sein PCB wird entfernt.
- Aktiv -> Angehalten (Suspendierung): Ein laufender, bereiter oder blockierter Prozess kann vom Betriebssystem (oder Benutzer) angehalten werden (z. B. um Speicher freizugeben). Er geht in den Zustand „Angehalten Bereit“ oder „Angehalten Blockiert“ über. Sein PCB wird entsprechend markiert oder verschoben.
- Angehalten -> Aktiv (Aktivierung): Ein angehaltener Prozess (Bereit oder Blockiert) kann wieder aktiviert werden. Er kehrt in den entsprechenden Zustand „Bereit“ oder „Blockiert“ zurück.
Prozessplanung (Scheduling)
An dieser Stelle untersuchen wir die verschiedenen Politiken und Mechanismen, die aktuelle Betriebssysteme für die Verwaltung des Prozessors verwenden. Dieses Management ist als Planung (Scheduling) bekannt. Sein Hauptziel ist es, die Nutzung des Prozessors zu optimieren, indem die Reihenfolge festgelegt wird, in der die Prozesse, die zu einem gegebenen Zeitpunkt im System existieren, ausgeführt werden.
Es gibt verschiedene Ebenen der Planung:
- Langfristige Planung (Job Scheduler): Entscheidet, welche Programme (aus einem Pool von Aufträgen) in den Speicher geladen und zu Prozessen gemacht werden sollen. Kontrolliert den Grad der Multiprogrammierung. In Time-Sharing-Systemen oft weniger relevant oder integriert.
- Mittelfristige Planung (Swapping Scheduler): Verwaltet die angehaltenen Prozesse. Entscheidet, ob ein laufender oder blockierter Prozess vorübergehend aus dem Speicher entfernt (ausgelagert/swapped out) werden muss, um Platz zu schaffen. Später, wenn das System weniger ausgelastet ist, wird der Prozess wieder in den Speicher geladen (eingelagert/swapped in) und in den Zustand „Bereit“ oder „Blockiert“ zurückversetzt. Diese Technik ist als Swapping bekannt und wird im Zusammenhang mit der Speicherverwaltung behandelt. Sie existiert hauptsächlich in Systemen mit virtuellem Speicher.
- Kurzfristige Planung (CPU Scheduler / Dispatcher): Ist dafür zuständig zu entscheiden, welcher der im Speicher befindlichen bereiten Prozesse als Nächstes den Prozessor verwenden darf. Die Hauptfunktion in Multiprogramm-Systemen ist es, den interaktiven Prozessen einen guten Service zu bieten, sodass der Benutzer nicht merkt, dass er mit anderen um die Nutzung des Prozessors konkurriert.
Jedes Mal, wenn ein Ereignis (intern oder extern) eine Änderung des Systemzustands bewirkt, wird der Dispatcher aktiviert und übernimmt die Kontrolle, um die folgenden Schritte durchzuführen:
- Entscheiden, ob der aktuelle Prozess weiterlaufen soll oder ein Wechsel stattfinden muss.
- Wenn ein Wechsel stattfindet: Speichern des Kontexts (volatile Umgebung) des aktuellen Prozesses.
- Auswählen des nächsten Prozesses aus der Bereit-Warteschlange gemäß der Scheduling-Politik.
- Laden des Kontexts des ausgewählten Prozesses und Übergeben der Kontrolle an ihn.
Planungskriterien
Die Prozessplanung ist dafür zuständig zu entscheiden, welchem der Prozesse in der Bereit-Warteschlange die CPU zugewiesen wird.
Aufgrund der Vielzahl bestehender Planungsalgorithmen wurden verschiedene Kriterien für deren Vergleich vorgeschlagen, darunter die wichtigsten:
- CPU-Auslastung: Der Prozentsatz der Zeit, in der die CPU beschäftigt ist. Ziel ist eine hohe Auslastung.
- Durchsatz (Throughput): Die Anzahl der Prozesse, die pro Zeiteinheit abgeschlossen werden. Ziel ist ein hoher Durchsatz.
- Durchlaufzeit (Turnaround Time): Die Gesamtzeit, die ein Prozess vom Start bis zum Abschluss im System verbringt (Wartezeit + Ausführungszeit + E/A-Zeit). Ziel ist eine minimale Durchlaufzeit.
- Wartezeit (Waiting Time): Die Gesamtzeit, die ein Prozess in der Bereit-Warteschlange verbringt. Ziel ist eine minimale Wartezeit.
- Antwortzeit (Response Time): Die Zeit vom Absenden einer Anfrage bis zum Erhalt der ersten Antwort (nicht des gesamten Ergebnisses). Wichtig für interaktive Systeme. Ziel ist eine minimale Antwortzeit.
- Fairness: Sicherstellen, dass jeder Prozess einen angemessenen Anteil an der CPU erhält und keine Aushungerung (Starvation) auftritt.
Mehrstufige Warteschlangen mit Rückkopplung
Die Methode der mehrstufigen Warteschlangen mit Rückkopplung (Multilevel Feedback Queues) teilt die Prozesse in mehrere Bereit-Warteschlangen mit unterschiedlichen Prioritäten auf. Jede Warteschlange kann ihre eigene Planungspolitik haben (z. B. Round Robin, FIFO). Prozesse können zwischen den Warteschlangen wechseln.
Zur Zuweisung des Prozessors wird der Prozess aus der höchsten nicht-leeren Prioritätswarteschlange ausgewählt. Ein Prozess, der seine zugewiesene Zeitscheibe (Quantenzahl) in einer bestimmten Warteschlange verbraucht hat, ohne seine Ausführung zu beenden, kann in eine Warteschlange mit niedrigerer Priorität verschoben werden. Prozesse, die auf E/A warten und dann wieder bereit werden, können in eine höhere Prioritätswarteschlange gelangen.
Diese Politik zielt darauf ab, Prozessen eine faire Behandlung zukommen zu lassen, indem sie nach ihrem Verhalten (z. B. CPU-gebunden vs. E/A-gebunden) kategorisiert werden und ihnen den Service bieten, den sie benötigen (z. B. kurze Zeitscheiben für interaktive Prozesse, längere für Batch-Prozesse).
Speicherverwaltung
Wir betrachten den Hauptspeicher als eine lebenswichtige Ressource, auf die sowohl der Prozessor als auch die E/A-Geräte zugreifen, um Informationen zu lesen und/oder zu schreiben.
Damit ein Computerprogramm ausgeführt werden kann, müssen sowohl das Programm selbst als auch seine Daten im Hauptspeicher gespeichert sein (im sogenannten Adressraum).
In Multiprogramm-Systemen, in denen mehrere Programme gleichzeitig laufen können, ist eine gute Speicherverwaltung erforderlich, damit diese Programme und ihre Daten gleichzeitig im Speicher bleiben können, ohne ihre Adressräume zu vermischen.
Der Speicher-Manager
Der Teil des Betriebssystems, der für die Steuerung des Speichers verantwortlich ist, ist der Speicher-Manager.
Speicherverwaltung ist die Zuweisung von Bereichen des physischen Speichers an verschiedene Prozesse auf Anfrage, um deren Ausführung zu ermöglichen.
Daher muss der Speicher-Manager auf effizienteste Weise verwalten, welche Teile des Speichers verwendet werden und welche nicht, um neuen Prozessen Speicherplatz zuzuweisen und den von beendeten Prozessen verwendeten Speicherplatz freizugeben.
Er verwaltet auch den Austausch von Prozessen zwischen Hauptspeicher und Festplatte (Swapping oder Paging), wenn der Hauptspeicher voll ist, um Platz für andere Prozesse zu schaffen.
Adresszuweisung
Wir wissen, dass Programme im Speicher sein müssen, um ausgeführt zu werden, und in einigen Fällen den Speicher mit anderen Programmen teilen. Aber an welche Adressen sollen diese Programme geladen werden?
Wenn ein Programm erstellt wird, definiert es eine Reihe von Anweisungen oder Befehlen, die in einer bestimmten Reihenfolge ausgeführt werden sollen. Anschließend übersetzt der entsprechende Compiler das Quellprogramm in Maschinensprache.
Der Compiler nummeriert jede generierte Maschinensprachenanweisung fortlaufend, sodass jede Nummer der logischen Adresse einer Anweisung entspricht. Die erste Anweisung kann die Adresse 0 erhalten, genannt relative Nulladresse. Die folgenden Anweisungen haben einen Versatz (Offset) relativ zu dieser Nulladresse. Dieser Adressraum, der bei der Kompilierung entsteht, wird als logischer Adressraum des Programms bezeichnet.
Die logischen Adressen liegen zwischen Null und der Adresse der letzten Anweisung. Zugriffe während der Ausführung des Programms sollten nur auf Adressen innerhalb dieses Bereichs erfolgen.
Wenn das Programm ausgeführt wird, lädt der Lader des Betriebssystems es in den Speicher ab einer bestimmten physischen Adresse, die nicht unbedingt die Adresse 0 sein muss. Diese Startadresse wird als Basisadresse bezeichnet.
Die Umwandlung von relativen (logischen) Adressen in absolute (physische oder reale) Adressen wird als Adressbindung oder Adressumsetzung bezeichnet. Sie definiert den physischen Adressraum des Programms im realen Speicher.
Diese Trennung zwischen der Benutzersicht (logischer Adressraum) und der realen Sicht (physischer Adressraum) ermöglicht eine effizientere Verwaltung des realen Speichers, da die Entwicklung eines Programms unabhängig von seiner zukünftigen Position im Speicher erfolgen kann.
Adressumsetzung (Relocation)
Es gibt zwei Möglichkeiten, die Adressumsetzung durchzuführen:
- Statische Umsetzung: Erfolgt beim Laden des Programms. Der Lader modifiziert alle logischen Adressen im Programmcode, indem er die Basisadresse addiert, während er das Programm in den Speicher schreibt. Wenn das Programm ausgeführt wird, beziehen sich alle Speicherreferenzen bereits auf tatsächliche physische Adressen. Ein einmal geladenes Programm kann nicht verschoben werden.
- Dynamische Umsetzung: Das Programm wird ohne Änderung der logischen Adressen in den Speicher geladen. Wenn das Programm ausgeführt wird, fängt eine spezielle Hardware-Einheit (Memory Management Unit, MMU) jede Speicheradresse ab und addiert automatisch die Basisadresse hinzu, um die physische Adresse zu erhalten. Dies ermöglicht das Verschieben von Programmen im Speicher während ihrer Ausführung.
Speicherverwaltung bei Monoprogrammierung
Wir betrachten nun, wie die Speicherverwaltung in Systemen mit Monoprogrammierung funktionierte.
- Dedizierter Speicher: In den ersten Computern griffen Programmierer direkt auf die Hardware zu und verwalteten den Speicher in ihren Programmen selbst. Der Speicher wurde von einem einzigen Programm belegt; es gab kein Betriebssystem und somit keinen Speicher-Manager. Speicher, der nicht vom Programm verwendet wurde, war nutzlos.
- Speicherteilung mit Resident Monitor: Das Aufkommen von Betriebssystemen (Resident Monitors) erzwang die Teilung des Speichers in zwei Zonen: eine für das Betriebssystem reservierte Zone und den Rest für das Benutzerprogramm. Was vom Benutzerbereich übrig blieb, war nutzlos.
Die Speicherteilung erfordert einen Schutzmechanismus, der den Speicherbereich des Betriebssystems vor Zugriffen durch das Benutzerprogramm schützt (absichtlich oder unabsichtlich).
Dies wird durch ein Grenzwertregister (Limit Register) erreicht, das die Grenze des Betriebssystembereichs markiert. Jede Speicheradresse, die von einem Benutzerprogramm angefordert wird, wird mit diesem Grenzwert verglichen, um den Zugriff zu erlauben oder zu verweigern. Diese Kontrolle erfolgt direkt durch die Hardware.
Mit der Entwicklung schneller Speichermedien (wie Festplatten) entstand die Technik des Austauschs (Swapping). Wenn ein geladenes Programm im Speicher auf ein Ereignis wartet, kann das Betriebssystem es auf die Festplatte auslagern (Swap-out) und stattdessen das Programm eines anderen Benutzers laden (Swap-in).
Eine Verbesserung dieser Technik war die Überlappung der Ausführung eines Programms mit dem Austausch eines anderen. Dazu teilte das System den Benutzerbereich in zwei Teile: Während ein Programm in einem Teil ausgeführt wird, wird ein anderes in den anderen Teil geladen oder von dort ausgelagert.
Bisher haben wir Speichersysteme betrachtet, in denen sich nur ein Benutzerprogramm im Hauptspeicher befindet (Monoprogrammierung).
Mit der Überlappung durch Swapping entsteht eine neue Arbeitsweise, bei der sich zu einem gegebenen Zeitpunkt mehrere Benutzerprogramme im Speicher befinden können. Dies führt uns zur Multiprogrammierung.
Speicherverwaltung bei Multiprogrammierung
Um den Prozessor zwischen mehreren Prozessen aufzuteilen, müssen sich diese im Hauptspeicher befinden. Daher wird der Speicher in mehrere Teile, sogenannte Partitionen, unterteilt, die verschiedene Prozesse aufnehmen können. Die Anzahl der Partitionen bestimmt den Grad der Multiprogrammierung im System.
Der Speicher-Manager muss wissen, welche Speicherbereiche (Partitionen) belegt und welche frei sind. Er muss die Startadresse und die Größe jeder Partition kennen, um sicherzustellen, dass Programme innerhalb ihrer Grenzen bleiben.
Er muss auch die Aufgaben der Zuweisung und Freigabe von Speicherbereichen verwalten, wenn Prozesse erstellt oder zerstört werden.
In Multiprogramm-Systemen stellt sich das Problem, wie der Speicher für die verschiedenen Programme, die ihn anfordern, aufgeteilt werden soll. Im Laufe der Geschichte wurden verschiedene Techniken angewendet:
- Feste Partitionierung: Der Speicher wird in eine feste Anzahl von Partitionen (gleicher oder unterschiedlicher Größe) aufgeteilt. Jede Partition nimmt ein Programm auf. Programme werden in eine passende freie Partition geladen.
- Vorteil: Einfache Verwaltung von freien und belegten Partitionen.
- Nachteil: Interne Fragmentierung tritt auf, wenn ein Programm kleiner ist als die Partition, in die es geladen wird. Der ungenutzte Speicher innerhalb der Partition geht verloren.
- Variable Partitionierung: Keine vordefinierten Grenzen. Partitionen werden dynamisch mit genau der Größe erstellt, die ein Programm anfordert. Das System muss eine Liste freier Speicherblöcke (Löcher) verwalten.
- Vorteil: Keine interne Fragmentierung.
- Nachteil: Externe Fragmentierung tritt auf. Wenn Prozesse geladen und wieder freigegeben werden, entstehen viele kleine, nicht zusammenhängende freie Speicherblöcke, die zu klein für neue Prozesse sind, obwohl insgesamt genug Speicher frei wäre. Dies erfordert gelegentlich eine Speicherverdichtung (Compaction), bei der alle belegten Speicherbereiche zusammengeschoben werden, um die freien Bereiche zu einem großen Block zu vereinen. Compaction ist zeitaufwändig und erfordert, dass Programme verschiebbar (relocatable) sind.
Paging
Paging ist eine Speicherverwaltungstechnik, die eine nicht zusammenhängende Speicherreservierung ermöglicht. Sie umfasst die Aufteilung des physischen Speichers in gleich große Blöcke fester Größe, die Kacheln (Frames) genannt werden, und die Aufteilung des logischen Adressraums eines Programms in Blöcke derselben Größe, die Seiten (Pages) genannt werden. Die Größe dieser Kacheln/Seiten wird durch die Hardware bestimmt und ist in der Regel eine Potenz von 2 (z. B. 4 KB).
Um ein Programm im Speicher zu platzieren, findet das System genügend freie Kacheln im physischen Speicher für die Seiten des Programms. Diese Kacheln müssen nicht zusammenhängend sein.
Das Betriebssystem verwaltet für jeden Prozess eine Seitentabelle (Page Table). Diese Tabelle enthält für jede Seite des Prozesses die Nummer der Kachel im physischen Speicher, in der sie sich befindet.
Paging-Mechanismus
Die Zuordnung zwischen dem logischen Adressraum (kontinuierlich aus Sicht des Programms) und dem physischen Adressraum (potenziell gestückelt) erfolgt durch dynamische Adressübersetzung mittels Hardware (MMU).
Jede vom Prozessor generierte logische Adresse wird in zwei Teile unterteilt:
- Eine Seitennummer (p)
- Ein Versatz (Offset) innerhalb der Seite (d)
Die Seitennummer p wird als Index verwendet, um in der Seitentabelle des Prozesses die Basisadresse der entsprechenden Kachel im physischen Speicher zu finden. Der Versatz d wird zu dieser Basisadresse addiert, um die endgültige physische Adresse zu erhalten.
Diese Adressübersetzung muss von der Hardware sehr schnell durchgeführt werden, um keine Verzögerungen bei der Programmausführung zu verursachen.
Speicherverwaltung mit Paging
Paging ist eine Methode zur dynamischen Adresszuweisung. Das System analysiert jeden neuen Auftrag, um die Anzahl der benötigten Seiten zu ermitteln, und sucht in der Liste der freien Kacheln eine entsprechende Anzahl. Wenn genügend freie Kacheln vorhanden sind, werden die Seiten des Programms in diese geladen, eine entsprechende Seitentabelle wird aufgebaut, und die Liste der freien Kacheln wird aktualisiert. Jeder Auftrag hat seine eigene Seitentabelle, auf die oft über den Prozesskontrollblock (PCB) verwiesen wird.
Auf diese Weise wird externe Fragmentierung vermieden, da jede freie Kachel einem Auftrag zugewiesen werden kann.
Interne Fragmentierung kann jedoch weiterhin in der letzten Seite eines Programms auftreten, wenn die Größe des Programms kein genaues Vielfaches der Seitengröße ist.
Segmentierung
Segmentierung ist eine Speicherverwaltungstechnik ähnlich dem Paging, bei der jedoch Speicherblöcke variabler Größe, sogenannte Segmente, auf Anforderung der Programme definiert werden. Segmente entsprechen oft logischen Einheiten eines Programms (z. B. Code, Daten, Stack).
Diese Technik vermeidet interne Fragmentierung, da jedem Segment genau die benötigte Speichergröße zugewiesen wird.
Um ein Programm in den Speicher zu laden, müssen passende freie Speicherbereiche (Löcher) für seine Segmente gefunden werden. Da Segmente unterschiedliche Größen haben, tritt hier das Problem der externen Fragmentierung auf, ähnlich wie bei der variablen Partitionierung.
Die Segmente eines Programms werden oft vom Compiler definiert. Jede logische Adresse wird als Paar ausgedrückt:
- Segmentnummer (s)
- Versatz (Offset) innerhalb des Segments (d)
Segmentierungs-Hardware
Auf Computern, die diese Technik verwenden, gibt es eine Hardware-Einheit (MMU), die dafür verantwortlich ist, jede vom Prozessor generierte logische Adresse (s, d) in eine reale Adresse (r) umzuwandeln.
Die Umwandlung erfolgt mithilfe der Segmenttabelle des Programms. Diese Tabelle enthält für jedes Segment dessen Basisadresse im physischen Speicher und seine Länge (Limit). Die Hardware prüft auch, ob der Offset d innerhalb der Segmentgrenzen liegt.
Kombinierte Systeme (Paging und Segmentierung)
Da sowohl Paging als auch Segmentierung Vor- und Nachteile haben, versuchen einige Systeme, beide Techniken zu kombinieren, um ihre positiven Eigenschaften zu nutzen.
- Segmentierung mit Paging: Jedes Segment wird in Seiten unterteilt. Der logische Adressraum ist segmentiert, aber die Segmente selbst werden mittels Paging im physischen Speicher abgebildet. Dies vermeidet externe Fragmentierung und erlaubt es, nur Teile eines Segments im Speicher zu halten. (Beispiel: Intel x86)
- Paging mit Segmentierung: Der Adressraum wird primär durch Paging verwaltet, aber die Seitentabelle selbst kann segmentiert sein, um ihre Verwaltung zu erleichtern.
Virtueller Speicher
Die bisher betrachteten Speicherverwaltungssysteme erfordern, dass ein Programm vollständig in den Hauptspeicher geladen wird, um ausgeführt zu werden.
Virtueller Speicher ist eine Technik, die Hard- und Software kombiniert und die Ausführung von Programmen ermöglicht, die nur teilweise in den realen Hauptspeicher geladen sind. Der Rest des Programms befindet sich auf einem schnellen Sekundärspeicher (z. B. Festplatte).
Dies muss sehr effizient implementiert sein, da sonst die Leistung des Programms erheblich beeinträchtigt werden kann.
Diese Arbeitsweise bringt wichtige Vorteile:
- Der logische Adressraum eines Programms kann größer sein als der verfügbare physische Speicher.
- Da jedes Programm weniger realen Speicher belegt, kann der Grad der Multiprogrammierung erhöht und damit die Effizienz des Systems gesteigert werden.
- Weniger E/A ist erforderlich, um Programme zu laden oder auszutauschen.
Die verschiedenen Teile eines Programms werden bei Bedarf in den Arbeitsspeicher geladen. Dabei sind drei wichtige Aspekte zu berücksichtigen:
- Ladestrategie (Fetch Policy): Wann werden Teile (Seiten/Segmente) geladen? Bei Bedarf (Demand Paging/Segmentation) oder im Voraus (Prepaging/Presegmentation)?
- Platzierungsstrategie (Placement Policy): Wohin im Hauptspeicher wird ein neuer Teil geladen? (Bei Paging trivial, bei Segmentierung relevant: First Fit, Best Fit, Worst Fit).
- Ersetzungsstrategie (Replacement Policy): Wenn der Hauptspeicher voll ist und ein neuer Teil geladen werden muss, welcher vorhandene Teil wird ersetzt?
Demand Paging (Seitenladen bei Bedarf) ist die häufigste Ladestrategie bei der Verwendung von virtuellem Speicher mit Paging.
Es wird nicht das gesamte Programm in den Speicher geladen, sondern nur die Seiten, die tatsächlich angefordert (referenziert) werden.
Wenn der Prozessor eine Adresse generiert, die zu einer Seite gehört, die sich nicht im Hauptspeicher befindet, tritt ein Seitenfehler (Page Fault) auf. Das Betriebssystem unterbricht den Prozess, sucht die fehlende Seite auf dem Sekundärspeichergerät, lädt sie in eine freie Kachel im Hauptspeicher (ggf. nach Anwendung einer Ersetzungsstrategie) und setzt dann den Prozess fort.
Die Behandlung von Seitenfehlern führt zu einer zusätzlichen Verzögerung bei der Ausführung von Programmen und beeinflusst die allgemeine Systemleistung.
Seitenersetzung
Die Demand-Paging-Technik reduziert den Speicherbedarf jedes Programms während seiner Ausführung. Wenn ein Programm startet, werden nur wenige Seiten geladen, sodass Seitenfehler anfangs häufig auftreten. Wenn ein Programm einen Seitenfehler verursacht, muss die benötigte Seite in den Speicher gebracht werden.
Wenn kein freier Frame verfügbar ist, muss eine Seite im Speicher ausgewählt und ersetzt werden. Der Algorithmus, der diese Auswahl trifft, ist der Seitenersetzungsalgorithmus.
Seitenersetzungsalgorithmen
- Optimaler Algorithmus (OPT/MIN): Ersetzt die Seite, die in Zukunft am längsten nicht mehr benötigt wird. Bietet die geringste Anzahl von Seitenfehlern, ist aber nicht implementierbar, da er zukünftiges Verhalten vorhersagen müsste. Dient als Vergleichsmaßstab.
- FIFO (First-In, First-Out): Ersetzt die Seite, die am längsten im Speicher ist. Einfach zu implementieren (mit einer Warteschlange). Geringer Overhead. Die Leistung ist jedoch oft schlecht, da häufig genutzte Seiten ersetzt werden können. Anfällig für Belady's Anomalie (mehr Frames können zu mehr Seitenfehlern führen).
- LRU (Least Recently Used): Ersetzt die Seite, die am längsten nicht mehr verwendet wurde. Basiert auf der Annahme, dass kürzlich verwendete Seiten wahrscheinlich bald wieder verwendet werden. Gute Annäherung an OPT. Benötigt Hardware-Unterstützung zur Nachverfolgung der Zugriffszeiten (Zähler oder Stapel), was den Overhead erhöht.
- Näherungsalgorithmen für LRU:
- Referenzbit-Algorithmen (z. B. Clock/Second Chance): Jede Seite hat ein Referenzbit, das von der Hardware bei Zugriff gesetzt wird. Das OS setzt die Bits periodisch zurück. Ersetzt werden Seiten, deren Bit nicht gesetzt ist. Varianten wie Clock durchsuchen die Seiten zyklisch.
- LFU (Least Frequently Used): Ersetzt die Seite, die am seltensten verwendet wurde. Benötigt Zähler für Zugriffe. Berücksichtigt nicht die Zeitnähe der Zugriffe gut.
- Modifiziert-Bit (Dirty Bit): Viele Algorithmen werden durch ein Modifiziert-Bit ergänzt. Dieses Bit wird von der Hardware gesetzt, wenn eine Seite beschrieben wird. Beim Ersetzen werden bevorzugt nicht modifizierte („saubere“) Seiten ausgewählt, da diese nicht auf die Festplatte zurückgeschrieben werden müssen, was E/A spart.
Kriterien für Seitenersetzung (Scope)
Wenn ein Seitenfehler auftritt, muss entschieden werden, aus welchem Pool von Seiten die zu ersetzende Seite ausgewählt wird:
- Lokale Ersetzung: Die Auswahl ist auf die Seiten des Prozesses beschränkt, der den Seitenfehler verursacht hat.
- Globale Ersetzung: Die Auswahl kann aus allen Seiten im Speicher erfolgen, unabhängig davon, welchem Prozess sie gehören. Globale Ersetzung ist oft flexibler und kann die Systemleistung verbessern, birgt aber die Gefahr, dass ein Prozess die Seiten eines anderen „stiehlt“.
Verwaltung von Peripheriegeräten (E/A-Management)
Betrachtet man die Vielfalt und Vielzahl von Peripheriegeräten, die heute existieren, und die Unterschiede zwischen ihnen auf allen Ebenen (z. B. Arbeitsgeschwindigkeit, Kontaktmodus synchron/asynchron, Art der Datendarstellung), wird klar, dass eine Abstraktionsebene benötigt wird.
Prozesse müssen nicht die Besonderheiten jedes Peripheriegeräts kennen, sondern nur, wie sie Daten damit austauschen können. Daher müssen die Eigenschaften der Geräte so maskiert werden, dass die Eingabe/Ausgabe unabhängig von Typ und Modell des Geräts ist.
Der Teil des Betriebssystems, der für die Überwachung aller an den Computer angeschlossenen E/A-Geräte verantwortlich ist, ist der Manager für Eingabe/Ausgabe (I/O Manager).
Er ist verantwortlich für die Bereitstellung einer Schnittstelle, die die Eigenschaften der Geräte isoliert, sodass die Übertragung von Informationen in beide Richtungen zwischen Peripherie und Prozessor oder Speicher möglich ist.
Die Ziele des E/A-Managers sind:
- Bereitstellung einer einheitlichen Schnittstelle zwischen den Geräten und dem Rest des Systems (Geräteunabhängigkeit). Ermöglicht die Arbeit mit generischen Funktionen wie Lesen oder Schreiben, unabhängig von den Geräteeigenschaften (Festplatten, Disketten, CD-ROM usw.).
- Behandlung von Fehlern: Sollte Fehler behandeln, die während der Nutzung der Peripherie auftreten. Fehler sollten so weit wie möglich auf Hardware-Ebene behandelt werden.
- Verwaltung von gemeinsam genutzten und dedizierten Geräten: Muss die gemeinsame Nutzung von Geräten durch Prozesse ermöglichen und die Nutzung dedizierter Geräte blockieren, wenn ein Prozess sie benötigt, damit andere Prozesse sie nicht gleichzeitig verwenden können (z. B. Sperren des Druckers während eines Druckauftrags).
- Verwaltung asynchroner Operationen: Durch den Einsatz von Zwischenpuffern (Buffering), um die unterschiedlichen Geschwindigkeiten von CPU und Peripheriegeräten auszugleichen.
Hardwaregeräte
Es gibt zwei Klassifizierungen für Geräte:
- Nach ihrer Funktion:
- Speichermedien: Geräte, die Informationen dauerhaft speichern (Magnetbänder, Festplatten, USB-Sticks, CD-ROMs usw.).
- Benutzerschnittstellengeräte: Geräte, über die Benutzer Daten eingeben und empfangen können (Tastatur, Monitor, Maus usw.).
- Übertragungsgeräte: Geräte, deren Aufgabe es ist, Computer zu verbinden, um Informationen zu übertragen (Netzwerkkarte, Modem usw.).
- Nach der Art der Informationsverarbeitung:
- Blockorientierte Geräte (Block Devices): Behandeln Informationen in Blöcken fester Größe. Jeder Block hat eine eigene Adresse und kann separat gelesen oder geschrieben werden (z. B. Festplatten).
- Zeichenorientierte Geräte (Character Devices): Empfangen oder senden einen Strom von Zeichen ohne Rücksicht auf eine Blockstruktur. Sie sind nicht adressierbar und unterstützen keine Suchoperationen (z. B. Tastatur, Drucker im Zeichenmodus).
Schnittstelle Prozessor/Peripherie
Die Geschwindigkeit und Komplexität der Peripherie bestimmen, wie sie an den Prozessor angeschlossen wird. Wir untersuchen drei Arten von Verbindungen:
- Ports/Register: Die Kommunikation zwischen CPU und einfachen Geräten erfolgt über spezielle Hardwareregister, sogenannte Ports. Diese befinden sich entweder in einem eigenen E/A-Adressraum oder sind speicherabbildet (Memory-Mapped I/O). Jedes Gerät hat eine Basisadresse für seine Ports.
Die Ports für ein Gerät umfassen typischerweise:
- Eingabepuffer: Daten vom Gerät zur CPU.
- Ausgabepuffer: Daten von der CPU zum Gerät.
- Statusregister: Gerät meldet seinen Zustand an die CPU.
- Befehlsregister: CPU gibt Befehle an das Gerät.
Die CPU führt ein Programm (Teil des Treibers) aus, das den E/A-Vorgang direkt steuert: Auswahl des Geräts, Überprüfung des Status, Senden des Lese-/Schreibbefehls, Übertragen der Daten.
Um festzustellen, wann die Operation abgeschlossen ist, gibt es zwei Möglichkeiten:
- Polling (Abfrage): Die CPU liest wiederholt das Statusregister des Geräts. Nachteil: Verschwendet CPU-Zeit.
- Interrupts (Unterbrechungen): Die CPU führt andere Arbeiten aus. Wenn das Gerät die Operation abgeschlossen hat, sendet es ein Interrupt-Signal an die CPU. Die CPU unterbricht ihre aktuelle Arbeit, um die Unterbrechung zu behandeln (Interrupt Service Routine, ISR).
- Controller: Komplexere Geräte (z. B. Festplatten) werden nicht direkt, sondern über eine Hardware-Komponente namens Controller an den Prozessorbus angeschlossen. Der Controller dient als Schnittstelle, enthält Gerätestatusinformationen, steuert das Gerät und wickelt Datentransfers ab. Das Betriebssystem (der Treiber) kommuniziert mit dem Controller, nicht direkt mit dem Gerät. Ein Controller kann oft mehrere Geräte desselben Typs verwalten (z. B. IDE/SATA-Controller).
- Direct Memory Access (DMA): Wird bei schnellen Blockgeräten verwendet, um die CPU während der Datenübertragung zu entlasten. Die CPU weist den DMA-Controller an, Daten zu übertragen, indem sie ihm folgende Informationen gibt:
- Quelladresse (Gerät oder Speicher)
- Zieladresse (Speicher oder Gerät)
- Anzahl der zu übertragenden Bytes (oder Blöcke)
- Kanäle (Channels): In Großrechnern werden oft spezielle E/A-Prozessoren, sogenannte Kanäle, eingesetzt. Sie steuern mehrere Controller und führen komplexe E/A-Operationen (Kanalprogramme) unabhängig von der Haupt-CPU aus. Kanäle entlasten die CPU erheblich.
- Selektorkanäle: Können mehrere Geräte steuern, aber nur mit einem gleichzeitig Daten übertragen.
- Multiplexerkanäle: Können mehrere (oft langsame) Geräte gleichzeitig bedienen, indem sie deren Daten verschachteln (Interleaving).
E/A-Software
Die Software zur Steuerung der E/A wird auf mehreren Ebenen behandelt:
- Geräteunabhängige Software: Teil des Betriebssystems, bietet eine einheitliche Schnittstelle für alle Geräte.
Hauptaufgaben:
- Einheitliche Schnittstelle für Gerätetreiber: Generische Befehle (read, write, open, close).
- Gerätebenennung: Zuordnung von logischen Namen (z. B. `/dev/sda1`) zu physischen Geräten.
- Zugriffskontrolle/Schutz: Überprüfung von Berechtigungen.
- Einheitliche Blockgröße: Abstraktion von physischen Blockgrößen.
- Pufferung (Buffering): Temporäre Speicherung von Daten zur Geschwindigkeitsanpassung und Effizienzsteigerung.
- Speicherplatzverwaltung für Blockgeräte: Verfolgung freier/belegter Blöcke auf Datenträgern.
- Reservierung/Freigabe dedizierter Geräte.
- Fehlerberichterstattung: Meldung von Fehlern, die nicht auf tieferen Ebenen behoben werden konnten.
- Geräteabhängige Software (Treiber): Spezifische Programme zur Steuerung eines bestimmten Gerätetyps oder -modells. Berücksichtigen die besonderen Merkmale des Geräts.
Für jedes im System installierte Gerät muss ein Treiber vorhanden sein. Funktionen eines Treibers:
- Definition der Gerätemerkmale für das restliche Betriebssystem.
- Initialisierung der gerätespezifischen Hardwareregister beim Systemstart.
- Aktivierung und Deaktivierung des Geräts für einen Prozess.
- Verarbeitung aller von einem Prozess angeforderten E/A-Operationen durch Übersetzung in gerätespezifische Befehle.
- Abbruch von E/A-Operationen, falls erforderlich.
- Behandlung von Gerätestatus und Fehlern, Kommunikation mit der geräteunabhängigen Software.
Ablauf einer Treiberoperation:
- Empfängt eine Anfrage von der geräteunabhängigen Software.
- Übersetzt die Anfrage in spezifische Befehle für den Controller/das Gerät.
- Schreibt die Befehle in die entsprechenden Hardwareregister (Ports).
- Wartet, bis das Gerät reagiert und die Operation ausführt (oder übergibt die Kontrolle und wartet auf einen Interrupt).
- Prüft auf Fehler durch Lesen des Statusregisters. Bei Fehlern ggf. Wiederholungsversuche.
- Meldet das Ergebnis (Erfolg oder nicht behebbarer Fehler) an die geräteunabhängige Software.
Ein Treiber ist definiert als „ein Satz von Routinen und Tabellen als Teil des Betriebssystems, der die Ein- und Ausgabeaktivitäten für jedes an den Computer angeschlossene Gerät ausführt und steuert; er ist für jedes Gerät einzigartig.“
Ein Treiber ist kein eigenständiger Prozess, sondern eine Sammlung von Routinen und Datenstrukturen (oft im Kernel-Speicher), die die Kommunikation mit der Hardware ermöglichen.
Interrupt-Vektorisierung
Betriebssysteme müssen auf Interrupts von Peripheriegeräten reagieren können. Um zu erkennen, welches Gerät einen Interrupt verursacht hat, und die richtige Behandlungsroutine (Interrupt Service Routine, ISR) aufzurufen, verwendet das Betriebssystem eine Interrupt-Vektortabelle. Diese Tabelle, die sich an einer festen Speicheradresse befindet, enthält die Adressen der ISRs für die verschiedenen Interrupt-Quellen (nummeriert durch Interrupt-Nummern oder IRQs).
Ein Betriebssystem unterstützt eine maximale Anzahl von Interrupts, die bei seinem Design festgelegt wird (z. B. 16 für klassisches DOS über den PIC).
Adressierung von E/A-Geräten
Peripheriegeräte oder deren Controller verfügen über Hardwareregister (Ports), die vom Betriebssystem gelesen oder beschrieben werden können, um Operationen durchzuführen. Die Adresse des Speicherbereichs (im E/A-Adressraum oder im Hauptspeicheradressraum bei Memory-Mapped I/O), der diese Register enthält, wird als E/A-Adresse (I/O Address) des Geräts bezeichnet.
Datenverwaltung (Dateisystem)
Das Betriebssystem stellt dem Benutzer eine logische Sicht auf Informationen zur Verfügung, die auf externen Speichermedien gespeichert sind, unabhängig von der physischen Realität.
Das System muss wissen, wie es Informationen auf den Medien findet, Platz für neue Dateien reserviert, gelöschte Dateien entfernt und den freigegebenen Platz verwaltet.
In einem Mehrbenutzer-Betriebssystem muss zusätzlich das Problem des Dateischutzes gelöst werden, um unbefugten Zugriff (freiwillig oder nicht) auf Inhalte zu verhindern. Es muss den Zugriff auf Dateien kontrollieren und die Privatsphäre wahren.
Der Teil des Betriebssystems, der für diese Funktionen verantwortlich ist, wird als Dateisubsystem (File Subsystem) bezeichnet.
Physische Unterstützung der Informationen
Logische Struktur der Informationen:
- Bit: Kleinste Informationseinheit (0 oder 1).
- Zeichen (Character): Kombination von Bits (z. B. gemäß ASCII, EBCDIC), die Buchstaben, Zahlen, Sonderzeichen darstellt.
- Feld (Field): Eine Gruppe von zusammengehörigen Zeichen (z. B. Name, Preis). Kann numerisch, alphabetisch, alphanumerisch sein.
- Datensatz (Record): Eine Sammlung von logisch zusammengehörigen Feldern, die sich auf eine Entität beziehen (z. B. Kundendatensatz).
- Datei (File): Eine Sammlung von zusammengehörigen Datensätzen. Oft haben Datensätze Schlüsselfelder zur Identifizierung.
- Datenbank (Database): Eine Sammlung von miteinander verknüpften Dateien, die gemeinsam von einem Datenbankmanagementsystem (DBMS) verwaltet werden.
Benutzer handhaben Informationen oft in logischen Einheiten variabler Größe, den logischen Datensätzen.
Die physischen Strukturen der Speichermedien (insbesondere Festplatten) bestimmen jedoch die Grundeinheit für die Datenübertragung, den physischen Datensatz oder Block. Bei Festplatten entspricht ein Block oft einem Sektor oder einer Gruppe von Sektoren.
Um die Speichernutzung zu optimieren, kann das Betriebssystem mehrere logische Datensätze zu einem physischen Block zusammenfassen. Dieser Vorgang wird als Blockung (Blocking) bezeichnet.
Software des Dateisubsystems
Aus Sicht der Nutzer sind Dateien Gruppen von zusammengehörigen Informationen, mit denen verschiedene Operationen (lesen, schreiben, ändern, löschen usw.) durchgeführt werden können.
Der Dateisystem-Manager muss diese Operationen verwalten und an die Eigenschaften der physischen Geräte anpassen. Dazu muss er folgende Aufgaben erfüllen:
- Speicherplatzverwaltung: Entscheiden, wie der Speicherplatz auf den Geräten aufgeteilt wird, um Speicherplatz effizient zu nutzen und schnellen Zugriff auf gespeicherte Informationen zu ermöglichen.
- Zugriffsmethoden: Definieren, wie auf gespeicherte Informationen zugegriffen wird (sequenziell, direkt, indiziert).
- Dateiverwaltung: Kontrolle über vorhandene Dateien, ihre Beziehungen, Erstellung, Löschung, Freigabe usw. (oft über Verzeichnisse).
- Schutz und Integrität: Sicherstellen der Vertraulichkeit, Integrität und Verfügbarkeit der in Dateien enthaltenen Informationen.
Es gibt verschiedene Techniken und Ansätze zur Erfüllung dieser Aufgaben, und jedes System wird entsprechend seinen Zielen entworfen.
Speicherplatzverwaltung und -zuweisung
- Kontrolle des freien Speicherplatzes: Das Dateisubsystem muss jederzeit wissen, welche Bereiche auf einem Speichermedium belegt und welche verfügbar sind. Es führt eine Liste oder eine andere Struktur (z. B. Bitmap, verkettete Liste freier Blöcke), um den freien Speicherplatz zu verwalten. Wenn Dateien erstellt werden, wird Platz zugewiesen; wenn sie gelöscht werden, wird der Platz wieder freigegeben.
- Geräteverzeichnis (Volume Control Block): Oft reserviert das System einen Bereich auf jedem Datenträger für Metadaten, einschließlich Informationen über das Volume selbst und oft auch das Wurzelverzeichnis oder Informationen zur Verwaltung des freien Speicherplatzes.
- Verzeichnisstruktur (Directory Structure): Das System verwaltet Verzeichnisse (Ordner), um Dateien zu organisieren. Ein Verzeichnis ist eine spezielle Datei, die Einträge für andere Dateien und Verzeichnisse enthält. Jeder Eintrag enthält Informationen wie:
- Dateiname
- Dateityp
- Physischer Speicherort (oder Verweis darauf)
- Größe
- Kontrollinformationen (Attribute wie schreibgeschützt, Systemdatei)
- Schutzinformationen (Zugriffsrechte)
- Buchhaltungsinformationen (Erstellungsdatum, Änderungsdatum, Eigentümer)
- Zuweisung von Speicherplatz (Allocation Methods): Das Betriebssystem muss entscheiden, wie die Blöcke einer Datei auf dem Datenträger angeordnet werden.
- Kontinuierliche Zuweisung (Contiguous Allocation): Alle Blöcke einer Datei werden in einem zusammenhängenden Bereich auf dem Datenträger gespeichert. Das Verzeichnis speichert die Startadresse und die Länge. Ermöglicht schnellen sequenziellen und direkten Zugriff. Problem: Externe Fragmentierung, Schwierigkeiten beim Vergrößern von Dateien.
- Verkettete Zuweisung (Linked Allocation): Die Blöcke einer Datei sind über Zeiger miteinander verbunden. Jeder Block enthält einen Zeiger auf den nächsten Block. Das Verzeichnis speichert nur die Adresse des ersten Blocks (manchmal auch des letzten). Löst das Problem der externen Fragmentierung. Gut für sequenziellen Zugriff. Schlecht für direkten Zugriff (man muss der Kette folgen). Anfällig für Datenverlust bei Zeigerfehlern. Eine Variante ist die File Allocation Table (FAT), bei der die Zeiger in einer separaten Tabelle im Speicher gehalten werden.
- Indizierte Zuweisung (Indexed Allocation): Alle Zeiger auf die Datenblöcke einer Datei werden in einem speziellen Block, dem Indexblock, gesammelt. Das Verzeichnis speichert die Adresse des Indexblocks. Ermöglicht schnellen direkten Zugriff (nur zwei Zugriffe: Indexblock + Datenblock). Löst das Problem der externen Fragmentierung. Keine Größenbeschränkung durch zusammenhängenden Platz. Für große Dateien können mehrere Indexblöcke verwendet werden (verkettet, mehrstufig - z. B. Unix i-nodes).
Zugriffsmethoden
Unabhängig davon, wie die Informationen physisch gespeichert sind, kann logisch auf sie zugegriffen werden:
- Sequenzieller Zugriff: Datensätze werden in einer vordefinierten Reihenfolge (normalerweise vom Anfang bis zum Ende) nacheinander gelesen oder geschrieben. Das System verwaltet einen Zeiger auf den nächsten Datensatz. Einfachste Methode, passt gut zu Bandgeräten.
- Direkter Zugriff (oder Relativer Zugriff): Jeder Datensatz (oder Block) kann direkt über seine Nummer oder Adresse zugegriffen werden, ohne die vorherigen durchlaufen zu müssen. Erfordert ein Medium, das direkten Zugriff unterstützt (z. B. Festplatte). Effizient für Anwendungen mit wahlfreiem Zugriff auf große Datenmengen.
- Indizierter Zugriff (Indexed Sequential Access Method - ISAM): Baut auf dem direkten Zugriff auf, verwendet aber einen Index, um Datensätze anhand eines Schlüsselfeldes zu finden. Der Index enthält Paare aus Schlüsselwerten und den zugehörigen Block- oder Datensatzadressen. Ermöglicht schnellen Zugriff über den Schlüssel sowie sequenzielle Verarbeitung in Schlüsselreihenfolge. Für große Dateien können mehrstufige Indizes verwendet werden.
Dateiverwaltung (Verzeichnisse)
Das Dateisubsystem muss den Speicherort aller Dateien kennen und Anfragen bearbeiten (Erstellen, Lesen, Schreiben, Löschen, Ausführen usw.). Dies geschieht mithilfe von Verzeichnisstrukturen.
Grundlegende Verzeichnisoperationen:
- Suchen (Search): Finden einer Datei oder einer Gruppe von Dateien.
- Erstellen (Create): Hinzufügen einer neuen Datei zum Verzeichnis und Zuweisen von Speicherplatz.
- Löschen (Delete): Entfernen einer Datei aus dem Verzeichnis und Freigeben ihres Speicherplatzes.
- Auflisten (List): Anzeigen der Dateien in einem Verzeichnis und ihrer Attribute.
Verzeichnisstrukturen:
- Einstufiges Verzeichnis (Single-Level Directory): Alle Dateien befinden sich in einem einzigen Verzeichnis. Einfach, aber problematisch bei vielen Dateien oder mehreren Benutzern (Namenskonflikte).
- Zweistufiges Verzeichnis (Two-Level Directory): Ein Hauptverzeichnis (Master File Directory, MFD) enthält Einträge für separate Benutzerverzeichnisse (User File Directories, UFDs). Jeder Benutzer hat sein eigenes Verzeichnis. Löst Namenskonflikte zwischen Benutzern. Der Pfadname besteht aus Benutzername und Dateiname.
- Baumstrukturierte Verzeichnisse (Tree-Structured / Hierarchical Directory): Eine Verallgemeinerung der zweistufigen Struktur. Verzeichnisse können Dateien und weitere Unterverzeichnisse enthalten. Beginnt mit einem Wurzelverzeichnis (Root). Ermöglicht flexible Organisation. Standard in modernen Betriebssystemen (Unix, Windows, etc.). Pfadnamen können absolut (vom Root) oder relativ (vom aktuellen Verzeichnis) sein.
Schutz und Integrität der Dateien
Der primäre Zweck von Dateien ist die Speicherung von Daten für spätere Verwendung. Verlust oder Veränderung dieser Daten kann schwerwiegende Folgen haben.
Die Sicherheit von Dateien umfasst zwei Aspekte:
- Verfügbarkeit: Sicherstellen, dass auf die Informationen zugegriffen werden kann, wenn sie benötigt werden.
- Vertraulichkeit/Schutz: Kontrolle des Zugriffs auf Informationen, um unbefugte Nutzung zu verhindern.
Verfügbarkeit von Dateien
- Sicherungskopien (Backups): Regelmäßiges Kopieren von Dateien auf separate Medien (Bänder, andere Festplatten, Cloud). Ermöglicht die Wiederherstellung nach Datenverlust. Betriebssysteme bieten oft Dienstprogramme für Backups und Wiederherstellung.
- Protokolldateien (Log Files / Journaling): In Systemen mit häufigen Aktualisierungen (z. B. Datenbanken, Transaktionssysteme) werden Änderungen oft zuerst in einer Protokolldatei aufgezeichnet, bevor sie an der eigentlichen Datei vorgenommen werden (Write-Ahead Logging). Dies ermöglicht die Wiederherstellung eines konsistenten Zustands nach einem Systemabsturz, indem abgeschlossene Transaktionen wiederholt (Redo) oder unvollständige Transaktionen rückgängig gemacht (Undo) werden.
Vertraulichkeit und Schutz von Dateien
- Benutzerauthentifizierung: Überprüfung der Identität des Benutzers beim Anmelden am System, typischerweise durch Benutzername und Passwort.
- Zugriffskontrolle: Mechanismen, die festlegen, welche Benutzer welche Operationen (Lesen, Schreiben, Ausführen usw.) an welchen Dateien durchführen dürfen.
- Zugriffssteuerungslisten (Access Control Lists, ACLs): Mit jeder Datei wird eine Liste von Benutzern/Gruppen und deren spezifischen Berechtigungen gespeichert.
- Fähigkeitslisten (Capability Lists, C-Lists): Jedem Benutzer/Prozess wird eine Liste von Objekten (Dateien) und den erlaubten Operationen zugeordnet (eine Art Ticket).
- UNIX-Berechtigungen: Ein einfacheres Modell mit Berechtigungen für Eigentümer, Gruppe und Andere (Lesen, Schreiben, Ausführen).
Sicherheit im weiteren Sinne
Sicherheitsmechanismen ergänzen sich gegenseitig.
Externe Sicherheit
Mechanismen außerhalb des Betriebssystems selbst.
- Physische Sicherheit: Schutz vor physischen Bedrohungen wie Feuer, Wasser, Diebstahl, unbefugtem Zutritt. Maßnahmen: Zugangskontrollen (Schlösser, Karten, Biometrie), Katastrophenschutz (Feuerlöscher, USV, Klimatisierung), sichere Aufbewahrung von Backup-Medien.
- Verwaltungssicherheit / Betriebssicherheit: Organisatorische und prozedurale Maßnahmen.
- Zugangsschutz (Authentifizierung): Sicherstellen, dass nur autorisierte Benutzer auf das System zugreifen können (Passwörter, Zwei-Faktor-Authentifizierung).
- Kryptografie: Verschlüsselung von Daten, um sie vor unbefugtem Lesen zu schützen (sowohl bei Speicherung als auch bei Übertragung). Methoden: Symmetrisch (z. B. DES, AES - gleicher Schlüssel für Ver-/Entschlüsselung), Asymmetrisch (z. B. RSA - öffentlicher/privater Schlüssel).
- Funktionale Sicherheit:
- Sicherheit bei der Datenübertragung: Schutz vor Abhören oder Verfälschung auf Kommunikationsleitungen (Verschlüsselung, Datenkompression, Zuverlässigkeitsprüfungen wie Prüfsummen).
- Fehlertolerante Systeme: Systeme, die auch bei Ausfall einzelner Komponenten weiterarbeiten können (Redundanz bei Hardware oder Software).
Interne Sicherheit
Sicherheitsmechanismen innerhalb des Betriebssystems.
- Prozessorsicherheit: Schutzmechanismen der CPU (Kernel/User Mode, privilegierte Instruktionen), Hardware-Timer gegen Blockaden.
- Speichersicherheit: Schutz des Speichers verschiedener Prozesse voreinander (Grenzwertregister, Paging/Segmentierungs-Schutzbits, Kernel/User-Adressräume).
- Dateisicherheit: Mechanismen zur Sicherstellung von Verfügbarkeit und Vertraulichkeit (Backups, Logging, Zugriffskontrolle - siehe oben).
Modelle von Benutzeroberflächen für Betriebssysteme
Äußerlich manifestiert sich ein Betriebssystem durch seine Benutzeroberfläche (Interface). Diese Schnittstelle ermöglicht es dem Benutzer, das Betriebssystem zu identifizieren und Anweisungen oder Befehle einzugeben, um einen Dialog mit dem System zu führen.
Man kann zwei Haupttypen von Schnittstellen unterscheiden:
- Textbasiert (Command Line Interface - CLI): Alle Benutzerbefehle und Systemantworten werden als Zeichenketten (Text) über die Tastatur eingegeben und auf dem Bildschirm angezeigt. Oft wird die Bereitschaft zur Befehlseingabe durch ein Prompt-Symbol (z. B. `>`, `$`, `#`) angezeigt. Beispiele: MS-DOS, Unix/Linux Shell, CPM.
- Grafisch (Graphical User Interface - GUI): Besteht aus Fenstern, Menüs, Dialogboxen und kleinen Bildern (Icons), die Programme oder Dateien repräsentieren. Die Interaktion erfolgt hauptsächlich über ein Zeigegerät (Maus). Informationen werden in grafischen Elementen dargestellt. GUIs sind oft einfacher zu erlernen und zu bedienen, aber komplexer in der Erstellung. Beispiele: Windows, macOS, OS/2 Presentation Manager, Linux-Desktop-Umgebungen (KDE, GNOME).
Bei grafischen Schnittstellen gibt es Unterschiede:
- Integrierte GUIs: Das Betriebssystem startet direkt mit einer grafischen Oberfläche (z. B. Windows 95 und spätere Versionen, macOS, OS/2). Diese Systeme bieten oft auch die Möglichkeit, textbasierte Programme in einem Fenster auszuführen.
- GUI-Aufsätze: Grafische Oberflächen, die auf einem textbasierten Betriebssystem aufsetzen und nach dessen Start geladen werden müssen (z. B. Windows 1.0 bis 3.11 auf MS-DOS; X Window System mit Desktop-Umgebungen wie KDE oder GNOME auf Unix/Linux).
Wichtige Betriebssysteme am Markt und ihre Funktionen
DOS (Disk Operating System)
Auch bekannt als PC-DOS (IBM) und MS-DOS (Microsoft). Es wurde 1981 von Microsoft im Auftrag von IBM für die ersten IBM PCs entwickelt. Das Ergebnis war MS-DOS 1.0. Es folgten neuere Versionen (bis 6.22), die an Fortschritte angepasst wurden und Fehler behoben. DOS hat eine textbasierte Oberfläche (Kommandozeile) mit einem Laufwerksbuchstaben und dem Prompt `>`. Es ist ein Single-User-, Single-Tasking-Betriebssystem, das ursprünglich nur 640 KB Speicher direkt adressieren konnte und keine Festplatten über 2 GB (in frühen Versionen viel weniger) unterstützte. In den 1980er Jahren war es das dominierende Betriebssystem für PCs, ist aber heute weitgehend veraltet.
Windows
Microsoft entwickelte Windows als benutzerfreundlichere grafische Oberfläche für DOS. Es verwendet Icons, Fenster und eine Maus. Ein wichtiges Merkmal war die (anfangs kooperative) Multitasking-Fähigkeit, d. h. die Möglichkeit, mehrere Programme gleichzeitig in separaten Fenstern auszuführen. Anwendungen unter Windows haben ein ähnliches Erscheinungsbild, was das Erlernen neuer Programme erleichtert. Die ersten Versionen (bis Windows 3.11 for Workgroups) waren keine eigenständigen Betriebssysteme, sondern GUIs für MS-DOS.
Windows 95 (erschienen 1995) war ein wichtiger Schritt, ein integriertes 32-Bit-Betriebssystem mit einer weiterentwickelten GUI, präemptivem Multitasking und besserer Hardware-Unterstützung (Plug and Play). Es konnte weiterhin DOS- und ältere Windows-Programme ausführen.
Windows 98 und Windows ME waren Weiterentwicklungen der Windows 9x-Linie, die Unterstützung für neuere Technologien (USB, DVD, FAT32) hinzufügten. Windows ME war die letzte Version, die auf DOS basierte.
Parallel dazu entwickelte Microsoft Windows NT (New Technology), beginnend mit Version 3.1 (1993). NT war ein von Grund auf neu entwickeltes 32-Bit-Betriebssystem mit einem stabileren Kernel (ursprünglich für OS/2 3.0 vorgesehen), echtem präemptivem Multitasking, Speicherschutz, Sicherheit und Netzwerkfähigkeiten. Es gab Versionen für Workstations und Server. Die Benutzeroberfläche ähnelte der von Windows 3.1, später der von Windows 95 (NT 4.0).
Windows 2000 (basierend auf NT 5.0) führte die 9x- und NT-Linien zusammen und bot verbesserte Zuverlässigkeit, Verwaltung und Hardware-Unterstützung.
Windows XP war eine Weiterentwicklung von Windows 2000 mit überarbeiteter Benutzeroberfläche und Fokus auf Benutzerfreundlichkeit. Es folgten weitere Versionen wie Vista, 7, 8, 10 und 11.
Windows ist heute das meistgenutzte Betriebssystem für Personal Computer.
OS/2
1987 von IBM (anfangs in Zusammenarbeit mit Microsoft) angekündigt. Es war eines der ersten 32-Bit-Betriebssysteme für PCs mit grafischer Benutzeroberfläche (Presentation Manager). Es sollte die 640-KB-Speichergrenze von DOS überwinden und echtes Multitasking bieten. Es unterstützte einen Real-Modus für DOS-Kompatibilität und einen Protected-Modus für OS/2-Anwendungen. Obwohl technisch fortschrittlich, konnte es sich aufgrund mangelnder Anwendungsunterstützung nicht gegen Windows durchsetzen.
Mac OS
Das Betriebssystem für Apples Macintosh-Computer. Es war eines der ersten kommerziell erfolgreichen Betriebssysteme mit einer grafischen Benutzeroberfläche und trug maßgeblich zur Popularität des Macintosh bei. Es gilt als sehr benutzerfreundlich. Da es nur auf Apple-Hardware läuft, ist seine Verbreitung geringer als die von Windows. Das klassische Mac OS wurde durch macOS (ursprünglich Mac OS X) abgelöst, das auf einem Unix-Kern (NeXTSTEP/BSD) basiert.
UNIX
Ein sehr altes und einflussreiches Betriebssystem, dessen Entwicklung Ende der 1960er Jahre bei den Bell Labs begann. Es ist bekannt für seine Robustheit, Stabilität und Portabilität. Es ist ein Multi-User-, Multitasking-Betriebssystem, das im Time-Sharing-Modus arbeitet und starke Netzwerkfähigkeiten besitzt. Die traditionelle Benutzeroberfläche ist textbasiert (Shell, z. B. sh, bash, csh), aber grafische Oberflächen (basierend auf dem X Window System) sind weit verbreitet. Es gibt viele kommerzielle Varianten (z. B. Solaris, HP-UX, AIX) und freie Unix-ähnliche Systeme.
Linux ist ein Unix-ähnlicher Betriebssystemkern, der 1991 von Linus Torvalds initiiert wurde. Er wird unter der GNU General Public License (GPL) vertrieben und ist Open Source. In Kombination mit Systemsoftware aus dem GNU-Projekt und anderer Software bildet er vollständige Linux-Distributionen (z. B. Ubuntu, Fedora, Debian). Linux ist auf PCs, Servern, eingebetteten Systemen und Supercomputern sehr populär geworden.