Grundkurs Betriebssysteme
Peter Mandl Grundkurs Betriebssysteme Architekturen, Betriebsmittelverwaltung, Synchronisation, Prozesskommunikation, Virtualisierung 4. Auflage
Peter Mandl München, Deutschland ISBN 978-3-658-06217-0 DOI 10.1007/978-3-658-06218-7 ISBN 978-3-658-06218-7 (ebook) Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar. Springer Vieweg Springer Fachmedien Wiesbaden 2008, 2010, 2013, 2014 Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Jede Verwertung, die nicht ausdrücklich vom Urheberrechtsgesetz zugelassen ist, bedarf der vorherigen Zustimmung des Verlags. Das gilt insbesondere für Vervielfältigungen, Bearbeitungen, Übersetzungen, Mikroverfilmungen und die Einspeicherung und Verarbeitung in elektronischen Systemen. Die Wiedergabe von Gebrauchsnamen, Handelsnamen, Warenbezeichnungen usw. in diesem Werk berechtigt auch ohne besondere Kennzeichnung nicht zu der Annahme, dass solche Namen im Sinne der Warenzeichen- und Markenschutz-Gesetzgebung als frei zu betrachten wären und daher von jedermann benutzt werden dürften. Gedruckt auf säurefreiem und chlorfrei gebleichtem Papier Springer Vieweg ist eine Marke von Springer DE. Springer DE ist Teil der Fachverlagsgruppe Springer Science+Business Media. www.springer-vieweg.de
Vorwort Betriebssysteme stellen Dienste für Anwendungssysteme bereit und werden auch nur für diese entwickelt. Ohne Anwendung bräuchte man nämlich auch kein Betriebssystem. Heutige Betriebssysteme wie Unix, Linux, Windows oder Großrechnerbetriebssysteme sind sehr komplexe Programmsysteme, in denen viele Jahre Entwicklungsleistung stecken und die auch ständig weiterentwickelt werden müssen. Sie nutzen viele Techniken und Strategien zur Gewährleistung einer hohen Leistungsfähigkeit und zur Bereitstellung von optimalen Services für die Anwendungen. Das vorliegende Lehrbuch befasst sich mit den Grundlagen von Betriebssystemen. In kompakter Form werden wichtige Grundkonzepte, Verfahren und Algorithmen dargestellt, die in modernen Betriebssystemen eingesetzt werden. Das Buch behandelt die folgenden Themenkomplexe: 1. Einführung 2. Betriebssystemarchitekturen und Betriebsarten 3. Interruptverarbeitung 4. Prozesse und Threads 5. CPU-Scheduling 6. Synchronisation und Kommunikation 7. Hauptspeicherverwaltung 8. Geräte- und Dateiverwaltung 9. Betriebssystemvirtualisierung Der Schwerpunkt liegt bei sog. Mehrzweckbetriebssystemen oder Universalbetriebssystemen, die überwiegend für betriebliche Informationssysteme eingesetzt werden, weniger bei Realzeit- bzw. Embedded Systemen, die mehr in technischen Fragestellungen relevant sind. Einige grundlegende Konzepte gelten aber für alle Typen von Betriebssystemen. Kapitel 1 enthält eine Einführung in grundlegende Konzepte und Aufgaben von Betriebssystemen sowie eine historische Betrachtung. Kapitel 2 stellt wichtige Architekturvarianten und Betriebsarten von Betriebssystemen vor. In Kapitel 3 werden die Konzepte zur Interruptbearbeitung und zur Behandlung von Systemaufrufen diskutiert. V
Vorwort Im Kapitel 4 wird erläutert, wie heutige Betriebssysteme die Ressourcen Prozess und Thread verwalten. Was Threads sind und wie sie in höheren Programmiersprachen wie Java und C# verwendet werden können, wird ebenfalls dargestellt. Kapitel 5 beschreibt verschiedene Strategien zur Verwaltung von Prozessen und Threads (CPU-Scheduling = Ablaufplanung) und erläutert, wie ein Betriebssystem einen Prozess-/Threadwechsel durchführt (Dispatching = Arbeitsvorbereitung, Disposition). Verschiedene Scheduling-Strategien werden vorgestellt und mit Fallbeispielen unterlegt. Das Thema Synchronisation und Kommunikation wird in Kapitel 6 behandelt, wobei die grundlegenden Prinzipien paralleler bzw. nebenläufiger Bearbeitung von Objekten durch Prozesse und Threads erläutert werden. Als Mechanismen zur Synchronisation nebenläufiger Prozesse und Threads werden Locks, Semaphore, Mutexe und Monitore behandelt. Es wird gezeigt, wie man diese Mechanismen in höheren Sprachen wie Java und C# einsetzen kann. Kommunikationsmöglichkeiten zwischen Prozessen oder Threads werden ebenfalls vorgestellt, wobei z. B. auf das Pipe-Konzept eingegangen wird. In Kapitel 7 werden schließlich die Konzepte der Hauptspeicherverwaltung ausführlich erläutert, wobei die virtuelle Speichertechnik im Mittelpunkt steht. Seitenersetzungsstrategien werden vorgestellt und Ansätze für die Verwaltung großer Adressräume skizziert. Ein grundlegender Einblick in einige Konzepte der Geräte- und Dateiverwaltung innerhalb von Betriebssystemen folgt in Kapitel 8. Es wird erläutert, wie die Geräteverwaltung ins Betriebssystem eingebettet ist und wie Dateisysteme prinzipiell funktionieren. Schließlich befasst sich das Kapitel 9 mit den grundlegenden Konzepten und Lösungsansätzen für die Virtualisierung von Betriebssystemen. Im Anhang sind einige Ergänzungen enthalten. Insbesondere werden einige Datenstrukturen, die in Betriebssystemen häufig verwendet werden, im Anhang einführend erläutert. In diesem Buch wird ein praxisnaher Ansatz gewählt. Der Stoff wird mit vielen Beispielen aus aktuell relevanten Betriebssystemen und Programmiersprachen angereichert. Als Beispiel-Betriebssysteme werden vorwiegend Windows, Unix und Linux herangezogen. Zu jedem Kapitel sind Übungsaufgaben beigefügt. Für das Verständnis einiger Programmbeispiele sind grundlegende Kenntnisse von Programmiersprachen (C, C++, Java und C#) nützlich, jedoch können die wesentlichen VI
Vorwort Konzepte auch ohne tiefere Programmierkenntnisse verstanden werden. Vom Leser werden ansonsten keine weiteren Grundkenntnisse vorausgesetzt. In der zweiten Auflage wurden textliche Überarbeitungen sowie einige Aktualisierungen vorgenommen und es wurden zahlreiche Fehler behoben. Der Aufbau des Buches blieb bis auf die Aufteilung von Kapitel 1 in drei Einzelkapitel unverändert. Die Einführung in wichtige Datenstrukturen wurde in den Anhang verlegt. In der dritten Auflage wurde die Kapitelaufteilung ebenfalls beibehalten und es wurde das Kapitel 9 zum Thema Betriebssystemvirtualisierung ergänzt. Dieses Thema war uns aufgrund der immensen Entwicklung in den letzten Jahren ein eigenes Kapitel wert. Innerhalb der einzelnen Kapitel wurden teilweise umfangreiche Aktualisierungen vorgenommen. Der didaktische Aufbau wurde verbessert und es wurden neue Fallbeispiele wie etwa das Betriebssystem Android für mobile Geräte in die einzelnen Kapitel eingearbeitet. Die vierte Auflage dient der Aktualisierung und Fehlerbehebung, wobei die grundlegende Struktur beibehalten wurde. Bedanken möchte ich mich sehr herzlich bei meinen Kolleginnen und Kollegen sowie bei all meinen Tutoren für die Diskussionen im Rahmen der Vorlesungen und Übungen. Ganz herzlich möchte ich mich an dieser Stelle für die Anregungen von Studierenden bedanken, die das Buch für die Nachbearbeitung von Vorlesungen und zur Prüfungsvorbereitung nutzten. Ein herzliches Dankeschön geht auch an meine Kolleginnen und Kollegen aus anderen Hochschulen, die das Buch ebenfalls für ihre Veranstaltungen verwenden und mir wichtige Hinweise und Anregungen übermittelten. Für die zahlreichen textlichen Hinweise und die inhaltlichen Verbesserungsvorschläge zur zweiten Auflage möchte ich meinem Kollegen Herrn Prof. Dr. Christian Vogt recht herzlich danken. Dem Verlag, insbesondere Frau Sybille Thelen, danke ich für die Unterstützung bei den ersten beiden Auflagen sowie der vierten Auflage und für die allzeit problemlose Zusammenarbeit. Bei Frau Maren Mithöfer möchte ich mich ebenfalls ganz herzlich für die konstruktive Zusammenarbeit und für die wertvolle Unterstützung bei der dritten Auflage bedanken. Fragen und Korrekturvorschläge richten Sie bitte an mandl@cs.hm.edu. Ich freue mich auf weitere Vorschläge, die sich aus der Nutzung des Buches ergeben. Begleitende Informationen zur Vorlesung finden Sie http://www.prof-mandl.de oder unter https://github.com/grundkursbetriebssysteme. München, im Juli 2014 Peter Mandl VII
Inhaltsverzeichnis 1 Einführung... 1 1.1 Computersysteme... 1 1.1.1 Einführung... 2 1.1.2 Aufgabe von Betriebssystemen... 3 1.1.3 Grundlegende Hardwaremodelle... 3 1.1.4 CPU-Registersatz... 7 1.1.5 Multicore-Prozessoren und Hyperthreading-CPUs... 9 1.1.6 Einfaches Modell der Hardware für die weitere Betrachtung... 10 1.1.7 Beispiele für Mikroprozessor-Architekturen... 12 1.2 Entwicklung von Betriebssystemen... 16 1.2.1 Betriebssystemkategorien... 16 1.2.2 Universalbetriebssysteme... 17 1.2.3 Historische Entwicklung... 17 1.2.4 Geschichte von Microsoft Windows... 19 1.2.5 Geschichte von Unix... 21 1.2.6 Geschichte von Linux... 23 1.3 Übungsaufgaben... 23 2 Betriebssystemarchitekturen und Betriebsarten... 25 2.1 Zugriffsschutz in Betriebssystemen... 25 2.2 Betriebssystemarchitekturen... 27 2.2.1 Klassische Architekturen... 27 2.2.2 Mikrokern-Architektur... 29 2.2.3 Architekturbeispiele... 30 2.3 Klassische Großrechnerbetriebsarten... 35 2.3.1 Multiprogramming, Multiprocessing und Multitasking... 35 2.3.2 Batchverarbeitung und interaktive Verarbeitung... 36 2.3.3 Teilnehmerbetrieb... 37 2.3.4 Teilhaberbetrieb... 38 2.4 Terminalserver-Betrieb... 40 2.5 Verteilte Verarbeitung... 42 2.5.1 Echt verteilte Betriebssysteme... 42 2.5.2 Client-/Server-Systeme... 42 IX
Inhaltsverzeichnis 2.5.3 Peer-to-Peer-Systeme... 43 2.5.4 Kommunikations-Middleware... 44 2.5.5 Application-Server-Betrieb... 45 2.6 Virtualisierung von Betriebs- und Laufzeitsystemen... 47 2.7 Cloud Computing... 48 2.8 Übungsaufgaben... 49 3 Interruptverarbeitung... 51 3.1 Interrupts... 52 3.1.1 Überblick... 52 3.1.2 Interrupt-Bearbeitung... 53 3.1.3 Interrupt-Verarbeitung bei IA32-Prozessoren... 58 3.1.4 Interrupt-Bearbeitung unter Windows... 61 3.1.5 Interruptverarbeitung unter Linux... 67 3.2 Systemaufrufe... 70 3.2.1 Systemaufrufe aus Sicht eines Anwendungsprogrammierers... 70 3.2.2 Software-Interrupts unter Linux... 71 3.2.3 Software-Interrupts unter Windows... 74 3.3 Übungsaufgaben... 74 4 Prozesse und Threads... 77 4.1 Prozesse... 78 4.1.1 Prozessmodell... 78 4.1.2 Prozessverwaltung... 79 4.1.3 Prozesslebenszyklus... 82 4.2 Threads... 83 4.2.1 Threadmodell... 83 4.2.2 Implementierung von Threads... 83 4.2.3 Vor-/Nachteile und Einsatzgebiete von Threads... 86 4.3 Programmierkonzepte für Threads... 88 4.3.1 Threads in Java... 88 4.3.2 Threads in C#... 93 4.4 Prozesse und Threads in konkreten Betriebssystemen... 96 4.4.1 Prozesse und Threads unter Windows... 96 4.4.2 Prozesse und Threads unter Unix und Linux... 104 4.5 Übungsaufgaben... 109 X
Inhaltsverzeichnis 5 CPU-Scheduling... 111 5.1 Scheduling-Kriterien... 112 5.2 Scheduling-Verfahren... 115 5.2.1 Verdrängende und nicht verdrängende Verfahren... 115 5.2.2 Überblick über Scheduling-Verfahren... 116 5.2.3 Multi-Level-Scheduling mit Prioritäten... 118 5.2.4 Round-Robin-Scheduling mit Prioritäten... 119 5.3 Vergleich ausgewählter Scheduling-Verfahren... 121 5.3.1 CPU-Scheduling im ursprünglichen Unix... 125 5.3.2 CPU-Scheduling unter Linux... 127 5.3.3 CPU-Scheduling unter Windows... 136 5.3.4 Scheduling von Threads in Java... 143 5.3.5 Zusammenfassung... 144 5.4 Übungsaufgaben... 146 6 Synchronisation und Kommunikation... 151 6.1 Grundlegendes zur Synchronisation... 152 6.1.1 Nebenläufigkeit, atomare Aktionen und Race Conditions... 152 6.1.2 Kritische Abschnitte und wechselseitiger Ausschluss... 155 6.1.3 Eigenschaften nebenläufiger Programme... 158 6.2 Synchronisationskonzepte... 160 6.2.1 Sperren... 160 6.2.2 Semaphore... 162 6.2.3 Monitore... 167 6.3 Synchronisationstechniken moderner Betriebssysteme... 173 6.4 Synchronisationsmechanismen in Programmiersprachen... 175 6.4.1 Die Java-Synchronisationsprimitive synchronized... 175 6.4.2 Warten auf Bedingungen in Java... 182 6.4.3 Weitere Synchronisationsmechanismen in Java... 185 6.4.4 C#-Monitore... 187 6.4.5 Die C#-Synchronisationsprimitive lock... 189 6.4.6 C#-Mutex-Objekte... 190 6.4.7 C#-Lese- und Schreibsperren... 192 6.4.8 C#-Interlocked-Klasse... 193 6.4.9 Warten auf Bedingungen in C#... 195 6.5 Kommunikation von Prozessen und Threads... 195 6.5.1 Überblick über Kommunikationsmöglichkeiten... 196 XI
Inhaltsverzeichnis 6.5.2 Verbindungsorientierte versus verbindungslose Kommunikation... 196 6.5.3 Speicherbasierte versus nachrichtenbasierte Kommunikation... 197 6.5.4 Synchrone versus asynchrone Kommunikation... 201 6.5.5 Kommunikationskanäle im Halb- und Vollduplex-Betrieb... 203 6.5.6 Varianten der Empfängeradressierung... 204 6.5.7 Fallbeispiel: Rechnerinterne Kommunikation über Pipes... 205 6.5.8 Rechnerübergreifende Interprozesskommunikation... 209 6.6 Übungsaufgaben... 210 7 Hauptspeicherverwaltung... 213 7.1 Grundlegende Betrachtungen... 214 7.1.1 Speicherhierarchien... 214 7.1.2 Lokalität... 215 7.1.3 Adressen und Adressräume... 216 7.1.4 Techniken der Speicherverwaltung... 218 7.2 Virtueller Speicher... 221 7.2.1 Grundbegriffe und Funktionsweise... 221 7.2.2 Optimierung der Speicherverwaltung... 232 7.2.3 Seitenersetzung und Verdrängung (Replacement)... 236 7.2.4 Vergleich von Seitenersetzungsverfahren... 246 7.2.5 Speicherbelegungs- und Vergabestrategien (Placement)... 247 7.2.6 Entladestrategie (Cleaning)... 250 7.2.7 Eine weitere Technik: Segmentadressierung... 251 7.2.8 Shared Memory... 253 7.3 Speicherverwaltung in ausgewählten Systemen... 254 7.3.1 Linux-Speicherverwaltung... 254 7.3.2 Windows-Speicherverwaltung... 258 7.3.3 Android-Speicherverwaltung... 264 7.4 Übungsaufgaben... 265 8 Geräte- und Dateiverwaltung... 267 8.1 Aufgaben und Überblick... 268 8.1.1 Grundlegendes... 268 8.1.2 Gerätearten... 271 8.1.3 Geräteanbindung unter Unix... 274 8.1.4 Memory-Mapped Ein-/Ausgabe und DMA... 275 8.2 Dateiverwaltung... 277 XII
Inhaltsverzeichnis 8.2.1 Allgemeines... 277 8.2.2 Fallbeispiel: Dateisysteme unter Unix... 279 8.2.3 Fallbeispiel: Dateisysteme unter Linux... 282 8.2.4 Fallbeispiel: Dateisysteme unter Windows... 283 8.3 Storage-Systeme... 288 8.3.1 RAID-Plattensysteme... 288 8.3.2 NAS und SAN... 293 8.4 Übungsaufgaben... 295 9 Betriebssystemvirtualisierung... 297 9.1 Grundbegriffe und Einsatzgebiete... 297 9.1.1 Virtualisierungsterminologie... 297 9.1.2 Einsatz der Virtualisierungstechnik... 299 9.1.3 Vor- und Nachteile der Virtualisierung... 300 9.2 Virtualisierbarkeit der Hardware... 301 9.2.1 Hardware-Voraussetzungen... 301 9.2.2 Virtualisierung bei x86-prozessoren... 303 9.2.3 Virtualisierungstechniken in Prozessoren... 304 9.3 Varianten der Virtualisierung... 306 9.3.1 Typ-1-Hypervisor... 307 9.3.2 Typ-2-Hypervisor... 307 9.3.3 Paravirtualisierung... 308 9.3.4 Weitere Virtualisierungsansätze... 310 9.4 Betriebsmittelverwaltung bei Virtualisierung... 310 9.4.1 Interruptverarbeitung und Gerätesteuerung... 310 9.4.2 CPU-Scheduling... 312 9.4.3 Speicherverwaltung... 314 9.5 Zusammenfassung... 317 9.6 Übungsaufgaben... 318 10 Schlussbemerkung... 319 11 Lösungen zu den Übungsaufgaben... 321 11.1 Einführung... 321 11.2 Betriebssystemarchitekturen und Betriebsarten... 322 11.3 Interruptverarbeitung... 325 11.4 Prozesse und Threads... 329 11.5 CPU-Scheduling... 333 XIII
Inhaltsverzeichnis 11.6 Synchronisation und Kommunikation... 342 11.7 Hauptspeicherverwaltung... 349 11.8 Geräte- und Dateiverwaltung... 356 11.9 Betriebssystemvirtualisierung... 359 Anhang... 363 A1 Zahlennamen... 363 A2 Metrische Grundeinheiten... 364 A3 Wichtige Datenstrukturen für Betriebssysteme... 365 A4 Java-Implementierung des Dining-Philosophers-Problems... 380 A5 C#-Implementierung des Dining-Philosophers-Problems... 384 A6 C#-Implementierung des Zählerproblems mit Monitoren... 389 Literaturhinweise... 395 Sachwortverzeichnis... 399 XIV