Akademielehrgang Netzwerkadministration 1 Vorlesung „Betriebssystem“ BETRIEBSSYSTEME Quellen: „Handouts zur Vorlesung Betriebssysteme für Informatiker“ von J. R. Mühlbacher Mitschrift der Vorlesung „Betriebssysteme“ „Taschenbuch der Informatik“ Kap. 7 („Betriebssysteme“) „Fachwörterbuch Datenverarbeitung Englisch-Deutsch“ Überblick A) Grundlagen B) Klassifikation von Systemen Betriebsarten Benutzersicht Art der CPU Zuteilung Technisch-Interner Aufbau C) Speicherverwaltung (Memory Management) Address binding Freispeicherverwaltung Paging D) Virtueller Speicher E) Prozesse F) CPU-Scheduling J) Fallstudie Windows 2000 A) Grundlagen Ein Betriebssystem - ist das Bindeglied zwischen der Hardware und dem Anwender bzw. der Anwenderprogramme - steuert und überwacht die Abwicklung von Programmen - nutzt die Hardware in effizienter Weise Ein Computersystem kann grob in 4 Teile gegliedert werden: - Hardware (z. B. CPU, Hauptspeicher, ...) - Betriebssystem (bestehend aus eigentlichem System u. systemnahen Programmen) - Anwenderprogrammen - Anwender (Personen, Maschinen, andere Computer) Betriebsarten: - Batchprocessing (Stapelbetrieb): Eine Reihe von Aufgaben wird der Reihe nach abgearbeitet (z. B. in DOS die *.bat - Dateien). Es gibt aber eine Technik Ein- und Ausgabegeräte parallel zu betreiben („spooling-process“) - Multiprogramming (= Multitasking): Muss die CPU aus irgend einem Grund warten, wird inzwischen ein anderer Prozess ausgeführt. - Timesharing: Im Hauptspeicher sind eine Reihe von Prozessen zum abarbeiten. Die CPU benutzt eine „Zeitscheibe“. Jeder kriegt eine bestimmte Zeit -> wechselt zum Nächsten -> bleibt bestimmte Zeit - > zum Nächsten ... - Real Time System (Echtzeitsystem): Es wird in Echtzeit auf ein Signal reagiert. 75924440 ©B.C.G. 2 Akademielehrgang Netzwerkadministration Vorlesung „Betriebssystem“ Nach diesen Betriebsarten wurde die BSe früher eingeteilt. Moderne Systeme verwenden Mischformen dieser Betriebsarten. Das Betriebssystems dient zur Verwaltung und Nutzung von Ressourcen: Anweisung und Freigabe von Ressourcen, Verwaltung von geteilten Ressourcen (shared resources), Ausführung und Nutzung von Ressourcen. Es gibt Hardware-Ressourcen (Hauptspeicher, CPU, Festplatten, ...) und Software-Ressourcen (Compiler, Linker, Loader, Dateisystem, ausführbare Dateien). Man kann die Ressourcen auch nach ihrer Nutzung unterteilen: - Aktive Ressourcen, die gleichzeitig benutzt werden können (z. B. CPUs) - Aktive Ressourcen, die nicht gleichzeitig benutzt werden dürfen (z. B. bestimmte Programme) - Passive Ressourcen, die gleichzeitig benutzt werden können (z. B. Hauptspeicher) - Aktive Ressourcen, die nicht gleichzeitig benutzt werden dürfen (z. B. Drucker) Eingabe und Ausführung eines Programms Die Eingabe von Programm und Daten ist nötig (kommt an eine fixe Adresse im Hauptspeicher (typische Adressen: „0000“ oder „0001“). Eine Instruktion ist an einer bestimmten Stelle gespeichert. Man setzt auch den Instruktions-Pointer auf diese Adresse. Er rückt dann entsprechend weiter. Der Programm-Counter wird auf die erste ausführbare Instruktion gesetzt und ausgeführt. Der Von Neumann-Zyklus beginnt zu laufen. Von Neumann-Zyklus Instruktion holen Hochzählen Instruktion ausführen Interrupt behandeln, wenn vorhanden Moderne Hardware verwendet das Prinzip des „pipelining“, d. h. mehrere Instruktionen können parallel bzw. überlappend ausgeführt werden. Das passiert, wenn ein Rechner eingeschalten wird: Bootstrap-Loader Jedes System hat ein kleines Programm im ROM-Speicher (firmware), den Bootstrap-Loader („Stiefelanzieher“). Wird gestartet, wenn der Rechner eingeschalten wird. Die Daten werden eingelesen und als Maschinencodebefehle angesehen. Setzt den Programmzähler dann auf die erste Instruktion des Programms. Der von Neumann Zyklus läuft ab, bis die letzte Instruktion eine „Halt“-Instruktion ist. Das Betriebssysten wird gestartet: Folien A21 – A23 Struktur einer Harddisk (A24): 75924440 ©B.C.G. 3 Akademielehrgang Netzwerkadministration Vorlesung „Betriebssystem“ Unterteilt in Partitionen (logische Einteilung). Sinnvoll bei mehreren Betriebssystemen. Muss zu Beginn entscheiden, welche Partition aktiv sein soll -> „active partition“. Nachteil von Partitionen: eingeschränkter Platz je Partition. Der Master Boot Record (MBR) weiß, welche Partition aktiv ist und wie groß die Partitionen sind. Das Betriebssystem ist selbst ein Programm: - residiert als ausführbares Maschinenprogramm z. B. im Massenspeicher - wird vom Bootstrap-Loader geladen und gestartet - führt elementare Initialisierungen aus - startet den Kommandointerpreter (= Schnittstelle zum Benutzer, z. B. C: im DOS) Einfachstes Betriebssystem: Monitor (hat nichts mit dem Bildschirm zu tun, bedeutet nur sehr kleines, einfaches BS) Rechner einschalten Initialisierung Kommandointerpreter (ist bei der ersten ausführbaren Instruktion zu finden) BIOS Der Kommandointerpreter enthält eine Liste von Befehlen. Prüft die eingehenden Befehle, ob er sie in seiner Liste findet (z. B. „copy“). Diese Tabelle enthält auch die Adressen, wo sich die Befehle befinden. Führt ständig die „Nichts-tun“ Prozedur aus. Wartet immer auf den nächsten Tastendruck. Bei einem Tastendruck kommt Interrupt-Signal, Der „Nichts-Tun“-Prozess bricht ab (NeumannZyklus). Der „Interrupt“ wird ausgeführt. Dann wartet er auf die nächste Befehlseingabe. Das Betriebssystem kann ein anderes Betriebssystem aktivieren. Es ist für den User eine „Virtuelle Maschine“ (=Begriff aus der Softwaretechnik), die die Hardware „verbirgt“. Das Betriebssystem simuliert den Computer, z. B. mit einem Tastatur-Treiber (baut virtuelle Tastatur, unabhängig von der tatsächlichen Tastatur). Typischerweise wird ein BS in „C“ programmiert. Es können auf einem Betriebssystem mehrere BSe aufgesetzt werden. Der Microkernel ist der „primitive“ Kern, der die elementaren Funktionen eines BS beherrscht. Auf ihm bauen die anderen Funktionalitäten des BS auf. Verteilte Betriebssysteme: - Das BS wird aufgabenorientiert in autonome Subsysteme unterteilt (BS zum Beispiel internetweit „gestückelt“. Ist noch nicht auf dem Markt!). - Dies kommunizieren durch Nachrichtenaustausch unteeinander - können auf Knoten ine einem Computer-Netz verteilt sein. Komponenten eines Betriebssystems: 75924440 ©B.C.G. Akademielehrgang Netzwerkadministration 4 Vorlesung „Betriebssystem“ - Lieferumfang: Man kann ein Betriebssystem nach seinem Lieferumfang beschreiben. Ist gut für den Verkäufer. Gibt dem User Information, was er erwirb (Preis/Leistungsverhältnis) - Betriebsmodus: Jene Programmteile die immer laufen bilden den Kern („kernel“) des Systems. Alles andere sind Applikationen. Manche davon systemnahe (z. B. File-System), manche anwenderbezogen (Compiler, Textverarbeitung) - Strukturelle Sicht: Programmen, insbesondere den Anwendungsprogrammen sollen die Dienste des Betriebssystems verfügbar gemacht werden. Dafür hat das Betriebssystem eine eigene Schnittstelle: API API = Application Programming Interface Programmen, insbesondere den Anwendungsprogrammen sollen die Dienste des Betriebssystems verfügbar gemacht werden. Dafür hat das Betriebssystem eine eigene Schnittstelle: API Auch Komponenten des Betriebssystems können vom API Gebrauch machen. Sie müssen aber in der Ebene „über“ dem API liegen oder das API ist als eigenes Subnetz angelegt. Beispiele für API: Ausgabe eines Textes am Bildschirm oder Drucker, speichern einer Datei, starten eines parallelen Prozesses. (Diese Befehle muss das Betriebssystem umsetzen können, unabhängig von der Hardware.) Die APIs sind bei verschiedenen Betriebssystemen unterschiedlich (z. B. MacIntosh, Windows) B) Klassifikation von Systemen Es gibt folgende Klassifikationsmerkmale: - Betriebsarten (z. B. Timesharing) - Benutzersicht (Benutzerschnittstelle graphisch oder kommandozeileninterpretiert) - Art der CPU Zuteilung (Scheduling Strategy) - Technischer- Interner Aufbau Betriebsarten: 1) Batch Systeme (Stapelverarbeitung) Mehrere Aufträge werden zu einem Stapel („batch“) zusammengefasst. Um dem System Bearbeitungsinformationen über die einzelnen Aufträge mitzuteilen, fügt man zusätzlich Steuerinformationen ein. Verwendet dazu die Sprache JCL (Job Control Language). Zum Beispiel sind das die BATCH-Kommandos unter DOS, die in einen BATCH-File zusammengefasst werden. Wenn ein Job (=Auftrag) als prozess abläuft, hat er die Kontrolle der kompletten Maschine. Es ist keine andere Benutzerinteraktion möglich. Ist der Auftrag abgearbeitet, wird die Kontrolle an das Betriebssystem zurückgegeben und der nächste Job im Stapel wird bearbeitet. 2) Multiprogramming (=Multitasking) Bei großen Systemen ist im Hauptspeicher genügend Platz für mehrere Benutzeraufträge gleichzeitig. Die CPU kann bei Bedarf (Interrupt, Scheduling) zwischen den einzelnen Prozessen hin und her geschalten werden. Multiprogramming ist direkt aus der Stapelverarbeitung hervorgegangen. Der erste Schritt dazu war spooling (es gibt einen Job-Pool und damit ein Abweichen von der Regel „First 75924440 ©B.C.G. Akademielehrgang Netzwerkadministration 5 Vorlesung „Betriebssystem“ in – First out“; konnte die Reihenfolge ändern). Ein Job-Scheduling war möglich und brachte eine bessere CPU-Auslastung. Long Term Scheduling: Das Betriebssystem muss hier für den Benutzer Entscheidungen treffen. Alle Jobs liegen zunächst einmal in einem Pool auf einem Massespeicher und warten auf freien Platz im Hauptspeicher. Wenn im Hauptspeicher zuwenig Platz ist, muss das Betriebssystem entscheiden, welche Jobs ausgewählt werden. 3) Timesharing Das Timesharing ist mit einer Schach-Simultanpartie vergleichbar. Die CPU ist sehr leistungsfähig und der Hauptspeicher „genügend“ groß. Die CPU wird jedem Prozess t Zeiteinheiten (typisch: Millisekunden) zyklisch zugeteilt. Damit können sich viele User über Terminals anschliessen und glauben subjektiv die CPU für sich zu haben. Ein Job löst im System einen Prozess aus. Ein Programm, das in den Speicher geladen und ausgeführt wird, läuft als Prozess ab. Probleme des Timesharings: Speichergröße (Was ist, wenn der Speicher für alle Programme zu klein ist?), Speicherschutz (Programm x darf nicht in den Bereich von Programm y schreiben / lesen), Periphere Geräte (Welcher Prozess erhält wann welches Gerät?) Die Lösungen dieser Probleme führen zu einer Vergrößerung des Betriebssystems. Je größer das Betriebssystem, desto weniger Platz ist für die Anwenderprogramme! 4) Real Time Systems Die Benutzeraufträge müssen innerhalb einer vordefinierten Zeitspanne ausgeführt werden bzw. muss das System innerhalb einer vordefinierten Zeit reagieren. „Hard“ Real Time Systeme garantieren, dass Aufträge (= tasks) tatsächlich in Echtzeit ausgeführt werden. Sie benutzen hauptsächlich den nichtflüchtigen Speicher (ROM), statt eines Massespeichers. Ihr Aussehen unterscheidet sich deutlich von „gewöhnlichen“ Betriebssystemen. Sie werden verwendet in der Medizin (Intensivstation), zur Prozesssteuerung in Flugzeugen, Robotern und anderen industriellen Bereichen. Bei „Soft“ Real Time Systemen erhält ein kritischer Prozess Vorrang vor anderen Prozessen bis er abgearbeitet ist. Dieses Konzept wird heutzutage in den meisten neuen Betriebssystemen in erweiterter bzw. modifizierter Form verwendet (z. B. Windows NT) Benutzersicht Heutzutage ist ein Betriebssystem meist dialog-orientiert. Eine Interaktion mit dem Benutzer ist vorgesehen. Der User kann jederzeit ein Programm unterbrechen und andere Aufgaben vorziehen. Es gibt zwei verschiedene Arten von Benutzerschnittstellen (= user interfaces): graphisch (z. B. Windows) oder kommandozeilenorientiert (z. B. DOS). Art der CPU Zuteilung (CPU Scheduling) CPU Scheduling = Zeitablaufplanung (Lexikon) = „steuern im Ablauf der Zeit“ (Mühlbacher) = „...allows several users to share the use of a CPU“ (Lexikon) Non Preemptive Scheduling (Nicht-unterbrechende Steuerung): Es erlaubt im Prinzip keinen Prozesswechsel. Es gibt aber kleine Ausnahmen, wie spezielle Interrupts und wenn es leicht 75924440 ©B.C.G. Akademielehrgang Netzwerkadministration 6 Vorlesung „Betriebssystem“ möglich ist, dürfen auch zwei Prozesse gleichzeitig ablaufen. Dieses System verwenden alle Batch Systeme wie z. B. MS-DOS. Cooperative CPU-Scheduling: Der Prozess gibt freiwillig unter bestimmten Bedingungen die CPU für einen anderen Prozess frei. Verwendete z. B. Windows 3.x Preemptive Scheduling (Unterbrechende Steuerung): Die CPU kann einem Prozess „jederzeit“ zu Gunsten eines anderen Prozesses (temporär) entzogen werden. Wird zum Beispiel bei Handys verwendet. Auch alle modernen Betriebssysteme verwenden es. Ist aber nur bei entsprechenden hardwaremäßigen Voraussetzungen möglich. Technische Interne Struktur Es geht darum, wie die interne Struktur eines Betriebssystems beschaffen ist: handelt es sich um ein nicht unterteiltes Betriebssystem (Monolithic System) oder um ein geschichtetes Modell, wobei die unteren Schichten den oberen Schichten Dienste zur Verfügung stellen (Layered System). Anderes existierendes System: Client-Server Model + (Micro-) Kernel Monolithic Systems: Hat man früher verwendet (erinnert an „Spaghetti-Code“Programmierung). Es gab eine Trennung zwischen Anwendungsprogrammen und Betriebssystem-Komponenten. Es kam zum allmählichen Übergang zu strukturierteren Systemen. Das Betriebssystem bestand aus vielen kleinen Teilbereichen. Wird ein Teilbereich geändert, muss er trotzdem zu allen anderen kompatibel sein. Passiert hier ein Fehler, kann es zu vielen Fehlern führen. (Folie B30) Man begann das Ganze in Schichten einzuteilen, wobei jede Schicht auf alle darunterliegenden Schichten zugreifen können. Das Problem ist, das man dabei für eine Aufgabe eventuell alle Schichten durchlaufen muss. Dauert eine Zeit! Man wollte aber nicht, dass Schichten übersprungen werden können, daher entwickelte man das Layerd Operating System. Layerd Operating System: Dieses System ist vom „strukturierten Programmieren“ stark beeinflusst. Man konnte die einzelnen Schichten nicht überspringen. Es war aber schwierig diese Regel einzuhalten. Die Schichten: Hardware – CPU Scheduling – Memory Management – Command Interpreter – Buffering for I/O Devices – User Programs. Vorteile: - Jede Schicht hat nur Zugang zur direkt darunterliegendenen Schicht - Fehler zu korrigieren ist leichter: man beginnt an der untersten Schicht - Hinzufügen und Teilen von Schichten ist möglich - Es ist möglich eine Schicht zu ersetzen ohne andere Teile des Systems ändern zu müssen Client-Server Model + (Micro)-Kernel Diese technische Struktur ist heute Standard. Wird von Windows NT und 2000 verwendet. Das Betriebssystem wird in verschiedene Prozesse unterteilt (aufgabenorientiert, nicht schichtorientiert). Jeder Prozess implementiert eine bestimmte Anzahl von Diensten. Möglichst alle Dienste werden im „user mode“ ausgeführt, die anderen im „kernel mode“. Die Dienste im „kernel mode“ können vom User nicht verändert werden. Auf Anfrage werden dem Client vom Server Dienste zugewiesen. Die Begriffe Client und Server sind fließend. Der was will, ist der „Client“, der was bietet ist der „Server“. Betriebssystemkomponenten können somit beides sein! (Hat nichts mit Client und Server von Netzwerken zu tun!) 75924440 ©B.C.G. Akademielehrgang Netzwerkadministration 7 Vorlesung „Betriebssystem“ Der Mikrokernel erhält eine Anfrage von einem Client (= Komponente des Betriebssystems oder Anwendungsprogramm). Er überprüft die Rechte und übermittelt die Nachricht an den Server. Der Server führt den Dienst aus und schickt das Ergebnis an den Kernel. Dieser leitet es an den Client weiter. Im Idealfall bearbeitet jeder Server einen eigenen „usermode process“. Aus Leistungsgründen (Performancegründen) werden aber auch im Kernel Dienste ausgeführt (Grafiktreiber, GDI = Graphic Device Inerface). Der Grafiktreiber wird in den Kernel geladen -> fehlerhafter Treiber -> ev. System-Crash. Virengefahr! Microsoft zertifiziert Treiber, d. h. sie garantieren, dass er problemlos funktioniert. Vorteile dieser Struktur: - Die einzelnen Teile des Betriebssystems sind klein und in sich abgeschlossen - Ein einzelner Dienst (Server) kann ausfallen und neu gestartet werden, ohne das das ganze Betriebssystem crashed. - Verschiedene Dienste (Server) können auf verschiedenen Prozessoren oder Computer laufen (wichtiger Schritt in Richtung „Verteilte Systeme“) C) Speicherverwaltung (Memory Management) Der Hauptspeicher (= RAM = main memory) ist von zentraler Bedeutung für die Arbeit eines Computers. Wenn wir vom Betriebssystem sprechen, wird der Hauptspeicher als Feld ( = array = Vektor) von Bytes oder Wörtern betrachtet, die alle ihre eigene Adresse haben. Der Hauptspeicher nimmt die Daten auf. Programme gelten auch als Daten. Aufgabe: Speicher zur Verfügung zu stellen. Ist grundsätzlich zu klein. Muss immer ein- und ausgeräumt werden. Dafür braucht man das main-mainboard-management. Das ist die Aufgabe des Betriebssystems. Man braucht auch ein File-Management (Dateisystemverwaltung). Dateien müssen angelegt, verwaltet und gelöscht werden. Verzeichnisse müssen erstellt werden: DirectoryManagement. Address binding: Logischen Adressen werden physische Adressen zugewiesen. Diesen Vorgang nennt man „address binding“. Logische Adresssen: Adresse aus der Programmsicht Physische Adressen: tatsächliche Adresse zur Ansteuerung der Speicherbänke. Die logischen Adressen bilden den log. Adressraum, die physischen Adressen, den physischen Adressraum. Daher kann der logische Adressraum größer sein, als der tatsächlich vorhandene physische Speicher. Die Umwandlung von logischen in physische Adressen erfolgt durch eine einfache Umrechnung in der Memory Management Unit, die oft ein Teil der CU ist. (Folie C38) Die Umwandlung kann zu verschiedenen Zeitpunkten erfolgen: - Beim Kompilieren (Compile Time Binding) 75924440 ©B.C.G. Akademielehrgang Netzwerkadministration 8 Vorlesung „Betriebssystem“ - Beim Laden (Load Time Binding) - Beim Ausführen (Run Time Binding) Hier das ganze noch einmal etwas genauer erklärt: Viele Systeme erlauben es, dass die Prozesse irgendwo im physikalischen Speicher ablaufen. Also muss die erste Adresse eines Prozesses nicht „0000H“ sein. Ein mapping (map = abbilden) von den symbolischen (= logischen) auf die physikalischen Adressen muss stattfinden, d. h. den logischen Adressen werden physikalische Adressen zugewiesen. Diesen Vorgang nennt man „adress binding“. Dieser Vorgang kann stattfinden beim Kompilieren, Laden oder zum Zeitpunkt der Ausführung eines Programms. Statische, absolute Adressierung (absolute addresses): Die physikalischen Adressen werden bereits zur Programmierzeit vollständige festgelegt. Das wurde früher gemacht und ist auch heute noch in kleinen Systemen üblich. Es wird außerdem verwendet, wenn man in Maschinencode programmiert. Auch Compiler (setzt Programm in Maschinencode um) und Assembler (setzt AssemblerProgramme in Maschinencode um) können „absolute addresses“ (= physikal. Adressen) erzeugen, die nicht mehr geändert werden können („compile time binding“). Normalerweise erzeugen sie aber „relative addresses“. Dynamische, relative Adressierung (relative addresses): Relative Adressen ermöglichen es, das „address binding“ aufzuschieben, bis eine tatsächliche physikalische Adresse bekannt ist. Zur relativen Adresse wird dann eine entsprechende Zahl dazuaddiert (vom relocation-register), um auf die tatsächliche physikalische Adresse zu kommen. Die Umwandlung erfolgt, wenn das Programm geladen wird: Load Time Binding. Zur Kompilierzeit sind die Speicheradressen noch unbekannt. Der Compiler erzeugt verschiebbaren Code (relocatable). Der Programmlader(Loader) des Betriebssystems fügt dann die korrekten Adressen beim Laden des Programms in den Hauptspeicher ein. Loader: Ein Programm liegt auf der Festplatte und muss in den Hauptspeicher gebracht werden, um ausgeführt werden zu können. Das macht der Loader! Freispeicherverwaltung Das Betriebssystem selbst und jedes laufende, im Speicher liegende Programm benötigt Speicher für den Code und die Daten. Die Aufgaben des Betriebssystems sind: - Verwaltung des verfügbaren Speichers - Zuteilung des Speichers an die Programme - Schutzmechanismus gegen unerlaubte Zugriffe auf bereits benutzten Speicher (Hardwareunterstütung nötig) Speicherbelegung: siehe Folie C43. Gibt verschiedene Zuordnungsstrategien: - First Fit: erster passender Block wird genommen - Best Fit: Minimaler Speicherplatz bleibt über -> viele kleine Überbleibsel - Worst Fit: größter Block wird genommen - Buddy Methode: Blöcke der Größe 2x werden genommen 75924440 ©B.C.G. Akademielehrgang Netzwerkadministration 9 Vorlesung „Betriebssystem“ Probleme, wenn zwischen den belegten Speicherplätzen immer wieder was frei bleibt, die Einzelteile aber z. B. zu klein sind um von neuen Programmen /Daten genutzt werden zu können. Typische Probleme bei der Speicherverwaltung: Fragmentierung und Verschiebbarkeit Fragmentierung: Speicherverschnitt durch nicht nutzbare Teile. Interne Fragmentierung: einem Prozess wird verfahrensbedingt mehr Speicher zugeteilt, als er benötigt Externe Fragmentierung: der Speicher wird so in freie und belegte Teile zerstückelt, dass kein genügend großer, zusammenhängender, freier Bereich zu finden ist. Durch Defragmentierung erfolgt eine Umordnung, wobei alle belegten Teile „dicht“ ans Ende des Speichers und alle freien Teile zusammen an den Anfang verschoben werden. Verschiebbarkeit (relocation): Programmteile müssen verschiebbar sein, damit sie in jedem beliebigen freien Bereich gespeichert werden können. Dies erfordert entsprechende Adressierungsverfahren und einen geeigneten Programm-Lader. Paging Beim Paging wird der Hauptspeicher in gleich große Blöcke (=Seiten = Frames) geteilt. Die Seitengröße wird durch die Hardware festgelegt. Sie ist eine Zweierpotenz. Die optimale Seitengröße ist ein Kompromiss zwischen der Häufigkeit von Seitenwechseln und der Größe internen Fragmentierung. Sie liegt in der Praxis oft zwischen 2 und 32 KByte. Die logische Adresse wird geteilt in die Seitennummer und dem Offset (= „quantity added to a number or adress to give a final number. Ausgleichszahl“ laut Lexikon). Die logische Adresse wird in zwei Teile geteilt. Ein Teil wird reserviert für die Beschreibung der Straße, der Rest für die Hausnummer. (Erklärung von Dr. Mühlbacher) Ein im logischen Adressraum durchgehender Bereich muss nicht auf einen durchgehenden Bereich im physischen Speicher abgebildet werden! Die Programmteile werden an beliebigen Stellen gespeichert. Man braucht ein Verzeichnis, das sich merkt, wo was ist: page table (= Seitentabelle). Hat dadurch längere Zugriffszeiten. es wird ständig versucht zu optimieren. Die Seitentabelle liegt in der CPU (nur kleine Seitentabellen möglich) oder im Hauptspeicher (große Seitentabellen, aber längere Zugriffszeit). Jeder Prozess hat seine eigene Seitentabelle. In einer Seitentabelle sind die Startadressen aller Seiten im physischen Hauptspeicher gespeichert. Beispiel siehe Folie C 57. Vorteile des Paging: - Externen Fragmentierung wird vermieden (nicht jedoch interne) - Paging ist vor Anwenderprogrammen völlig verborgen - Anwenderprogramm sieht eigenen Speicher als kontinuierlichen Block - Das Betriebssystem kann den Zugriff auf „fremden“ Speicher verhindern (eigene Seitentabelle pro Prozess) - Das Auslagern von Seiten auf die Platte ist einfacher und effizienter als das Auslagern variabel großer Speicherblöcke. Paging & Speicherschutz: 75924440 ©B.C.G. Akademielehrgang Netzwerkadministration 10 Vorlesung „Betriebssystem“ Die Einträge in den Seitentabellen werden erweitert, um die Einträge nur lesen, lesen/schreiben, nur ausführen, gültige Adresse. Es erfolgt eine Gültigkeitsprüfung beim Übersetzen der logischen Adresse in die physische Adresse. Erfolgt ein illegaler Zugriff, wird ein Hardware Trap ausgelöst. (Hardware Trap = that will catch something, such as a variable, fault or value. Fangstelle. … Unterbrechung während einer Ablaufverfolgung) Shared Pages: Wird zum Beispiel eine DLL von zwei verschiedenen Programmen benutzt, erhält sie die gleiche Adresse in der Seitentabelle. Siehe Folie C 63 und 64. Das bringt eine Speicherersparnis. Gemeinsam benutzter Code wird also in Shared Pages gelegt. Voraussetzungen dafür sind ein re-entrant code (= „wierververnbarer Code“ = ein Programm, das von mehreren Usern gleichzeitig benutzt wird muss unterbrochen werden können, bzw. von einem anderen User gestartet werden können, bevor es seine derzeitige Arbeit beendet hat) und der Code sollte über Read only / Execute only Flag (=Anzeiger, markieren) geschützt werden können. Der Datenaustausch zwischen verschiedenen Prozessen über Shared Pages bringt aber auch Probleme, z. B. welche CPU darf wann zugreifen (symmetric multiprocessing)? D) Virtueller Speicher Oft ist kein genügend großer physischer Speicher vorhanden. Wenig benutzte Teile werden nicht geladen. Man schafft daher einen virtuellen Speicher, der natürlich viel langsamer ist. Das Betriebssystem muss herausfinden, wie der virtuelle Speicher in den Hauptspeicher kommt, Meist on-demand (= bei Bedarf). Ein virtueller Speicher erlaubt das Ausführen von Prozessen, die nicht zur Gänze im physischen Hauptspeicher stehen. Vorteile: - Programmierer müssen nicht auf den tatsächlich vorhandenen Hauptspeicher Rücksicht nehmen. - Programme sind nicht länger durch die Grenzen des physischen Speichers eingeschränkt. - Es wird nicht das gesamte Programm geladen, damit gibt es schnellere Ladezeiten - Es wird pro Prozess weniger physischer Hauptspeicher belegt, d. h. mehrere Prozesse können den Hauptspeicher gleichzeitig nutzen. Das führt zu einer besseren CPUAuslastung und somit zu einem höheren Durchsatz. Begriffe: - Seite (=Page): Teilausschnitt eines logisch konsekutiven Adressbereichs, der auch physikalisch konsekutiv abgebildet wird. - Seitenrahmen (= Frame): physikalischer hauptspeicherbereich, der eine Seite aufnehmen kann. - Page-Reference-String: Abfolge jener Seiten, die ein Prozess anspricht. Ein virtueller Speicher wird meist über Paging implementiert. Vorteile: - Die Algorithmen für das ein- und auslagern von Pages sind einfacher, da Pages fixe Länge haben (z. B. 4 KB ist typisch) - Externe Fragmentierung fällt weg - Verschieben von Seiten entfällt, sobald sie einmal platziert sind. 75924440 ©B.C.G. Akademielehrgang Netzwerkadministration 11 Vorlesung „Betriebssystem“ Es muss mitprotokolliert werden, welche Sachen sich im Hauptspeicher befinden und welche im virtuellen Speicher. Das wird in der Seitentabelle vermerkt. Außerdem braucht jedes Betriebssystem eine Ladestrategie (= fetch policy): Wann wird was geladen? Üblich ist eine Ladestrategie, genannt „Demand Paging“. Die Seiten werden„Ondemand“ (=nach Bedarf) geladen, meist kombiniert mit „look ahead“ (=Vorschau; nicht nur die benötigten, sondern auch „benachbarte“ Seiten werden auf Verdacht mitgeladen) Auch muss festgelegt werden in welchen Rahmen (frame) eine Seite (page) gelegt werden soll: placement strategy Replacement-Strategy: zu wenig physischer Speicher -> welche Seiten sollen ausgelagert werden. Page Fault (Seitenfehler): Ein Seitenfehler tritt auf, wenn ein Prozess eine Seite benötigt, die sich nicht im physikalischen Hauptspeicher befindet. So eine Seite wird „invalide page“ genannt. Es kommt zu einem Interrupt. Der „Lazy Swapper“ tritt in Aktion und lädt die Seite aus dem virtuellen Speicher in den Hauptspeicher. Je größer der physische Hauptspeicher, desto weniger Seitenfehler gibt es! E) Prozesse Was ist ein Prozess? Wenn ich ein Programm im System zur Ausführung bringe, dann entsteht ein Prozess. - Ein Prozess ist eine Folge von Zuständen. - Ein Prozess braucht Betriebsmittel: CPU, Speicher. Die CPU spult Prozesszustände ab, d. h. „CPU scheduling“ (=steuern im Ablauf der Zeit). - Ein Prozess muss zuerst einmal erzeugt (created) werden. - Manchmal muss ein laufender Prozess angehalten werden können (z. B. arbeitet mit einem Programm. Email kommt an. Bekommt Meldung. Dazu muss das Programm kurz angehalten werden.) - Prozess-Synchronisation: z. B. gibt man Text ein und gleichzeitig läuft die Rechtschreibprüfung. Diese beiden Tätigkeiten müssen von der CPU synchronisiert werden. Das macht das Betriebssystem (nicht das Textverarbeitungsprogramm!). - Inter-Process-Communication: Kommuniziert auch im Netz. Gibt auch Prozesse zwischen Rechnern Scheduling: Normalerweise bezieht sich „scheduling“ auf die Aufgabe, die Nutzung von Ressourcen zu planen: Wann werden / können / sollen Ressourcen genutzt werden? Welche Bedingungen sind bei der Nutzung zu beachten? CPU scheduling: die CPU wird einem Prozess zugewiesen bzw. planen von Prozessen. Disk scheduling Was sind Ressourcen? CPU, Hauptspeicher, Festplatte, periphere Geräte (z. B. Drucker),… Die wichtigste Ressource ist die CPU! Die Ausführung eines Programms startet einen Prozess. Im Normalfall werden viele Prozesse gestartet. 75924440 ©B.C.G. Akademielehrgang Netzwerkadministration 12 Vorlesung „Betriebssystem“ Aber wir vereinfachen es einmal auf einen Prozess. Zu jedem bestimmten Zeitpunkt wird genau eine Anweisung (instruction) ausgeführt. Die CPU kann nun zwei Prozesse parallel ausführen, indem sie diese „verzahnt“: zuerst wird die erste Anweisung des Prozesses A abgearbeitet, dann die erste Anweisung des Prozesses B. Nun kommt die zweite Anweisung des Prozesses A an die Reihe, dann die zweite Anweisung des Prozesses B und so weiter (Folie E 7). Natürlich können auch mehrere CPUs parallel arbeiten. Man spricht von zwei parallel ausgeführten Prozessen, wenn die erste Anweisung des einen Prozesses gestartet wird, bevor die letzte Anwesung des anderen Prozesses beendet worden ist. (Diese Aussage ist unabhängig von der Anzahl der CPUs. Sie trifft auch bei nur einer CPU zu!) Manchmal sagt man statt Prozess auch „Task“, wobei der Begriff „task“ in der Literatur nicht exakt definiert ist. Prozesszustände Wenn ein Prozess ausgeführt wird, ändert sich sein Zustand (state). Der Prozess kann folgende Zustände annehmen: - new: Neuer Prozess wird gestartet - active: Der Prozess ist aktiv. Da die CPU von mehreren Prozessen gleichzeitig benutzt werden kann, unterteilt man die aktiven Prozesse noch einmal in „running“ (der Prozess läuft; Instruktionen werden ausgeführt) und „ready“ (der Prozess ist bereit, muss aber auf die CPU-Zuweisung warten). Von den aktiven Prozessen können viele „ready“ sein, aber nur einer ist „running“. - waiting: Wartezustand. Der Prozess wird z. B. gerade nicht benötigt, eine Ressource fehlt, wartet auf Vollendung eines Inputs oder eines Outputs. - terminated: Der Prozess ist beendet. Auslöser für einen Prozesswechsel können sein: - Der Scheduling-Algorithmus weist der CPU einen „ready“-Prozess zu. - Ein Interrupt taucht auf und wird von der CPU ausgeführt - Ein Prozess erfordert einen Input oder Output und muss warten (z. B. schickt Sachen an den Drucker und muss warten bis der Druckerpuffer wieder leer ist und dann die nächsten Sachen schicken) - Die Wartebedingung ist beendet (z. B. input/output ist fertig. Könnte z. B. sein: Druckerpuffer füllen). Der Prozess kommt in den „ready“-Status. - Der Prozess ist beendet. (Siehe Folie E15) F) CPU-Scheduling Ein Scheduler sorgt für die Zuteilung von Betriebsmitteln an die Prozesse. Man unterscheidet zwei Stufen: „Long Term Scheduling“ und „Short Term Scheduling“. Long Term Scheduler: Er legt fest, welche Aufträge (Jobs) aus dem Jobpool zur Verarbeitung in den Hauptspeicher geladen werden. In einem Stapelverarbeitungssystem fallen oft mehr Jobs an, als zugleich im Hauptspeicher gehalten werden können: Die Jobs werden daher zuerst auf den Massenspeicher kopiert. Der 75924440 ©B.C.G. Akademielehrgang Netzwerkadministration 13 Vorlesung „Betriebssystem“ Long Term Scheduler wählt Jobs aus diesem Job Pool. Diese werden dann in den Hauptspeicher geladen, um dort ausgeführt zu werden. Die Reihenfolge in der Auswahl kann durchaus unterschiedlich sein von „First in – First out“. Short Term Scheduler: Er wählt von jenen Prozessen, die im Zustand „ready“ sind, einen aus und ordnet diesem die CPU zu. (Prozesse im Zustand „ready“ befinden sich im Hauptspeicher!) Es gibt verschiedene Forderungen an die CPU, die sich gegenseitig widersprechen: - CPU-Auslastung (CPU utilisastion): Die CPU-Auslastung sollte sich zwischen 40 % (lightly loaded) und 90 % (heavily loaded system) bewegen. - Durchsatz (throughput): Der Durchsatz gibt die Anzahl der fertig gerechneten Jobs pro Zeiteinheit an. Ein Job kann eine Stunde beanspruchen, während hingegen bei kurzen Jobs zehn in einer Sekunde erledigt werden können. - Verweilzeit (turnaround time): Die Verweilzeit ist die Zeitspanne von der Übergabe eines Jobs an das System bis zu dessen Fertigstellung. Da die Verweilzeit auch die Zeit für die Ausgabe des Ergebnisses enthält, spielt auch die Geschwindigkeit der Ausgabegeräte ein wesentliche Rolle. - Antwortzeit (response time): Die Antwortzeit ist die Zeitspanne vom Abschluss einer (Benutzer-)Eingabe an einen Prozess, bis zum Beginn der nachfolgenden Ausgabe. Sie ist ein besseres Kriterium als die Verweilzeit. - Wartezeit (waiting time): Die Wartezeit ist jene Zeitspanne, die ein Prozess im Zustand „ready“ ist. Die CPU-Auslastung und der Durchsatz sollen maximal sein. Verweilzeit, Antwortzeit und Wartezeit sollen minimal sein. Bei Scheduling-Systemen gibt es zwei Varianten: preemptive Scheduling (= unterbrechende Steuerung) und nonpreemptive Scheduling (=nicht unterbrechende Steuerung). Nonpreemptive Scheduling (= nicht unterbrechende Steuerung) Die CPU bleibt einem Prozess zugeteilt, bis dieser sie von sich aus zurückgibt, z. B. wegen einer I/O-Anforderung. Wichtige nonpreemptive Scheduling Algorithmen: - First Come First Serverd: Der Prozess, der zuerst kommt, wird zuerst bearbeitet. Nicht sehr effektiv, da weder die zu erwartende Laufzeit, noch die benötigten Betriebsmittel oder Prioritäten berücksichtigt werden. - Shortest Job First: Die Prozesse werden danach gereiht und ausgeführt, wie lange sie die CPU benötigen. Der Prozess mit der kürzesten Dauer wird zuerst ausgeführt. Ist die Prozesslänge von zwei Prozessen gleich, so wird nach „First Come First Serverd“ entschieden. Diese Methode minimiert die Wartezeit der Jobs. Wie lange die CPU jedoch 75924440 ©B.C.G. Akademielehrgang Netzwerkadministration 14 Vorlesung „Betriebssystem“ tatsächlich von den einzelnen Jobs belegt wird ist nicht vorhersehbar. Man behilft sich daher mit einer Schätzung. - Priority Scheduling: Jedem Prozess wird eine Priorität zugeordnet. Die CPU erhält jenen Prozess zugeteilt, der die höchste Priorität hat. Bei Prozessen mit gleicher Priorität wird nach „First Come First Serverd“ entschieden. Basis für die Vergabe von Prioritäten sind Kenngrößen der Ressourcen-Nutzung wie Zeitlimits, Speicherbedarf, Anzahl der offenen Dateien, aber auch Faktoren, die außerhalb des Rechners liegen und häufig politischer Natur sind. „Shortest Job First“ ist ein Spezialfall von Priority Scheduling: die Priorität wir in Abhängigkeit von der Länge der Nutzung der CPU vergeben. Es kann vorkommen, das ein Prozess „verhungert“, da immer Prozesse mit höherer Priorität kommen. Dieses Problem wird durch „Aging“ gelöst: die Priorität wird entsprechend der Wartezeit vom Betriebssystem periodisch erhöht. Preemptive Scheduling Algorithmen Die Algorithmen “Shortest Job First” und “Priority Scheduling” funktionieren genauso wie beim Nonpreemptiv Scheduling, aber: Fordert ein Prozess die CPU an, der einen kürzeren CPU-Burst bzw. eine höhere Priorität als der gerade laufende Prozesse hat, so wird letzterem die CPU entzogen!!! Das führt aber zu vielen Problemen: - Wechsel des TCB erforderlich (retten des Prozesszustandes) - Speicherverwaltung? - Kann zu jedem beliebigen Zeitpunkt unterbrochen werden? Nein! - Häufiges Umschalten führt zu Zeitproblemen - ... Im Zusammenhang mit Prozessumschaltung benötigt man eine spezielle Betriebssystemkomponente, den Dispatcher. Er weißt einem Prozess die CPU zu oder entzieht ihm die CPU. Round Robin Verfahren Jedem Prozess wird die CPU eine gewisse Zeit zugeteilt. Dann bekommt sie der nächste Prozess. Nach einiger Zeit wird die CPU wieder dem ersten Prozess zugeteilt. So entsteht der Eindruck, dass alle Prozesse gleichzeitig abgearbeitet werden. Dieses Verfahren eignet sich vor allem für Timesharing-Systeme. Moderne Systeme (z. B. Windows 2000, Linux) verwenden normalerweise das preemptive priority scheduling. Innerhalb einer Klasse mehrerer gleichrangiger Prozesse, aber das Round Robin Verfahren. Dabei verwenden sie variable Zeitspannen. J) Fallstudie Windows 2000 Von Windows 2000 gibt es vier Versionen: Professional, Server, Advanced Server und Datacenter Server. Sie unterscheiden sich durch ... - die Anzahl der verwendbaren Prozessoren (zwei oder mehrere CPUS: ein Master und Slaves oder alle gleichberechtigt = symmetrisches Processing) 75924440 ©B.C.G. Akademielehrgang Netzwerkadministration 15 Vorlesung „Betriebssystem“ - die Größe des Hauptspeichers - die Anzahl der Rechner im Netz - die Anzahl der mitgelieferten Services Prozess Eine simple Beschreibung eines Prozesses wäre: „Wenn ein Programm ausgeführt wird, erzeugt es einen Prozess“. Eigentlich ist das aber die Beschreibung eines Threads. Ein Prozess (= task) ist ein Container für ein Set von Ressourcen, die von Threads verwendet werden, die die Befehle eines Programms ausführen. Ein Programm ist eine statische Sequenz von Instruktionen. Ein Prozess besteht aus: - einem „private virtual address space” = ein Set von virtuellen Speicheradressen ist, die der Prozess benutzen kann - einem ausführbaren Programm - einer Liste von Zugängen zu verschiedenen Systemressourcen, wie Dateien (Originaltext: „A list of open handles to various system resources, such as semaphores, communication ports, and files) - Ein Prozess fragt die Rechte ab, die mit ihm zusammenhängen, bevor er abläuft (identifiziert den Benutzer, Sicherheitsgruppen, Privilegien) - Jeder Prozess wird intern durch eine Nummer identifiziert. - Ein Prozess besteht aus mindestens einem Thread. Ein Prozess wird gestartet. Zuerst wird überprüft, worauf er zugreifen darf. Gibt mehrere Threads, die ein Prozess erzeugen kann (z. B. Tastendruck verarbeiten, Rechtschreibprüfung, ...). Ein Thread ist ein kleiner Prozess. Ein Prozess besteht aus mehreren Threads. Jeder Prozess hat bestimmte Rechte. Die Threads erhalten diese Rechte auch. Die Rechte müssen nicht jedes Mal neu angelegt, geladen werden. Es wird nur mehr der jeweilige Thread aufgerufen. Bei DOS waren die Begriffe „Prozess“ und „Thread“ ident, da ein Prozess nur aus einem Thread bestehen konnte. Adressraum In Windows 2000 können 4 Gigabyte (!) Hauptspeicher adressiert werden ( 4 GB = 232). Üblich sind aber nur 256 MB bzw 512 MB! Die obere Hälfte ist für das Betriebssystem, die unteren 2 GB für den Anwender. Das spielt sich alles im virtuellen Speicher ab. Windows 2000 benutzt das Paging um logischen Adressen physische Adressen zuzuweisen. Verwendet werden außerdem der „user mode“ und der „kernel mode“. Im „kernel mode“ laufen Komponenten des Betriebssystems, wie Systemdienste und Gerätetreiber, ab. Vorsicht: Wird ein fehlerhafter Treiber installiert, kann das zu großen Problemen führen! Innerhalb des Kernels gibt es keine Security. Komponenten des „kernel mode“ sind : - Executive (Ausführung): beinhaltet die Basisdienste des Betriebssystems wie memory management, process management, thread management, interprocess communication (zwei Prozesse tauschen Daten aus), security, Input/Output - Kernel: grundlegende Funktionen des Betriebssystems, wie thread scheduling, Behandlung von Interrupts, Multiprocessor Synchronisation. Es ist kein MicroKernel, weil er auch noch für andere Prozesse (tasks) zuständig ist. 75924440 ©B.C.G. Akademielehrgang Netzwerkadministration 16 Vorlesung „Betriebssystem“ - Device Drivers and HAL: Die Gerätetreiber (device drivers) übersetzen Ein- und Ausgabeanforderungen der User für die Hardware. Der Hardware abstraction layer (HAL) isoliert den Kernel und die Treiber vor plattformspezifischen Hardwareunterschieden, wie z. B. die Unterschiede zwischen Motherboards. - GUI und GDI: GUI = Graphic User Interface, GDI = Graphic Device Interface. Früher waren dieser Prozesse im user mode. Aus Performance-Gründen sind sie jetzt ein Teil des kernel mode. Sie sind zuständig fürs Zeichnen, die Fenster und user interface controls, wie z. B. die Maus. Im „user mode“ laufen die Anwenderprogramme und weniger wichtige Komponenten des Betriebssystems. Es gibt Schutzmechanismen, sogenannte Ringe. Aus historischen Gründen gibt es davon nur zwei: ring 0 und ring 3. Windows 2000 benutzt den Ring 0 für den „kernel mode“ und den Ring 3 für den „user mode“. Die Architektur des Intel x86 Prozessors verwendete 4 Ringe um Programme und Daten vor dem Überschreiben durch weniger privilegierte Programme zu schützen. Architektur von Windows 2000 Einerseits ist Win2000 ein „monolithic system“, in dem Sinn, dass der Großteil des Betriebssystems und die Gerätetreiber sich den gleichen Speicherplatz teilen, nämlich im Kernel. Andererseits in das System sehr geschichtet („layered design“). Auch ist Win2000 Client-Server orientiert und unterstützt wichtige Kommunikationsmechanismen: die „Local Procedure Calls“ werden verwendet um Nachrichten zwischen Threads auszutauschen. Dieser Austausch erfolgt über Ports und auch über geteilten Speicher („shared memory“). Multiprocessing: Symmetric Multiprocessing: Man hat mehrere gleichberechtigte CPUs. Grundlegende Philosophie: Jede CPU verwendet eine identische Kopie des Betriebssystems. Wenn nötig, kommunizieren diese Kopien miteinander. Asymmetric Multiprocessing: Es gibt mehrere CPUs. Es besteht eine Art Master-Slave Beziehung zwischen den CPUs. Jeder CPU wird ein spezieller Prozess (task) zugewiesen. Ein Master-Prozess kontrolliert das System. Der Master-Prozess teilt den Slave-CPUs die Arbeit zu. Im speziellen: Das Betriebssystem wählt eine CPU aus um das Betriebssystem auszuführen, während die anderen CPUs user code abarbeiten. Vergleich symmetric und asymmetric multiprocessing: Folien J 41 und J 42. Windows 2000 unterstützt symmetrical multiprocessing. Wie viele CPUs unterstützt werden, hängt von der Version ab die man hat: Professional (2 CPUs), Server (4 CPUs), Advanced Server (8 CPUs), Datacenter Server (32 CPUs). 75924440 ©B.C.G. Akademielehrgang Netzwerkadministration 17 Vorlesung „Betriebssystem“ Windows 2000 Scheduling funktioniert auf Grundlage des Preemptive scheduling und der Priority. Es gibt 32 priority-levels: 16 “real time“-levels, 15 variable levels und 1 system level (idle = bereit = wird nicht genutzt, aber wartet auf Einsatz). Außerdem hat jeder Thread eine Priorität auf Grund seiner Erzeugungszeit (creation time). Es kann immer nur ein Prozess laufen. Laufen zwei Prozesse gleichzeitig, dann bedeutet das, dass der Rechner zwei CPUs besitzt! „Foreground Process”: In Windows hat ein Fenster den Focus, und somit dessen Thread eine hohe Priorität. Das heißt, der User kann bestimmen, welche Prozesse (und somit welche Programme) eine hohe Priorität haben. Diese Priorität kann aber von „real time“ Prozessen zurückgesetzt werden. Unterstützte file systems: FAT 12: max. 32 MB, für Disketten, Speichermedien FAT 16: max. 4 GB FAT 32: max. 32 GB, verwendet von Win98 NTFS: New Technology File System, verwendet von Win2000 UDF: Universal Disk Format. Neuer Standard für read-only Medien. (Zukünftiges Format) Bei FAT 16 und FAT 32 kann man viele Sicherheitsvarianten nicht verwenden! 75924440 ©B.C.G.