Eduard Glatz, Prof. Dr. sc., studierte an der ETH in Zürich Elektrotechnik und Betriebswissenschaften. Nach 16 Jahren Berufspraxis in der Industrie und in Ingenieurunternehmungen wurde er 1996 an die Hochschule für Technik (FH Ostschweiz) in Rapperswil berufen, wo er Betriebssystemtheorie unterrichtete. Seit 2017 ist er privatwirtschaftlich u.a. im Kurswesen tätig.
|
Zu diesem Buch – sowie zu vielen weiteren dpunkt.büchern – können Sie auch das entsprechende E-Book im PDF-Format herunterladen. Werden Sie dazu einfach Mitglied bei dpunkt.plus+: www.dpunkt.plus |
Grundlagen, Konzepte, Systemprogrammierung
4., überarbeitete und aktualisierte Auflage
Eduard Glatz
eduard@glatz.name
Lektorat: Christa Preisendanz
Copy-Editing: Ursula Zimpfer, Herrenberg
Herstellung: Stefanie Weidner, Frank Heidt
Umschlaggestaltung: Helmut Kraus, www.exclam.de
Bibliografische Information der Deutschen Nationalbibliothek
Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar.
ISBN:
Print 978-3-86490-705-0
PDF 978-3-96088-839-0
ePub 978-3-96088-840-6
mobi 978-3-96088-841-3
4., überarbeitete und aktualisierte Auflage 2019
Copyright © 2019 dpunkt.verlag GmbH
Wieblinger Weg 17
69123 Heidelberg
Hinweis:
Dieses Buch wurde auf PEFC-zertifiziertem Papier aus nachhaltiger Waldwirtschaft gedruckt. Der Umwelt zuliebe verzichten wir zusätzlich auf die Einschweißfolie.
Schreiben Sie uns:
Falls Sie Anregungen, Wünsche und Kommentare haben, lassen Sie es uns wissen: hallo@dpunkt.de.
Die vorliegende Publikation ist urheberrechtlich geschützt. Alle Rechte vorbehalten. Die Verwendung der Texte und Abbildungen, auch auszugsweise, ist ohne die schriftliche Zustimmung des Verlags urheberrechtswidrig und daher strafbar. Dies gilt insbesondere für die Vervielfältigung, Übersetzung oder die Verwendung in elektronischen Systemen.
Es wird darauf hingewiesen, dass die im Buch verwendeten Soft- und Hardware-Bezeichnungen sowie Markennamen und Produktbezeichnungen der jeweiligen Firmen im Allgemeinen warenzeichen-, marken- oder patentrechtlichem Schutz unterliegen.
Alle Angaben und Programme in diesem Buch wurden mit größter Sorgfalt kontrolliert. Weder Autor noch Verlag können jedoch für Schäden haftbar gemacht werden, die in Zusammenhang mit der Verwendung dieses Buches stehen.
5 4 3 2 1 0
Betriebssysteme unterliegen einer stetigen Weiterentwicklung, die der Produktoptimierung hinsichtlich angebotener Dienste, Stabilität und Sicherheit dient. Darüber hinaus werden neue vielversprechende Technologien dienstbar gemacht, sofern sie eine gewisse Reife erreicht haben. Dies wurde bei der vierten Auflage angemessen berücksichtigt. Neu beschrieben sind beispielsweise NAS- (Network Attached Storage) und SAS-Systeme (Server Attached Storage), die dazu zählenden RAID-Laufwerksverbunde, Container-Systeme (z.B. Docker) und Unikernels. Ein näher beim Systemkern liegender Dienst betrifft den unter Linux zentralen Completely Fair Scheduler (CFS), der in seiner Funktionsweise erklärt wird. Nicht zu vernachlässigen sind thematische Ergänzungen bei der nebenläufigen Verarbeitung, wie etwa die Korrektheitsbedingungen der Parallelität, das Thread-Pool-Konzept und die Windows Services. Die bei Betriebssystemen nötige Konfigurationsdatenhaltung, realisiert mithilfe von Textdateien in der Unix-Welt, wird der Lösung mit einer Registrierungsdatenbank (Windows Registry) gegenübergestellt. Buchinhalte früherer Auflagen, die an Bedeutung verloren haben bzw. überholt sind, wurden entfernt oder auf die Buch-Webseite (http://buch.novavia.ch) ausgelagert. Abschließend möchte ich mich bei allen bedanken, die zu den bestehenden und neuen Themen beigetragen oder in anderer Form dieses Buch unterstützt haben.
Eduard Glatz
Urdorf, im Juli 2019
Seit der Erstauflage dieses Lehrbuches, die Ende 2005 entstand, hat das Thema der Betriebssysteme nichts an Aktualität verloren. Vielmehr sind Betriebssysteme als Basissoftware von Smartphones und Embedded Systems fortlaufend in neue Anwendungsbereiche vorgestoßen. Entsprechend stellen Betriebssysteme einen obligatorischen Bestandteil einer Informatikausbildung auf Hochschulstufe dar. So gelten eine Mehrheit der in diesem Buch erfassten Themen in den von ACM und IEEE im Dezember 2013 aktualisierten Computer Science Curricula als Core-Tier-1- und -Tier-2-Inhalte, d.h., als Kernthemen eines Informatik-Bachelorstudiums.
Dieses Buch nutzt zwei Betrachtungswinkel: Einerseits ist dies die Sicht auf die Programmierschnittstelle eines Betriebssystems, also die Blackbox-Betrachtung des Softwareentwicklers. Andererseits werden die dahinter steckenden Prinzipien, Algorithmen und Mechanismen beschrieben, was der Whitebox-Betrachtung des Ingenieurs entspricht. Ergänzend werden ein paar Grundlagen der Prozessortechnik vermittelt. Diese helfen die Schnittstelle zwischen Betriebssystem und Hardware besser zu verstehen. Als Beispiele dienen die Betriebssysteme Windows und Unix, deren kombinierte Kenntnis heute eine wichtige Anforderung der Praxis darstellt. Als Hilfe für Dozierende stehen auf der Buch-Website http://unix.hsr.ch Übungsaufgaben mit Lösungen, alle Abbildungen des Buches und etliche Vorlesungfolien in elektronischer Form zur Verfügung.
Für die aktuelle Auflage wurde das Buch gesamthaft überarbeitet, teilweise neu gegliedert und zu Beginn jedes Kapitels mit kompetenzorientierten Lernzielen versehen. Die gestiegene Bedeutung der Mobilbetriebssysteme und der Rechnervirtualisierung wurde gebührend berücksichtigt, indem diese Themen nun in eigenen Kapiteln behandelt werden. Einen Einblick in mögliche zukünftige Systemarchitekturen gibt die Darstellung der aktuellen Forschung bzw. deren Erkenntnisse. Abschließend bedanke ich mich bei allen Personen, die mir bei der Realisierung dieses Buchprojektes geholfen haben.
Eduard Glatz
Urdorf, im Dezember 2014
Obwohl heute Middleware-Systeme zur Verfügung stehen, die in vielen Fällen unabhängig von einem darunter laufenden Betriebssystem sind, ist die Betriebssystemthematik aus der Informatik-Grundausbildung aus verschiedenen Gründen nicht wegzudenken. Ohne Kenntnisse der hauptsächlichen Strukturen, Mechanismen und der Programmierschnittstelle eines Betriebssystems ist es nicht möglich, spezielle Systemdienste zu benutzen oder die Effizienz eines Systems zu optimieren. Es ist ein altes Ideal des Software Engineering, dass die hinter einer Schnittstelle stehende Implementierung als solche unwichtig ist und daher ignoriert werden soll. Auf Betriebssysteme bezogen würde dies heißen, nur die Programmierschnittstelle zu betrachten. Leider sind die dazugehörigen Beschreibungen praktisch immer minimal und befassen sich kaum mit den Konzepten der dahinter stehenden Implementierungen. Dies erschwert nicht nur ein tieferes Verständnis der Systemdienste, sondern kann auch zu einer inadäquaten Nutzung in komplexen Applikationen führen. Dieses Buch will Studierenden der Informatik und weiteren interessierten Personen die Grundlagen der Betriebssystemtheorie aus einer praktischen Perspektive näher bringen. Damit ist gemeint, dass nicht nur die Prinzipien von Betriebssystemen, sondern auch deren Nutzung bei der systemnahen Programmierung aufgezeigt werden. Dieser Ansatz entspricht der Idee des Bachelor-Studiums, das eine Berufsbefähigung nach drei Studienjahren anstrebt und die forschungsorientierte Ausbildung in die Master- und Doktoratstufe verschiebt.
Methodisch wird ein Weg zwischen der Betrachtung anfallender Probleme und ihren Lösungen auf einer theoretischen und einer praktischen Basis beschritten. Der Praxisbezug orientiert sich an den zwei am meisten verbreiteten Systemwelten, nämlich Unix und Windows. Kenntnisse der Prozessortechnik werden keine vorausgesetzt. Wo nötig werden die wichtigsten Prozessorgrundlagen erklärt, soweit sie für das Verständnis des Betriebssystems und der systemnahen Programmierung hilfreich sind. Die zahlreichen Beschreibungen von Systemfunktionen dienen dazu, die Programmbeispiele genau zu verstehen. Dies ist im Zeitalter der Java-Programmierung umso wichtiger, da eine gründliche Ausbildung in der Programmiersprache C nicht mehr vorausgesetzt werden kann, wenn auch C-Grundkenntnisse für dieses Buch notwendig sind. Im Weiteren verschaffen diese Beschreibungen einen Einstieg in die Systemdokumentationen, wie sie in Form der Unix-Handbuchseiten oder der MSDN-Beschreibungen (Microsoft Developer Network) für Windows vorliegen und erfahrungsgemäß für Neulinge nur schwer verständlich sind. Auf die Betrachtung von Computernetzen wird weitgehend verzichtet, da dieses Thema in einem Betriebssystembuch nur oberflächlich gestreift werden kann und ausgezeichnete Standardwerke zur Verfügung stehen. Dafür werden als Ergänzung die aktuellen Themen Multiprozessorsysteme, Handheld-Betriebssysteme und Virtualisierungstechnologien vorgestellt.
Als Hilfe für Dozierende stehen auf der Buch-Website http://unix.hsr.ch Übungsaufgaben mit Lösungen, alle Abbildungen des Buches und etliche Vorlesungsfolien in elektronischer Form zur Verfügung. Abschließend bedanke ich mich bei allen Personen, die mir bei der Realisierung dieses Buchprojektes geholfen haben.
Eduard Glatz
Urdorf, im August 2005
Eine neue Auflage erlaubt nicht nur das Aktualisieren schnell veralteter Informationen, sondern auch das Einbringen von Erfahrungen und zusätzlichen Themen. Aktualisiert haben wir die Informationen zu Windows 7, Windows CE und Symbian OS. Die ausführlichen tabellarischen Beschreibungen zu den Systemfunktionen sind nun nicht mehr im Buch, sondern in einer PDF-Datei zusammengefasst auf der Buch-Website (http://unix.hsr.ch) verfügbar. Auf vielfältigen Wunsch wurde das Literaturverzeichnis ausgedehnt. Neue Themen betreffen u.a. die Linux-basierten Smartphone-Betriebssysteme Android, WebOS und Maemo, die Systemprogrammierung aus C++, Java und .NET-Sprachen, die Bauweise von SSD (Solid State Disks), spezielle Dateisystemtechnologien (Schattenkopie, Disk Scheduling) und die Vermeidung von Synchronisationsengpässen.
Eduard Glatz
Urdorf, im Februar 2010
1Einführung
1.1Zweck
1.2Definitionen
1.3Einordnung im Computersystem
1.4Betriebssystemarten
1.4.1Klassische Einteilungen
1.4.2Moderne Einteilungen
1.4.3Geschichte
1.5Betriebssystemarchitekturen
1.5.1Architekturformen
1.5.2Benutzer-/Kernmodus
1.5.3Monolithische Systeme
1.5.4Geschichtete Systeme
1.5.5Mikrokernsysteme (Client/Server-Modell)
1.5.6Multiprozessorsysteme
1.5.7Verteilte Betriebssysteme
1.5.8Beispiele von Systemarchitekturen
1.5.9Zukünftige Systemarchitekturen aus Sicht der Forschung
2Programmausführung und Hardware
2.1Rechner- und Prozessorgrundlagen
2.1.1Grundmodell eines Rechners
2.1.2Befehlsverarbeitung in der CPU
2.1.3Prozessoraufbau
2.1.4Allgemeine Prozessorregister (general purpose registers)
2.1.5Steuerregister (control registers)
2.2Grundlagen des Adressraums
2.2.1Adressraumtypen
2.2.2Bytereihenfolge (byte ordering)
2.2.3Adressraumbelegungsplan (memory map)
2.2.4Ausrichtungsregeln im Adressraum
2.2.5Adressraumbelegung durch Programme
2.2.6Adressraumnutzung durch C-Programme
2.3Grundlagen der Programmausführung
2.3.1Quell- und Binärcode
2.3.2Programmausführung und Programmzähler (PC)
2.3.3Funktionsweise des Stapels und Stapelzeigers (SP)
2.3.4Funktion des Programmstatusworts (PSW)
2.3.5Programmunterbrechungen (interrupts)
2.3.6Privilegierte Programmausführung (Benutzer-/Kernmodus)
2.4Unterprogrammmechanismen
2.4.1Unterprogrammaufruf und Komplettierung
2.4.2Formen des Unterprogrammaufrufs
2.4.3Parameterübergabe beim Unterprogrammaufruf
2.4.4Realisierung der Parameterübergabe und lokale Variablen
3Systemprogrammierung
3.1Wahl der Systemprogrammiersprache
3.1.1Mischsprachenprogrammierung
3.1.2Programmiersprache C++
3.1.3Java Native Interface (JNI)
3.1.4Microsoft .NET-Sprachen
3.2Laufzeitsystem der Programmiersprache C
3.3Unterprogrammtechniken
3.3.1Formale und aktuelle Parameter
3.3.2Idempotente Unterprogramme
3.4Grundlagen der Systemprogrammierung
3.4.1Dienstanforderung und Erbringung
3.4.2Dienstparameter und Resultate
3.4.3Umgebungsvariablenliste (environment list)
3.4.4Dateideskriptoren & Handles
3.4.5Systemdatentypen
3.4.6Anfangsparameter für Prozesse
3.4.7Beendigungsstatus von Programmen
3.4.8Fehlerbehandlung
3.4.9Programmierung für 32- und 64-Bit-Systeme
3.5Systemprogrammierschnittstellen
3.5.1Aufrufverfahren
3.5.2Unix-Programmierschnittstelle
3.5.3Windows-Programmierschnittstelle
4Prozesse und Threads
4.1Parallelverarbeitung
4.1.1Darstellung paralleler Abläufe
4.1.2Hardware-Parallelität
4.1.3Software-Parallelität
4.1.4Begriffe
4.2Prozessmodell
4.2.1Grundprinzip
4.2.2Prozesserzeugung und Terminierung
4.2.3Prozesse unter Unix
4.2.4Funktionsweise der Unix-Shell
4.2.5Prozesse & Jobs unter Windows
4.2.6Vererbung unter Prozessen
4.2.7Systemstart und Prozesshierarchie
4.2.8Ausführungsmodelle für Betriebssysteme
4.3Threads
4.3.1Thread-Modell
4.3.2Vergleich Prozesse zu Threads
4.3.3Implementierung des Multithreading
4.3.4Windows Threads, Fibers und Services
4.3.5Services
4.3.6Threads unter Unix
4.3.7Thread-Pool-Konzept
4.3.8Anwendungsprobleme
4.4Prozessorzuteilungsstrategien
4.4.1Quasiparallelität im Einprozessorsystem
4.4.2Prozess- und Thread-Zustände
4.4.3Konzeptionelle Prozessverwaltung
4.4.4Zuteilungsstrategien
4.4.5Multiprozessor-Scheduling
4.4.6POSIX-Thread-Scheduling
4.4.7Java-Thread-Scheduling
4.4.8Scheduling unter Windows
4.4.9Scheduling unter Unix
5Synchronisation von Prozessen und Threads
5.1Synchronisationsbedarfe und Lösungsansätze
5.1.1Problem der Ressourcenteilung
5.1.2Verlorene Aktualisierung (lost update problem)
5.1.3Inkonsistente Abfrage (inconsistent read)
5.1.4Absicherung mit Selbstverwaltung – naiver Ansatz
5.1.5Absicherung mit Selbstverwaltung – korrekter Ansatz
5.1.6Absicherung mit Systemmitteln
5.2Semaphore
5.2.1Semaphortypen
5.2.2Implementierungsfragen
5.3Anwendung der Semaphore
5.3.1Absicherung kritischer Bereiche (mutual exclusion)
5.3.2Synchronisation von Abläufen (barrier synchronization)
5.3.3Produzenten & Konsumenten (producer and consumer)
5.3.4Leser & Schreiber (readers and writers)
5.3.5Problem der Prioritätsumkehrung (priority inversion)
5.3.6Weitere Anwendungsprobleme
5.4Implementierungen von Semaphoren
5.4.1Semaphore unter Unix
5.4.2Semaphore unter Windows
5.5Unix-Signale
5.5.1Idee & Grundprinzip der Unix-Signale
5.5.2Programmierung der Signale
5.5.3Signale im Multithreading
5.5.4Realtime-Signale
5.6Verklemmungsproblematik (deadlocks)
5.6.1Ursache
5.6.2Deadlock-Bedingungen
5.6.3Lösungsansätze und ihre Beurteilung
5.7Praktische Erwägungen zur Parallelprogrammierung
5.7.1Grenzen der Leistungssteigerung (Amdahl‘s Law)
5.7.2Korrektheitsbedingungen der Parallelität
5.7.3Vermeidung von Synchronisationsengpässen
5.7.4Speicherkonsistenz (memory consistency)
6Kommunikation von Prozessen und Threads
6.1Überblick über Synchronisation und Kommunikation
6.2Nachrichtenbasierte Verfahren
6.2.1Allgemeine Aspekte
6.2.2Unix-Pipes
6.2.3Windows-Pipes
6.2.4Unix Message Queues
6.2.5Windows-Messages
6.2.6Windows-Mailslots
6.3Speicherbasierte Verfahren
6.3.1Gemeinsamer Speicher unter Windows
6.3.2Gemeinsamer Speicher unter Unix
6.4Monitor
6.4.1Grundprinzip
6.4.2Java-Monitor
6.4.3Monitornachbildung mit Bedingungsvariablen
6.5Rendezvous
6.5.1Grundprinzip
6.5.2Synchronisation in Client/Server-Systemen (barber shop)
6.6Rechnerübergreifende Interprozesskommunikation
6.6.1Netzwerksoftware
6.6.2Berkeley-Sockets
6.6.3Remote Procedure Call (RPC)
6.6.4Überblick über Middleware
7Ein- und Ausgabe
7.1Peripherie
7.1.1Einordnung im Rechnermodell
7.1.2Begriffsdefinitionen
7.2Ein-/Ausgabeabläufe
7.2.1Programmgesteuerte Ein-/Ausgabe
7.2.2Ein-/Ausgabe mittels Programmunterbrechungen
7.2.3Ein-/Ausgabe mittels DMA
7.2.4Ein-/Ausgabearten im Vergleich
7.3Ein-/Ausgabesystem
7.3.1Treiber
7.3.2Geräteverwaltung
7.3.3Treiberschnittstelle
7.3.4Ein-/Ausgabeschnittstelle
7.3.5Ein-/Ausgabepufferung
7.3.6Treibermodell in Linux
7.3.7Treibermodelle in Windows (WDM & WDF)
7.4Massenspeicher
7.4.1Wichtigste Massenspeicher
7.4.2Eigenschaften von Festplattenlaufwerken (HDD)
7.4.3Eigenschaften von Festkörperlaufwerken (SSD)
7.4.4Speicher-Anschlussmöglichkeiten
7.4.5Pufferung von Zugriffsdaten (disk cache)
7.4.6Speicher-Virtualisierung durch RAID
7.5Benutzerinteraktion aus Systemsicht (Benutzeroberflächen)
7.5.1Allgemeines
7.5.2Systemarchitekturen
7.5.3Programmiermodelle
7.5.4Die Unix-Shell als Kommandointerpreter
7.5.5Funktionsweise und Programmierung des X-Window-Systems
7.5.6Funktionsweise und Programmierung des Windows-GUI
8Speicherverwaltung
8.1Speichersystem
8.1.1Einordnung im Rechnermodell
8.1.2Grundlegende Speicherprinzipien
8.1.3Speicherhierarchie & Lokalitätsprinzip
8.1.4Cache-Funktionsweise
8.2Dynamische Speicherbereitstellung (Heap)
8.2.1Verwaltungsalgorithmen
8.2.2Grundprinzip der Speicherzuordnung
8.2.3Übersicht Implementierungsvarianten
8.2.4Variante A: Variable Zuordnungsgröße
8.2.5Variante B: Feste Blockgrößen bzw. Größenklassen
8.2.6Variante C: Mehrfache einer festen Blockgröße
8.2.7Variante D: Buddy-System
8.2.8Heap-Erweiterung
8.2.9Heap-Management in Windows
8.3Verwaltung von Prozessadressräumen
8.3.1Adressraumnutzung durch Programme
8.3.2Adressraumverwaltung durch das Betriebssystem
8.4Realer Speicher
8.4.1Monoprogrammierung
8.4.2Multiprogrammierung mit Partitionen
8.4.3Verfahren für knappen Speicher
8.5Virtueller Speicher
8.5.1Adressumsetzung
8.5.2Seitenwechselverfahren (demand paging)
8.5.3Speicherabgebildete Dateien
8.5.4Gemeinsamer Speicher (shared memory)
9Dateisysteme
9.1Dateisystemkonzepte
9.1.1Logische Organisation
9.1.2Dateisystemfunktionen
9.1.3Gemeinsame Dateinutzung
9.1.4Speicherabgebildete Dateien
9.2Realisierung von Dateisystemen
9.2.1Konzeptionelles Modell
9.2.2Blockspeicher als Grundlage
9.2.3Organisationsprinzipien
9.3UFS – traditionelles Unix-Dateisystem
9.3.1Datenträgeraufteilung
9.3.2Dateihaltung und Verzeichnisorganisation
9.3.3Index Nodes (Inodes)
9.4FAT– traditionelles Windows-Dateisystem
9.4.1Datenträgeraufteilung
9.4.2Aufbau der Belegungstabelle (FAT)
9.4.3Verzeichnisdaten
9.5NTFS – modernes Windows-Dateisystem
9.5.1Entstehung und Eigenschaften
9.5.2Logische Struktur und Inhalt einer NTFS-Partition
9.5.3NTFS-Streams
9.5.4Dateispeicherung
9.5.5Dateiverzeichnisse
9.6ZFS – zukunftweisendes Dateisystem
9.6.1Datenträgerverwaltung
9.6.2Datenintegrität
9.6.3Pufferung und Deduplizierung
9.6.4Interoperabilität
9.7Netzwerkdateisysteme
9.7.1Logische Sicht
9.7.2Implementierung
9.7.3NFS – Network File System in Unix
9.7.4SMB – Netzwerkdateisystem in Windows
9.8Spezielle Dateisystemtechnologien
9.8.1Protokollierende Dateisysteme
9.8.2Schattenkopie
9.8.3Disk Scheduling
9.9Datenträgerpartitionierung
9.9.1Anwendungsbereiche
9.9.2Master Boot Record (MBR)
9.9.3GUID Partition Table (GPT)
10Programmentwicklung
10.1Software-Entwicklungswerkzeuge
10.1.1Ablauf der Programmübersetzung
10.1.2Darstellung von Übersetzungsvorgängen mittels T-Notation
10.1.3Automatisierte Übersetzung
10.1.4Versionsverwaltung
10.2Adressraumbelegung und Relokation
10.2.1Storage Class
10.2.2Programmorganisation in Sektionen
10.2.3Relokation von Programmen
10.3Programmbibliotheken
10.3.1Grundlagen und Begriffe
10.3.2Anwendungsbereiche
10.3.3Programmbibliotheken unter Unix
10.3.4Programmbibliotheken unter Windows
10.4Skriptprogrammierung unter Unix
10.4.1Anwendungsbereiche
10.4.2Die Shell als Programminterpreter
10.4.3Portabilität und Kompatibilität
10.4.4Erstellung von Skriptprogrammen
10.4.5Ausführung von Skriptprogrammen
10.4.6Elemente der Skriptsprache
10.4.7Shell-Befehle
10.4.8Shell-Variablen
10.4.9Stringoperatoren für Shell-Variable
10.4.10Metazeichen
10.4.11Synonyme und Funktionen
10.4.12Bedingte Tests (conditional tests)
10.4.13Arithmetik
10.4.14Kontrollstrukturen für Skripte
10.5Anwendungs- und Systemkonfiguration
10.5.1Konfiguration mit Textdateien
10.5.2Konfiguration mit Registrierungsdatenbank
11Sicherheit
11.1Schutzziele
11.2Autorisierung und Zugriffskontrolle
11.2.1Grundlagen und Begriffe
11.2.2Schutzdomänenkonzept
11.2.3Schutzstrategien
11.3Hochsichere Betriebssysteme
11.4Sicherheit unter Unix
11.5Sicherheit unter Windows
12Virtualisierung
12.1Anwendungsbereiche
12.2Virtualisierungstypen
12.2.1Virtuelle Prozessoren
12.2.2Virtuelle Prozessumgebungen
12.2.3Virtuelles Betriebssystem
12.2.4Virtueller Desktop
12.2.5Virtuelle Ressourcen
12.2.6Sandboxing (virtuelles Laufzeitsystem)
12.2.7Virtuelle Computer (Stufe Computerhardware)
12.3Virtual Machine Monitor bzw. Hypervisor
12.3.1Anforderungen
12.3.2VMM-Funktionsweise
12.3.3VMM-Typen
12.3.4Unikernel
12.4Einsatzgebiete
13Mobile Betriebssysteme
13.1Gemeinsame Eigenschaften
13.1.1Anforderungen durch die Plattform
13.1.2Middleware als Betriebssystem
13.2Google Android
13.2.1Überblick
13.2.2Architektur
13.2.3System- und Applikationsstart
13.2.4Lebenszyklus von Applikationen
13.2.5Nachrichtensystem
13.3Apple iOS
AAnhang
A.1Maßeinheiten und Darstellungen
A.1.1Maßeinheiten in der Informatik
A.1.2Darstellung von Bitmustern
A.1.3Oktal- und Hexadezimalzahlen
A.1.4Kennzeichnung der Zahlensysteme
A.1.5Rechnerinterne Zahlendarstellungen
A.1.6Textzeichensätze
Literaturhinweise
Index
Lernziele
Als Einstieg in das Thema legen wir fest, welchen Zwecken ein Betriebssystem dient, wie es sich als Begriff definieren lässt und wo es in einem Rechner einzuordnen ist. Danach diskutieren wir die Anforderungen an den Betriebssystementwurf, mögliche Architekturen und weiterführende Ideen aus der Forschung.
Der Begriff »Betriebssystem« kann unterschiedlich aufgefasst werden. Beispielsweise über die Frage: Was leistet ein Betriebssystem? Zwei Grundfunktionen sind:
Detaillierter betrachtet erfüllt ein Betriebssystem sehr viele Zwecke. Es kann mehrere oder sogar alle der folgenden Funktionalitäten realisieren:
Die geräteunabhängige Ein-/Ausgabe war eine der wichtigsten Errungenschaften bei der erstmaligen Einführung von Betriebssystemen. Früher war es notwendig, dass Applikationen die Eigenheiten der angeschlossenen Peripheriegeräte im Detail kennen mussten. Mit einem Betriebssystem stehen hingegen logische Kanäle zur Verfügung, die Ein-/Ausgaben über standardisierte Funktionen bereitstellen (siehe Abb. 1–1). Die logischen Kanäle werden häufig mittels sprechender Textnamen identifiziert.
Abb. 1–1Ein-/Ausgabe ohne und mit Betriebssystem
Leider existiert keine allgemein verbindliche Definition eines Betriebssystems. Welche Komponenten zu einem Betriebssystem gehören und welche nicht, lässt sich daher nicht endgültig festlegen. Nachfolgend sind drei unterschiedliche Definitionen stellvertretend vorgestellt, die dabei helfen, ein Betriebssystem zu charakterisieren. Eine erste, etwas schwer lesbare Definition nach DIN 44 300 beschreibt ein Betriebssystem wie folgt (Ausschnitt):
… die Programme eines digitalen Rechnersystems, die zusammen mit den Eigenschaften dieser Rechenanlage die Basis der möglichen Betriebsarten des Rechnersystems bilden und insbesondere die Abwicklung von Programmen steuern und überwachen.
Eine zweite, der Literatur entnommene Definition lautet:
Ein Betriebssystem ist eine Menge von Programmen, welche die Ausführung von Benutzerprogrammen auf einem Rechner und den Gebrauch der vorhandenen Betriebsmittel steuern.
Eine dritte Definition betrachtet das Betriebssystem als Ressourcenverwalter, wobei die Ressource hauptsächlich die darunter liegende Hardware des Rechners ist. Ein Computersystem lässt sich hierbei als eine strukturierte Sammlung von Ressourcenklassen betrachten, wobei jede Klasse durch eigene Systemprogramme kontrolliert wird (siehe Tab. 1–1).
|
Zentrale Ressourcen |
Periphere Ressourcen |
Aktive Ressourcen |
Prozessor(en) |
Kommunikationseinheiten 1. Endgeräte (Tastaturen, Drucker, Anzeigen, Zeigegeräte etc.) 2. Netzwerk (entfernt, lokal) etc. |
Passive Ressourcen |
Hauptspeicher |
Speichereinheiten 1. Platten 2. Bänder 3. CD-ROM/DVD etc. |
Tab. 1–1Ressourcenklassen
Ein Betriebssystem lässt sich auch mit einer Regierung (government) vergleichen. Wie diese realisiert das Betriebssystem keine nützliche Funktion für sich alleine, sondern stellt eine Umgebung zur Verfügung, in welcher andere Beteiligte nützliche Funktionen vollbringen können. Einige Autoren (z.B. K. Bauknecht, C. A. Zehnder) ziehen die Begriffe Systemsoftware bzw. Systemprogramme der Bezeichnung Betriebssystem vor. In diesem Sinne ist folgende Beschreibung dieser Autoren abgefasst:
»Die Systemprogramme, oft unter dem Begriff Betriebssystem zusammengefasst, lassen sich gemäß Abbildung 1–2 gruppieren.
Abb. 1–2Softwaregliederung
Die eigentlichen Steuerprogramme sind für folgende Funktionen zuständig:
Auffallend bei dieser Definition ist der Einbezug von Übersetzern (Compiler, Binder), Testhilfen und Dienstprogrammen. Für klassische Betriebssysteme (z.B. Unix und GNU-Tools) trifft dies vollumfänglich zu, während moderne Betriebssysteme oft die Bereitstellung von Übersetzungstools irgendwelchen Drittherstellern überlassen bzw. diese als separate Applikation ausliefern (z.B. Windows und Visual Studio).
In einem Rechner stellt das Betriebssystem eine Softwareschicht dar, die zwischen den Benutzerapplikationen einerseits und der Rechnerhardware andererseits liegt (siehe Abb. 1–3). Das Betriebssystem selbst besteht aus einem Betriebssystemkern und einer Sammlung von Programmen, die Betriebssystemdienste bereitstellen. Je nach Betrachtungsweise zählen dazu auch Programme zur Softwareentwicklung, wie Editoren und Compiler. Häufig wird nur der Betriebssystemkern als Betriebssystem bezeichnet, während der Begriff Systemprogramme für das Gesamtpaket inklusive der Programmentwicklungswerkzeuge benutzt wird.
Abb. 1–3Schichtenmodell eines Rechners
Das Betriebssystem setzt auf der Prozessorarchitektur auf, die durch einen Satz von Maschinenbefehlen und den Registeraufbau charakterisiert wird (sog. Instruktionssatzarchitektur, ISA). Die Systemplatine mit all ihren Bausteinen und den angeschlossenen Peripheriegeräten stellt die Arbeitsumgebung des Prozessors dar. Diese muss ebenfalls dem Betriebssystem in all ihren Details bekannt sein. Von zentraler Bedeutung für den Softwareentwickler ist die Programmierschnittstelle des Betriebssystems (Application Programming Interface, API). Die dort zur Verfügung gestellte Funktionalität kann in Benutzerapplikationen eingesetzt werden. Aus Anwendungssicht unterscheiden sich Betriebssysteme in der Programmierschnittstelle , in den unterstützten Dateiformaten für ausführbare Dateien, im Funktionsumfang, in der Bedienoberfläche und der Maschinensprache, in die ihr Code übersetzt wurde. Zudem kann oft der Funktionsumfang, d.h. die installierten Systemteile, während des Installationsvorgangs unterschiedlich gewählt werden.
Wie bereits erwähnt, setzt das Betriebssystem direkt auf der Rechnerhardware auf und muss diese daher genau kennen. Denn es verwaltet folgende Hardwareelemente:
Die Betriebssystemtheorie beruht damit auf den Prinzipien der Computertechnik. Computertechnik befasst sich mit:
Um die hardwarenahen Teile des Betriebssystems oder nur schon den exakten Ablauf der Programmausführung zu verstehen, ist es daher unerlässlich, sich mit ein paar Details der Computertechnik zu befassen. Einige computertechnische Funktionsweisen, soweit sie für das Verständnis des Betriebssystems nötig sind, werden an passenden Stellen im Buch erklärt. Für weiter gehende Realisierungsdetails der Hardwareelemente sei auf entsprechende Spezialliteratur verwiesen.
Ein Betriebssystem stellt eine Umgebung zur Verfügung, in der Anwendungsprogramme ablaufen können. Eine Ablaufumgebung kann recht unterschiedlich realisiert sein:
Häufig findet man Kombinationen dieser vier Varianten. Beispielsweise können Sprach-Laufzeitsysteme Fähigkeiten zur Verfügung stellen, die ansonsten nur Bestandteil von Betriebssystemen sind. Dies beinhaltet Multitasking-Funktionen (z.B. in Java, Ada, Modula-2) und die Speicherverwaltung (verschiedene Sprachen).
Eine elementare Klassifizierung von Betriebssystemen basiert auf folgenden Anwendungsarten:
Moderne Betriebssysteme fallen mehr oder weniger in die Gruppe der Echtzeitsysteme, weswegen letztere für uns im Vordergrund stehen. Eine ergänzende Klassifizierung unterteilt Betriebssysteme nach unterstützter Rechnerstruktur:
Je nach Auslegung kann ein Betriebssystem eine oder mehrere dieser drei Rechnerstrukturen unterstützen. Ergänzend sei noch bemerkt, dass populäre Betriebssysteme netzwerkfähig (networked operating system) sind, auch wenn sie nicht verteilt ablaufen. Beispielsweise unterstützen sie verbreitete Netzwerkprotokolle, die Anbindung entfernter Laufwerke und – teilweise konfigurierbar – eine zentralisierte Benutzerverwaltung.
Beispiele:
Windows unterstützt Einprozessorsysteme und Multiprozessorsysteme. Das Betriebssystem Amoeba ermöglicht transparentes Arbeiten auf einem verteilten System. Für den Benutzer präsentiert es sich wie ein Einzelrechner, besteht in der Tat aber aus mehreren über ein Netzwerk verbundenen Computern.
Abbildung 1–4 zeigt eine kleine Auswahl an Entwicklungslinien gängiger Betriebssysteme, deren Geschichte wir kurz charakterisieren.
Abb. 1–4Entwicklungslinien einiger gängiger Betriebssysteme
Ein erstes Betriebssystem für Großrechner war das rudimentäre IBSYS, das Stapelverarbeitung ermöglichte. Umfangreicher war bereits das OS/360 von IBM, das in weiterentwickelter Form als z/OS auf heutigen Mainframe-Systemen läuft. Anfänglich hat es nur die Stapelverarbeitung unterstützt, wurde aber bald durch die TSO (Time Sharing Option) für den Dialogbetrieb ergänzt. Unabhängig davon entstand das CTSS (Compatible Time Sharing System), das den Dialogbetrieb auf Großrechnern bereits sehr früh erlaubte. Sein Nachfolger war MULTICS (Multiplexed Information and Computing Service), ein Konsortiumsprojekt, das letztlich nicht sehr erfolgreich war, jedoch viele neue Konzepte realisierte. Darin war es ein Vorbild für das ursprüngliche Unix, das jedoch ein wesentlich kompakterer Entwurf war, der die Komplexität des MULTICS vermied. Unix hat über viele Zwischenschritte die heutigen Systeme Linux, Oracle Solaris und Apple OS X geprägt. Das BSD (Berkeley Software Distribution) Unix existiert heute als FreeBSD, NetBSD und OpenBSD in geringer Verbreitung weiter. Separate Entwicklungslinien gelten für das Microsoft Windows. Ursprünglich hat es als grafische Oberfläche für MS-DOS begonnen, wurde aber immer unabhängiger davon. Separat zu dieser originären Windows-Linie entstand das Windows NT, das von den DEC VMS (Virtual Memory System) Minicomputer-Betriebssystemen abgeleitet wurde, jedoch die API des Microsoft Windows realisierte. Mit dem Windows XP wurde die originäre Windows-Linie beendet, womit der schwache Unterbau des MS-DOS verschwand. Das VMS existiert als OpenVMS noch heute, ist aber nur minimal verbreitet.
Beim Entwurf eines Betriebssystems sind viele Anforderungen in Einklang zu bringen, die nicht widerspruchsfrei sind, weswegen Kompromisse nötig sind. Neben der Realisierung der in Abschnitt 1.1 beschriebenen Kernfunktionalitäten sind folgende exemplarische Entwurfsziele zu berücksichtigen: