STUDIENGANG ANGEWANDTE INFORMATIK VORLESUNGSUNTERLAGEN ZU SYSTEMSOFTWARE Prof. Dr.-Ing. Silvia Keller Ausgabe: 14 .03.2005 Systemsoftware-Skript Version 1.1 Seitenzahl: 102 Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 2 von 102 Inhaltsverzeichnis 1. Einführung ........................................................................................................................................5 1.1 Historische Entwicklung ..................................................................................................................5 1.2 Betriebsarten...................................................................................................................................6 1.2.1 Direkte Maschinenprogrammierung ........................................................................................6 1.2.2 Stapelbetrieb (Batch Systeme)................................................................................................6 1.2.3 Mehrprogrammbetrieb ( Multiprogramming )...........................................................................7 1.2.4 Dialogbetrieb............................................................................................................................8 1.2.5 Realzeitbetrieb.........................................................................................................................9 1.3 Systemsoftware – Betriebssystem..................................................................................................9 1.4 Architektur von Betriebssystemen ................................................................................................11 1.4.1 Beispiel: Architektur von Windows NT...................................................................................12 1.4.2 Subsysteme unter Windows NT ............................................................................................13 1.5 Systemaufrufe ( Supervisor call )..................................................................................................14 1.5.1 Unterbrechungstechnik..........................................................................................................14 1.5.2 Systemfunktionen ..................................................................................................................15 1.5.3 Beispiel - Daten in eine Datei schreiben................................................................................16 1.6 Übungsaufgabe.............................................................................................................................17 1.6.1 Aufgabe 1 ..............................................................................................................................17 2. Multiprogramming ..........................................................................................................................18 2.1 Prozesse .......................................................................................................................................18 2.1.1 Prozess-Adressraum .............................................................................................................18 2.1.2 Prozesszustände ...................................................................................................................19 2.2 Prozeßwechsel ( Dispatch, Scheduling ) ......................................................................................19 2.2.1 Freiwilliger Prozeßwechsel durch Aufrufen einer Systemfunktion ( non preemptive )..........19 2.2.2 Erzwungener Prozeßwechsel ( preemptive ) ........................................................................20 2.3 Threads .........................................................................................................................................20 2.3.1 Definition und Erzeugung von Threads .................................................................................25 2.4 Wichtige Systemfunktionen ..........................................................................................................25 2.5 Scheduling Verfahren ...................................................................................................................25 2.5.1 First Come First Serve (FCFS)..............................................................................................26 2.5.2 Shortest Job First (Modifikation von FCFS ) .........................................................................26 2.5.3 Round Robin (RR) Zeitscheibenverfahren ..........................................................................27 2.5.4 Prioritäten ..............................................................................................................................28 2.6 Multiprogramming in UNIX............................................................................................................29 2.6.1 Prozesse in UNIX ..................................................................................................................29 2.6.2 Scheduling in UNIX................................................................................................................34 2.7 Multiprogramming in Windows NT................................................................................................35 2.7.1 Prozesse in NT ......................................................................................................................35 2.7.2 Threads in NT ........................................................................................................................36 2.7.3 Scheduling in NT ...................................................................................................................37 2.8 Übungsaufgaben...........................................................................................................................38 2.8.1 Aufgabe 2 ..............................................................................................................................38 2.8.2 Aufgabe 3 ..............................................................................................................................38 2.8.3 Aufgabe 4 ..............................................................................................................................39 2.8.4 Aufgabe 5 ..............................................................................................................................39 2.8.5 Aufgabe 6 ..............................................................................................................................40 2.8.6 Aufgabe 7 ..............................................................................................................................41 Prof. Dr. Keller 3. Systemsoftw are-Skript Version 1.1 Seite 3 von 102 Arbeitsspeicherverwaltung ...........................................................................................................42 3.1 Partitionierung...............................................................................................................................42 3.1.1 Strategien zur Speicherplatzvergabe ....................................................................................43 3.2 Segmentierung..............................................................................................................................44 3.3 Virtueller Speicher.........................................................................................................................45 3.3.1 Overlays.................................................................................................................................45 3.3.2 Seitenwechselverfahren ( Paging )........................................................................................45 3.4 Speicherverwaltung in UNIX.........................................................................................................52 3.5 Speicherverwaltung in Windows NT .............................................................................................53 3.6 Übungsaufgaben...........................................................................................................................54 3.6.1 Aufgabe 8 ..............................................................................................................................54 3.6.2 Aufgabe 9 ..............................................................................................................................54 3.6.3 Aufgabe 10 ............................................................................................................................55 3.6.4 Aufgabe 11 ............................................................................................................................55 3.6.5 Aufgabe 12 ............................................................................................................................56 3.6.6 Aufgabe 13 ............................................................................................................................56 4. Interprozesskommunikation .........................................................................................................57 4.1 Modelle zur Beschreibung eines nebenläufigen Systems ............................................................57 4.1.1 Beschreibung der Aufbaustruktur durch Instanzennetze ......................................................57 4.1.2 Beschreibung der Ablaufstruktur durch Petrinetze................................................................57 4.2 Kooperation über gemeinsame daten ( shared memory ) ............................................................58 4.3 Synchronisation ............................................................................................................................59 4.3.1 Signale, Flags ........................................................................................................................59 4.3.2 Stop/Unstop-Mechanismus ...................................................................................................59 4.3.3 Semaphore ............................................................................................................................59 4.3.4 Monitore.................................................................................................................................61 4.3.5 Verklemmungen.....................................................................................................................67 4.4 Kommunikation .............................................................................................................................68 4.4.1 Nachrichten............................................................................................................................68 4.5 Interprozesskommunikation unter UNIX .......................................................................................68 4.5.1 Signale und PIPES ................................................................................................................68 4.5.2 Semaphore, Shared Memory, Nachrichten ...........................................................................69 4.6 Interprozesskommunikation in Windows NT.................................................................................69 4.6.1 Gemeinsame Daten...............................................................................................................69 4.6.2 Synchronisation .....................................................................................................................69 4.6.3 Kommunikation über Nachrichten .........................................................................................71 4.7 Problem des schlafenden Friseurs (Sleeping Barber)..................................................................72 4.7.1 Problembeschreibung............................................................................................................72 4.7.2 Petrinetz.................................................................................................................................74 4.7.3 Pseudocode...........................................................................................................................75 4.7.4 Sourcecode............................................................................................................................75 4.8 Übungsaufgaben...........................................................................................................................78 4.8.1 Aufgabe 14 ............................................................................................................................78 4.8.2 Aufgabe 15 ............................................................................................................................79 4.8.3 Aufgabe 16 ............................................................................................................................80 4.8.4 Aufgabe 17 ............................................................................................................................81 4.8.5 Aufgabe 18 ............................................................................................................................82 4.8.6 Aufgabe 19 ............................................................................................................................82 5. Dateiverwaltung..............................................................................................................................83 5.1 Aufbau von Dateisystemen und Katalogen...................................................................................85 Prof. Dr. Keller 5.2 Systemsoftw are-Skript Version 1.1 Seite 4 von 102 Physikalische Organisation von Dateien ......................................................................................88 5.3 Aufbau des Dateisystems ext2 von Linux....................................................................................90 5.3.1 Repräsentation von Daten.....................................................................................................91 5.3.2 Repräsentation von Dateien ..................................................................................................91 5.3.3 Verzeichnisse und –einträge .................................................................................................92 5.3.4 Ausblick auf Ext3fs ................................................................................................................93 5.4 Memory Mapped Files ..................................................................................................................93 5.5 Inhaltsbezogener Zugriff auf Dateien............................................................................................94 5.5.1 Index-Sequentielle Dateien ( ISAM ) .....................................................................................94 5.6 Effizienzsteigerung, Fehlererkennung und Behebung..................................................................97 5.6.1 Effizienzsteigerung ................................................................................................................97 5.6.2 Fehlererkennung und Behebung ...........................................................................................97 5.6.3 RAID ......................................................................................................................................97 5.7 Übungsaufgaben...........................................................................................................................99 5.7.1 Aufgabe 20 ............................................................................................................................99 5.7.2 Aufgabe 21 ............................................................................................................................99 5.7.3 Aufgabe 22 ..........................................................................................................................100 6. Ein-/Ausgabesystem ....................................................................................................................101 7. Literaturverzeichnis .....................................................................................................................102 Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 5 von 102 1. Einführung 1.1 Historische Entwicklung RechnerZeitraum Generation Technologie Betriebsart Betriebssystem 1, 2 1945 1955 Manuell Relais, Röhren ( Zuse, Ein Benutzer Eckard&Maucheley, Ein Programm John von Neumann ) 3 1955 1965 Transistor Batch Assembler, FORTRAN Monitore sind erste Betriebssysteme ( FMS : Fortran Monitoring System ) 4 1965 1980 Integrierte Schaltkreise ( IBM/360 ) Spooling Multiprogramming Dialogbetrieb ( Time Sharing ) OS/360 MULTICS (Multiplexed Information and Computing Service ) UNIX 5 1980 heute LSI, VLSI (PC, Workstation, Rechnernetze ) Netzwerkfähige BS Verteilte BS MS-DOS UNIX OS/2 Windows NT keine Programmiersprache kein Betriebssystem Maschinenprogrammierung mittels Einsteckkarten Prof. Dr. Keller 1.2 Systemsoftw are-Skript Version 1.1 Seite 6 von 102 Betriebsarten Die Betriebsarten entwickelten sich parallel zu der historischen Entwicklung der Computer-Hardware, nach deren Nutzung und den technischen Möglichkeiten. 1.2.1 Direkte Maschinenprogrammierung 1.2.2 Stapelbetrieb (Batch Systeme) Stapelbetrieb ( Batch Systeme ) Lochkarten Stapel Listin g JOB Ausgaberaum Einleseraum Maschinenraum • Erste Programmiersprachen und Betriebssysteme ( Monitore ) – Assembler, FORTRAN (Formular Translator ) – FMS ( Fortran Monitoring System ) Eingabeband Eingabe- System- Ausgabeband band band Ausgabeband CPU Satellitenrechner SystemOperator Verbesserung durch Magnetbänder Manuelles laden der Bänder Satellitenrechner Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 7 von 102 Sequentielle Abarbeitung von Jobs. Die Jobs werden alle nacheinander vom Rechner bearbeitet. Jeder Job durchläuft die Abarbeitungsfolge: Lochkarten erstellen ==> Abgabe in Einleseraum. Dort werden die Jobs in einem Stapel gesammelt ==> Abarbeitung eines Jobs im Maschinenraum ==> Ausgabelisting in den Ausgaberaum ==>Listing 1.2.3 Mehrprogrammbetrieb ( Multiprogramming ) CPU bearbeitet mehrere Programme gleichzeitig ==> Bessere CPU-Auslastung Mehrere Benutzer ( Multiuser ) und mehrere Programme eines Benutzers ( Multitasking ) können gleichzeitig auf einer CPU abgearbeitet werden. Prof. Dr. Keller 1.2.4 Systemsoftw are-Skript Version 1.1 Seite 8 von 102 Dialogbetrieb Ein- und Ausgabe nicht per Lochkarten sondern über eine Online-Verbindung mit einer Dialogstation Varianten: Single User / Singletasking Single User / Muktitasking Multiuser / Multitasking (→ MS - DOS ) (→ OS/2, WINDOWS 3.1, WINDOWS NT ) (→ UNIX, VMS, WINDOWS NT1 ) Time Sharing = Zeitscheibenverfahren Jedes Programm darf nacheinander für eine kleine Zeitscheibe rechnen (Beispiel: UNIX , Windows NT) 1 Es werden zwar mehrere User verwaltet, anmelden kann sich jedoch nur ein User. Es gibt MultiuserErweiterungen zu Windows NT 4.0 Prof. Dr. Keller 1.2.5 Systemsoftw are-Skript Version 1.1 Seite 9 von 102 Realzeitbetrieb Der Rechner wird zur Steuerung oder Regelung eines technischen Prozesses eingesetzt. Jedes Programm muss seine Tätigkeiten in fest vorgegebenen Zeiten erledigen. Diese Zeiten werden von dem technischen Prozess vorgegeben, und nicht vom Rechner. Es müssen mehrere verkoppelte Prozesse gleichzeitig laufen können. Zeitgesteuert (Polling) Ereignisgesteuert Prioritäten z.B. ==> alle 0,5 ms einen Messwert aufnehmen z.B. ==> bei Störfall muss das System sofort reagieren Wechsel von Programmen entsprechend ihrer Wichtigkeit z.B. ist im Störfall erst das Ventil zu öffnen und dann erst eine Meldung am Bildschirm auszugeben BETRIEBSSYSTEME: RSX11, OS9, RTOS, VRTX 1.3 Systemsoftware – Betriebssystem Man unterscheidet Anwendersoftware von Systemsoftware. Systemsoftware Das sind Programme, die dem Betrieb des Rechners und der Programmentwicklung dienen. Anwendersoftware Wird mit Hilfe der Systemsoftware entwickelt und ist für spezielle Anwendungen konzipiert z.B. Tabellenkalkulation, Textverarbeitungsprogramme, Grafikeditoren, CAD-Programme u.v.m. Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 10 von 102 Systemsoftware Software System Software Betriebssystem Hardwareunabhängige Ein-/Ausgabe Effiziente Nutzung der ressourcen Laden von Programmen Anwender Software Compiler Binder Dienstprogramme Werkzeuge Erstellen von Anwenderprogrammen Editoren Filter Kommandointerpreter Mensch/Maschine Schnittstelle Textoreintiert z.B. UNIX-Shell Grafische Oberfläche z.B. Windows NT Was ist ein Betriebssystem? Software, die mit der Hardware eines Rechners ausgeliefert wird und im privilegierten Modus abläuft Software, die dem Anwender eine einfache und komfortable Nutzung der Rechnerhardware ermöglicht Software, die einem Anwendungsprogrammierer über eine Programmierschnittstelle ( API ) eine virtuelle Maschine vorspiegelt Funktionen eines Betriebssystems Hardwareunabhängige Ein-/Ausgabe z.B. Lesen und schreiben auf Dateien, anstatt Positionieren von Schreib-/Leseköpfen und Adressierung von Sektoren/Spuren auf Platte Optimale Nutzung der Systemressourcen wie Verteilung des Prozessors auf mehrere Programme ( Ziel 100%-ige Auslastung der CPU ) Verteilung des Speichers auf mehrere Programme Zuteilung von Geräten an nebenläufige Benutzerprozesse Laden von Anwendungsprogrammen Realisierung von Schutzmechanismen Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 11 von 102 Was sind Systemressourcen? Systemressourcen Arbeitsspeicher CPU Ausführung mehrerer nebenläufiger Programme (Multiprogramming) 1.4 Betriebssystem AnwendungsProgramm Daten Terminal, Drucker Plotter ... Festplatte, Bandlaufwerk externer Speicher Ein-/Ausgabe Geräte Verwaltung von Daten Zuteilung an Programme Architektur von Betriebssystemen Betriebssystemstrukturen Struktur aus Sicht des BS-Entwicklers 8 Monolitische Systeme Betriebssystem besteht aus einer Sammlung von Funktionen. Jede kann jede aufrufen. 8 Schichtenmodell Streng hierarchischer Aufbau. Jede Schicht enthält eine Sammlung von Funktionen, die eine neue virtuelle Maschine r Funktionen der Schicht Mi können nur Funktionen der Schicht Mi-1 aufrufen. Geringste Privilegien Maschine M2 Maschine M1 Höchste Privilegien 8 Menge von Funktionen der Schicht M1 Maschine M0 Rechnerhardware Client-Server-Architektur 8 8 Client 1 leichte Erweiterbarkeit Überschaubare Struktur Client 1 DateiServer Übertragbar auf verteilte Systeme SpeicherServer Maschine 1 Maschine 2 Maschine 3 Minimaler BS-Kern Client Client Server nur elementare Dienste: Prozeßverwaltung, Interprozeßkommunikation BS-Kern BS-Kern BS-Kern LAN Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 12 von 102 Betriebssystemstrukturen Struktur aus der Sicht des Systemprogrammierers Systemprogramme sonst. Anwenderprogramme Programmierschnittstelle User Modus Systemfunktionen Systemaufrufe Supervisorcall ( SVC ) privilegierter Modus Betriebssystemkern Rechnerhardware 1.4.1 Beispiel: Architektur von Windows NT Windows NT Modell zu jedem Subsystem existiert eine API Anwenderprogramm Anwenderprogramm ( WIN 16 Client ) ( WIN 32 Client ) Protected Subsysteme ( Server ) WIN32 OS/2 POSIX WIN16 User Modus DOS System Calls NT Executive privilegierter Modus HAL Rechnerhardware Windows NT = Windows New Technologie HAL = Hardeware Abstraction Layer Die Architektur von Windows NT ist eine Kombination von Client/Server-Modell und Schichtenmodell. Der privilegierte Systemteil, dazu gehören die System Calls, die NT Executive und HAL, wurde im Schichtenmodell realisiert. Das Protected Subsystem bildet das Client/Server-Modell. Jedes Subsystem ist ein Server, der als eigenständiger Prozess im User Modus abläuft, und bestimmte Systemfunktionen und Benutzerumgebun- Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 13 von 102 gen realisiert. Klienten sind die Anwendungsprogramme, die in einer bestimmten Benutzerumgebung laufen und Systemfunktionen von den Servern abrufen. In der NT Executive werden elementare Objekte und Systemfunktionen zu Verfügung gestellt, die über System Calls von den Servern aufgerufen werden. Ein Client kann selbst keine System Calls auslösen. In der NT Executive sind folgende Module realisiert: Objekt Manager Er verwaltet alle internen Systemobjekte. In NT werden Betriebssystemressourcen und Prozesse als Objekte realisiert. Prozeß Manager Er verwaltet Prozesse und Threads. Er beinhaltet den Scheduler. Speicherverwaltung I/O Manager Er realisiert die Dateiverwaltung, Geräte- und Netzwerktreiber Die HAL ( Hardware Abstraction Layer ) ist die unterste Schicht, die hardwareunabhängige Gerätefunktionen zur Verfügung stellt. Zur HAL gehören daher alle Interruptroutinen. 1.4.2 Subsysteme unter Windows NT Windows NT - Protected Subsysteme DOSClient Virtual DOS Machine ( VDM ) WIN 3.1 Client NT Client WIN 16 API WIN 32 API WIN16 Subsystem Botschaft Unix Client OS/2 Client POSIX API OS/2 API POSIX Subsystem OS/2 Subsystem WIN32 Subsystem (Bearbeitung API + Benutzeroberfläche ) System Call NT Executive Ein Subsystem ist ein Server, der für Anwendungsprogramme ( Clients ) eine bestimmte Systemumgebung und Systemfunktionen zu Verfügung stellt. Jedes Subsystem ist ein unabhängiger Prozess, der im User Modus läuft. Jedes Subsystem stellt der Anwendung ein eigenes API zu Verfügung. Jeder API-Aufruf im Klienten bewirkt, dass eine Botschaft an den Server geschickt wird. Der Server wiederum löst über System Calls Aktionen in der NT Executive aus. Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 14 von 102 NT unterscheidet zwei Arten von Servern ( Subsystemen ) 1. Environment Subsystem Diese realisieren bzw. emulieren eine bestimmte Betriebssystemumgebung einschließlich der Benutzeroberfläche. Das WIN32 Subsystem bildet die grafische Benutzeroberfläche von NT. Das WIN16 Subsystem realisiert eine Windows 3.1 Umgebung und bildet zusammen mit dem DOS Subsystem eine virtuelle DOS Maschine (VDM) Das OS/2 Subsystem realisiert eine OS/2 Umgebung Das POSIX Subsystem realisiert eine UNIX-Umgebung 2. Integral Subsystems Durch diese Server werden wichtige Betriebssystemfunktionen aus der Executive ausgelagert, die nicht den privilegierten Modus verlangen. z.B verwaltet das Security Subsystem alle User Accounts, Passworte, Quoten, Privilegien u.v.m. Der Workstation Service und der Server Service stellen die Netzwerkumgebung ( Networking Subsystem) zu Verfügung. 1.5 Systemaufrufe ( Supervisor call ) Funktionen des Betriebssystemkerns laufen im privilegierten Modus. Die Unterbrechungstechnik ermöglicht eine Umschaltung vom Benutzermodus in den privilegierten Modus. Der Eintritt in Betriebssystemfunktionen des Kerns ist daher nur über Unterbrechungstechnik möglich. Unterbrechungsroutinen bilden den Betriebssystemkern. 1.5.1 Unterbrechungstechnik Unterbrechungstechnik Unterbrechungstechnik Asynchrone Unterbrechung Interrupt Gerätetreiber Synchrone Unterbrechung TRAP, SVC Betriebssystemkern Ausnahme bei Befehlsabwicklung Fehlerbehandlung Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 15 von 102 Systemaufrufe ( SVC ) Ablauf einer synchronen Unterbrechung User Mode UserProgramm Trap Priviilegierter Modus Systemstack Retten User PC SVC Unterbrechungsbearbeitung im Steuerwerk BSProgramm Besorgen BS-Adresse ( Hardware ) RTE Rückkehr zu unterbrochenem Programm Besorgen User PC Tabelle mit Startadressen der Unterbrechungsprogramme Umschalten Modus Verzweigen in BS 1.5.2 Systemfunktionen Systemfunktionen bilden die Schnittstelle zum Programmierer. Die Funktionen stehen in einer Systembibliothek als Unterprogramme dem Programmierer zu Verfügung Systemfunktionen als Programmierschnittstelle User Modus Privileg. Modus User-Programm Betriebssystemkern Unterprogrammaufruf werden aus Systembibliotthek dazugebunden Parameter Systemfunktionen Parameter setzen SVC Rücksprung von UP TrapBehandlung BS-Daten IRBehandlung RTE I/OGeräte Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 16 von 102 Systemaufrufe Systemfunktion User Programm Aufruf Systemfunktion Bearbeitung SVC ( BS-Routine ) UP-Aufruf Bearbeitung Interrupt Privilegierter Modus Parameter für Systemaufruf bereitstellen Betriebssystem Asynchrone Unterbrechung Synchrone Unterbrechung Systemaufruf ( TRAP ) Parameter auswerten Ergebnis holen und interpretieren Interruptbearbeitung Aktionen ausführen BenutzerProzeß RTS Rückkehr Ergebnis zu Verfügung stellen User Modus 1.5.3 Rücksprung RTE Beispiel - Daten in eine Datei schreiben Systemfunktion: write( datei, datenpuffer, anzahl_byte ) SVC: Trap-Routine Nr. 5 Parameter werden in Registern übergeben Beispiel : Daten in Datei schreiben User Programm Systemfunktion write(file,buffer,anz) Bearbeitung SVC ( BS-Routine ) UP-Aufruf Bearbeitung Interrupt Privilegierter Modus Parameter in Register schreiben Platte zum schreiben bereit Synchrone Unterbrechung TRAP #5 Parameter auswerten IO-Auftrag beschaffen Ergebnis holen und interpretieren Fehler rückmelden Rückkehr IO-Auftrag für Platte erzeugen Daten schreiben RTS Auftragsbearbeitung starten User Modus Rücksprung IO-Auftrag löschen RTE RTE Prof. Dr. Keller 1.6 Systemsoftw are-Skript Version 1.1 Seite 17 von 102 Übungsaufgabe 1.6.1 Aufgabe 1 In der Vorlesung wurde ein Schichtenmodell als Architektur für ein Betriebssystem eingeführt. Dabei wurde das Betriebssystem in zwei Softwareschichten aufgeteilt, die Systemfunktionen und die Systemaufrufe, auch Supervisor Calls ( SVC ) genannt. a) Kennzeichnen Sie in der folgenden Grafik die Schicht der "Systemfunktionen" und die Schicht der " Systemaufrufe (SVC) ". Anwenderprogramme Rechnerhardware b) Erläutern sie kurz die Aufgaben, die eine Systemfunktion übernimmt und mit welcher Programmiertechnik eine Systemfunktion realisiert wird, d.h. in welcher Form Systemfunktionen dem Anwenderprogramm zur Verfügung stehen. c) Erläutern Sie kurz mit welcher Technik ein Systemaufruf ( SVC ) realisiert wird und was bei einem Systemaufruf im Rechner abläuft? d) Das System unterscheidet zwei Abwicklungsmodi User und Privilegiert. In welchem Modus laufen die Systemfunktionen ? In welchem Modus laufen die Systemaufrufe ? Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 18 von 102 2. Multiprogramming 2.1 Prozesse Ein Prozess ist ein Programm, welches auf einem Prozessor unter einem Betriebssystem als atomare Einheit abläuft. Jeder Prozess besitzt seinen eigenen virtuellen Prozessor mit seinem eigenen virtuellen Adressraum, der gegenüber anderen Prozessen geschützt ist, d.h. auf Adressen eines Prozesses A kann kein anderer Prozess im System zugreifen. Jeder Prozess läuft unabhängig von allen anderen auf dem Rechner ab. Ein Prozess ist eine Verwaltungseinheit des Betriebssystems. Das BS vergibt dazu für einen Prozess eine eindeutige Kennung ( PID = process identifikation ). Für jeden Prozess erzeugt und verwaltet das BS eine Datenstruktur, in der Kennung, Zustand und Umgebung eines Prozesses gespeichert sind. Dieser Prozesskontrollblock ( PCB ), in dem alle Information über einen Prozess abgelegt ist, wird in einer Prozesstabelle verwaltet. Die Prozesstabelle enthält alle aktuellen Prozesse im laufenden System. Diese Prozesstabelle kann statisch ( z.B. UNIX ) oder aber auch dynamisch angelegt werden. Zu einem Prozess gehört ein ausführbares Programm, die Daten des Programms und ein dynamischer Stack. Weiterhin gehört zu jedem Prozess ein eigener Hardwarekontext, das sind die Hardwareregister, der Programmzähler ( PC ), und ein Stackzeiger ( SP ) sowie weitere Informationen, die den Zustand und die Eigenschaften des Prozesses beschreiben (Softwarekontext) z.B. verbrauchte Rechenzeit, Abarbeitungspriorität, geöffnete Dateien. Das Betriebssystem stellt Funktionen zur Verfügung mit Hilfe derer zur Laufzeit dynamisch Prozesse erzeugt und vernichtet werden können. In UNIX sind dies z.B. die Funktionen fork() zum Erzeugen eines Prozesses, exit() zum freiwilligen beenden eines Prozesses und kill() zum unfreiwilligen Vernichten eines Prozesses durch einen anderen Prozess. 2.1.1 Prozess-Adressraum Multitasking - Prozess, Task Betriebssystem Code + Daten Programm auf Festplatte Laden Starten Enthält Verwaltungsdaten zu einem Prozess Prozess #1 Code Prozess #12 statische Daten Stack Arbeitsspeicher Heap für dynamische Daten Prof. Dr. Keller 2.1.2 Systemsoftw are-Skript Version 1.1 Seite 19 von 102 Prozesszustände Multitasking - Prozesszustände Zuteilung durch BS ( Scheduling ) rechnend Prozess terminieren Prozess bereit erzeugen Verdrängen durch BS ( Laden, Starten ) Blockieren durch Prozess Deblockieren durch BS Eintreffen von Ereignissen freiwerden von Ressourcen Warten auf Ereignisse oder Ressourcen blockiert • preemptive Scheduling • non preemptive Scheduling – Prozesswechsel wird vom Betriebssystem erzwungen (Zeitscheibenverfahren ) 2.2 2.2.1 – Prozesswechsel erfolgt nur durch freiwillige Abgabe der CPU durch einen Prozess (Systemaufrufe im Programm) Prozeßwechsel ( Dispatch, Scheduling ) Freiwilliger Prozeßwechsel durch Aufrufen einer Systemfunktion ( non preemptive ) Multitasking Prozesswechsel durch Systemaufruf Prozess blockieren Aktionen Benutzerprozess Systemfunktion I/O-Auftrag initieren IO-Auftrag ausführen Prozess deblockieren Aktionen Benutzerprozess BenutzerProzesse Dispatcher Prozessauswahl Scheduler Prozess aktivieren Betriebssystem Prof. Dr. Keller 2.2.2 Systemsoftw are-Skript Version 1.1 Seite 20 von 102 Erzwungener Prozeßwechsel ( preemptive ) Multitasking Prozesswechsel durch Zeitscheibe Zeitscheibe abgelaufen Aktionen Benutzerprozess Dispatcher aktivieren Prozess verdrängen Aktionen Benutzerprozess BenutzerProzesse 2.3 Dispatcher Prozessauswahl Prozess aktivieren Scheduler Betriebssystem Threads Threads • Sequentielle Programm- / Funktionsausführung innerhalb eines Prozesses ( thread = Ausführungsfaden ) – Ein thread bearbeitet eine sequentielle Teilaufgabe innerhalb eines Prozesses – Mehrere nebenläufige Teilaufgaben können in mehreren Threads innerhalb eines Prozesses abgearbeitet werden ( Multithreading ) – Thread verfügt über einen eigenen Hardwarekontext ( PC, SP, Prozessorregister ), einen Ausführungszustand und einen eigenen Stack – läuft jedoch im Softwarekontext des Prozesses und teilt sich damit den virtuellen Adressraum und alle Ressourcen mit allen anderen Threads des Prozesses Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Threads Nebenläufige Ausführungsfunktionen Prozess 1 Prozess 2 3 Threads 1 Thread Verwaltungsungs-/ Sicherungsaufgaben Adressraum Ressourcen Schutzfunktionen Verwaltungsungs-/ Sicherungsaufgaben Adressraum Ressourcen Schutzfunktionen Programmausführung Programmausführung Globale Variable Threads • Vorteile: – schneller Prozesswechsel, da nur der Hardwarekontext ausgetauscht werden muss – einfacher Austausch von Informationen zwischen nebenläufigen Threads durch einen gemeinsamen Adressraum (globale Daten des Prozesses ) • Nachteile: – Durch den gemeinsamen Adressraum ist kein Schutz vor fehlerhaftem Zugriff auf globale Daten möglich • Wenn mehrere Threads auf gemeinsame Daten arbeiten, müssen diese Threads synchronisiert werden. Fehlende oder fehlerhafte Synchronisation verursacht Datenverluste oder Dateninkonsistenzen Seite 21 von 102 Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Multithreading Thread-Implementierung • Benutzer-Threads ( ULT = user level Thread ) – Unix, Linux • Kernel-Threads ( KLT = kernel level thread ) – Windows NT/2000/XP, Linux, Mach • Kombination ( Solaris ) Multithreading Benutzer-Threads • • • Laufen im User Modus. Der BS-Kern ( Kernel ) kennt unbd verwaltet selbst keine Threads sondern nur Prozesse. Der Anwendungsprozess verwaltetet seine Threads selbst Die Verwaltung erfolgt über eine Thread-Bibliothek, in der alle Funktionen zur Verwaltung, Erzeugung, Terminieren und Synchronisieren realisiert werden. – In der Bibliothek sind für jeden Thread entsprechende Datenstrukturen implementiert. – Weiterhin übernimmt die Bibliothek auch das Umschalten und Scheduling zwischen den Threads innerhalb des Prozesses. – Scheduling von Prozessen ist damit unabhängig vom Scheduling der Threads Seite 22 von 102 Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Multithreading Benutzer-Threads • Beispiel – BS kennt Prozess A und Prozess B – Prozess A besitzt Thread A.1 und Thread A.2. – Prozess B besitzt nur Thread B.1 – Fall 1: • Prozess A ist rechnend. Innerhalb A ist Thread A.2 rechnend. Thread A.2 ruft eine blockiernde Systemfunktion z.B. I/O-Wunsch auf. – SVC d.h. Sprung in den Kernel zur Abarbeitung der Systemfunktion. – Prozess A wird blockiert. Prozess B wird rechnend. – Im Prozess A wird Thread A.2 immer noch als rechnend eingestuft. • I/O.Ereignis ist eingetroffen. – Sprung in den Kernel – Prozess A wird vom Kernel wieder deblockiert. – Wenn Prozess A vom Kernel wieder in den Zustand rechnend überführt wird kann Thread A.2 weiter ausgeführt werden. Multithreading Benutzer-Threads • Beispiel – BS kennt Prozess A und Prozess B – Prozess A besitzt Thread A.1 und Thread A.2. – Prozess B besitzt nur Thread B.1 – Fall 2: • Prozess A ist rechnend. Innerhalb A ist Thread A.2 rechnend. Thread A.2 ruft blockiernde Funktion der Thread-Bibliothek auf z.B. warten auf Ereignis von Thread A.1 – Prozess A bleibt rechnend ( falls Zeitscheibe noch nicht abgelaufen ist ), – Thread A.2 wird blockiert und Thread A.1 wird rechnend. Seite 23 von 102 Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Multithreading Benutzer-Threads • Vorteile: – Threadwechsel wird im User-Modus abgearbeitet. Kein SVC und daher wesentlich schneller. – Prozessspezifisches Scheduling der Threads unabhängig vom Scheduling des BS-Kerns. – Die Bibliothek kann auf jedes beliebige Betriebssystem aufgebaut werden. Es sind keinerlei Änderungen im Kernel notwendig. • Nachteile: – Blockiert ein thread blockiert auch der Prozess und damit auch alle anderen threads im Prozess. – Mehrprozessorbetrieb ist nicht nutzbar. Alle Threads eines Prozesses laufen auf einem Prozessor ab. Multithreading Kernel-Thread • Kernel übernimmt die Verwaltung von Threads und Prozessen • Das Scheduling erfolgt im Betriebssystem auf Basis der threads. • Vorteile: – Unterstützt Mehrprozessoren-Archtiketur – Ein blockierter thread blockiert nicht nicht andere threads im gleichen Prozess. • Nachteil: – Ein Threadwechsel bedeutet immer auch aufrufen eines SVC und damit Übergang in den privilegierten Modus. Seite 24 von 102 Prof. Dr. Keller 2.3.1 Systemsoftw are-Skript Version 1.1 Seite 25 von 102 Definition und Erzeugung von Threads STATISCHE THRE ADS Die Anzahl der Threads in einem Prozess wird bei der Programmentwicklung d.h. zum Zeitpunkt des Übersetzens festgelegt DYNAMISCHE THR EADS Das Erzeugen und Beenden von Threads erfolgt während der Prozesslaufzeit. Das Betriebssystem stellt dazu Funktionen zum Erzeugen und Vernichten von Threads zu Verfügung → Windows NT, Linux 2.4 Wichtige Systemfunktionen Neuen Prozess erzeugen Neuen Thread erzeugen Prozess freiwillig beenden Thread freiwillig beenden Prozess / Thread ohne Grund freiwillig blockieren ( suspendieren ) Prozess / Thread deblockieren Prozesse im Hintergrund laufen lassen Prozesse zu bestimmten Zeiten starten Prozessinformationen anzeigen lassen PID des Prozesses / Thread besorgen 2.5 Scheduling Verfahren Optimierungskriterien: Antwort des Systems Zeit I/ORequest • Antwortzeit ↓ t0 t1 • CPU-Auslastung (möglichst hin zu 100%, real 50-80%) ↑ • Durchsatz: Anzahl der beendeten Jobs / Zeiteinheit ↑ • Verweildauer: Zeit vom Start eines Prozesses bis zu dessen Terminierung inkl. aller Wartezeiten ↓ t0 • Wartezeit: Zeitpunkt der Terminierung Startzeit Inkl. aller Wartezeiten Zeit in der ein Prozess in der Bereit-Schlange liegt t1 Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 26 von 102 Algorithmen: 2.5.1 First Come First Serve (FCFS) BA FÜR TCH -BE TRIEB GEEIGNET BEISPIEL: D C B A 10 5 3 20 → tatsächliche Rechenzeit FIFO (einfach verkettete Liste) Annahme: - kein I/O - Alle Prozesse werden direkt nacheinander gestartet (d.h. Startzeit ist gleich) Zeitliche Abarbeitungsfolge: t0 A B C D 20 3 5 10 t Verweildauer der Prozesse: VD(A)=20 VD(B)=23 VD(C)=28 VD(D)=38 2.5.2 Mittlere Verweildauer: VD=(20+23+28+38)/4=27 Vorteile: - einfach - schnell Nachteile: - sehr lange Verweildauer - große Schwankungen in der Verweildauer Shortest Job First (Modifikation von FCFS ) Zeitliche Abarbeitungsfolge ( siehe Beispiel FCFS) t0 B C D A 3 5 10 20 Mittlere Verweildauer: Vorteil: Nachteil: VD=(3+8+18+38)/4=17 - Minimale Verweildauer - Rechenzeit ist zur Zeit des Starts nicht bekannt t Prof. Dr. Keller 2.5.3 Systemsoftw are-Skript Version 1.1 Round Robin (RR) Zeitscheibenverfahren GEEIGNET FÜR D IALOGBETRIEB Rundlauf B A Seite 27 von 102 Annahme: - Zeitscheibe hat Zeiteinheit ∆t=5 C E D Zeitliche Abarbeitungsfolge ( siehe Beispiel FCFS) A B C D A D A A 5 3 5 5 5 5 5 5 t VD=(38+8+13+28)/4=87/4≈22 BEISPIELE MIT UNTERSCHIEDLICHER ZEITSCHEIBE (A: RZ=20, B: RZ=3, C: RZ=5, D: RZ=10) ∆t=2 A B C D A B C D A C D A D A D A A A A A 2 2 2 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 2 VD(A)=38 VD(B)=11 VD(C)=18 VD(D)=28 t VD=(38+11+18+28)/4=95/4≈24 ∆t=10 A B C D A 10 3 5 10 10 VD=(38+13+18+28)/4=24,... t Prof. Dr. Keller 2.5.4 Systemsoftw are-Skript Version 1.1 Seite 28 von 102 Prioritäten Jedem Prozess wird eine Priorität zugeordnet statisch ( beim starten des Programms ) Wie werden die Prioritäten vergeben dynamisch (Prioritäten werden zur Laufzeit des Prozesses geändert) BEISPIELE: non-preemptives Verfahren Prioritäten A: Prio=5 , Rz=20 B: Prio=3 , Rz=3 C: Prio=7 , Rz=5 D: Prio=1 , Rz=10 (7 ist höchste Priorität) Alle Prozesse starten zum Zeitpunkt t=0 t0=0 C 5 A B D 20 3 10 t VD=(5+25+28+38)/4=96/4=24 preemptives Verfahren Alle Prozesse starten zu unterschiedlichen Zeitpunkten. Es gilt folgende Annahme: t0=0 Startzeit von A=0 B=1 C=5 D=8 A C A B D 5 5 15 3 10 VD(A)=25 VD(B)=28-1=27 VD(C)=10-5=5 VD(D)=38-8=30 t VD=(25+27+5+30)/4=87/4≈22 non-preemptive mit unterschiedliche Startzeiten ( Startzeiten siehe oben ): t0=0 VD(A)=20 VD(B)=27 VD(C)=20 VD(D)=30 A C B D 20 5 3 10 VD=(20+27+20+30)/4=97/4≈24 t Prof. Dr. Keller 2.6 2.6.1 Systemsoftw are-Skript Version 1.1 Seite 29 von 102 Multiprogramming in UNIX Prozesse in UNIX Prozesse unter UNIX - Prozessarten • Interaktive Prozesse – Shell-Prozesse arbeiten mit stdin ( Tastatur ) und stdout ( Bildschirm ) • Dämon-Prozesse ( deamon ) – arbeiten im Hintergrund ohne stdin und stdout z.B. Druckspooler, Swapper, Paging Dämon Als Daemon ( Disk And Execution MONitor ) werden unter Linux die verschiedenen dienstbaren Geister bezeichnet. Das sind Prozesse, die unauffällig im Hintergrund warten, ob es etwas für sie zu tun gibt. Wenn ja, wird das erledigt, dann gehen sie wieder in Wartestellung. Benutzerinteraktionen finden hierbei nur auf indirektem Weg statt. Bei Microsoft Windows heißen die entsprechenden Programme "services" bzw. "Dienste". Daemons werden nicht vom Computerbenutzer interaktiv bedient, sondern warten im Hintergrund, bis sie durch eine Netzwerkanfrage oder ein anderes Programm aktiviert werden. Typische Daemonprogramme sind Server-Prozesse wie Netzwerkdienste, File-Sharing, E-Mail-Server, Datenbankserver und Druckerserver. Sie dienen auch der Hardwarekonfiguration bzw. Überwachung, oder sie laufen zu vorher festgelegten Zeiten automatisch an. Ein typisches Beispiel ist der lpd, der line printer daemon. Er wartet, ob ein Druckauftrag gegeben wurde, wenn ja, wird er von ihm abgearbeitet. Der lpd kann Druckjobs entgegennehmen, auch wenn der Drucker nicht betriebsbereit oder sogar nicht einmal angeschlossen ist, die Dateien werden eben solange zwischengespeichert. Daemonen können z.B. gleich beim Systemstart aus den Startdateien heraus gestartet werden, z.B. aus /etc/rc.d/rc.local heraus. Daemonen im Leerlauf verbrauchen zwar nur wenig Systemleistung, bei einem gut ausgebauten Server sind aber recht viele Daemonen am Werk, die dann eben doch eine nennenswerte Grundlast erzeugen. Daher existiert noch eine weitere Startmöglichkeit über den Metadaemon inetd. Aufgrund von Konfigurationsdateien achtet er permanent darauf, ob vom System die Dienste eines Dämonen benötigt werden. Wenn ja, startet er den entsprechenden Dämon, der sich nach Abarbeitung des Auftrages dann wieder beendet. Im Idealfall ist dann nur dieser Metadaemon permanent am Laufen, alle anderen laufen nur, wenn sie auch gerade benötigt werden. Der Metadaemon inetd wird aus der Datei /etc/rc.d/rc.inet2 heraus gestartet. Wann er welchen Daemon starten soll, erfährt inetd aus der Konfigurationsdatei /etc/inetd.conf Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 30 von 102 Beispiele (bei Unix) initd Daemon (/sbin/initd) Der initd Daemon ist das letzte Programm, das der Kernel beim Hochfahren startet. Er bleibt so lange aktiv, bis das System heruntergefahren wird. Der Init-Daemon wird durch die Konfigurationsdatei /etc/inittab gesteuert. cron daemon Startet andere Programme zu festgelegten Zeiten syslogd daemon nimmt Meldungen von Programmen entgegen und schreibt diese ins Logfile sendmail daemon Mail Transfer Agent lpd der line printer daemon - wartet auf Druckaufträge und bearbeitet diese Prozesse unter UNIX • Prozesse werden in einer Prozesstabelle und PCB‘s verwaltet. Ein Prozess wird unter Unix auch als Task bezeichnet. – Jeder Eintrag in der Prozesstabelle verweist auf den PCB des Prozesses. • Jeder Prozess wird durch eine eindeutige PID verwaltet und verfügt über eine Gruppen-ID und Benutzer-ID. – Über Gruppe und Benutzer werden Zugriffsrechte auf Ressourcen geregelt. Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 31 von 102 Prozesse unter UNIX - Erzeugen und Terminieren • Prozess erzeugen – Systemfunktion pid =fork() • Es wird eine Kopie des aktuellen Prozesses erzeugt. • Ergebnis der Funktion ( gespeichert in pid ): – < 0 wenn Prozess nicht erzeugt werden konnte ( z.B. Prozesstabelle ist voll ) – = 0 im Sohnprozess – >0 im Vaterprozess; • freiwilliges Ende – exit (...) • Variable pid enthält die Prozessidentifikation der erzeugten Kopie d.h. des Sohnprozesses ( wird vom Sohn aufgerufen ) Ausführen eines neuen Programms – exec(....) ( wird vom Sohnprozess aufgerufen ) • warten auf das Ende eines erzeugten Sohnprozesses – wait(....), waitpid() ( wird vom Vater aufgerufen ) Prozesse unter UNIX - Erzeugen Beispiel . . . . pid = fork(); if ( pid <0 ) printf("Prozeß wurde nicht erzeugt\n"); else if ( pid == 0 ) /* Starten eines neuen Programms im erzeugten Sohnprozeß execl(......) else /* Vaterprozeß wartet auf Ende des Sohnprozesses */ wait(...) */ Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 32 von 102 Prozesse unter UNIX erzeugen Vater Erzeuge Prozeß pid = fork() Ausgabe Fehlermeldung Warte auf Ende Sohn Sohn Erzeugte Kopie Führe ein neues Programm xxxx aus Erzeuge Prozeß pid = fork() Ausgabe Fehlermeldung Warte auf Ende Sohn Führe ein neues Programm xxxx aus freiwilliges Ende freiwilliges Ende Prozesse unter UNIX • Jeder Prozess kennt seinen Vater, seine Geschwister und alle seine Kinder • Terminiert ein Sohnprozess, so wird er in den Zustand Zombie versetzt bis der Vaterprozess den Terminierungsstatus vom BS abgeholt hat. • Terminiert der Vaterprozess, so werden alle existierenden Sohnprozesse einem neuen Vater zugeordnet. – Dieser Vater ist immer der Prozess INIT ( Pid = 1 ). • Möchte der Vater nicht auf das Ende eines Sohnprozesses warten, sondern ohne zu warten nur den Terminierungsstatus abholen, um seinen Sohn aus dem zustand Zombie zu erlösen, kann er die Systemfunktion waitpid() verwenden. Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 33 von 102 Prozesse unter UNIX - Systemfunktionen • Eigene PID erfragen pid() • Pid des Vaterprozesses erfragen ppid() A UFBAU EINES B AUMES UNTER UNIX BS-Kern erzeugen Systemfkt. exit ( ) für freiwilliges Terminieren PID=1 Urprozeß Programm Daten Kontext Sohnprozeß erzeugen Systemfkt: fork ( ) PID=2 PID=2 Programm Daten Kontext INIT PCB Warteschlangen Überladen des Programms P Systemfkt: exec ( ) * * D Kontext * Bei fork wird eine identische Kopie erzeugt !! (Urprozeß geklont) INIT (pid=1) Login Shell prim vi emacs cc Terminiert unter Unix ein Prozess, ohne dass der return-Status vom Vater abgeholt wurde, so wird der Prozess in den Zustand „Zombie“ versetzt. Ein Zombi-Prozess kann nicht durch senden des kill-Signals abgebrochen werden, da er schon terminiert ist. Erst wenn der Vater den return-Wert vom Betriebssystem abruft, dies geschieht durch die Systemfunktion wait() oder waitpid(), wird der Zombie-Prozess erlöst und ist danach wirklich tot. Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Multithreading Seite 34 von 102 linux • Linux verwaltet keinen eigenen threads – Ein thread wird wie ein prozess behandelt. • Unter linux werden threads durch Kopieren von Prozessen erzeugt. Der Prozess erbt damit auch die Ressourcen des Vaterprozesses. • Es ist möglich das ein kopierter Prozess sich den virtuellen Speicher mit seinem Vaterprozess teilt – Dadurch entsteht ein thread in einem Prozess 2.6.2 Scheduling in UNIX Scheduler in UNIX Timesharing nach Round Robin Ziel : Optimieren der Antwortzeiten von interaktiven Prozessen Zeitscheibe: 100ms Zuteilung der CPU nach Prioritäten Die Priorität eines Prozesses wird dynamisch entsprechend seiner Aktiviäten verändert. Rechneintensive Prozesse werden bestraft. Interaktive Prozesse werden belohnt. Auslastung der CPU durch den Prozeß: a Der Wert von a wird wird mit jedem Zeittakt um 1 erhöht. Nach jeder Sekunde werden die Prioritäten neu berechnet a:= a/2 Priorität:= Basispriorität +a/Konstante +Nice-Wert Round Robin innerhalb einer Prioritätenschlange Niedrigste Priorität Priorität = n Nice Rechenzeit Priorität = 0 Höchste Priorität SVC Priorität = - m User Prozesse Basispriorität Prozesse warten auf Ereignis ( privileg. Modus ) Prof. Dr. Keller 2.7 Systemsoftw are-Skript Version 1.1 Seite 35 von 102 Multiprogramming in Windows NT 2.7.1 Prozesse in NT Ein Prozess wird in NT als Systemobjekt mit Eigenschaften ( Objektattribute ) und Methoden, die von der Objektklasse „Process“ geerbt werden, realisiert. Zugriffe des Systems auf einen Prozess erfolgt damit nur über die implementierten Methoden der Objektklasse. Das Scheduling erfolgt nur über Threads. Damit muss ein Prozess mindestens einen Thread besitzen, damit er lauffähig ist. Ein Prozess kann über die Systemfunktion CreateProcess() dynamische zur Laufzeit mehrere Threads erzeugen. Zwischen Prozessen besteht keine Vater/Sohn-Beziehung wie in UNIX. Für jeden Prozess wird ein Systemobjekt angelegt, in dem die Eigenschaften des aktuellen Prozesses gespeichert sind. Jeder Prozess besitzt einen eigenen geschützten virtuellen Adreßraum von 4 GByte. Objektklasse Prozess in Windows NT Objektklasse PROZESS Process ID Access token Base priority Default processor affinity Quota limits Execution time I/O counters VM operation counters Execution/debugging ports Exit status Create process Open process Query process information Set process information Current process Terminate process Allocate/free virtual memory Read/write virtual memory Protect virtual memory Lock/unlock virtual memory Query virtual memory Flush virtual memory Objektattribute Objektmethoden Objektattribute in Windows NT Process ID : Access token: Base priority: Default processor affinity: Quota limits: Execution time: I/O counters: Eine eindeutige Nummer, die NT für jeden erzeugten Prozess vergibt, um damit den Prozess eindeutig identifizieren zu können. Eine Referenz auf ein NT-Objekt, in dem Sicherheits- und Zugriffsinformationen über den eingeloggten Benutzer, zu dem der Prozess gehört, abgelegt sind. Eine Basispriorität für den Prozess. Beim starten des Prozesses wird die Priorität auf diese Basispriorität gesetzt. Eine vorgegebene Menge von Prozessoren, auf denen die Threads eines Prozesses laufen können. Maximalwerte für die Anzahl von physikalischen Seiten, Größe der Paging-Datei, und Rechenzeit Die aktuell von allen Threads verbrauchte Rechenzeit. Zähler für die Anzahl der I/O Operationen. Prof. Dr. Keller VM operation counters: Execution/debugging port: Exit status: 2.7.2 Systemsoftw are-Skript Version 1.1 Seite 36 von 102 Zähler für die ausgeführten Speicheroperationen. IP-Kanal, über den der Prozessmanager Nachrichten versendet, falls eine Fehlersituation eingetreten ist. Ein Wert, der den grund für ein Prozessende beschreibt. Threads in NT Ein Thread ist ein sequentieller Programmteil eines Prozesses, das nebenläufig zu anderen sequentiellen Programmteilen ( Threads ) im Adressraum des erzeugenden Prozesses abläuft. Ein Thread kann damit als „Subprozess“ innerhalb eines Prozesses erklärt werden. Ein Prozess besteht aus mindestens einem Thread. Grund: Scheduling in NT erfolgt ausschließlich über Threads. Ein Thread läuft im Kontext des Prozesses und teilt sich damit Adressraum und Ressourcen mit allen anderen Threads eines Prozesses. Ein Thread kann selbst wieder Sohn-Threads erzeugen. Eigenschaften eines Thread sind: eine eindeutige Kennung ( Client ID, Hardwarekontext bestehend aus Prozessorregister, PC, Stack, Stackzeiger ), Priorität, Rechenzeit, Wartezeit Multithreading Windows 2000 • Threads werden als Kernel-Threads realisiert • Ein Prozess kann mehrere Threads besitzen • Scheduling in NT erfolgt ausschließlich über Threads – Ein Prozess besteht aus mindestens einem Thread. • Ein Thread kann selbst wieder Sohn-Threads erzeugen. • Eigenschaften eines Thread sind : – – – – – – eine eindeutige Kennung ( Thread-ID ) Thread-Kontext (Prozessorregister, PC, Stack, Stackzeiger ) Basispriorität und Dynamische Priorität Prozessoraffinität ( Prozessoren auf der dieser Thread ausgeführt werden kann ) Ausführungzeit ( = Rechenzeit ) Terminierungsstatus Prof. Dr. Keller 2.7.3 Systemsoftw are-Skript Version 1.1 Seite 37 von 102 Scheduling in NT Threadzustände Thread erzeugen und starten Windows 2000 Ressource wird verfügbar bereit unterbrochen unterbrochen Scheduler transition Objekt wird “signaled” standby Ressource nicht verfügbar wartend Dispatcher beendet “Terminieren” rechnend Threadzustände System Call warte auf “Objekt signaled” Windows 2000 • Bereit – kann vom Scheduler eingeplant werden • Rechnend ( aktiv ) – Ist gerade auf einem Prozessor rechnend • Standby – Wurde vom Scheduler ausgewählt muss aber noch auf einen bestimmten Prozessor warten. Die Abarbeitung erfolgt sobald der Prozessor frei wird. • Wartend – wartet auf Ereignis, auf I/O, auf Systemobjekte oder freiwillig ohne Grund • transition – Grund der blockierung ist aufgehoben kann jedoch nicht abgearbeitet werden da noch Ressourcen z.B. Speicher fehlen. • Beendet ( Terminiert ) – Hat sich selbst beendet oder wurde von anderen threads bzw. dem Vaterprozess beendet Preemptives zeit- und prioritätengesteuertes Scheduling. Variable Prioritäten (1..15) werden zur Laufzeit vom Kernel verändert mit dem Ziel interaktive Prozesse mit hoher Priorität, I/O-intensive Threads mit mittlerer Priorität und rechenintensive Prozesse mit niedriger Priorität zu behandeln. Die Priorität wird erhöht, wenn ein Prozess vom Zustand „wartend“ in den Zustand „bereit“ gelangt. Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 38 von 102 Die Priorität wird erniedrigt, wenn ein Thread nach Ablauf einer Zeitscheibe unterbrochen wird. Die Priorität wird minimal zur Basispriorität und maximal af 15 verändert. Realzeitprioritäten ( 16 .. 31 ) werden nicht vom System geändert. Ein Thread erbt die Basispriorität vom Prozess. Ein Thread kann die vererbte Basispriorität um maximal 2 nach oben oder nach unten verändern. Diese veränderte Basispriorität des Thread wird die Priorität beim ersten rechnen des Thread. 2.8 Übungsaufgaben 2.8.1 Aufgabe 2 In einem Multiuser/Multitasking-Betriebssystem können mehrere Prozesse nebenläufig abgearbeitet werden. Jeder Prozeß läuft dabei auf einer virtuellen CPU ab, die im Multiplexverfahren einer realen CPU zugeteilt werden. Die Speicherverwaltung kann bei Speicherbedarf Prozesse auslagern. a) Wie wird ein Prozeß vom Betriebssystem verwaltet? Welche Datenstrukturen werden beim Erzeugen eines Prozesses angelegt und welche Informationen sind dort abgelegt. b) Prozesse nehmen normalerweise verschiedene Zustände an. Geben Sie den Zustandsgraph eines Prozesses an. Erläutern Sie die Bedeutung der Zustände und die Bedingungen für die Zustandsübergänge. 2.8.2 Aufgabe 3 In einem Multiuser/Multitasking Betriebssystem können mehrere Prozesse nebenläufig abgearbeitet werden. Jeder Prozess läuft dabei auf einer virtuellen CPU ab, die im Multiplexverfahren einer realen CPU zugeteilt werden. Die Zuteilung einer virtuellen CPU an die reale CPU erfolgt durch das Betriebssystem nach einem bestimmten Algorithmus. a) Erklären Sie die Funktion von Dispatcher und Scheduler. Gegeben ist folgendes Petrinetz, das die kausale Abfolge von Aktionen bei der Prozessverwaltung beschreibt. Kennzeichnen Sie im Petrinetz diejenige Transitionen, die zur Programmabwicklung eines Prozesses gehören mit P, diejenigen, die zum Dispatcher gehören mit D und diejenigen Transitionen, die zum Scheduler gehören, mit S ( Jede Transition im Petrinetz muss gekennzeichnet werden). Programmbefehl abwickeln aktuellen Prozeß deaktivieren neuen Prozeß auswählen neuen Prozeß aktivieren Prof. Dr. Keller b) Systemsoftw are-Skript Version 1.1 Seite 39 von 102 Bei der Zuteilung der realen CPU an einen Prozess unterscheidet man non-preemptive und preemptive Zuteilungsstrategien. Durch welche Ereignisse findet ein Prozesswechsel statt • • 2.8.3 im Falle von non-preemptive Scheduling im Falle von preemptive Scheduling. Aufgabe 4 Die Verweildauer eines Prozesses ist die Zeit vom Start eines Prozesses ( Einlagerung in die ReadyWarteschlange ) bis zum Ende eines Prozesses. Die Verweildauer umfasst damit sowohl reine Rechenzeit, als auch die Zeit, die der Prozess auf die Zuteilung warten muss. Die mittlere Verweildauer von Prozessen ist die Summe der Verweildauer aller Prozesse, die in einem Zeitintervall ablaufen, geteilt durch die Anzahl der ausgeführten Prozesse. Sie kann als Gütemaß für einen Zuteilungsalgorithmus herangezogen werden. Berechnen Sie die mittlere Verweildauer für die im Folgenden angegebene Situation: y Fünf Prozesse werden auf zwei Rechnersystemen mit unterschiedlicher Zuteilungsstrategie in der gleichen zeitlichen Reihenfolge gestartet. y Betriebssystem A arbeitet nach der non-preemptive Strategie FIRST COME FIRST SERVE ( Prioritäten werden nicht berücksichtigt ). y Betriebssystem B arbeitet mit preemptive PRIORITÄTENGESTEUERTER Zuteilung. Berechnen Sie die mittlere Verweildauer für beide Fälle Betriebssystem A und Betriebssystem B. Prozeßnummer 1 2 3 4 5 2.8.4 Startzeitpunkt ( in ms ) (bezogen auf to=0 ms) 0 5 8 10 15 Rechenzeit ( in ms ) 10 5 3 10 7 Priorität 1 2 5 3 3 Aufgabe 5 In einem Multitasking-Betriebssystem werden mehrere Prozesse nebenläufig abgearbeitet. Bei der Zuteilung der CPU an einen rechenbereiten Prozess verfolgt das Betriebssystem eine preemptive Prioritätensteuerung mit dynamischen Prioritäten d.h. beim Starten eines Prozesses erhält der Prozess eine Basispriorität, die während der Laufzeit dynamisch vom Betriebssystem verändert wird. Gibt es zwei Prozesse mit gleicher Priorität, so hat immer der gerade rechnende Prozess Vorrang vor einem wartenden Prozess. Gibt es mehrere wartende Prozesse, so hat der Prozess Vorrang, der als letzter gerechnet hat, also der Prozess mit der kleinsten Wartezeit. Die dynamische Korrektur der Priorität erfolgt nach folgenden Regeln: a) b) c) d) Nach jeder Zeiteinheit Rechenzeit wird die Priorität um 1 erniedrigt. Negative Prioritäten werden zu 0 gesetzt. Nach einem Systemaufruf (SVC) wird nach Ablauf der Zeiteinheit die Priorität um 2 erhöht. Bei der Berechnung der Priorität am Ende einer Zeiteinheit wird sowohl Regel a) als auch Regel b) angewendet, d.h. ein Prozess ohne SVC wird um 1 erniedrigt ein Prozess mit SVC wird um 1 erhöht. Tritt ein SVC zum Zeitpunkt einer Zeiteinheit auf, so wird Regel a) und Regel b) angewendet d.h. die Priorität erhöht sich in diesem Fall um 1. Im folgenden Beispiel werden drei Prozesse P1, P2 und P3 betrachtet. Die Prozesse starten alle zum gleichen Zeitpunkt t=0, haben jedoch unterschiedliche Basisprioritäten. Alle SVC's treten zum Zeitpunkt einer Zeiteinheit auf ( d.h. in diesem Fall soll Regel d anwendet werden ). In der folgenden Tabelle sind die drei Prozesse im Detail beschrieben. Startzeit und Rechenzeit der einzelnen Prozesse sind in Zeiteinheiten (ZE) angegeben. Prof. Dr. Keller Prozessnummer 1 2 3 Systemsoftw are-Skript Version 1.1 Rechenzeit (in ZE) 6 5 4 Basispriorität Seite 40 von 102 SVC bei Rechenzeit kein SVC 1,2 2 5 3 4 Startzeit 0 0 0 Tragen Sie in die folgende Zeitleiste ein, welcher Prozess in der jeweiligen Zeiteinheit abläuft. Zeiten, in denen das Betriebssystem arbeitet, sind wegzulassen. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 J Zeit in ZE 2.8.5 Aufgabe 6 Auf ihrem Rechner ist ein Multiprogramming-Betriebssystem MUBS installiert. Der Scheduler von MUBS realisiert eine preemptive Zuteilungsstrategie, eine Kombination aus Round Robin (RR) und dynamischen Prioritäten. Die Priorität eines Prozesses wird beim Start angegeben. Ein Prozess kann die Priorität während der Laufzeit durch Aufruf der Systemfunktion PRIO() um den Wert 1 erniedrigt werden. Die Erniedrigung der Priorität wird erst in der folgenden Zeitscheibe wirksam. Eine Erhöhung der Priorität um den Wert 2 erfolgt durch das Betriebssystem, wenn ein Prozess ein I/O_Operation über die API-Funktionen IO_read() und IO_write() durchführt. Die Erhöhung der Priorität wird erst in der folgenden Zeitscheibe wirksam. Eine beim Start vergebene Priorität bleibt solange erhalten, bis der Prozess endet oder bis durch Aufruf der Systemfunktion PRIO() die Priorität erniedrigt wird oder das BS aufgrund einer I/O-Operation eine Erhöhung anordnet. Die neu berechnete Priorität bleibt erhalten, bis zum Ende des Prozesses oder einem erneuten Aufruf von PRIO() bzw. I/O-Operation. Wird PRIO() oder eine IO_Operation innerhalb einer Zeitscheibe mehrmals aufgerufen wird die Priorität bei jedem Systemaufruf erniedrigt bzw. erhöht d.h. nach dem zweiten Systemaufruf von PRIO() ist die Priorität um 2 niedriger, nach zwei I/O_Operationen innerhalb einer Zeitscheibe um 4 erhöht. Existieren zu Beginn einer Zeitscheibe mehrere Prozesse mit gleicher Priorität, so wird das Round Robin Verfahren angewendet und es darf der Prozess beginnen, der am längsten nicht gerechnet hat. In der folgenden Tabelle ist eine Situation beschrieben, in der 4 Prozesse zu unterschiedlichen Zeiten starten. Alle Zeiten in der Tabelle sind als Zeiteinheiten angegeben ( 1 Zeiteinheit= 1 Zeitscheibe ). Die Prozesse starten mit unterschiedlicher Priorität. Prozess 1,2 und 3 erniedrigen zur Laufzeit ihre Prioritäten. In der Spalte 5 ist angegeben in welcher Zeiteinheit ein Aufruf von PRIO() erfolgt. In Spalte 6 ist eingetragen, ob und wann die Prozesse eine I/O-Operation durchführen. Die Rechenzeit wird in Anzahl von Zeiteinheiten angegeben, die der Prozess rechnet. Nach dem Start befindet sich ein Prozess daher in der Rechenzeit 1. Prozess-ID Startzeit Priorität beim Start Rechenzeit Aufruf von PRIO() im Zeitintervall 1 0 3 3 2 I/O-Operationen innerhalb des Zeitintervalls 3 2 2 4 5 2 1 3 5 6 7 1 und 5 - 4 10 5 5 - 2 und 4 Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 41 von 102 Tragen Sie in die vorgegebene Zeitleiste ein, welcher Prozess in welcher Zeiteinheit mit welcher Priorität abläuft ProzessID Priorität Zeiteinheit 0 2.8.6 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Aufgabe 7 In einem Multiuser/Multitasking-Betriebssystem werden mehrere Prozesse nebenläufig abgearbeitet. In dem gegebenen Betriebssystem ist ein preemptive Scheduling-Algorithmus als Kombination von RoundRobin und Prioritätensteuerung realisiert. a) In der folgenden Tabelle ist eine Situation beschrieben, in der fünf Prozesse zu unterschiedlichen Zeiten mit unterschiedlichen Prioritäten starten. Die Startzeit, als auch die Rechenzeit der einzelnen Prozesse sind in Zeiteinheiten (ZE) angegeben. Die Zeitscheibe beträgt 1 ZE. Die Prioritäten werden mit steigendem Wert höher, d.h. Priorität 1 ist weniger wichtig als Priorität 5. Prozessnummer Startzeitpunkt ( ZE ) (bezogen auf to=0 ZE) 0 3 5 8 10 1 2 3 4 5 Rechenzeit ( in ZE) 10 3 8 2 5 Priorität 1 5 2 3 3 Tragen Sie in die folgende Zeitleiste ein, welcher Prozess in der jeweiligen Zeitscheibe abläuft. Zeiten, in denen das Betriebssystem arbeitet, sind wegzulassen. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 20 25 30 Zeit in ZE b) Die Verweildauer eines Prozesses ist die Zeit vom Start eines Prozesses (Einlagern in die ReadyWarteschlange) bis zum Ende eines Prozesses. Die Verweildauer umfasst damit sowohl reine Rechenzeit als auch die Zeit, die der Prozess auf die Zuteilung warten muss. Wie groß ist die Verweildauer der einzelnen Prozesse aus Teilaufgabe a)? Verweildauer(1)= Verweildauer(2)= Verweildauer(3)= Verweildauer(4)= Verweildauer(5)= Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 42 von 102 3. Arbeitsspeicherverwaltung Speicherverwaltung • Arbeitsspeicher muss auf mehrere Prozesse aufgeteilt werden – Dynamisches Einlagern und Auslagern von Prozessen – Verschieben von Prozessen zur Laufzeit ( relocation ) Adresse 0 Betriebssystem Dialogbetrieb Prozeß 1 Prozeß 2 Prozeß 3 Swapping ( Auslagern ) Starten und Beenden von Prozessen Adresse n 3.1 Partitionierung Speicherpartitionierung Partition Feste Größe Variable Größe BS BS BS BS BS Prozeß 1 Prozeß 1 Prozeß 1 Prozeß 1 Prozeß 1 frei frei Prozeß 2 Prozeß 2 Prozeß 3 Prozeß 3 Prozeß 3 Fragmentierung Garbage Collection Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 43 von 102 Dynamische Speicheranforderung • Prozesse können zur Laufzeit dynamisch Speicherblöcke anfordern bzw. freigeben • Beispiel: Aufbau einer verketteten Liste, Bäume, Grafen • Funktionen : malloc(), free() in C, new(), dispose() in PASCAL • Realisierung durch Speicherverwaltung Speicherbelegung statisch beim Laden Speicherbelegung dynamisch zur Laufzeit benachbarter Speicher belegt Speicherbereich im Voraus reservieren ( beim Laden ) benachbarter Speicher frei Speicherpartition belegen 3.1.1 Speicher voll Speicher hat noch Platz Verschieben von Prozessen im Speicher Swapping Strategien zur Speicherplatzvergabe First Fit Nehme den ersten passenden Block den du findest Vorteil: Nachteil: Schnell Viele kleine Blöcke bilden sich am Speicheranfang Next Fit Wie First Fit, jedoch beginne Suche nach dem letztem vergebenen Block Best Fit Suche nach einem Block, der am besten passt Vorteil: Nachteil: Worst Fit geringe Speicherverschwendung langsam, da die gesamte Speicherliste durchsucht werden muß Suche den größten Block und teile ihn, so das ein Block ausreichender Größe übrig bleibt Prof. Dr. Keller 3.2 Systemsoftw are-Skript Version 1.1 Segmentierung Segmentierung Segment Logische Einheit eines Programms Segmentierung schon in der ExecutableDatei physikalischer Adreßraum (Arbeitsspeicher) Segment 0 Code Segment 1 Daten 0 1 2 3 Segment 2 Stack Segmentnummer Segment 3 Heap Segmenttabelle Adresse im Speicher Segmentierung •Adreßumrechnung Physikalische Adresse Logische Adresse Segmentnummer Offset Basisadresse Offset •Eintrag einer Segmenttabelle Anfangsadresse Größe des Segments Attribute •Attribute eines Segments •Zugriffsrechte (lesen, schreiben, ausführen) •verschiebbar •Auslagerbar •sharable •Compiler muß Segmentierung unterstützen Seite 44 von 102 Prof. Dr. Keller 3.3 3.3.1 Beispiel Virtueller Speicher Overlays ASSEMBLER 37K Code Phase 1 8K Code Phase 2 14K Gemeinsame Routinen 5K Symboltabelle 10K St Overlay-Baum: 15 G 8K P1 Σ 23K 3.3.2 Systemsoftw are-Skript Version 1.1 P2 14K Phase 1: Aufbau der Symboltabelle Phase 2: Codeerzeugung Wird in beiden Phasen benötigt ( Rootsegment ) Rootsegment Overlay’s Σ 29K Seitenwechselverfahren ( Paging ) Virtueller Speicher Adreßraum des Prozesses > physikalischer Adreßraum virtueller Adreßraum des Prozesses 0 physikalischer Adreßraum ( Arbeitspeicher ) Adreßabbildung dff BS 200 fff ffff Programmadresse 32-Bit Adreßbus 24-Bit Adreßabbildung durch Hardware und Betriebssystem Seite 45 von 102 Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 46 von 102 Paging Problem Nicht jede Adresse kann einzeln abgebildet werden • Aufteilung des virtuellen Speichers in Seiten und des physikalischen Speichers in Kacheln gleicher Größe • Adressierung durch Seitennummer und Offset Lösung Verfahren • Nur Abbildung der Anfangsadresse einer Seite auf eine Kachel • Ein-/Auslagern von ganzen Seiten auf Festplatte zur Laufzeit Paging - ein Beispiel • PhysikalischerAdreßraum: 4K • Vorhanden: 4K • Virtueller Adreßraum: 8K • Seitengröße: 1K 4 Kacheln 8 Seiten Kachelnummer Seitentabelle Seite 0 Seite 1 Seite 2 Seite 3 Seite 4 Seite 5 0 1 2 3 4 5 6 7 1 1 2 1 - 0 3 1 - 0 - 0 - 0 0 1 Kachel 0 Kachel 1 Kachel 2 Kachel 3 Seite 6 Seite 7 Attribute Präsenzflag 2 Bit 3 Bit Seitennummer Offset 10 Bit Kachelnumer 10 Bit Offset Prof. Dr. Keller BE Systemsoftw are-Skript Version 1.1 Seite 47 von 102 ISPIELE Paging: Drei-Stufen-Paging, die SPARCReferenz (8) index 1 Kontext 0 (6) index 2 erste Ebene 0 (6) index 3 (12) offset zweite Ebene dritte Ebene 0 0 8 8 255 63 63 4095 8 Drei Ebenen Seitentabelle im Speicher mit Auslagerung Kontexttabelle in MMU 8 0 4 K Kacheln 8 Speicherwort 8 8 Je Prozeß ein Prozeßkontextzeiger Kontextumschaltung durch neuen Kontextzeiger Kontextzeiger über die Lebensdauer in Kontext-Tabelle ( MMU- Hardware) konstant Beschränkung auf 4K Prozesse Kontextzeiger und virtuelle Adresse p hysikalische Adresse 4 G vitueller Adressraum je Prozess 1 M Seiten je Prozess á 4 K 384 Einträge je "process page table" 4095 Vier-Stufen-Paging, M 68030 - Flexibilität (32) (0-25)(0-25) d (0-25) (0-25) (0-25) ( 7 - 15) c b a offset unused vier-stufige-Seitentabelle • • • Paging kann durch das Betriebssystem mitbestimmt werden (parametrierbare Hardware- MMU 0 - 4 Stufen und Anzahl der Adressbits, die eine Stufe ausmachen sind SW-seitig einstellbar (Index - Breite) t ranslation control register werden durch BS definiert BS legt die Interpretation der virtuellen Adresse fest virtueller Adressraum kann eingestellt werden ( < 232 ) Seitengröße kann eingestellt werden (265 bytes bis 32 K) Einstellung wieviel bit der Adressraum wirklich hat Die Eigenschaften des Paging werden ausschließlich durch das Betriebssystem bestimmt Kein bekanntes Betriebssystem nutzt die Flexibilität ernsthaft aus Prozeß-spezifische Definitionen des virtuellen Adressraums denkbar und eventuell sinnvoll Prof. Dr. Keller TR ANSLATION L OOKASIDE Systemsoftw are-Skript Version 1.1 BUFFE Seite 48 von 102 R Bei mehrstufigen Verfahren liegen die Seitenersetzungstabellen im Arbeitsspeicher. Die Adressumrechnung erfordert daher mehrere Speicherzugriffe. Das bedeutet aber eine Verlangsamung der Adressumrechnung ( z.B. M68030 virtuelle Adresse erfordert fünf Speicherzugriffe ). Die meisten Programme haben viele Speicherzugriffe in einer kleinen Zahl von Seiten. Für diesen kleinen Anteil umgeht man die Seitentabellen durch eine schnellere Sonderlösung, einen Assoziativspeicher, den Translation Lookaside Buffer ( TLB ) Translation Lookaside Buffer ( TLB ) virtuelle Adresse Seitennummer Offset MMU Seitennummer Seitennummer Seitennummer Kachelnummer Kachelnummer Kachelnummer TLB Hit Zeiger PT Page Table Kachel Kachel Kachel Kachel Kachel TLB Miss Kachelnummer Offset physikalische Adresse Der Assoziativspeicher ist Teil der MMU (minimal 32 Speicherzellen). Im Assoziativspeicher werden für den aktuell rechnenden Prozess die im Moment gebräuchlichsten Seiten mit ihrem Seitentabelleneintrag vorgehalten. Neben der Seitennummer enthält ein Speichereintrag auch die Kachelnummer. Assoziativspeicher realisieren eine parallele Suche, d.h. die virtuelle Adresse wird gleichzeitig mit allen Tabelleneinträgen verglichen. Wird eine virtuelle Seite im TLB gefunden ( TLB Hit ), steht dort die Kachelnummer und die Adressumrechnung kann direkt erfolgen War die Suche im TLB ohne Erfolg ( TLB Miss ), muß auf die Seitentabellen im Arbeitsspeicher zurückgegriffen werden Bei einem Prozesswechsel muss der TLB komplett ausgetauscht werden, da jetzt die Seiten des neuen Prozesses eingetragen werden müssen. Für den Austausch des TLB-Inhaltes gibt es zwei Strategien: Man startet mit einem leeren TLB. Und füllt in nach jeder Seitenreferenz Man rettet den Inhalt des TLB im Prozesskontext und kann dann nach Prozesswechsel den gesicherten Inhalt zurückschreiben Prof. Dr. Keller 3.3.2.1 SE Systemsoftw are-Skript Version 1.1 Seite 49 von 102 ITENERSETZUNGSSTRATEGIEN Generelle Regeln A) Wird eine Seite ausgelagert, die im Speicher nicht verändert wurde ist nur die Seitentabelle zu aktualisieren und die Kachel freizugeben. Wird eine Seite ausgelagert, die im Speicher verändert wurde, muß diese Seite auf die Platte kopiert werden, die Seitentabelle aktualisiert und die Kachel freigegeben werden. Damit eine Änderung einer Seite im physikalischen Speicher erkannt werden kann, muss durch die Hardware bei einem schreibenden Speicherzugriff auf eine Seite in der Seitentabelle ein Bit ( M-Bit ) gesetzt werden. B) Lokale Algorithmen betrachten beim Aus-/Einlagern nur Seiten des betroffenen Prozesses Globale Algorithmen betrachten alle eingelagerten Seiten im Speicher unabhängig von den Prozessen C) Einlagerung von Seiten, nur wenn diese auch aktuell benötigt werden ( Demand Paging ). Einlagern einer Menge von Seiten bevor ein Prozess rechnet. Während der Laufzeit dann aber nur nach Bedarf. ( Prepaging ) D) Paging Daemon Ein Daemon ( Disc And Execution Monitoring ) ist ein Betriebssystemprozess, der im Hintergrund läuft ( ins Deutsche übersetzt auch Dämon-Prozess ). Sind viele Kacheln frei, ist ein schnelles Einlagern von Seiten möglich, da keine Seite ausgelagert werden muss. Eine Garantie, dass viele Kacheln frei sind kann durch einen periodisch aktivierten Hintergrundprozess realisiert werden. Dieser so genannte Paging Daemon schaut periodisch nach, ob eine gewisse Menge von Kacheln frei ist. Sind nicht genügend Kacheln frei, werden im Vorgriff Seiten ausgelagert. Algorithmen Nach einem Page Fault muss eine neue Seite in den physikalischen Speicher gelegt werden. Ist der Speicher voll, muss das Betriebssystem Platz schaffen, indem eine eingelagerte Seite ausgelagert wird. Welche Kachel das sein wird, wird durch einen Seitenersetzungsalgorithmus festgelegt. DER OPTIMALE ALGORITHMUS Jede im Speicher liegende Seite wird bei der Ausführung eines Befehls zu einer Zeit x angesprochen. X = Anzahl der Befehl, die noch ausgeführt werden müssen, bevor ein Seitenzugriff erfolgt. Lagere also diejenige Seite aus, deren x am größten ist. Problem: x ist erst dann bekannt, wenn ein Zugriff auf diese Seite erfolgt. Dies liegt jedoch in der Zukunft. Das Betriebssystem kennt daher die Größe x nicht. Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 50 von 102 NOT RECENTLY USED ( NRU ) Lagere diejenige Seite aus, die im Moment am wenigsten benutzt wird Realisierung: Für jede Seite wird in der Seitentabelle zwei Bit gespeichert. R-Bit: Dieses wird bei jedem Speicherzugriff auf 1 gesetzt. Das Betriebssystem setzt dieses Bit periodisch nach Ablauf der Zeitscheibe auf 0 zurück. M- Bit: Dieses wird bei einem schreibenden Zugriff auf die Seite auf 1 gesetzt. Das Betriebssystem verändert dessen Wert danach nicht mehr. Klassifizierung der Seiten: Klasse 0: Klasse 1: Klasse 2: Klasse 3: R=0 und M=0 R=0 und M=1 R=1 und M=0 R=1 und M=1 FIRST IN FIRST OUT ( FIFO ) Lagere diejenige Seite aus, die am längsten im Speicher liegt SECOND CHANCE Eine Modifikation von FIFO. Es wird der Wert des R-Bit für die älteste Seite betrachtet. R= 0 ? R= 1 ? Lagere die Seite aus Setze R-Bit auf 0 und gib dieser Seite eine neue Chance, indem Sie an den Schluss der FIFO gehängt wird LEAST RECENTLY USED ( LRU ) Lagere diejenige Seite aus, die am längsten nicht benutzt wurde B EISPIEL : Ein Programm erzeugt folgenden reference string: 0 1 0 2 0 le le le schr le . 0 Hier Zeitscheibe schr 0 4 5 1 1 3 0 le le schr le le schr le 4 schr Es stehen 3 Kacheln zu Verfügung. Wie werden die Kacheln nacheinander belegt mit dem Verfahren a) NRU K1 K2 K3 0 Le 1 le 0 le 2 0 schr le . 0 Zeit schr 0 – 1,0 0 – 1,0 1 – 1,0 0 – 1,0 1 – 1,0 0 – 1,0 1 – 1,0 2 – 1,1 0 – 1,0 1 – 1,0 2 – 1,1 0 – 1,0 1 – 1,0 2 – 1,1 0 0 1 0 1 0 1 2 0 1 2 0 1 2 0 – 0,0 1 – 0,0 2 – 0,1 0 le 4 Le 5 1 schr le 1 le 3 0 schr le 4 schr 0 – 1,0 1 – 0,0 2 – 0,1 2 – 0,1 0 –1,0 4 – 1,0 0 – 1,0 4 – 1,0 5 – 1,1 4 – 1,0 5 – 1,1 1 – 1,0 4 – 1,0 5 – 1,1 1 – 1,0 5 – 1,1 4 – 1,0 3 – 1,1 0 – 1,0 3 – 1,1 5 – 1,1 3 – 1,1 5 – 1,1 4 – 1,1 0 1 2 0 4 2 0 4 5 1 4 5 1 4 5 3 4 5 3 0 5 3 4 5 Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 51 von 102 b) FIFO K1 K2 K3 0 Le 1 le 0 le 2 0 schr le . 0 schr 0 le 4 Le 5 1 schr le 1 le 3 0 schr le 4 schr 0 0 1 0 1 0 1 2 0 1 2 0 1 2 4 1 2 4 5 2 4 5 1 4 5 1 3 5 1 3 0 4 0 1 2 3 0 1 c) Second Chance K1 K2 K3 0 Le 1 le 0 le 2 0 schr le . 0 Zeit schr 0 le 4 Le 5 1 schr le 1 le 3 0 schr le 4 schr 0 – 1,0 0 – 1,0 1 – 1,0 0 – 1,0 1 – 1,0 0 – 1,0 1 – 1,0 2 – 1,1 0 – 1,0 1 – 1,0 2 – 1,1 0 – 1,0 1 – 1,0 2 – 1,1 0 – 1,0 1 – 0,0 2 – 0,1 2 – 0,1 0 –1,0 4 – 1,0 0 – 1,0 4 – 1,0 5 – 1,1 4 – 0,0 5 – 0,1 1 – 1,0 4 – 0,0 5 – 0,1 1 – 1,0 5 – 0,1 1 – 1,0 3 – 1,1 1 – 1,0 3 – 1,1 0 – 1,0 3 – 0,1 0 – 0,0 4 – 1,1 0 0 1 0 1 0 1 2 0 1 2 0 1 2 0 1 2 0 4 2 0 4 5 1 4 5 1 4 5 1 3 5 1 3 0 4 3 0 0 le 4 Le 5 1 schr le 1 le 3 0 schr le 0 – 0,0 1 – 0,0 2 – 0,1 d) LRU K1 K2 K3 0 Le 1 le 0 le 2 0 schr le . 0 Zeit schr 0 0 1 0 1 0 1 2 0 1 2 0 1 2 4 schr Prof. Dr. Keller 3.4 Systemsoftw are-Skript Version 1.1 Seite 52 von 102 Speicherverwaltung in UNIX FREISPEICHERVERWALTUNG über verkettete Liste. Verfahren First Fit. SEGMENTIERUNG, SWAPPING UND PAGING KOMBINIERT. Speicherverwaltung in UNIX Segmentierung Swapping •Der virtuelle Adreßraum wird in 4 Segmente eingeteilt: -Text-Segment ( read-only, shared ) -Statische Daten ( initialisiert, nicht initialisiert (BSS )) -Dynamische Daten ( Stack von unten nach oben, heap von oben nach unten ) •Hintergrundprozeß mit PID=0. Wird aktiviert zum Auslagern von Prozessen, wenn die Page Fault Rate zu hoch ist, oder kein Speicherplatz mehr vorhanden ist. Wird Periodisch aktiviert um nachzusehen, ob Prozesse wieder eingelagert werden können •Demand Paging mit globalem modifízierten FIFO Algorithmus Paging •Paging Dämon Hintergrundprozeß mit PID=2 . Dieser wird periodisch alle 250 msec aktiviert. Falls weniger als 1/4 des Speichers frei ist, werden im Vorgriff Seiten ausgelagert Prof. Dr. Keller 3.5 Systemsoftw are-Skript Version 1.1 Seite 53 von 102 Speicherverwaltung in Windows NT Windows NT ermöglicht die virtuelle Adressierung eines linearen Adressraumes von 4 Gigabyte ( = 2 32 Byte ). Jeder Prozess hat einen eigenen, gegenüber anderen geschützten virtuellen Adressraum, von insgesamt 4 Gigabyte, davon 2 Gigabyte Systembereich und 2 Gigabyte User-Bereich. Virteller Adreßraum eines NT Prozesses 0 User Bereich 2 Gigabyte non paged system area System Bereich 32 2 -1 2 Gigabyte non paged area Die Speicherverwaltung ( Virtual Memory Manager VM ) realisiert Paging. Die Seitengröße beträgt 4 KByte, d.h. jeder Prozess kann insgesamt 220 Seiten adressieren. NT benutzt eine 2-stufige Seitentabelle. Die erste Stufe bildet mit 210 Einträgen das Page Directory ( PD ). In der 2. Stufe existiert eine Seitentabelle ( PT ) mit ebenfalls 210 Einträgen. Der Offset innerhalb einer Seite beträgt 12 Bit (Seitengröße von 4K Byte). Jeder Prozess besitzt seine eigene Page Directory und damit auch seine eigene Seitentabelle. Page Directory und Seitentabelle können selbst ausgelagert werden unterliegen daher dem Paging. Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 54 von 102 Paging in Windows NT 31 PDE PD Eintrag 21 11 PTE Offset 0 PT Eintrag Page Directory Adresse Kachelnr. Page Directory Page Table Arbsp. Kacheln Ein-/Auslagerungs-Strategie: Demand Paging mit „Clustering“, d.h. eine Seite wird nach Bedarf eingelagert zusammen mit einer kleinen Zahl von zusätzlichen Seiten in der Umgebung der benötigten Seite. Lokale, d.h. auf einen Prozess bezogene, FIFO Strategie. Shared Memory Windows NT ermöglicht das Anlegen von Shared Pages. Dazu wird bei der Adressumrechnung von virtuellen Seiten in physikalische Kacheln eine zusätzliche Stufe eingeschoben, die Prototype Page Table ( PPT ), eine vom Betriebsystem dynamisch angelegte Seitentabelle, in der für alle shared pages die physikalische Adresse der Kachel eingetragen wird. Im entsprechenden Page Table Eintrag der Prozesse steht nicht die Kacheladresse sondern die Adresse des Eintrages in der Prototype Page Table. Beim Ein/Auslagern einer Shared Page muss damit nicht die Seitentabelle aller beteiligten Prozesse geändert werden, sondern nur der Eintrag in der PPT. 3.6 3.6.1 Übungsaufgaben Aufgabe 8 Ein Rechner mit 32-Bit virtueller Adressierung benutzt eine 2-stufige Seitentabelle. Eine virtuelle Adresse setzt sich zusammen aus 9 Bit Seitenindex 1. Stufe, 11 Bit Seitenindex 2. Stufe und Offset. Wie groß ist eine Seite ? Wie viele Seiten hat der virtuelle Adressraum ? 3.6.2 Aufgabe 9 In einem Multitasking Betriebssystem muss der Arbeitsspeicher auf mehrere gleichzeitig ablaufende Prozesse aufgeteilt werden. Sie haben in der Vorlesung zwei unterschiedliche Techniken kennengelernt, wie trotz geringem Arbeitsspeicher alle Prozesse bearbeitet werden können, das Swapping und Paging. Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 55 von 102 a) Erklären Sie den Unterschied dieser beiden Techniken. Ist eine Realisierung dieser beiden Techniken ohne zusätzliche Hardwarevorkehrungen möglich oder nicht ? b) Beim Paging tritt unter bestimmten Umständen ein sogenanntes Seitenflattern ( thrashing ) auf. Nennen Sie den/die Grund/Gründe für das Auftreten dieses Effektes. 3.6.3 Aufgabe 10 In einem Paging-System stehen 3 Kacheln (physikalische Seiten) Arbeitsspeicher zur Verfügung. Es soll ein Prozeß abgewickelt werden, der aus 5 virtuellen Seiten ( 0..4 )besteht. Dabei sei ausnahmsweise die Reihenfolge der Seitenzugriffe bekannt. Die Seiten werden in der Reihenfolge: 0,1,2,3,0,1,4,0,1,2,3,4 benötigt. Das Paging System arbeitet nach dem FIFO Verfahren und hat zum Startzeitpunkt drei "gereinigte" Kacheln zu Verfügung. Tragen sie in die nachfolgende Tabelle 1 die Belegungen der Kacheln mit Seiten ein und kennzeichnen Sie im Page Fault-Feld die auftretenden Seitenfehler Tragen Sie in die Tabelle 2 bei gleicher Reihenfolge für den gleichen Prozeß die Belegung und die Seitenfehler ein, wenn Sie vier Kacheln zur Verfügung haben Bei welcher Lösung ergeben sich mehr Seitenfehler? S0 S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 S11 S0 S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 S11 3.6.4 Aufgabe 11 Ein Multitasking-Betriebssystem verwaltet den Arbeitsspeicher nach dem Pagingverfahren. Die Seitengröße beträgt 1K. Jeder Prozess adressiert 8 virtuelle Seiten d.h. der virtuelle Adressraum eines Prozesses beträgt 8K. Dem Betriebssystem stehen 4 Kacheln zu Verfügung. In der Kachel 0 liegt das Betriebssystem permanent eingelagert. Die Seitentabelle eines Prozesses wird direkt in der MMU gespeichert. Bei der Abarbeitung eines Prozesses entsteht die folgende Sequenz von Seitenreferenzen ( Referenzstring ): Referenzstring : 1 2 3 2 4 2 3 5 2 1 2 4 5 Das Betriebssystem muss diese virtuellen Seiten auf 3 Kacheln im Arbeitsspeicher abbilden. Wie sieht die Zuordnung der virtuellen Seiten auf die Kacheln aus wenn das Least Recently Used (LRU) Verfahren angewendet wird. Bei dieser Strategie wird diejenige Seite verdrängt, die in einem zurückliegenden Zeitintervall die längste Zeit unbenutzt war. Tragen Sie in die vorgegebene Tabelle die Belegung der Kacheln mit virtuellen Seiten ein. Kennzeichnen Sie die Situationen "Auftreten eines Page Fault" durch einen Pfeil, der auf die Spalte zeigt, in der ein Page Fault auftritt. Referenzstring 1 Kachel 1 Kachel 2 Kachel 3 2 3 2 4 2 3 5 2 1 2 4 5 Prof. Dr. Keller 3.6.5 Systemsoftw are-Skript Version 1.1 Seite 56 von 102 Aufgabe 12 Ihr Betriebssystem realisiert virtuellen Speicher in Form von Paging. Die Seitengröße ist 1 KByte. Als Seitenersetzungsstrategie wird NRU (Not Recently Used ) benutzt. Der Adressraum eines Prozesses umfasst 8 virtuelle Seiten. Physikalisch sind 8 Kacheln vorhanden. Das Betriebssystem belegt permanent die Kachel 0 und 1, d.h. diese beiden Kacheln werden nicht ausgelagert. Zum Zeitpunkt x rechnet ein Prozess A. Die Seitentabelle des Prozesses hat zu diesem Zeitpunkt folgendes Aussehen: 0: 1: 2: 3: 4: 5: 6: 7: a) Kacheln P R M 2 1 0 0 7 1 1 0 0 0 0 0 0 0 0 0 4 1 1 1 0 0 0 0 5 1 0 1 0 0 0 0 P: Seite präsent M: Seite wurde modifiziert R: Seite wurde in der aktuellen Zeitscheibe benutzt Bei der Abwicklung des Prozesses A treten innerhalb der aktuellen Zeitscheibe folgende Seitenreferenzen auf: 1 (l), 5 (sch), 2 (sch), 1 (l), 7 (sch), 3 (sch), 1 (l),6 (l) sch: schreibend, l: lesend Tragen sie in die folgende Tabelle die Kachelbelegungen für die oben gegebene Seitenreferenzen ein. Die aktuelle Belegung zum Zeitpunkt x ist in der Spalte x vorgegeben, d.h. Kachelnummer 3 und 6 sind unbelegt. Kachelnr. 2 3 4 5 6 7 b) x 0 4 6 1 1 5 2 1 7 3 1 Wie sieht die Seitentabelle des Prozesses nach der letzten Seitenreferenz aus ? Kachelnr. P R M 0: 1: 2: 3: 4: 5: 6: 7: c) 6 Wie oft und in welchen Situationen wird ein "Page Fault" ausgelöst ? 3.6.6 Aufgabe 13 Paging – Vergleich FIFO, Second Chance ( im Skript ) Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 57 von 102 4. Interprozesskommunikation 4.1 4.1.1 Modelle zur Beschreibung eines nebenläufigen Systems Beschreibung der Aufbaustruktur durch Instanzennetze Mit Instanzennetzen kann man die Aktionsträger (Prozesse) und die Datenflüsse eines Softwaresystems modellieren. Ein Instanzennetz ist ein gerichteter bipartiter Graf. Ein bipartiter Graf besteht aus 2 Knotentypen. Kanten dürfen nur Knoten unterschiedlichen Typs verbinden. Knotensymbole: Instanzen Aktionsträger "Prozesse" Datenräume Speicher für Datenwerte passive Elemente Beispiel: Erzeuger/Verbraucher-Problem Warenlager Produzent 4.1.2 Konsument Beschreibung der Ablaufstruktur durch Petrinetze Mit Petrinetze kann man die zeitliche Abfolge von Ereignissen/Aktionen eines Softwaresystems modellieren. Ein Petrinetz ist ein gerichteter bipartiter Graf mit zusätzlichen Eigenschaften. Knotensymbole: Transitionen kennzeichnen Ereignisse / Aktionen Stellen kennzeichnen Systemzustände Prof. Dr. Keller 4.2 Systemsoftw are-Skript Version 1.1 Seite 58 von 102 Kooperation über gemeinsame Daten ( shared memory ) Kooperation über gemeinsame Daten Beispiel Prozeß #1 Prozeß #2 DruckSpooler FIFO Druckaufträge Problem Zeitlicher Wettlauf zwischen Prozeß 1 und Prozeß 2 Ursache Prozeßwechsel innerhalb kritischem Bereich. Kritischer Bereich Teil des Prozsesses, in dem ein Zugriff auf gemeinsame Datenbereiche erfolgt Aktionen P1 Aktionen P2 Zugriff auf gemeinsame Daten kritischer Bereich kritischer Bereich Kooperation über gemeinsame Daten Lösung Realisierung Wechselseitiger Ausschluß ( mutual exclusion ) Binäre Semaphore Aktionen P1 kritischer Bereich Semaphor MUTEX Aktionen P2 kritischer Bereich Prof. Dr. Keller 4.3 Systemsoftw are-Skript Version 1.1 Seite 59 von 102 Synchronisation 4.3.1 Signale, Flags 4.3.2 Stop/Unstop-Mechanismus Synchronisation durch passives Warten Beispiel: Produzent/Verbraucher-Problem Prüfe Pufferstatus Prüfe Pufferstatus Betriebssystem Stop Stop Puffer voll sonst Puffer leer sonst Lege Ware ins Lager Hole Ware aus Lager Erhöhe Pufferstaus um 1 Erniedrige Pufferstaus um 1 UNSTOP Konsument UNSTOP Produzent PRODUZENT 4.3.3 BI ZÄ NÄRE VERBRAUCHER Semaphore SE HLENDE MAPHORE SE MAPHORE BEISPIEL: PRODUZENT-VERBRAUCHER In 1 Kapazität=N Konsumie- Produziere MUTEX krit. Bereich Lege Ware ins Lager 1 Kap.=N Out Hole Ware aus dem Lager 1 Synchron. Starten Prof. Dr. Keller Art Binärer Semaphor Seite 60 von 102 Datenstruktur im BS Boolsche Variable S FIFO zu S mit Eintag PID unsigned int S FIFO zu S mit Eintrag PID Funktionen im BS P(S) V(S) Allgemeiner Semaphor mit Flusszahl > 1 unsigned int S FIFO zu S Eintrag: PID, Flußzahl P(k*S) V(k*S) Mengen (bzw.Vektor) Semphore unsigned int S1,S2 FIFO für alle Semaphore Eintrag: PID, Liste: Sempahor,Flußzahl P(n*S1,m*S"2) V(k*S1,l*S2) Allgemeiner Semaphor Petrinetz-Modell Systemsoftw are-Skript Version 1.1 P(S) V(S) Prof. Dr. Keller 4.3.4 Systemsoftw are-Skript Version 1.1 Monitore Monitore • Synchronisationsmethode nach Hoare(1974) und Hansen ( 1975 ) – Ein Monitor besteht aus • einer Menge von Prozeduren, Variablen und Datenstrukturen, • die in einem Modul bzw. Objekt-Klasse zusammengefasst sind – Ein Programm kann nur über die Monitorprozeduren auf die Daten im Monitor zugreifen – Nur genau ein Prozess kann einen Monitor betreten • realisiert mutual Exclusion. Monitore • Monitore sind Konstrukte einer Programmiersprache. – Der Compiler realisiert die Monitore in folgender weise: • Ruft ein Prozeß P2 eine Monitorprozedur auf, während gerade ein anderer Prozess P1 den Monitor benutzt, so wird P2 blockiert, bis der Prozess P1 den Monitor wieder verlässt. • Ist kein anderer Prozess im Monitor aktiv, so erhält P2 das Recht die Monitorprozedur zu benutzen und sprerrt damit für andere Prozesse den Zugriff auf die Monitordaten. – Der Compiler muss für einen Monitor den wechselseitigen Ausschluss umsetzen. – Falls vorhanden verwendet der Compiler dazu binäre Semaphore Seite 61 von 102 Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Monitore Daten im kritischen Bereich Prozedur 1 Prozedur 2 Monitor Prozeß 1 (aktiv in Monitor) Prozeß 2 ( blockiert) Monitore Konstrukte einer Programmiersprache • Vorteil: • Der Programmierer muss sich um mutual exclusion nicht selbst kümmern. • Dies regelt der Compiler. Daher können auch keine Fehler durch zeitliche Wettläufe erfolgen. Der Programmierer muss nur alle kritischen Bereiche in Monitore legen. • Nachteil: – Monitore sind Elemente einer Programmiersprache. • C und C++ ermöglichen keine Monitore. • JAVA unterstützt das Monitorkonzept Seite 62 von 102 Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Monitore - Synchronisation • In den meisten Fällen muss neben mutual exclusion zusätzlich ein Synchronisationsprotokoll zwischen den Prozessen implementiert werden, das einen Prozess blockiert wenn die globale Variable bestimmte Bedingungen nicht erfüllt, und den Prozess wieder deblockiert wenn die Bedingungen wieder hergestellt sind. • Beispiel Druckspooler: – Der Zugriff auf die Druckwarteschlange ( Einschreiben von Druckaufträgen, herausnehmen von Druckaufträgen ) muss mittels mutual exclusion sicher implementiert werden. – Ist kein Auftrag in der Schlange muss der Druckspooler blockieren. – Ist die Druckerwarteschlange voll muss der druckende Prozess blockiert werden. Monitore - Synchronisation Lösung • Die Bedingung zum Blockieren und Deblockieren kann nur in den Prozeduren des Monitors erkannt werden. • Blockieren und Deblockieren von Prozessen kann daher nur innerhalb des Monitors durch – warten auf Bedingungsvariablen / Ereignisse und – setzen von Bedingungsvariablen / Ereignisse realisiert werden Seite 63 von 102 Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 64 von 102 Monitore - Synchronisation • Wird in einer Monitorprozedur erkannt das eine Weiterverarbeitung nicht möglich ist, wird auf das Eintreten einer Bedingung gewartet ( wait(event) – Realisierung – • Dies bewirkt dass der Prozess, der sich in der Monitorprozedur befindet blockiert wird. Darauf wird er Monitor für einen auf Zutritt in den Monitor wartenden Prozess freigegeben, der dann eine Monitorprozedur ausführen kann, die die Bedingung für die Weiterverarbeitung eines blockierten Prozesses herstellen kann ( signal(event) ). Damit nicht zwei Prozesse gleichzeitig den Monitor benutzen, – – darf der jetzt deblockierte Prozess erst dann den Monitor betreten, wenn der die Deblockierung auslösende Prozess den Monitor wieder verlassen hat. Das Deblockieren eines Prozesses sollte daher die letzte Anweisung in einer Monitorprozedur sein. Monitore - JAVA-Beispiel Produzent Lager Verbraucher 4/4 4 Produziere Hole aus Lager 1 4 Lege ins Lager 4/0 1 Verbrauche Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 65 von 102 Monitore - JAVA-Beispiel JAVA-Klasse AnwendungsKlasse Thread Monitor Lager erzeugt Zugriff auf erzeugt Klasse Produzent erzeugt Klasse Konsument Ist ein JAVA Programmbeispiel // Anwendungsklasse - IPCTest erzeugt einen Monitor und zwei Threads ( Produzent, Verbraucher ) import java.lang.*; public class IPCTest { monitor lager; producer produzent; consumer verbraucher; // ------------Methoden ---------------------public IPCTest () { lager=new monitor(); // Monitor erzeugen System.out.println("Monitor erzeugt"); produzent=new producer(lager); // Thread Produzent erzeugen System.out.println("Produzent erzeugt "); verbraucher=new consumer(lager); // Thread Verbraucher erzeugen System.out.println("Verbraucher erzeugt "); produzent.start(); verbraucher.start(); // Produzent starten // Verbraucher starten } public static void main(java.lang.String[] args) { IPCTest anwendung=new IPCTest(); } } Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 66 von 102 // Klasse realisiert einen Monitor für das Schraubenlager zwischen den beiden Threads Produzent, Verbraucher import java.lang.*; public class monitor { int lager=0; final int MAX = 4; // ---------------Methoden ------------------public synchronized void aus_lager(int zahl) { while ( (lager-zahl)<0 ) { System.out.println("Lager hat nicht genug Schrauben - ich warte"); try { wait(); } catch ( InterruptedException e ) { System.out.println("Exception in Monitor.Methode: aus_lager"); } } lager=lager-zahl; // Schauben aus Lager entfernen System.out.println(" "+zahl+" Schrauben aus Lager genommen"); notify(); // wartende Threads informieren } public synchronized void in_lager(int zahl) { while ( (lager+zahl) > MAX) { System.out.println("Lager hat nicht genug Platz für "+zahl+" Schrauben - ich warte"); try { wait(); } catch (InterruptedException e) {System.out.println(" Exception in Monitor.Methode: in_lager");} } lager=lager+zahl; // Schrauben in Lager legen System.out.println(" "+zahl+" Schrauben in Lager gelegt"); notify(); // wartende Threads informieren }} // Klasse realisiert den Thread Schrauben-Produzent public class producer extends Thread { private monitor lager; // Referenz auf globale Variable Lager public producer(monitor data) { super(); lager=data; } public void run() // Thread-Anweisungen { int i,status; for ( i=1; i<=12; i++) { System.out.println("Produziere 1 Schraube"); lager.in_lager(1); } }} // Klasse realisiert den Thread Schrauben-Verbraucher import java.lang.*; public class consumer extends Thread { private monitor lager; // Referenz auf globale Variable lager public consumer(monitor data) { super(); lager=data; } public void run() // Thread-Anweisungen { int i,status; for(i=1; i<=3;i++) { lager.aus_lager(4); System.out.println("Verbrauche 4 Schrauben"); } } } Prof. Dr. Keller 4.3.5 Systemsoftw are-Skript Version 1.1 Seite 67 von 102 Verklemmungen Verklemmungen • Entdecken und Beheben – Protokollieren von Betriebsmittelanforderungen und Betriebsmittelbenutzung durch Aktualisieren des Betriebsmittelgraphen. – Prüfen des Graphen auf Zyklen und entfernen eines Prozesses aus dem Zyklus, so daß Zyklus aufgelöst wird. • Was ist ein Betriebsmittelgraph ? Symbol für ein Betriebsmittel Symbol für ein Prozeß BM P Prozeß P benutztt Betriebsmittel BM BM P Prozeß P ist blockiert und wartet auf Betriebsmittel BM Beipiel BM1 P2 benutzt BM1 P1 wartet auf BM1 P1 benutzt BM2 P2 wartet auf BM2 P1 P2 Zyklus Verklemmung BM2 Verklemmungen • Vermeidung – Vorbeisteuern an Verklemmungen dadurch, daß man Anforderungsketten von vorneherein vermeidet – Banker Algorithmus ( Dijkstra, 1965 ) ( Quelle: Tanenbaum, Modern Operating Systems ) • Algorithmus geht davon aus, daß jeder Prozeß zu Beginn angibt wie viele Betriebsmittel er zur Laufzeit benötigt • reine Theorie, in der Praxis nicht anwendbar Prof. Dr. Keller 4.4 4.4.1 4.5 4.5.1 Systemsoftw are-Skript Version 1.1 Kommunikation Nachrichten Interprozesskommunikation unter UNIX Signale und PIPES Interprozesskommunikation unter UNIX • Signale – UNIX kennt 32 verschiedene Signale. Signal sind asynchron. – Der Benutzer kann sich seine eigene Signalhandler schreiben. – Funktionen: kill(Signal,PiD): sende Signal an Prozess pause( ): warte auf nächstes Signal sigaction(Signal, Zeiger auf Funktion): Definition eines eigenen Signalhandlers • Pipes – Eine pipe ist eine Byte-FIFO. Zugriffe auf die pipe sind vergleichbar mit Dateibearbeitung. Eine pipe kann maximal 4096 Byte speichern und bildet einen unidirektionalen Kanal zwischen zwei Prozessen. Ist die pipe voll wird der einschreibenede Prozess blockiert ist die pipe leer wird der lesende Prozess blockiert write() read() Prozess 1 Prozess 2 schreibt in die pipe pipe liest aus der pipe Seite 68 von 102 Prof. Dr. Keller 4.5.2 Systemsoftw are-Skript Version 1.1 Seite 69 von 102 Semaphore, Shared Memory, Nachrichten Interprozesskommunikation unter UNIX System V • Gemeinsame Daten ( shared memory ) – gemeinsame Nutzung von Segmenten im virtuellen Adreßraum. Das Segment wird systemglobal erzeugt und mittels einer Kennung kann auf den Datenbereich zugegriffen werden. UNIX stellt 3 Funktionen zu Verfügung • kreieren eines gemeinsamen Datenbereichs • benutzen eines erzeugten Datenbereiches • Segment wieder freigeben • Semaphore – Es können allgemeine Semaphore und Semaphormengen benutzt werden. Die Semaphore werden systemglobal angelegt – Binäre Semaphore gibt es nicht • Nachrichten ( messages ) – Es wird eine systemglobale Nachrichten-FIFO erzeugt. Mit zwei Funktionen send und receive können Nachrichten ausgetauscht werden. 4.6 Interprozesskommunikation in Windows NT 4.6.1 Gemeinsame Daten Die Einrichtung eines Shared Memory wird nur zwischen Prozessen benötigt. Nebenläufige Threads eines Prozesses laufen im gleichen Adressraum ab und können damit auf globale Programmvariablen zugreifen. Shared Memory basiert in NT auf der Technik File Mapping. Beim File Mapping wird eine Datei in den virtuellen Adressraum eines Prozesses eingelagert. Nach dem Einlagern erfolgen die Dateizugriffe nicht auf die Festplatte sondern über Zeiger direkt im Arbeitsspeicher. Beim Einlagern kann man als Zugriffsmodus readonly oder read/write vereinbaren. Um auf eine shared memory zuzugreifen benutzen unterschiedliche Prozesse das gleiche mapped file. Mapped Files können in NT auch im paging-File liegen. Die Technik ist nicht netzwerkfähig. 4.6.2 STOP/U Synchronisation NSTOP -ME CHANISMUS Zu jedem Thread wird ein Zähler angelegt, der die Stop- und Unstop-Anweisungen zu einem Thread speichert. Jeder stop-Aufruf erhöht den Zähler. Jeder unstop deblockiert den Thread, wenn der Zähler auf 0 gesetzt wird. Ist der Zähler größer 0 wird nur der Zähler erniedrigt, der Thread aber nicht blockiert. Funktionen: suspendThread(Thread) resumeThread(Thread) entspricht stop entpricht unstop Prof. Dr. Keller KRITISC BERE HE Systemsoftw are-Skript Version 1.1 Seite 70 von 102 ICHE Kritische Bereiche können nur von nebenläufigen Threads innerhalb eines Prozesses bei Zugriff auf globale Variablen benutzt werden. Ein kritischer Bereich wird als globale Variable vom Typ CRITICAL_SECTION im Prozess erzeugt. Es kann immer nur ein Thread in den kritischen Bereich eintreten, d.h. die Variable benutzen. Funktionen: InitializeCriticalSection(kritischer Bereich) EnterCriticalSection(kritischer Bereich) LeaveCriticalSection(kritischerBereich) DeleteCriticalSection(kritischer Bereich) initialisiert die Variable. betreten des den kritischen Bereichs durch ein Thread. Der kritische Bereich ist damit für andere Threads gesperrt. der kritische Bereich wird wieder freigegeben. löscht die Variable Mutex-Objekte Unter NT entspricht ein Mutex-Objekt einem binären Semaphor. Mutex-Objekte werden zum Schutz von shared memory genutzt auf den verschiedene Prozesse zugreifen. Funktionen: CreateMutex() OpenMutex(Mutexobjekt) waitforSingleObject(MutexObjekt) ReleaseMutex(Mutexobjekt) Ein Mutex-Objekt wird erzeugt Benutzt ein vorhandenes Mutex-Objekt Wird benutzt um sich den Mutex zu holen. Ist da Mutexobjekt schon von einem anderen Prozeß benutzt wird der aktuelle Prozeß blockiert, bis der Mutex wieder freigeben ist. gibt den Mutex wieder frei Signale Signale unter NT sind Events. Signale sind synchron. Funktionen: CreateEvent(Initialwert) DeleteEvent(event) ResetEvent(event) PulsEvent(event) Signal erzeugen und initialisieren. Signal auf 1 setzen. Alle wartenden Threads werden deblockiert. Signal wird gelöscht. Signal auf 1 setzen. Wenn alle wartenden Threads deblockiert sind, dann wird das Signal wieder auf 0 gesetzt. Um auf ein Signal zu warten wird die Funktion waitforSingleObject(Objekt) verwendet. Als Objekte können hier nicht nur Signale sondern auch Prozesse, Mutex-Objekte, Semaphore u.a. angeben werden. Windows NT stellt auch eine Funktion waitforMultipleObejcts(Objektliste) zu Verfügung. Mit dieser Funktion kann auf das Eintreten mehrerer Signale reagiert werden. Über ein Flag können die angegebenen Objekte entweder UND- oder ODER-verknüpft werden. Semaphore NT stellt allgemeine Semaphore zu Verfügung. Beim Erzeugen eines Sempahors kann ein Maximalwert für den Sempahor vereinbart werden. Setzt man diesen Maximalwert auf 1 erhält man einen binären Semaphor. Eine P-Operation blockiert ein Thread, falls der Semaphorwert 0 ist, sonst wird der Semaphor um 1 erniedrigt. Bei der V-Operation kann der Sempahorwert um einen Betrag größer 1 erhöht werden ( Flusszahl > 1 ). Prof. Dr. Keller Funktionen: Systemsoftw are-Skript Version 1.1 CreateSemaphor( Initialwert, Maximalwert,) ReleaseSempahor(Semaphorobjekt, Flußzahl ) WaitForSingleObject(Semaphorobjekt) Seite 71 von 102 Erzeugt und initialisiert ein Semaphor-Objekt. Entspricht der V-Operation Entspricht der P-Operation Mit der Funktion WaitForMultipleObjects(Sempahor1, ...,Sempahor-n, Flag=UND) kann ein Mengensemaphor realisiert werden. 4.6.3 Kommunikation über Nachrichten Pipes Anonyme Pipe: vergleichbar mit Unix. Die Pipe ist ein unidirektionaler Nachrichtenkanal zwischen zwei Prozessen. Die Pipe ist nicht netzwerkfähig. Named Pipe: Eine Pipe mit einem frei vergebbaren Namen. Die Verbindung kann sowohl uni- als auch bidirektional aufgebaut werden. Es ist sowohl ein byteweiser Zugriff wie bei einer Unix-Pipe, als auch Nachrichten(Paket-) orientierter Zugriff möglich. Netzwerkfähig. Mail Slots Netzwerkfähig. Ein Mailslot ist eine Nachrichten-FIFO ( mailslot-Server), die auf einem lokalen Rechner in einem Netzwerk erzeugt wird. Nur der Prozess, der den Mailslot erzeugt, kann als Empfänger einer Nachricht die Nachrichten aus der FIFO lesen. Es können jedoch beliebige Prozesse auf unterschiedlichen Rechnern im Netzwerk Nachrichten in die mailslot schreiben. Bei Mailslots kann ein Sender seine Nachrichten an einen oder mehrere Empfänger senden ( Broadcasting ). Dies wird dadurch realisiert, dass auf verschiedenen Rechnern im Netzwerk mailslots mit gleichen Namen angelegt werden. Eine Nachricht an einen mailslot mit Namen xxx wird dann an alle Rechner im Netzwerk gesendet, auf denen ein mailslot-server mit Namen xxx installiert ist. Funktionen: CreateMailslot (Name, Maximale Größe einer Nachricht) Lesen mit readFile(), Schreiben mit writeFile() Prof. Dr. Keller 4.7 4.7.1 Systemsoftw are-Skript Version 1.1 Seite 72 von 102 Problem des schlafenden Friseurs (Sleeping Barber) Problembeschreibung Das Beispiel des schlafenden Friseurs zeigt anschaulich, was passieren kann, wenn es keinen gegenseitigen Ausschluss durch Semaphoren für die Synchronisation von Prozessen oder Threads gibt. Auf den Abbildungen ist die Türglocke der Zähler, jedes Mal wenn die Tür aufgeht, klingelt die Türglocke und der Friseur zählt seinen Kundenzähler um eins hoch. Wenn der Friseur mit einem Haarschnitt bei einem Kunden fertig ist, zählt er seinen Zähler um eins herunter. Beim Hinausgehen klingelt die Glocke nicht. Die Fehlerquelle liegt bei der Türglocke, da gleichzeitig mehrere Kunden hereinkommen können, während die Türglocke nur einmal bimmelt. Um den Fehler zu verhindern, müsste gewährleistet werden, dass immer nur ein Kunde durch die Tür kann. In der Interprozesskommunikation wäre diese Schutzmöglichkeit ein Semaphor. Der Kundenzähler wird also auf 3 inkrementiert, obwohl sich 4 Kunden im Raum befinden. Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 73 von 102 Die Folge des Fehlers ist, dass der Kundenzähler beim Hinausgehen des vorletzten Kunden bereits auf 0 dekrementiert wird, obwohl sich noch ein Kunde im Raum befindet. Der Friseur legt sich wieder schlafen, da er davon ausgeht, dass keine Kunde mehr im Raum ist. In der Praxis könnte man das Friseurproblem anhand eines Druckerspoolers demonstrieren. Jeder Prozess, der eine Datei ausdrucken möchte, muss den Namen der Datei in ein spezielles SpoolerVerzeichnis schreiben. Der Drucker-Dämon überprüft periodisch, ob dort auszudruckende Dateien eingetragen worden sind, druckt sie gegebenenfalls aus und löscht die Namen aus dem Verzeichnis. Es gibt zwei Variablen, die eine verweist auf den nächsten freien Platz, die andere auf die nächste zu druckende Datei. Diese beiden Variablen stehen in einer Datei auf die alle Prozesse zugreifen können. Nun kann es vorkommen, dass zwei Prozesse mehr oder weniger gleichzeitig eine Datei ausdrucken möchten. Der Prozess A, der gerade ausgeführt wird, liest die Variable mit dem nächsten freien Platz und merkt sie sich. Der Prozess A wird unterbrochen, da seine Prozessorzeit um ist. Das Betriebssystem veranlasst einen Prozesswechsel zum Prozess B, der auch drucken möchte. Dieser liest ebenfalls die Variable mit den freien Platz im Verzeichnis, merkt sie sich, schreibt den Dateinamen an die freie Stelle und erhöht den Wert um 1 (auf den nächsten freien Platz). Seine restliche Prozessorzeit verwendet er für andere Dinge. Irgendwann wird der Prozess A, der zuerst drucken wollte, an der Stelle weiter ausgeführt an der er unterbrochen wurde. Er hat sich die freie Stelle gemerkt und schreibt nun seinen Dateinamen an diese Stelle, dabei überschreibt er den anderen Dateinamen. Die Datei vom zweiten Prozess B wird also nie gedruckt. Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 74 von 102 Dieses Problem kann durch gegenseitigen Ausschluss (Mutual Exclusion) der Prozesse beim Zugriff auf das Spooler-Verzeichnis umgangen werden. 4.7.2 Petrinetz Startet Customer 0 Schlafe Prüfe Waiting 0 Melde Dich an Mutex Waiting -- 0 0 0 Warte 0 Melde Dich bereit Barber 0 Haarschnitt 0 Schneide 0 Gehe 0 Terminiert Frisör Kunde Gehe Prof. Dr. Keller 4.7.3 Systemsoftw are-Skript Version 1.1 Seite 75 von 102 Pseudocode Algorithmus für den Friseur: Wenn kein Kunde (Kundenzähler = 0) da ist, schlafe. Wenn Türglocke bimmelt, wache auf und zähle den Kundenzähler um eins hoch und schneide Haare. Wenn fertig mit Haare schneiden, zähle Kundenzähler um eins herunter. Solange Kundenzähler nicht Null ist, schneide Haare. Algorithmus für Kunden: Wenn Friseur schläft, wecke ihn. Wenn Friseur beschäftigt, warte auf Wartestuhl. Wenn schon fünf Kunden warten, gehe wieder und komm später wieder. Eine geeignete Lösung für dieses Problem, ohne dass es unter den einzelnen Kunden (Threads) zu Wettkampfbedingungen kommt, wäre folgender Pseudocode: Binary semaphore mutex = 1; Binary semaphore barber = 0; Counting semaphore customers = 0; int waiting = 0; void Barber(void) { while(true) { P(customers); // wait for or get next customer P(mutex); Waiting--; V(barber); V(mutex); Cut_Hair(); } } void Customer(void) { while(true) { P(mutex); //check waiting room if(waiting < numChairs) { waiting++; V(customers); V(mutex); P(barber); //wait for barber get_hair_cut(); } else V(mutex); } } 4.7.4 Sourcecode Barber // Erzeugung der Ressourcen durch den Barber TSharedMemory *Msg;// = new TSharedMemory; // zählende Semaphore für die Kunden hCustomer = CreateSemaphore(NULL, 0, 5, "SemCustomer"); // binäre Semaphore für sich selbst hBarber = CreateSemaphore(NULL, 0, 1, "SemBarber"); Prof. Dr. Keller // binäre hMutex // Shared hWaiting Systemsoftw are-Skript Version 1.1 Seite 76 von 102 Semapohre als Mutex = CreateMutex(NULL, TRUE, "Mutex"); Memory = ::CreateFileMapping((HANDLE)0xFFFFFFFF, NULL,PAGE_READWRITE, 0, sizeof(TSharedMemory), "MemWait"); // Barber öffnet und initialisiert das Shared Memory Msg = (TSharedMemory*)::MapViewOfFile(hWaiting, FILE_MAP_WRITE, 0, sizeof(TSharedMemory)); Msg->Zaehler = 0; 0, // Shared Memory schliessen ::UnmapViewOfFile(Msg); // Mutex freigeben ReleaseMutex(hMutex); while(!Terminated) { // Barber blockiert sich an der Semapohre des Kunden if(WaitForSingleObject(BarbForm->hCustomer, 100) == WAIT_OBJECT_0) { // Messages an Toolbook entsprechen den Transitionen SendTBMessage(WacheAuf); SendTBMessage(BHoleMutex); // Handle auf Mutex erzeugen hMutex = OpenMutex(MUTEX_ALL_ACCESS|SYNCHRONIZE, 0, "Mutex"); // auf Mutex warten if(hMutex != NULL) { if((WaitForSingleObject(hMutex, INFINITE))== WAIT_OBJECT_0) { TSharedMemory *Msg; // Handle auf Shared Memory erzeugen hWaiting = ::OpenFileMapping(FILE_MAP_WRITE, 0, "MemWait"); if (hWaiting) { // Shared Memory öffnen Msg = (TSharedMemory*)::MapViewOfFile(hWaiting,FILE_MAP_WRITE, 0, 0, sizeof(TSharedMemory)); // Zähler erniedrigen Msg->Zaehler --; // Message an Toolbook SendTBMessage(BWaiting); // Shared Memory schliessen ::UnmapViewOfFile(Msg); // Handle schliesse ::CloseHandle(hWaiting); // Mutex freigeben ReleaseMutex(hMutex); } } } SendTBMessage(BGebeMutex); // Semaphore erhöhen ReleaseSemaphore(BarbForm->hBarber, 1, NULL); // Botschaften lösen Toolbook Animationen aus SendTBMessage(ErhoeheBarber); SendTBMessage(Schneide); SendTBMessage(Schlafe); } } } Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 77 von 102 Customer SendTBMessage(CHoleMutex); // Customer verschafft sich ein Handle auf den Mutex und blockiert dann hMutex = OpenMutex(MUTEX_ALL_ACCESS|SYNCHRONIZE, 0, "Mutex"); if(hMutex != NULL) { if((WaitForSingleObject(hMutex, INFINITE))== WAIT_OBJECT_0) { TSharedMemory *Msg; // Shared Memory öffnen hWaiting = ::OpenFileMapping(FILE_MAP_WRITE, 0, "MemWait"); if (hWaiting) { Msg = (TSharedMemory*)::MapViewOfFile(hWaiting,FILE_MAP_WRITE, 0, 0, sizeof(TSharedMemory)); // Zähler prüfen if(Msg->Zaehler < 5) { // Zähler erhöhen Msg->Zaehler++; SendTBMessage(CWaiting); // Shared Memory schliessen ::UnmapViewOfFile(Msg); // Handle freigeben ::CloseHandle(hWaiting); ReleaseMutex(hMutex); SendTBMessage(CGebeMutex); SendTBMessage(Erhoehe Customer); // Handle auf zählende Semaphore erzeugen hCustomer = OpenSemaphore(SEMAPHORE_MODIFY_STATE, false, “SemCustomer”) // Wert erhöhen ReleaseSemaphor(hCustomer, 1, NULL); CloseHandle(hCustomer); // Handle auf Semaphor des Barbers erzeugen hBarber = OpenSemaphore(SEMAPHORE_MODIFY_STATE|SYNCHRONIZE, false, “SemBarber”); if(NULL != hBarber) { SendTBMessage(Warte); // Customer blockiert sich an der Sempahore des Barbers If((WaitForSingleObject(hBarber, INFINITE)) == WAIT_OBJECT_O) { // Handle schliessen CloseHandle(hBarber); SendTBMessage(Haarschnitt); SendTBMessage(Gehe); // Customer beendet sich selbst Terminate(); } } } // Im Fall, dass schon 5 Customer da sind else { // Shared Memory schliessen ::UnmapViewOfFile(Msg); // Handle schliessen ::CloseHandle(hWaiting); // Mutex freigeben ReleaseMutex(hMutex); Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 78 von 102 SendTBMessage(CCancle); Application->Terminate(); } }//hWaiting }//waitfor } // Möglicherweise ist kein Barber da. else { MessageDlg("No Barber", mtError, TMsgDlgButtons() << mbOK, 0); Application->Terminate(); } }//if mutex 4.8 Übungsaufgaben 4.8.1 Aufgabe 14 Das folgende Petrinetz zeigt zwei verkoppelte Prozesse P1 und P2. Die Transitionen a und b beschreiben Aktionen von P1, die Transitionen c und d Aktionen von P2, die Stellen M, S1 und S2 sind Synchronisationsstellen zwischen den beiden Prozessen. M a c S1 S2 b d Prozeß P1 Prozeß P2 Zur Synchronisation stehen den beiden Prozessen binäre Semaphore und die beiden Funktionen Anfordern Semaphor S: Freigabe Semaphor S: P(S) V(S) zur Verfügung. a) Geben Sie das Programm der beiden Prozesse P1 und P2 in Pseudocode an. Zur Initialisierung der Semaphore wird ein eigenes Programm INIT realisiert. Gehen Sie davon aus, dass dieser Prozess die Semaphore nach obigem Petrinetz korrekt initialisiert bevor P1 und P2 starten. Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 program P1; var M,S1,S2 : Semaphor; begin program P2; var M,S1,S2 : Semaphor; begin end. end. Seite 79 von 102 b) Prüfen Sie das System auf Verklemmungsfreiheit, indem Sie den Ereignisgraphen (Markierungsübergangsgraphen) zu dem Petrinetz erstellen und die Zustände markieren, in denen eine Verklemmung vorliegt. c) Das verkoppelte System kann verklemmungsfrei realisiert werden, indem Sie die Ursache für die Verklemmung eliminieren. Geben Sie die Programme von P1 und P2 für ein verklemmungsfreies System an, wenn die Aktionen der beiden Prozesse die folgende Sequenz bilden sollen: a b c d a b c d a ... 4.8.2 Aufgabe 15 Stellen Sie sich vor, Sie arbeiten mit einem Betriebssystem, dass zur Prozesssynchronisation ausschließlich binäre Semaphore zur Verfügung stellt. Zur Synchronisation zweier Prozesse P1 und P2 brauchen Sie jedoch einen allgemeinen Semaphor. Sie müssen sich die entsprechenden Systemfunktionen P ( Anfordern Semaphor ) und V ( Freigeben Semaphor ) selbst schaffen. Zeigen Sie, wie man mit Hilfe von binären Semaphoren einen allgemeinen Semaphor realisieren kann. Ergänzen Sie die untenstehenden Programmfragmente so, dass zwei Prozeduren für die Semaphoroperationen P und V entstehen! Verwenden Sie zur Beschreibung eine PASCAL ähnliche Notation. Hinweis: Die Realisierung der allgemeinen Semaphore basiert auf der Idee eine globale Zählvariable SEMA mit einem Wertebereich { -n,...0,...n } zur Realisierung eines allgemeinen Semaphor einzuführen. Negative Werte von SEMA kennzeichnen die Anzahl von Prozessen deren P-Operation in den Zustand blockiert führte. Zum Schutz von kritischen Bereichen und zum Blockieren eines Prozesse werden zwei binäre Semaphore S und M benötigt. Vorgaben Prozeduren für binäre Semaphoroperationen : pbin (var s: binärer Semaphor) vbin (var s: binärer Semaphor) binäre Semaphore : S und M zählende Semaphorvariable : SEMA Wertebereich{-n,...0,...n} = ganze Zahl Zu realisierende Prozeduren für allgemeine Semaphore: P() und V() Anfangswerte der Variablen Gehen Sie bei Ihren Überlegungen davon aus, dass die Semaphore und die globale Variablen wie folgt vorbelegt sind: M = 1; S =0 SEMA = 0 Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 80 von 102 Prozedurfragmente zur Vervollständigung p() begin v() begin if (SEMA < 0) then begin if (SEMA < 0) then begin end else begin end else begin end; end; end; end; 4.8.3 Aufgabe 16 Sie arbeiten mit einem Betriebssystem, in dem zur Interprozesskommunikation binäre und allgemeine Semaphore ( nur mit Flusszahl=1 ) verwendet werden können. Das Betriebssystem stellt 16 binäre und 8 allgemeine Semaphore zu Verfügung. Ein binärer Semaphor wird über eine Nummer zwischen 0 und 15, ein allgemeiner Semaphor durch eine Nummer zwischen 16 und 23 angesprochen. Über die Betriebssystemfunktionen Pbin(Semaphornummer) und Vbin(Semaphornummer) kann man die binären Semaphore nutzen. Mit P(Semaphornummer) und V(Semaphornummer) benutzt man die allgemeinen Semaphore. Beschreiben Sie den Algorithmus, wie das Betriebssystem die beiden Funktionen für binäre Semaphore, Pbin() und Vbin(), realisiert. Geben Sie die Programmstücke von Pbin und Vbin jeweils durch ein Programmstück in Pseudocode an. Welche Datenstrukturen bzw. Variablen benötigt das Betriebssystem zusätzlich zu den Semaphorvariablen ? void Pbin(unsigned int sema) { void Vbin(unsigned int sema) { } } Prof. Dr. Keller 4.8.4 Systemsoftw are-Skript Version 1.1 Seite 81 von 102 Aufgabe 17 Sie wollen Ihr Betriebssystem um allgemeine Semaphore erweitern und sollen dazu die indirekte Nachrichtenkommunikation zur Realisierung benutzen. Dazu müssen Sie zwei Funktionen P ( Semaphor S ) und V ( Semaphor S ) programmieren und in einem vorübersetzten Modul als Objekte den Prozessen zu Verfügung stellen. Ein zusätzlicher Prozess zur Verwaltung von Semaphoren wird nicht benötigt Über diese beiden Funktionen kann ein Prozess immer nur genau einen Semaphor beantragen oder freigeben ( Flusszahl = 1 ). Wie wird ein Semaphor im System realisiert ? Wie sind die beiden Funktionen P() und V() zu realisieren, wenn sie die beiden Systemfunktionen send(Mailbox,Nachricht) und recieve(Mailbox,Nachrichtenpuffer) zu Verfügung haben. procedure P( Semaphor S ) begin end; procedure V( Semaphor S ) begin end; Prof. Dr. Keller 4.8.5 Systemsoftw are-Skript Version 1.1 Seite 82 von 102 Aufgabe 18 Auf Ihrem Rechensystem soll ein Weckdienst installiert werden. Dieser Weckdienst soll durch eine reentrant Prozedur " WakeMe " und ein Systemprozess " Clock " realisiert werden. Ein Prozess, der sich für eine endliche Zeit selbst blockieren will, kann dies durch Aufruf der Prozedur WakeMe erreichen. Die Wartezeit des Prozesses wird dieser Prozedur als Parameter in Form einer ganzen Zahl übergeben, die die Wartezeit in Anzahl von Zeiteinheiten ( clock ticks ) angibt. Der Prozess clock wird periodisch bei jedem Timer-Interrupt aktiviert. Die Synchronisation zwischen Benutzerprozess, Prozess clock und Interruptroutine erfolgt über binäre Semaphore. In einer globalen Variablen count wird die Anzahl der wartenden Prozesse gespeichert. Der Prozess clock deblockiert nach jedem Timer IR die wartenden Benutzerprozesse, so dass diese Ihre verbleibende Wartezeit korrigieren können und bei Ablauf der Wartezeit weiter arbeiten können. Die Prozedur WakeMe und der Prozess clock sind wie folgt implementiert: Vereinbarte Semaphore zur Synchronisation: MUTEX: WAIT: QUIT: TICK: semaphor=1; semaphor=0; semaphor=0; semaphor=0; Benötigte globale Variable zum Speichern der Anzahl von wartenden Prozessen count: integer = 0; procedure WakeMe(time : integer) begin while ( time > 0 ) do begin P(MUTEX); count := count + 1; P(WAIT); V(MUTEX); V(QUIT); time := time -1; end; end; process clock begin while ( TRUE )do begin P(TICK); P(MUTEX); while ( count > 0 ) do begin V(WAIT); P(QUIT); count := count -1 ; end; V(MUTEX); end; end. Analysieren Sie die beiden Programme. Ist die Synchronisation korrekt oder können Fehler auftreten? Wenn ja welche Fehler und wie sind diese zu beheben ?. 4.8.6 Aufgabe 19 Realisierung von Semaphoren mit Flusszahl >1 mit asynchronen, indirekten Nachrichten Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 83 von 102 5. Dateiverwaltung Dateien dienen der langfristigen ( persistente ) Speicherung von Daten. Massenspeicher präsentieren sich als eine sehr große Liste von Blöcken, die einzeln ausgelesen und verändert wieder zurück geschrieben werden. Diese Datenblöcke werden beginnend mit 0 fortlaufend durchnummeriert. Ohne ein Dateisystem fehlen nicht nur jegliche Informationen, welche Blöcke belegt sind und welche nicht; auch können weder die Namen der Dateien noch die Struktur der Verzeichnisse festgehalten werden. Wie man sieht, besteht die Dateiverwaltung auf Massenspeichern nicht nur aus dem reinen Ablegen der einzelnen Daten; vielmehr gibt es eine große Zahl weiterer Anforderungen. Diese zu erfüllen, ist die Aufgabe eines Dateisystems: Es bildet den Mittler zwischen der "physikalischen Struktur" der Festplatte bzw. Diskette und der logischen Struktur der Daten. Da sich sowohl die im System befindlichen Dateien, als auch die Verzeichnisstruktur, bedingt durch die Arbeit damit, ständig ändern, muss ein Dateisystem entsprechende Funktionen anbieten, mit denen Dateien und Verzeichnisse erzeugt, gelöscht oder umstrukturiert werden können. Dies ist über die "Systemfunktionen" möglich, die von den einzelnen Programmen aufgerufen werden. Im interaktiven Betrieb sind z.B. unter Linux vor allem die GNU-Utilities wie cp, mv, ls ... für die Arbeit mit dem Dateisystem verantwortlich. Auch sie verwenden die entsprechenden Systemaufrufe, die von Kernel und Dateisystem zur Verfügung gestellt werden. Natürlich ist es auch notwendig, dass diese Aktionen so schnell und effektiv wie möglich durchgeführt werden - zusätzlich sollte auch noch möglichst wenig Speicherplatz für die Speicherung der Struktur verbraucht werden, sowie größtmögliche Sicherheit im Umgang mit den Daten geboten sein. Daraus ergeben sich vier wesentliche Forderungen an ein gutes Dateisystem: 1. Das Dateisystem muss eine sehr große Menge von Informationen effizient und sicher verwalten können. 2. Verschiedene Prozesse sollen auf die Dateien zugreifen können, ohne einander zu stören. 3. Die Arbeit mit den Dateien soll so wenig Ressourcen des Systems wie möglich verwenden. 4. Die einzelnen Dateien sollen nur von Benutzern verwendet werden können, die dazu berechtigt sind. Die Festplatte wird hierzu in Systembereich und Datenbereich unterteilt. Im Systembereich werden alle Informationen zur Verwaltung des Datenträgers und aller dazu notwendigen Datenstrukturen gespeichert. Dazu gehören in der Regel ein Bootblock, ein Superblock sowie weitere Systemdatenblöcke. Im Datenbereichbefinden sich die Datenblöcke, in denen die eigentlichen Daten gespeichert werden. Alle Informationen, die für die Verwaltung des Dateisystems benötigt werden, müssen sich auf der Festplatte befinden. Der Superblock enthält alle wichtigen Informationen die zur Verwaltung des dateisystems notwendig sind. Der Bootblock enthält den Urlader, ein Programm zum Laden des betriebssystems. Eine Festplatte kann in mehrer Partitionen ( logische Platten ) aufgeteilt werden. Jede Partition hat dann sein eigenes Dateisystem. Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Die seek time liegt im Bereich von 5- 15 m, die latency time liegt bei maximal 11 ms. Die mittlere Zugriffszeit liegt im Bereich von 7-12 ms. Im Vergleich dazu ist die mittlere Zugriffszeit auf Daten im Hauptspeicher bei ______ . Die Kapazität liegt in der Größenordnung mehreren GigaByte. Typische Blockgrößen: 512 Byte – 4 kByte Seite 84 von 102 Prof. Dr. Keller 5.1 Systemsoftw are-Skript Version 1.1 Seite 85 von 102 Aufbau von Dateisystemen und Katalogen Aufbau des Dateisystems - Kataloge Einstufiges Dateisystem Katalog ( Directory) Inhaltsverzeichnis des Volume Verwaltung der Dateien Pro Datei genau 1 Eintrag Datenträger Volume Katalogeintrag Datei #1 Name der Datei Dateiattribute Ort der Daten auf dem Volume Datei #n Aufbau des Dateisystems - Kataloge Stammverzeichnis Zweistufiges Dateisystem Datenträger Volume Katalogeintrag Benutzerkatalog Verweis auf Benutzerkatalog Katalogeintrag Katalogeintrag Datei #1 Datei #n Benutzerdateien Datei #1 Datei #m Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 86 von 102 Aufbau des Dateisystems - Kataloge Stammverzeichnis ( root ) Hierarchisches Dateisystem Datenträger Volume Katalogeintrag Unterverzeichnis Stufe 1 Datei Stufe 2 Stufe 3 Arbeitsverzeichnis Stufe 4 Zugriff auf eine Datei über Pfadangabe absolut relativ zum Arbeitsverzeichnis Aufbau des Dateisystems - Kataloge Hierarchisches Dateisystem mit Links root Datenträger Volume Katalogeintrag Datei Link Originaldatei (Owner) Datei existiert genau einmal ( Owner) Es können mehrere Katalogeintrage auf die Datei verweisen ( Links ) Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 87 von 102 Hierarchisches Dateisystem mit Links Hard-Link Logischer Link Der Link wird über eine zusätzliche (Link-)datei realisiert Die (Link-)datei enthält nur den Pfadnamen der verlinkten Datei Der Katalogeintrag verweist auf diese angelegte Link-datei. Der Katalogeintrag verweist auf eine physikalische Adresse, in der eine Beschreibung der Originaldatei liegt. Diese Dateibeschreibung ist fest mit der Originladatei verbunden und enthält alle Dateiattribute, auch die physikalische Lage auf der Festplatte und einen LinkZähler. Nachteil: Wird die Originaldatei gelöscht oder verschoben so existiert die (Link-)datei noch und enthält den alten unveränderten Pfadnamen. Der Link ist ist aber ungültig Vorteil: Beim verschieben oder umbenennen der Datei bleibt der Link auf die Dateibeschreibung gültig. Beim Löschen wird der Linkzähler geprüft. Die Datei wird nur dann gelöscht wenn der Linkzähler auf 1 steht, sonst wird nur der Link-Zähler erniedrigt. Vorteil: Netzwerkfähig, da der Pfadname eine Netzwerkadresse beinhalten kann. Nachteil: Löscht der Erzeuger A die Datei während noch ein weitere Link von B existiert, wird zwar die Datei nicht gelöscht. Der Katalogeintrag von A wird gelöscht, der Link von B existiert weiter. Jedoch wird nicht der Besitzereintrag in der Dateibeschreibung geändert. Besitzer bleibt also A. Beispiel: Beispiel: Windows NT UNIX Dateisystem Aufbau von Katalogen • Einstufiges Dateisystem ( CP/M ) Ben. code Dateiname 8 Hierarchisches Dateiname Anzahl Blöcke Dateityp Erweiterung Dateisystem Dateityp Liste von 16 Blöcken ( DOS ) Attribute Zeit Datum Erster Block Größe 8 Hierarchisches Dateisystem ( UNIX ) 8Je Datei eine Dateibeschreibung ( i-node ) i-node Nummer Dateiname Dateiattribute i-node 10 direkte Blöcke Einfach indirekt Zweifach idirekt Dreifach indirekt Blocknummer Blocknummer Blocknummer Blocknummer Blocknummer Blocknummer Blocknummer Blocknummer Blocknummer Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 88 von 102 Dateisystem Aufbau von Katalogen Informationen über die Datei Dateiname Eintrag Eintrag Dateiname Blöcke mit Verwaltungsinfo Dateityp Dateigröße Datenblock Eigentümer Eintrag Eintrag Shutzinformation Datenblock Erstellungszeitpunkt Zeitpunkt der letzten Änderung Datenblock Liste der physikal. Blöcke Physikal. Lage auf der Platte • • 5.2 Je Datei ein Eintrag Je Eintrag Dateiname, Attribute, Lage auf Platte Physikalische Organisation von Dateien Physikalische Organisation von Dateien Datei Sequenz von logischen Blöcken adressiert durch Dateiname Block 0 Block 1 Block 2 Dateianfang Festplatte Letzter Block nicht voll belegt mit Daten Dateiende Sequenz von physikalischen Blöcken adressiert über Spur und Sektor Block 0 Spur Sektor 0 0 Block 1 0 1 Block 2 0 2 Block 3 0 3 Block 4 1 0 Block 5 1 1 Block 6 1 2 Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 89 von 102 Physikalische Organisation von Dateien Kompakte zusammenhängende Speicherung Datei Block 0 Block 1 Block 2 Nur Block 0 in Katalogeintrag Festplatte Block 0 Block 1 Block 2 Block 3 Block 4 Block 5 Block 6 Vorteil: schneller Zugriff auf die Daten Nachteil: Fragmentierung Ausdehnung von Dateien schwierig Physikalische Organisation von Dateien Verkettete Liste Datei Block 0 Block 1 Block 2 Nur Block 0 in Katalogeintrag Festplatte 0 1 2 3 4 5 6 7 8 9 10 EOF Vorteil: keine externe Fragmentierung Ausdehnung von Dateien einfach Nachteil: langsamer, sequentieller Zugriff Dateninhalt < Blockgröße Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 90 von 102 Physikalische Organisation von Dateien Indextabelle ( Beispiel: FAT ( File Alocation Table ) ) Index Datei Block 0 Block 1 Block 2 Belegt durch BS 0 Belegt durch BS 1 frei 2 5 3 Nur Block 0 in Katalogeintrag frei 5 8 Tabelle liegt im Systembereich der Platte defekt frei 8 EOF Festplatte 0 1 2 3 4 5 6 7 8 9 10 frei EOF Vorteil: einfach; schneller Zugriff bei kleinen Platten Nachteil: langsam; speicherintensiv bei großen Platten 5.3 Genau eine Indextabelle pro Platte Für jeden physikalischen Block ein Tabelleneintrag Aufbau des Dateisystems ext2 von Linux Ext2 ( extended filesystem Version 2) ist das Standard Filesystem unter Linux. Es unterstützt Dateinamen bis 255 Zeichen, dateien bis 2 GByte und Datenträger bis 4 TByte. Unter Linux wird die Festplatte in einzelne Blockgruppen unterteilt, in denen sich sowohl die Datenblöcke, in denen die eigentlichen Daten gespeichert werden, als auch Freiraum für spezielle zur Verwaltung des Dateisystems benötigte Datenstrukturen befindet. Eine Blockgruppe setzt sich aus den in der folgenden Liste aufgezählten Elementen zusammen: - Superblock - Gruppendeskriptor - Block-Bitmap - Inode-Bitmap - Inode-Tabelle - Datenblocks Die Zusammensetzung einer Blockgruppe präsentiert sich wie folgt... Superblock Gruppendeskriptor 0 Gruppendeskriptor 1 … Gruppendeskriptor n Blockbitmap i-Nodebitmap i-Nodetabelle Daten blöcke … Datenblöcke Das ext2-Dateisystem kann mit Blöcken von 1, 2 oder 4 KB Größe arbeiten. Standardmäßig wird eine Blockgröße von 1 KB verwendet. Prof. Dr. Keller 5.3.1 Systemsoftw are-Skript Version 1.1 Seite 91 von 102 Repräsentation von Daten Die in einer Datei enthaltenen Daten werden in einem oder mehreren Datenblöcken gespeichert: Ist die Datenmenge kleiner (oder, im Extremfall) genau so groß wie die Blockgröße, genügt logischerweise ein einziger Block, um den Inhalt der Datei zu speichern; anderenfalls müssen mehrere Blöcke verwendet werden. Ein Block kann immer nur als Ganzes belegt werden, d.h. es ist nicht möglich, dass sich beispielsweise zwei kleine Dateien einen Block "teilen". Ext2fs verfährt also so, dass in einem Block stets nur die Daten einer einzigen Datei gespeichert werden können. Tatsächlich stellt sich das Problem allerdings differenzierter dar, da man nicht nur auf die optimale Plattenauslastung, sondern auch auf die Geschwindigkeit achten muss: Ein Datenblock besteht normalerweise aus 1 KByte. Es ist auch möglich, von diesem Wert abweichende Blockgrößen von 2 oder 4 KByte zu verwenden; allerdings muss diese Festlegung bereits beim Formatieren geschehen. Bei Platten, die zur Aufnahme sehr großer Dateien verwendet werden, wie sie beispielsweise bei Datenbankapplikationen entstehen, kann sich eine Vergrößerung der Blockgröße positiv auf die Geschwindigkeit auswirken. Sollen hingegen sehr viele kleine, d.h. nur wenige KB umfassende Dateien verwaltet werden, empfiehlt es sich, für die Blockgröße einen gegenüber dem Standard verkleinerten Wert zu verwenden, um so eine bessere Ausnutzung der vorhandenen Kapazität (bei kleineren Blockgrößen wird weniger Speicherplatz durch nicht vollständig ausgefüllte Blöcke vergeudet) zu erreichen - allerdings auf Kosten der Geschwindigkeit, da der eben genannte Vorteil durch einen höheren Verwaltungsaufwand erkauft wird (Je kleiner die Blockgröße ist, desto mehr Blöcke müssen für eine Datei organisiert und verwaltet werden). Wie man erkennt, stellt die verwendete Blockgröße immer einen Kompromiss zwischen Geschwindigkeit und Ausnutzung der Festplattenkapazität dar. Hinsichtlich dieser beiden Pole hat sich die Blockgröße von 1 KByte bewährt und ist für den allergrößten Teil der Computernutzungen der beste Wert, der bedenkenlos übernommen werden kann. Der eigentliche Grund, warum ein Block immer nur für eine einzige Datei verwendet werden kann, ist allerdings durch die Art und Weise bedingt, mit der ext2fs eine Datei verwaltet wird. 5.3.2 Repräsentation von Dateien Es muss zwischen der Repräsentation von Daten und Dateien unterschieden werden. Eine Datei ist quasi eine Symbiose zwischen zwei verschiedenen Arten von Daten: Zum einen die „Nutzdaten“, die bisher als Daten bezeichnet wurden, und zum anderen die zur Verwaltung der Nutzdaten notwendigen „Zusatzdaten“ wie Dateiname, Datengröße, etc. All diese Informationen werden in einer Datenstruktur zusammengefasst, die man als i-Node bezeichnet – der Kern der gesamten Unix-Dateiverwaltung. Jede Datei ( und auch, wie man später sehen wird, jedes Verzeichnis) wird unter Unix durch einen einzelnen i-Node repräsentiert, der Inhaltund Typ der Datei beschreibt. Superblock und Gruppendeskriptoren Dateien werden also mittels i-Nodes verwaltet, die sich neben den Nutzdaten mit auf der Festplatte befinden. Wie aber werden die i-Nodes selbst verwaltet? Da sich auf jeder Platte eine große Anzahl von i-Nodes herumtreibt, müssen auch diese vom Dateisystem verwaltet werden.. ext2fs verwendet zu diesem Zweck zwei weitere Konstruktionen, die zum einen als "Gruppendeskriptoren" und zum anderen als "Superblock" bezeichnet werden. Blockgruppe Alle Datenblöcke, die auf der Platte verfügbar sind, werden zu mehreren in übergeordnete Einheiten zusammengefasst, die man als "Blockgruppe" bezeichnet. Sinnvollerweise befinden sich in einer Blockgruppe nur Blöcke, die sich auch physikalisch auf der Festplatte nebeneinander befinden - die Zugriffszeit beim Lesen oder Schreiben von Blöcken innerhalb einer Blockgruppe sinkt dadurch enorm, da der Lesekopf der Festplatte unter anderem keine weiten Strecken auf der Festplatte zurücklegen muss. Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 92 von 102 Wie kann man aber feststellen, welche dieser Blöcke bereits mit Daten belegt sind und welche noch Daten aufnehmen können? Linux verwendet hierzu eine Struktur, die als Blockbitmap bezeichnet wird, und die in jeder Blockgruppe gespeichert wird - als Bestandteil des Gruppendeskriptors. Im Prinzip handelt es sich bei der Blockbitmap umeine Bitliste, in der jedes Bit einen Block innerhalb der Blockgruppe kennzeichnet. Ein Bit der Liste enthalten entweder eine 0 oder eine 1. Eine 1 weist darauf hin, dass der Block bereits belegt ist, während eine 0 den jeweiligen Block als frei verfügbar markiert. Für die Speicherung der i-Nodes selbst werden wiederum einige Blöcke aus der Blockgruppe verwendet. Die Inode-Tabelle wird im Gruppendeskriptor durch eine Zahl repräsentiert, die auf einen Block zeigt den Startblock für die Speicherung der i-Nodes. Zusätzlich wird eine bestimmte Anzahl von Blocks, die sich aus der Blockgröße und der Zahl der i-Node’s pro Blockgruppe ergibt, hinter dem Startblock gespeichert (da diese Werte beim Anlegen eines Ext2-Filesystems variabel eingestellt werden können, ist die Zahl der belegten Blöcke für die Speicherung der i-Node’s auch nicht fest, sondern schwankt je nach verwendeten Filesystem-Parametern). Der Superblock bildet zusammen mit den Gruppendeskriptoren quasi ein Layout der Festplatte, in dem alle für den Zugriff auf die Daten relevanten Informationen gespeichert sind. Die Integrität dieser Strukturen ist für ein fehlerfreies und sicheres Arbeiten mit dem Dateisystem also von höchster Bedeutung. Um eine Korruption dieser Strukturen auf alle Fälle zu vermeiden, speichert das ext2-Filesystem sie gleich vielfach auf der Platte ab: In jeder Blockgruppe befindet sich sowohl eine Kopie des Superblocks als auch der Gruppendeskriptoren aller anderen Blöcke. Normalerweise wird zwar nur der Superblock aus Blockgruppe 0 verwendet; sollte dieser aber einmal einen Fehler enthalten, kann er mit in den anderen Blockgruppen angelegten "Sicherheitskopien" wieder restauriert werden. Zusätzlich werden Block- und InodeBitmap sowie die Inode-Tabelle der jeweiligen Blockgruppe hinter der Liste aller Gruppendeskriptoren gespeichert. Diese Aufteilung bringt übrigens noch einen weiteren Vorteil mit sich: Durch die physikalische Nähe der Inode-Tabelle zu den Datenblöcken auf der Platte wird das Lesen und Schreiben von Dateien zusätzlich beschleunigt, da weniger Kopfbewegungen auf der Festplatte zu verrichten sind 5.3.3 Verzeichnisse und –einträge Wir haben nun alle Dateien und Daten sicher auf der Festplatte untergebracht, aber ein entscheidender Punkt fehlt noch: Wie kann man sie wiederfinden? Dies wird auch dadurch erschwert, daß bisher noch nirgends der Begriff "Dateiname" aufgetaucht ist und dieser ist schließlich ein essentieller Bestandteil einer Datei. In diesem Abschnitt wird deshalb erläutert, wie Dateien in die Verzeichnisstruktur eingebunden und anhand ihres Namens gefunden werden. Als kurze Vorbemerkung: Ich werden in den folgenden Beispielen nur absolute Dateinamen verwenden, d.h. sie gehen alle vom root-Verzeichnis des Systems (/) aus. Auch intern werden im Kernel nur absolute Dateinamen verwendet, da die Erweiterung von relativen zu absoluten Angaben z.B. bereits durch die Shell erfolgt. Ein Verzeichnis wird durch eine relativ simple Datenstruktur beschrieben. Sie enthält nur vier Elemente, die folgende Bedeutungen haben: inode name name_len rec_len - Die Inode, mit deren Hilfe die Daten für das jeweilige Verzeichnis verwaltet werden. Der Name des Verzeichnisses. Die Länge des Verzeichnisnamens. Die Länge der Einträge. Jedes Verzeichnis ist an genau eine Inode geknüpft, kann aber mehrere Datenblöcke besetzen - genau so, wie es auch bei normalen Dateien der Fall ist. Die einzelnen Einträge des Datenblocks stehen für eine Datei; sie sind aus jeweils drei Elementen zusammengesetzt: Der Inode, dem Namen und der Länge des Namens. Ein Verzeichnis ist also nichts anderes als eine Datei, in der Daten über die darin gespeicherten Dateien oder über eventuell vorhandene Unterverzeichnisse gespeichert sind. Exemplarisch soll nun erklärt werden, was geschieht, wenn die Datei (genauer die Inode der Datei) /usr/include/stdio.h gesucht werden soll. Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 93 von 102 Begonnen wird die Suche nach einer Datei immer im root-Verzeichnis, d.h. /. Die Inodennummer für dieses Verzeichnis ist im Superblock gespeichert und dem System daher stets sofort bekannt. Linux muß sich nun Verzeichnis für Verzeichnis nach vorne "hangeln", bis die Inode schließlich gefunden ist. Über die Inode des root-Verzeichnisses wird auf den Datenblock zugegriffen, der zu dieser Inode gehört. Da auch das root-Verzeichnis ein ganz normales Verzeichnis ist, folgt es den vorgestellten Konventionen - im Datenblock sind also Einträge enthalten, die Dateien und Verzeichnisse aus dem /-Verzeichnis enthalten. Diese Einträge werden solange durchsucht, bis Linux auf den Namen usr trifft. Zusätzlich zum Namen ist eine Inode gespeichert, die die Nummer der für das /usr-Verzeichnis verantwortlichen Inode enthält. Mit dieser Nummer ist wiederum der Zugriff auf den Datenblock möglich, in dem die Verzeichniseinträge von /usr enthalten sind. Sie werden von Linux nach dem Namen include durchsucht; war die Suche erfolgreich, erhält man als Ergebnis wiederum die Indexnummer für eine Inode, deren Datenblock die Einträge des /usr/include-Verzeichnisses festhält. Diese Einträge werden nun solange durchsucht, bis Linux auf den Namen stdio.h trifft. Mit diesem Namen ist eine assoziierte Inode gespeichert, die für die Datei verantwortlich ist - voila, mit ihrer Hilfe kann auf die Datenblöcke und somit auf den Inhalt der Datei zugegriffen werden. Die ersten beiden Einträge aller Datenblöcke, in dem die Verzeichniseinträge gespeichert sind, heißen übrigens immer . und ... Sie bezeichnen das aktuelle bzw. das vorhergehende Verzeichnis und speichern die Nummern der entsprechenden Inodes. Sicher sind ihnen diese beiden Spezialeinträge schon aufgefallen, wenn sie die Ausgabe von ls betrachtet haben. Der Nachteil der oben gezeigten Methode zum Auffinden von Dateien soll nicht verschwiegen werden: Bei jeder Suche ist eine Anzahl von Festplattenzugriffen notwendig, die bekanntlich nicht gerade schnell vor sich gehen. Um dies zu vermeiden, verwendet Linux diverse Caches und Puffer, die die entsprechenden Prozesse beschleunigen sollen. Das ganze Schema ist also in Wirklichkeit etwas komplizierter, als es gerade beschrieben wurde. 5.3.4 Ausblick auf Ext3fs Ext3fs ist der direkte Nachfolger vom Ext2fs, dem "second extended file system". Dieses ist seit langem das Standard-Dateisystem für Linux und wird von allen Distributionen standardmäßig unterstützt. Da Ext2fs kein Journaling bietet, hat sich Stephen Tweedie daran gemacht, eine Journal-Erweiterung für Ext2fs zu programmieren; das Ergebnis der Bemühungen ist Ext3fs. Ext3fs ist also kein völlig neues, unerprobtes Dateisystem, sondern die Ergänzung von Ext2fs um einen Journal-Treiber. Das bedeutet für Ext3fs einen großen Vorteil gegenüber anderen Journaling Filesystems: Ext3fs ist zu Ext2fs vollständig auf- und abwärtskompatibel. Das heißt, dass es möglich ist, eine Ext2fs-Partition "on the fly" auf Ext3 umzustellen und diesen Schritt auch unkompliziert wieder rückgängig zu machen. Es bedeutet außerdem, dass sich eine Ext3fs-Partition als Ext2fs-Dateisystem mounten lässt, was unter Umständen sehr nützlich sein kann, wenn man sein System (etwa zu Wartungszwecken oder bei Überschreiben des BootSektors) von einer Boot-Diskette ohne Ext3fs-Support starten muss. Ein dritter Vorteil ist, dass Ext3fs aufgrund der Abwärtskompabilität das Dateisystem-Check-Tool e2fsck von Ext2fs benutzen kann. Damit verfügt Ext3fs von Anfang an über ein praxiserprobtes und äußerst zuverlässiges Dateisystem-CheckProgramm, auf welches man bei anderen Journaling Filesystems lange Zeit warten musste. Aus diesen Gründen wird sich dieser Artikel nur mit Ext3fs und dessen Konfiguration beschäftigen. 5.4 Memory Mapped Files Memory Mapped Files sind Dateien, die entweder vollständig oder in Ausschnitten in den virtuellen Adressraum des Prozesses eingeblendet werden. Damit kann auf die Daten der Datei wahlfrei, wie auf Daten im Arbeitspeicher zugegriffen werden. Benötigte BS-Funktionen: Map(Dateiname, virtuelle Adresse, Ausschnitt ) Unmap(virtuelle Adresse ) Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 94 von 102 Bei einem Zugriff auf die virtuelle Seite wird der Inhalt der Datei von Festplatte in den Arbeitsspeicher gelagert. Lesen und Schreiben kann dann direkt im Programm ohne Dateifunktionen read() und write() erfolgen. Erst beim Auslagern der Seite aber spätestens beim Terminieren des Prozesses werden alle Daten im Speicher wieder in die Datei auf die Festplatte geschrieben. Vorteil: schneller Zugriff auf Daten Nachteil: schreibende Zugriffe erfolgen im Arbeitspeicher und werden nicht sofort auf Platte übertragen. Bei Programmabsturz sind daher die Daten verloren. Abhilfe: Bei kritischen Daten kann ein Schreiben auf Platte erzwungen werden. Besteht gleichzeitig ein lesender Zugriff auf die Datei können inkonsistente Zustände entstehen, da schreibende Zugriffe nicht direkt auf Platte erfolgen. Damit kann eine Änderung schon erfolgt sein, der lesende Prozess bekommt diese jedoch nicht mit. 5.5 5.5.1 Inhaltsbezogener Zugriff auf Dateien Index-Sequentielle Dateien ( ISAM ) Dateisystem Index-Sequentieller Zugriff ( ISAM ) ISAMDatei • Index Primärbereich SORTIERT Direkter, inhaltsbezogener Zugriff Sequentieller Zugriff • • • Datensätze im Primärbereich sortiert, sequentiell abgelegt Index aufsteigend sortiert Ein Indexeintrag pro Block Aufwendiges Einfügen neuer Datensätze aufsteigend sortierte Datensätze 13 35 42 10 12 Block 0 Suche nach Datenblock über Schlüsselvergleich 13 17 20 Block 1 35 40 42 Block 2 Sequentielle Suche nach Datensatz innerhalb Datenblock Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 95 von 102 Dateisystem Index-Sequentieller Zugriff • Hierarchischer Index • starre Hierarchiestufen Gruppe 0 10 12 Block 0 13 Gruppe 1 17 20 35 40 Block 1 42 45 Gruppe 2 48 Block 2 50 53 60 Block 3 Block 4 45 13 35 60 53 35 53 60 Dateisystem Index-Sequentieller Zugriff - B-Bäume Aufbau eines Indexeintrages : B-Baum ( k,h ) Schlüssel Si Aufbau eines Knoten : Zeiger auf Nachfolger Datensatz Di Zi Zeiger auf ersten Nachkommen Z0 + n Indexeinträge Verzweigungsgrad: 2k+1 mit k = n/2 n=4 k=n/2 =2 Verzweigungsgrad= 5 Z0 Sohn 0 8 8 8 8 S1 D1 Z1 Sohn 1 S2 D2 Z2 S3 Sohn 2 D3 Z13 S4 Sohn 3 D4 Z4 Sohn 4 Verweigungsgrad = Maximale Anzahl von Söhnen Ein Knoten liegt in einem Plattenblock Schlüssel innerhalb eines Blockes sind aufsteigend sortiert Knoten muß mindestens halb voll sein und kann maximal voll belegt sein Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 96 von 102 Dateisystem Index-Sequentieller Zugriff - B-Bäume B-Baum ( 2,3 ) zu folgenden Schlüssel ( aufsteigend sortiert ) : 2 3 4 16 25 26 29 35 36 41 43 47 51 53 55 58 67 78 86 88 91 95 Mittleres Element Platten block 25 D 2 D 3 Wurzel ( teilweise belegt ) 47 D 36 67 D 88 91 D 16 Blatt Schlüssel < 25 26 D 29 78 D 35 Blatt Schlüssel > 25 und < 36 41 D 43 51 D Blatt Schlüssel > 36 und < 47 53 95 Blatt Schlüssel > 88 86 Blatt Schlüssel > 67 und < 88 55 D 58 Blatt ( voll belegt ) Dateisystem Index-Sequentieller Zugriff - B*-Bäume B*-Baum ( K=3, k*=2, h=2 ) Wurzel 25 36 47 58 78 88 2 D 3 D 16 D 25 D Blatt 26 D 29 Blatt 35 36 41 D 43 47 Blatt 51 D 53 55 D 58 Blatt 67 D 78 Blatt 86 D 88 Blatt 91 D 95 Prof. Dr. Keller 5.6 Systemsoftw are-Skript Version 1.1 Seite 97 von 102 Effizienzsteigerung, Fehlererkennung und Behebung 5.6.1 Effizienzsteigerung 5.6.2 Fehlererkennung und Behebung 5.6.3 RAID RAID ( Redundant Arrays of Inexpensive (Independend) Disks Idee Vorteile Zusammenfassung mehrerer Festplatten zu einem "Platten-Array" Für den Anwender erscheint das Array bestehend aus mehreren kleinen Platten als wäre es nur eine grosse Platte Höhere Geschwindigkeiten durch zeitlich verschränktes Schreiben auf mehrere Platten Fehlertoleranz RAID-Level Beschreibung Vorteile / Nachteile 0 Keine Redundanz Verteilung der Daten auf Blockebene über mehrere Festplatten ( Striping ) Höherer Datendurchsatz als bei einer großen Platte Bei Defekt einer Platte gehen Daten verloren 1 ( Mind. 2 Platten ) Daten werden parallel auf zwei oder mehrere Festplatten geschrieben ( Spiegelung ) Leseoperationen schneller Schreiboperationen langsamer Bei Defekt einer Platte entsteht kein Datenverlust Hohe Kosten, da geringere Speicherkapazität 2 Hamming-Fehlerkorrektur. Wird nicht realisiert Nicht üblich 3 ( mind. 3 Platten ) Für jeden Datenblock werden Paritätsdaten auf einer zusätzlichen Platte Gespeichert ( Nur in Hardware realisierbar ) Nicht üblich 4 ( mind. 3 Platten ) Verteilung der Daten blockorientiert über mehrere Platten. Für jeden Datenblock werden Paritätsdaten auf einer zusätzlichen Platte Gespeichert ( Stripe Sets ) Die Paritätsdaten ermöglichen ein Wiederherstellen der Daten nach einem Systemausfall oder einer defekten Platte 5 Verteilung der Daten blockorientiert über mehrere Platten. Für jeden Datenblock werden Paritätsdaten über mehrere Platten verteilt. Wie 4. Der Flaschenhals nur 1 Paritätsplatte ist allerdings behoben. Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 RAID (Redundant Arrays of Inexpensive (Independend) Disks) Datensätze Data Striping 0 1 2 3 Platte 2 0 1 2 3 RAID (Redundant Arrays of Inexpensive (Independend) Disks) Spiegelung 0 Datensätze 1 2 3 Platte 1 Platte 2 0 0 1 1 2 2 3 3 Seite 98 von 102 Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 99 von 102 RAID ( Redunant Arrays of Inexpensive (Independend) Disks) Hardwarelösungen – Externe RAID-Boxen mit eigenem Controller, Platten, Lüftung und Stromversorgung – RAID-Controller im Rechner. Es sind mehrere Platten anschließbar. Die RAID-Levels werden im Contoller realisiert Softwarelösungen – Raid-Levels werden im Betriebssystemkern implementiert • • 5.7 Windows NT Raid 0,1,4,5 LINUX RAID 0,1,4,5 Übungsaufgaben 5.7.1 Aufgabe 20 Sie arbeiten an einem Rechensystem, das zur Abbildung von Dateiblöcken auf Plattenblöcke eine Indextabelle für die gesamte Festplatte benutzt. Die Festplatte hat eine Größe von 20 MByte. Die Blockgröße ist 1 KByte. Wie breit muss ein Tabelleneintrag sein ? Wie viel Speicherplatz muss des Dateisystem für die Indextabelle reservieren ? 5.7.2 Aufgabe 21 Sie arbeiten an einem Rechensystem mit hierarchischem Dateisystem. Verzeichnisse werden wie reguläre Dateien gespeichert. Die Beschreibung von Dateien geschieht über Index-Knoten. Folgendes Bild zeigt den Aufbau eines Index-Knoten. Indexknoten Dateiattribute 20 Byte 1 direkter Block 4 Byte 1 indirekter Verweis 4Byte 1 zweifach indirekter Verweis Sie wollen eine Datei der Größe 1K einlesen. Ihr Arbeitsverzeichnis ist : /usr/stud Der Dateiname : daten.dat 4Byte Wie viele Plattenzugriffe benötigen Sie um alle Daten in den Arbeitsspeicher zu kopieren, wenn die Blockgröße 1K ist, alle Indexknoten in Block 2 liegen, Verzeichnisse maximal 1 KByte Größe haben und das Stammverzeichnis in Block 1 liegt? Das Dateisystem benutzt den Arbeitsspeicher zur Reduzierung der Plattenzugriffe. Prof. Dr. Keller 5.7.3 Systemsoftw are-Skript Version 1.1 Seite 100 von 102 Aufgabe 22 Die Festplatte ihres Rechners hat eine Kapazität von 128 KByte mit einer Blockgröße von 512 Byte. Ihr Dateisystem ist hierarchisch organisiert. Hauptkatalog, Unterkataloge und reguläre Dateien werden durch Indexknoten verwaltet. Indexknoten Dateiattribute 1 direkter Block 1 indirekter Verweis 1 zweifach indirekter Verweis Ein Indexknoten enthält neben den Dateiattributen die Blocknummer des ersten logischen Blocks, einen einfach indirekten Verweis auf weitere Blöcke und einen zweifach indirekten Verweis auf weitere Plattenblöcke bei sehr großen Dateien. Ein Indexknoten hat eine Größe von insgesamt 8 Byte. Sie befinden sich in Ihrem Arbeitsverzeichnis mit dem absoluten Pfadnamen /wurzel/stud/test. Der erste "/" kennzeichnet das Hauptverzeichnis der Platte, alle folgenden "/"dienen als Trennzeichen der Unterverzeichnisse. Ein Katalogeintrag enthält den Dateinamen und die Nummer des Indexknoten, der die Dateiattribute und die Abbildung der logischen Plattenblöcke auf physikalische Plattenblöcke enthält. Ein Katalogeintrag hat eine Länge von 8 Byte. Ihr Arbeitsverzeichnis enthält insgesamt 64 Dateien. In Ihrem Arbeitsverzeichnis liegt eine Datei mit Namen FOO. Diese Datei enthält 50 Datensätze mit einer Länge von 25 Byte. Die Verwaltung freier Plattenblöcke erfolgt über eine Bit Map. Sie wollen die Datei FOO kopieren in eine neue Datei mit Namen NOT. Auf der Platte befinden sich vor dem Kopiervorgang insgesamt 190 Dateien ( Verzeichnisse + reguläre Dateien ). Das Dateisystem muss für den Kopiervorgang mehrere Plattenblöcke neu belegen, die zu unterschiedlichen Objekten gehören. Geben Sie an wie viele neue Plattenblöcke belegt werden und zu welchen Objekten diese Plattenblöcke gehören. Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 6. Ein-/Ausgabesystem Ein- /Ausgabe-System Benutzerprozess Ein-/Ausgabe-Funktionen i/O-Auftrag (Geräteunabhängig ) Rückmeldung Geräteunabhängige Auftragsbearbeitung Aufträge Gerät Steuerbefehle Aktivierung GeräteGeräteregister register Datenübertragung Geräte-Treiber Geräte-Treiber Geräte beschreibungen und I/O-Aufträge I/O-Puffer Betriebssystem Interrupt-Service-Routinen Interrupt-Service-Routinen Interrupt-Service-Routinen Interrupt-Service-Routinen Interrupt-Service-Routinen Interrupt-Service-Routinen Seite 101 von 102 Prof. Dr. Keller Systemsoftw are-Skript Version 1.1 Seite 102 von 102 7. Literaturverzeichnis Tanenbaum, Andrew S. Moderne Betriebsysteme, 2. Auflage, Prentice Hall 2002, ISBN 3-8273-7019-1 Tanenbaum, Andrew S. Modern Operating Systems, Prentice Hall, 1992, ISBN 0-13-588187-0 Stallings, W. Betriebssysteme, Prinzipien und Umsetzung, 4. Auflage, Prentice Hall 2003, ISBN 3-8273-7030-2 Jürgen Nehmer, Peter Sturm Systemsoftware Grundlagen moderner Betriebssysteme, dpunkt Verlag 1998, ISBN 3-920993-74-8 Wolfgang Laun Konzepte der Betriebssysteme, Springers Angewandte Informatik, Springer Verlag, 1989, ISBN 3-211-82153-8 AT&T Unix System V Programmers guide, Prentice Hall, 1987, ISBN 0-13-940438-4 Gulbins, Jürgen UNIX, Springer Verlag, 1984 Gulbins, Jürgen, Obermayr, Karl Linux. Oberflächen, Konzepte, Kommandos. Springer Science + Business Media, Gebundene Ausgaben, Juli 2003, ISBN 3-540-00815-2 Stephen R. Bourne Das Unix System V, Addison-Wesley, 1988, ISBN 3-925118-23-3 Stevens, W. Richard Programmierung von Unix-Netzen, Carl Hanser Verlag, 1992 ISBN 3-446-16-318-2 Regionales Rechenzentrum für Niedersachsen / Uni Hannover Windows XP Grundlagen für Anwender Windows XP Systembetreuer Workstation Windows Server 2003 AuV Aufbau und Verwaltung eines Netzwerkes Windows Server 2003 N Netzwerkadministration Windows ME Grundlagen für Anwender Windows ME Systembetreuer Windows NT 4.0 Anwender Linux Nutzung mit der grafischen Oberfläche KDE Unix Eine Einführung Diese Begleitmaterialen zu Vorlesungen / Kursen sind erhältlich beim ASTA / Lehrmittelreferat für Preise unter 7 € je Heft. Eine Liste aller erhältlichen Bücher erhält man unter: http://www.rrzn.uni-hannover.de/buecher.html