Das Betriebssystem bestimmt unser Computererlebnis. Es ist die erste Software, die wir sehen, wenn wir den Computer einschalten, und die letzte Software, die wir sehen, wenn der Computer ausgeschaltet wird. Es ist die Software, die alle Programme ermöglicht, die wir benutzen. Das Betriebssystem organisiert und steuert die Hardware auf unseren Schreibtischen und in unseren Händen, aber die meisten Benutzer können nicht mit Sicherheit sagen, was genau das Betriebssystem tut.
In dieser Ausgabe von HowStuffWorks erklären wir Ihnen, was eine Software tun muss, um als Betriebssystem bezeichnet zu werden, und zeigen Ihnen, wie das Betriebssystem funktioniert, um aus einer Ansammlung von Hardware ein leistungsfähiges Computerwerkzeug zu machen!
Das Grundgerüst
Es ist wichtig zu wissen, dass nicht alle Computer ein Betriebssystem haben. Der Computer, der den Mikrowellenherd in Ihrer Küche steuert, braucht zum Beispiel kein Betriebssystem. Er hat eine Reihe relativ einfacher Aufgaben zu erfüllen, sehr einfache Ein- und Ausgabemethoden (eine Tastatur und einen LCD-Bildschirm) und einfache, sich nie ändernde Hardware zu steuern. Für einen Computer wie diesen wäre ein Betriebssystem unnötiger Ballast, der die Komplexität dort erhöht, wo sie nicht benötigt wird. Stattdessen führt der Computer in einem Mikrowellenherd einfach ein einziges Programm aus, das die ganze Zeit läuft.
Für Computersysteme, die über die Komplexität einer Mikrowelle hinausgehen, kann ein Betriebssystem jedoch der Schlüssel zu einer größeren Betriebseffizienz und einer einfacheren Anwendungsentwicklung sein. Alle Desktop-Computer haben Betriebssysteme. Die gängigsten sind die Windows-Betriebssysteme, die UNIX-Betriebssysteme und die Macintosh-Betriebssysteme. Es gibt Hunderte von anderen Betriebssystemen für spezielle Anwendungen, einschließlich Spezialisierungen für Großrechner, Robotik, Fertigung, Echtzeitsteuerungssysteme usw.
Auf der einfachsten Ebene tut ein Betriebssystem zwei Dinge:
- Es verwaltet die Hardware- und Software-Ressourcen des Computersystems. Zu diesen Ressourcen gehören z.B. der Prozessor, der Speicher, der Festplattenplatz, usw.
- Sie bietet eine stabile, konsistente Möglichkeit für Anwendungen, mit der Hardware umzugehen, ohne alle Details der Hardware kennen zu müssen.
Die erste Aufgabe, die Verwaltung der Hardware- und Softwareressourcen, ist sehr wichtig, da verschiedene Programme und Eingabemethoden um die Aufmerksamkeit der Zentraleinheit (CPU) konkurrieren und für ihre eigenen Zwecke Arbeitsspeicher, Speicherplatz und Eingabe-/Ausgabebandbreite (E/A) benötigen. In dieser Eigenschaft spielt das Betriebssystem die Rolle des guten Elternteils, der sicherstellt, dass jede Anwendung die notwendigen Ressourcen erhält, während es mit allen anderen Anwendungen gut zusammenspielt und die begrenzte Kapazität des Systems zum größten Nutzen aller Benutzer und Anwendungen nutzt.
Die zweite Aufgabe, die Bereitstellung einer konsistenten Anwendungsschnittstelle, ist besonders wichtig, wenn mehr als ein Computer eines bestimmten Typs das Betriebssystem benutzen soll oder wenn die Hardware, aus der der Computer besteht, sich ändern kann. Eine konsistente Anwendungsprogrammschnittstelle (API) ermöglicht es einem Softwareentwickler, eine Anwendung auf einem Computer zu schreiben und sich darauf verlassen zu können, dass sie auch auf einem anderen Computer desselben Typs läuft, selbst wenn der Speicherplatz oder die Speichermenge auf den beiden Rechnern unterschiedlich ist. Selbst wenn ein bestimmter Computer einzigartig ist, kann ein Betriebssystem sicherstellen, dass die Anwendungen auch bei Hardware-Upgrades und -Updates weiterlaufen, da das Betriebssystem und nicht die Anwendung mit der Verwaltung der Hardware und der Verteilung ihrer Ressourcen beauftragt ist. Windows 98 ist ein hervorragendes Beispiel für die Flexibilität, die ein Betriebssystem bietet. Windows 98 läuft auf Hardware von Tausenden von Anbietern. Es kann Tausende von verschiedenen Druckern, Plattenlaufwerken und speziellen Peripheriegeräten in jeder möglichen Kombination aufnehmen.
In der großen Familie der Betriebssysteme gibt es im Allgemeinen vier Typen, die nach der Art der Computer, die sie steuern, und der Art der Anwendungen, die sie unterstützen, eingeteilt werden. Die großen Kategorien sind:
- Echtzeit-Betriebssystem (RTOS) – Echtzeit-Betriebssysteme werden zur Steuerung von Maschinen, wissenschaftlichen Instrumenten und industriellen Systemen eingesetzt. Ein RTOS hat in der Regel nur eine sehr geringe Benutzerschnittstelle und keine Dienstprogramme für den Endbenutzer, da das System bei Auslieferung eine „versiegelte Box“ ist. Ein sehr wichtiger Teil eines RTOS ist die Verwaltung der Computerressourcen, so dass ein bestimmter Vorgang jedes Mal in genau der gleichen Zeit ausgeführt wird, wenn er auftritt. Wenn sich in einer komplexen Maschine ein Teil schneller bewegt, nur weil Systemressourcen verfügbar sind, kann das genauso katastrophal sein wie wenn es sich überhaupt nicht bewegt, weil das System ausgelastet ist.
- Einzelbenutzer, Einzelaufgabe – Wie der Name schon sagt, ist dieses Betriebssystem darauf ausgelegt, den Computer so zu verwalten, dass ein Benutzer effektiv eine Sache zur gleichen Zeit erledigen kann. Das Palm OS für Palm-Handheld-Computer ist ein gutes Beispiel für ein modernes Single-User-, Single-Task-Betriebssystem.
- Einzelbenutzer, Multitasking – Dies ist die Art von Betriebssystem, die die meisten Menschen heute auf ihren Desktop- und Laptop-Computern verwenden. Windows 98 und MacOS sind beides Beispiele für Betriebssysteme, die es einem einzelnen Benutzer ermöglichen, mehrere Programme gleichzeitig zu benutzen. Es ist zum Beispiel durchaus möglich, dass ein Windows-Benutzer eine Notiz in einem Textverarbeitungsprogramm schreibt, während er eine Datei aus dem Internet herunterlädt und gleichzeitig den Text einer E-Mail-Nachricht druckt.
- Multi-User – Ein Multi-User-Betriebssystem ermöglicht es vielen verschiedenen Benutzern, die Ressourcen des Computers gleichzeitig zu nutzen. Das Betriebssystem muss sicherstellen, dass die Anforderungen der verschiedenen Benutzer ausgeglichen sind und dass jedes der von ihnen verwendeten Programme über ausreichende und separate Ressourcen verfügt, damit ein Problem mit einem Benutzer nicht die gesamte Benutzergemeinschaft beeinträchtigt. Unix, VMS und Mainframe-Betriebssysteme wie MVS sind Beispiele für Mehrbenutzer-Betriebssysteme.
Es ist wichtig, hier zwischen Mehrbenutzer-Betriebssystemen und Einzelbenutzer-Betriebssystemen, die Netzwerke unterstützen, zu unterscheiden. Windows 2000 und Novell Netware können jeweils Hunderte oder Tausende von vernetzten Benutzern unterstützen, aber die Betriebssysteme selbst sind keine echten Mehrbenutzer-Betriebssysteme. Der Systemadministrator ist der einzige „Benutzer“ von Windows 2000 oder Netware. Die Netzwerkunterstützung und alle entfernten Benutzeranmeldungen, die das Netzwerk ermöglicht, sind im Gesamtplan des Betriebssystems ein Programm, das vom administrativen Benutzer ausgeführt wird.
Mit den verschiedenen Arten von Betriebssystemen im Hinterkopf ist es nun an der Zeit, sich die grundlegenden Funktionen eines Betriebssystems anzusehen.
Weckruf
Wenn ein Computer eingeschaltet wird, ist das erste Programm, das ausgeführt wird, in der Regel eine Reihe von Anweisungen, die im Festwertspeicher (ROM) des Computers gespeichert sind und die Systemhardware überprüfen, um sicherzustellen, dass alles richtig funktioniert. Dieser Selbsttest beim Einschalten (POST) überprüft die CPU, den Speicher und das BIOS (Basic Input-Output System) auf Fehler und speichert das Ergebnis in einem speziellen Speicherbereich. Nach erfolgreichem Abschluss des POST beginnt die im ROM geladene Software (manchmal auch Firmware genannt), die Laufwerke des Computers zu aktivieren. Bei den meisten modernen Computern findet der Computer, wenn er das Festplattenlaufwerk aktiviert, den ersten Teil des Betriebssystems: den Bootstrap-Loader.
Der Bootstrap-Loader ist ein kleines Programm, das eine einzige Funktion hat: Es lädt das Betriebssystem in den Speicher und ermöglicht ihm, den Betrieb aufzunehmen. In der einfachsten Form richtet der Bootstrap-Loader die kleinen Treiberprogramme ein, die die Schnittstelle zu den verschiedenen Hardware-Subsystemen des Computers bilden und diese steuern. Er richtet die Speicherbereiche ein, die das Betriebssystem, die Benutzerinformationen und die Anwendungen enthalten. Er richtet die Datenstrukturen ein, die die unzähligen Signale, Flags und Semaphore enthalten, die zur Kommunikation innerhalb und zwischen den Subsystemen und Anwendungen des Computers verwendet werden. Dann übergibt es die Kontrolle über den Computer an das Betriebssystem.
Die Aufgaben des Betriebssystems lassen sich im allgemeinsten Sinne in sechs Kategorien einteilen:
- Prozessorverwaltung
- Speicherverwaltung
- Geräteverwaltung
- Speicherverwaltung
- Anwendungsschnittstelle
- Benutzerschnittstelle
Es gibt zwar einige, die argumentieren, dass ein Betriebssystem mehr als diese sechs Aufgaben übernehmen sollte, und einige Hersteller von Betriebssystemen bauen viel mehr Dienstprogramme und Hilfsfunktionen in ihre Betriebssysteme ein, aber diese sechs Aufgaben bilden den Kern fast aller Betriebssysteme. Schauen wir uns die Werkzeuge an, die das Betriebssystem verwendet, um jede dieser Funktionen auszuführen.
Prozessorverwaltung
Der Kern der Prozessorverwaltung besteht aus zwei verwandten Themen:
- Sicherstellen, dass jeder Prozess und jede Anwendung genug Zeit des Prozessors erhält, um richtig zu funktionieren
- So viele Prozessorzyklen wie möglich für die eigentliche Arbeit verwenden
Die grundlegende Softwareeinheit, mit der sich das Betriebssystem bei der Planung der vom Prozessor geleisteten Arbeit befasst, ist je nach Betriebssystem entweder ein Prozess oder ein Thread.
Es ist verlockend, sich einen Prozess als eine Anwendung vorzustellen, aber das vermittelt ein unvollständiges Bild davon, wie Prozesse mit dem Betriebssystem und der Hardware zusammenhängen. Die Anwendung, die Sie sehen (Textverarbeitungsprogramm, Tabellenkalkulation oder Spiel), ist in der Tat ein Prozess, aber diese Anwendung kann mehrere andere Prozesse auslösen, z. B. für die Kommunikation mit anderen Geräten oder anderen Computern. Es gibt auch zahlreiche Prozesse, die laufen, ohne dass Sie einen direkten Hinweis auf ihre Existenz erhalten. Ein Prozess ist also eine Software, die eine Aktion ausführt und gesteuert werden kann – durch einen Benutzer, durch andere Anwendungen oder durch das Betriebssystem.
Es sind eher Prozesse als Anwendungen, die das Betriebssystem kontrolliert und für die Ausführung durch die CPU einplant. In einem Single-Tasking-System ist der Zeitplan sehr einfach. Das Betriebssystem lässt die Anwendung laufen und unterbricht die Ausführung nur so lange, bis Unterbrechungen und Benutzereingaben bearbeitet werden. Unterbrechungen sind spezielle Signale, die von Hardware oder Software an die CPU gesendet werden. Es ist so, als ob ein Teil des Computers plötzlich die Hand hebt, um in einer lebhaften Besprechung die Aufmerksamkeit der CPU zu fordern. Manchmal plant das Betriebssystem die Priorität von Prozessen so, dass Unterbrechungen maskiert werden, d. h. das Betriebssystem ignoriert die Unterbrechungen von einigen Quellen, damit eine bestimmte Aufgabe so schnell wie möglich erledigt werden kann. Es gibt einige Interrupts (z. B. solche, die durch Fehlerzustände oder Probleme mit dem Speicher verursacht werden), die so wichtig sind, dass sie nicht ignoriert werden können. Diese nicht-maskierbaren Interrupts (NMIs) müssen unabhängig von den anderen anstehenden Aufgaben sofort abgearbeitet werden.
Während Interrupts die Ausführung von Prozessen in einem Single-Tasking-System etwas komplizierter machen, wird die Aufgabe des Betriebssystems in einem Multi-Tasking-System noch viel komplizierter. Jetzt muss das Betriebssystem die Ausführung von Anwendungen so arrangieren, dass man glaubt, es würden mehrere Dinge gleichzeitig passieren. Das ist kompliziert, weil die CPU immer nur eine Sache auf einmal erledigen kann. Um den Anschein zu erwecken, dass viele Dinge gleichzeitig passieren, muss das Betriebssystem Tausende von Malen pro Sekunde zwischen verschiedenen Prozessen umschalten. Dies geschieht folgendermaßen.
- Ein Prozess belegt eine bestimmte Menge an RAM. Er nutzt auch Register, Stapel und Warteschlangen in der CPU und im Speicher des Betriebssystems.
- Wenn zwei Prozesse Multitasking betreiben, teilt das Betriebssystem eine bestimmte Anzahl von CPU-Ausführungszyklen einem Programm zu.
- Nach dieser Anzahl von Zyklen erstellt das Betriebssystem Kopien aller Register, Stapel und Warteschlangen, die von den Prozessen verwendet werden, und notiert den Punkt, an dem der Prozess in seiner Ausführung pausiert hat.
- Dann lädt es alle Register, Stapel und Warteschlangen, die vom zweiten Prozess verwendet werden, und gewährt ihm eine bestimmte Anzahl von CPU-Zyklen.
- Wenn diese abgeschlossen sind, erstellt es Kopien aller vom zweiten Programm verwendeten Register, Stapel und Warteschlangen und lädt das erste Programm.
Alle Informationen, die benötigt werden, um einen Prozess beim Umschalten zu verfolgen, werden in einem Datenpaket gespeichert, das Prozesssteuerungsblock genannt wird. Der Prozesssteuerungsblock enthält in der Regel:
- eine ID-Nummer, die den Prozess identifiziert
- Zeiger auf die Stellen im Programm und seinen Daten, an denen die Verarbeitung zuletzt stattfand
- Registerinhalte
- Zustände verschiedener Flags und Schalter
- Zeiger auf die obere
- Zeiger auf die obere und untere Grenze des für den Prozess benötigten Speichers
- Liste der vom Prozess geöffneten Dateien
- Priorität des Prozesses
- Status aller vom Prozess benötigten E/A-Geräte
Wenn sich der Status des Prozesses ändert, von ausstehend zu aktiv, zum Beispiel, oder von angehalten zu laufend, müssen die Informationen im Prozesssteuerungsblock wie die Daten in jedem anderen Programm verwendet werden, um die Ausführung des Task-Switching-Teils des Betriebssystems zu steuern.
Dieses Prozess-Swapping geschieht ohne direkte Einmischung des Benutzers, und jeder Prozess erhält genügend CPU-Zyklen, um seine Aufgabe in einer angemessenen Zeitspanne zu erledigen. Probleme können jedoch auftreten, wenn der Benutzer versucht, zu viele Prozesse gleichzeitig laufen zu lassen. Das Betriebssystem selbst benötigt einige CPU-Zyklen, um das Speichern und Auslagern aller Register, Warteschlangen und Stapel der Anwendungsprozesse durchzuführen. Wenn genügend Prozesse gestartet werden und das Betriebssystem nicht sorgfältig entworfen wurde, kann das System beginnen, den größten Teil seiner verfügbaren CPU-Zyklen für den Austausch zwischen Prozessen zu verwenden, anstatt Prozesse auszuführen. Wenn dies geschieht, nennt man es Thrashing, und es erfordert in der Regel eine Art von direktem Benutzereingriff, um Prozesse zu stoppen und wieder Ordnung in das System zu bringen.
Eine Möglichkeit für die Entwickler von Betriebssystemen, das Risiko von Thrashing zu verringern, besteht darin, den Bedarf an neuen Prozessen zur Ausführung verschiedener Aufgaben zu reduzieren. Einige Betriebssysteme ermöglichen einen „Prozess-Lite“, der als Thread bezeichnet wird und alle CPU-intensiven Aufgaben eines normalen Prozesses übernehmen kann, aber im Allgemeinen nicht die verschiedenen Arten von E/A bearbeitet und keine Strukturen aufbaut, die den umfangreichen Prozesssteuerungsblock eines regulären Prozesses erfordern. Ein Prozess kann viele Threads oder andere Prozesse starten, aber ein Thread kann keinen Prozess starten.
Bislang hat sich alles, was wir über Scheduling diskutiert haben, auf eine einzige CPU bezogen. In einem System mit zwei oder mehr CPUs muss das Betriebssystem die Arbeitslast auf die CPUs aufteilen und versuchen, die Anforderungen der erforderlichen Prozesse mit den verfügbaren Zyklen auf den verschiedenen CPUs in Einklang zu bringen. Asymmetrische Betriebssysteme verwenden eine CPU für ihre eigenen Bedürfnisse und verteilen die Anwendungsprozesse auf die übrigen CPUs. Symmetrische Betriebssysteme teilen sich selbst auf die verschiedenen CPUs auf und gleichen den Bedarf mit der CPU-Verfügbarkeit aus, auch wenn nur das Betriebssystem selbst läuft.
Auch wenn das Betriebssystem die einzige Software ist, die ausgeführt werden muss, ist die CPU nicht die einzige Ressource, die geplant werden muss. Die Speicherverwaltung ist der nächste entscheidende Schritt, um sicherzustellen, dass alle Prozesse reibungslos ablaufen.
Speicher- und Speicherverwaltung
Wenn ein Betriebssystem den Speicher des Computers verwaltet, gibt es zwei große Aufgaben, die zu bewältigen sind:
- Jeder Prozess muss über genügend Speicher verfügen, in dem er ausgeführt werden kann, und er darf weder in den Speicherbereich eines anderen Prozesses hineinlaufen noch von einem anderen Prozess hineinlaufen.
- Die verschiedenen Arten von Speicher im System müssen richtig genutzt werden, damit jeder Prozess möglichst effektiv arbeiten kann.
Die erste Aufgabe besteht darin, dass das Betriebssystem Speichergrenzen für Softwaretypen und für einzelne Anwendungen einrichtet.
Betrachten wir als Beispiel ein imaginäres System mit 1 Megabyte (1.000 Kilobytes) RAM. Während des Startvorgangs ist das Betriebssystem unseres imaginären Computers so konzipiert, dass es bis an den Anfang des verfügbaren Speichers geht und dann so weit „zurückgeht“, dass es den Bedarf des Betriebssystems selbst decken kann. Nehmen wir an, dass das Betriebssystem 300 Kilobyte benötigt, um zu laufen. Nun geht das Betriebssystem an den unteren Rand des Arbeitsspeichers und beginnt mit dem Aufbau der verschiedenen Treibersoftware, die zur Steuerung der Hardware-Subsysteme des Computers erforderlich ist. In unserem imaginären Computer nehmen die Treiber 200 Kilobyte in Anspruch. Nachdem also das Betriebssystem vollständig geladen ist, bleiben 500 Kilobyte für Anwendungsprozesse übrig.
Wenn Anwendungen in den Speicher geladen werden, werden sie in vom Betriebssystem festgelegten Blockgrößen geladen. Wenn die Blockgröße 2 Kilobyte beträgt, erhält jeder Prozess, der geladen wird, ein Stück Speicher, das ein Vielfaches von 2 Kilobyte groß ist. Die Anwendungen werden in diesen festen Blockgrößen geladen, wobei die Blöcke an Grenzen beginnen und enden, die durch Wörter von 4 oder 8 Byte festgelegt sind. Diese Blöcke und Grenzen tragen dazu bei, dass die Anwendungen nicht durch ein oder zwei schlecht berechnete Bits übereinander geladen werden. Nachdem dies sichergestellt ist, stellt sich die Frage, was zu tun ist, wenn der 500-Kilobyte-Anwendungsraum gefüllt ist.
In den meisten Computern ist es möglich, den Speicher über die ursprüngliche Kapazität hinaus zu erweitern. Zum Beispiel kann man den Arbeitsspeicher von 1 auf 2 Megabyte erweitern. Das funktioniert gut, ist aber in der Regel relativ teuer. Außerdem wird dabei eine grundlegende Tatsache der Datenverarbeitung ignoriert: Die meisten Informationen, die eine Anwendung im Speicher ablegt, werden zu einem bestimmten Zeitpunkt nicht verwendet. Ein Prozessor kann immer nur auf einen Speicherplatz zugreifen, so dass der größte Teil des Arbeitsspeichers zu jedem Zeitpunkt ungenutzt ist. Da Festplattenspeicher im Vergleich zu RAM billig ist, kann durch das Verschieben von Informationen aus dem RAM auf die Festplatte der RAM-Speicher ohne Kosten erheblich erweitert werden. Diese Technik wird als virtuelle Speicherverwaltung bezeichnet.
Der Festplattenspeicher ist nur eine der Speicherarten, die vom Betriebssystem verwaltet werden müssen, und die langsamste. Die Speicherarten in einem Computersystem sind in der Reihenfolge ihrer Geschwindigkeit folgende:
- Hochgeschwindigkeits-Cache – Dies sind schnelle, relativ kleine Speichermengen, die der CPU über die schnellsten Verbindungen zur Verfügung stehen. Cache-Controller sagen voraus, welche Daten die CPU als nächstes benötigt, und ziehen sie aus dem Hauptspeicher in den Hochgeschwindigkeits-Cache, um die Systemleistung zu beschleunigen.
- Hauptspeicher – Dies ist der Arbeitsspeicher, der beim Kauf eines Computers in Megabyte angegeben wird.
- Sekundärspeicher – Hierbei handelt es sich meist um eine Art rotierenden Magnetspeicher, der Anwendungen und Daten für die Nutzung bereithält und als virtueller RAM unter der Kontrolle des Betriebssystems dient.
Das Betriebssystem muss die Bedürfnisse der verschiedenen Prozesse mit der Verfügbarkeit der verschiedenen Speichertypen in Einklang bringen, indem es Daten in Blöcken (Seiten genannt) zwischen dem verfügbaren Speicher verschiebt, wie es der Zeitplan der Prozesse vorschreibt.
Geräteverwaltung
Der Weg zwischen dem Betriebssystem und praktisch aller Hardware, die sich nicht auf der Hauptplatine des Computers befindet, führt über ein spezielles Programm, das Treiber genannt wird. Ein Großteil der Funktion eines Treibers besteht darin, als Übersetzer zwischen den elektrischen Signalen der Hardware-Subsysteme und den höheren Programmiersprachen des Betriebssystems und der Anwendungsprogramme zu fungieren. Treiber nehmen Daten, die das Betriebssystem als Datei definiert hat, und übersetzen sie in Bitströme, die an bestimmten Stellen auf Speichergeräten abgelegt werden, oder in eine Reihe von Laserimpulsen in einem Drucker.
Da es so große Unterschiede in der durch Treiber gesteuerten Hardware gibt, gibt es auch Unterschiede in der Funktionsweise der Treiberprogramme, aber die meisten werden ausgeführt, wenn das Gerät benötigt wird, und funktionieren fast genauso wie jeder andere Prozess. Das Betriebssystem weist den Treibern häufig Blöcke mit hoher Priorität zu, damit die Hardwareressource so schnell wie möglich freigegeben und für die weitere Verwendung vorbereitet werden kann.
Ein Grund dafür, dass Treiber vom Betriebssystem getrennt sind, ist, dass neue Funktionen zum Treiber – und damit zu den Hardware-Subsystemen – hinzugefügt werden können, ohne dass das Betriebssystem selbst geändert, neu kompiliert und neu verteilt werden muss. Durch die Entwicklung neuer Hardware-Gerätetreiber, die oft vom Hersteller der Subsysteme und nicht vom Herausgeber des Betriebssystems durchgeführt oder bezahlt wird, können die Eingabe-/Ausgabefähigkeiten des Gesamtsystems erheblich verbessert werden.
Die Verwaltung von Ein- und Ausgaben ist weitgehend eine Frage der Verwaltung von Warteschlangen und Puffern, speziellen Speichereinrichtungen, die einen Strom von Bits von einem Gerät, z. B. einer Tastatur oder einer seriellen Schnittstelle, aufnehmen, diese Bits speichern und sie an die CPU mit einer Geschwindigkeit freigeben, die für die CPU langsam genug ist, um sie zu verarbeiten. Diese Funktion ist besonders wichtig, wenn eine Reihe von Prozessen läuft und Prozessorzeit in Anspruch nimmt. Das Betriebssystem weist einen Puffer an, weiterhin Eingaben vom Gerät entgegenzunehmen, aber keine Daten an die CPU zu senden, solange der Prozess, der die Eingaben benötigt, unterbrochen ist. Wenn dann der Prozess, der die Eingabe benötigt, wieder aktiv wird, weist das Betriebssystem den Puffer an, Daten zu senden. Dieses Verfahren ermöglicht es einer Tastatur oder einem Modem, mit hoher Geschwindigkeit mit externen Benutzern oder Computern umzugehen, auch wenn die CPU zu bestimmten Zeiten keine Eingaben von diesen Quellen verwenden kann.
Die Verwaltung aller Ressourcen des Computersystems ist ein großer Teil der Funktion des Betriebssystems und kann im Fall von Echtzeitbetriebssystemen praktisch die gesamte erforderliche Funktionalität sein. Für andere Betriebssysteme ist die Bereitstellung einer relativ einfachen, konsistenten Möglichkeit für Anwendungen und Menschen, die Leistung der Hardware zu nutzen, ein entscheidender Teil ihrer Existenzberechtigung.
Schnittstelle zur Welt
Anwendungsschnittstelle
Genauso wie Treiber eine Möglichkeit für Anwendungen bieten, Hardware-Subsysteme zu nutzen, ohne jedes Detail des Hardwarebetriebs kennen zu müssen, ermöglichen Anwendungsprogrammschnittstellen (APIs) den Anwendungsprogrammierern, Funktionen des Computers und des Betriebssystems zu nutzen, ohne alle Details des CPU-Betriebs direkt verfolgen zu müssen. Betrachten wir das Beispiel der Erstellung einer Festplattendatei zum Speichern von Daten, um zu sehen, warum dies wichtig sein kann.
Ein Programmierer, der eine Anwendung zur Aufzeichnung von Daten aus einem wissenschaftlichen Instrument schreibt, möchte dem Wissenschaftler vielleicht die Möglichkeit geben, den Namen der erstellten Datei anzugeben. Das Betriebssystem könnte eine API-Funktion namens MakeFile zum Erstellen von Dateien bereitstellen. Beim Schreiben des Programms würde der Programmierer eine Zeile einfügen, die wie folgt aussieht:
MakeFile
In diesem Beispiel weist die Anweisung das Betriebssystem an, eine Datei zu erstellen, die einen zufälligen Zugriff auf ihre Daten erlaubt (1), einen vom Benutzer eingegebenen Namen hat (%Name) und eine Größe hat, die je nach der in der Datei gespeicherten Datenmenge variiert (2). Schauen wir uns nun an, was das Betriebssystem tut, um die Anweisung in die Tat umzusetzen.
- Das Betriebssystem sendet eine Anfrage an das Laufwerk, um den ersten freien Speicherplatz zu ermitteln.
- Mit diesen Informationen erstellt das Betriebssystem einen Eintrag im Dateisystem, der den Anfangs- und Endspeicherort der Datei, den Namen der Datei, den Dateityp, die Frage, ob die Datei archiviert wurde, die Benutzer, die berechtigt sind, die Datei anzusehen oder zu ändern, sowie das Datum und die Uhrzeit der Erstellung der Datei enthält.
- Das Betriebssystem schreibt Informationen an den Anfang der Datei, die die Datei identifizieren, die Art des möglichen Zugriffs festlegen und andere Informationen enthalten, die die Datei mit der Anwendung verknüpfen.
In all diesen Informationen liegen die Abfragen an das Laufwerk und die Adressen des Anfangs- und Endpunkts der Datei in Formaten vor, die stark vom Hersteller und Modell des Laufwerks abhängen.
Da der Programmierer sein Programm so geschrieben hat, dass es die API für Plattenspeicher verwendet, muss er sich nicht mit den Befehlscodes, Datentypen und Antwortcodes für alle möglichen Festplatten- und Bandlaufwerke auseinandersetzen. Das Betriebssystem, das mit den Treibern für die verschiedenen Hardware-Subsysteme verbunden ist, kümmert sich um die wechselnden Details der Hardware – der Programmierer muss einfach Code für die API schreiben und darauf vertrauen, dass das Betriebssystem den Rest erledigt.
APIs haben sich in den letzten Jahren zu einem der am heftigsten umkämpften Bereiche der Computerindustrie entwickelt. Die Unternehmen haben erkannt, dass Programmierer, die ihre API verwenden, letztlich die Möglichkeit haben, einen bestimmten Teil der Branche zu kontrollieren und davon zu profitieren. Dies ist einer der Gründe, warum so viele Unternehmen bereit sind, Anwendungen wie Lesegeräte oder Viewer der Öffentlichkeit kostenlos zur Verfügung zu stellen. Sie wissen, dass die Verbraucher verlangen werden, dass die Programme die Vorteile der kostenlosen Lesegeräte nutzen, und die Anwendungsunternehmen werden bereit sein, Lizenzgebühren zu zahlen, damit ihre Software die von den Verbrauchern gewünschten Funktionen bereitstellen kann.
Benutzerschnittstelle
Genauso wie die API den Anwendungen eine einheitliche Möglichkeit bietet, die Ressourcen des Computersystems zu nutzen, strukturiert eine Benutzerschnittstelle (UI) die Interaktion zwischen einem Benutzer und dem Computer. In den letzten zehn Jahren hat sich fast die gesamte Entwicklung im Bereich der Benutzerschnittstellen auf die grafische Benutzerschnittstelle (GUI) konzentriert, wobei zwei Modelle, Apples Macintosh und Microsofts Windows, die meiste Aufmerksamkeit erhielten und den größten Marktanteil erlangten. Für andere Betriebssysteme gibt es weitere, teils grafische, teils nicht grafische Benutzeroberflächen.
Unix zum Beispiel hat Benutzeroberflächen, die Shells genannt werden und die eine flexiblere und leistungsfähigere Benutzeroberfläche bieten als die standardmäßige textbasierte Oberfläche des Betriebssystems. Programme wie die Korn-Shell und die C-Shell sind textbasierte Schnittstellen, die wichtige Hilfsprogramme hinzufügen, deren Hauptzweck jedoch darin besteht, dem Benutzer die Manipulation der Funktionen des Betriebssystems zu erleichtern. Es gibt auch grafische Benutzeroberflächen wie X-Windows und Gnome, die Unix und Linux aus der Sicht des Benutzers mehr wie Windows- und Macintosh-Computer erscheinen lassen.
Es ist wichtig, sich daran zu erinnern, dass in all diesen Beispielen die Benutzeroberfläche ein Programm oder eine Reihe von Programmen ist, die als Schicht über dem eigentlichen Betriebssystem liegt. Das Gleiche gilt – mit etwas anderen Mechanismen – für die Betriebssysteme Windows und Macintosh. Die Kernfunktionen des Betriebssystems, die Verwaltung des Computersystems, liegen im Kernel des Betriebssystems. Der Display-Manager ist separat, auch wenn er eng mit dem darunter liegenden Kernel verbunden sein kann. Die Verbindungen zwischen dem Betriebssystem-Kernel und der Benutzeroberfläche, den Dienstprogrammen und anderer Software definieren viele der Unterschiede in den heutigen Betriebssystemen und werden sie auch in Zukunft definieren.
Die Zukunft
Eine Frage, die die Zukunft der Betriebssysteme betrifft, dreht sich um die Fähigkeit einer bestimmten Philosophie der Softwareverteilung, ein Betriebssystem zu schaffen, das von Unternehmen und Verbrauchern gemeinsam genutzt werden kann.
Linux, das Betriebssystem, das nach den Prinzipien von Open Source entwickelt und vertrieben wird, könnte einen bedeutenden Einfluss auf das Betriebssystem im Allgemeinen haben. Die meisten Betriebssysteme, Treiber und Hilfsprogramme werden von kommerziellen Unternehmen geschrieben, die ausführbare Versionen ihrer Software vertreiben – Versionen, die nicht untersucht oder verändert werden können. Open Source erfordert die Verteilung von Original-Quellmaterial, das untersucht, verändert und weiterentwickelt werden kann, wobei die Ergebnisse wiederum frei verteilt werden.
Das anhaltende Wachstum des Internets und die Verbreitung von Computern, die keine Standard-Desktop- oder Laptop-Computer sind, bedeutet, dass sich die Betriebssysteme ändern werden, um mit der Entwicklung Schritt zu halten, aber die zentralen Verwaltungs- und Schnittstellenfunktionen werden fortbestehen, auch wenn sie sich weiterentwickeln.