Betriebssysteme Computerarchitektur Die Computerarchitektur ist ein Teilgebiet der Informatik, welche sich mit dem internen sowie externen Aufbau eines Computersystems beschäftigt Von-Neumann-Architektur Über Hauptplatine sind alle Komponenten miteinander verbunden. Das ist in Systemen ein kompliziertes Verbindungsgeflecht, weshalb man sich dieser Materie zunächst mit Hilfe einer sehr vereinfachten Darstellung nähert, der Von-Neumann-Architektur. Computer, der nach Prinzipien der Von-Neumann-Architektur aufgebaut ist, nennt man Von-Neumann-Rechner Dies ist Referenzsystem für Computer und bestehtaus einer CPU mit Steuerwerk und Rechenwerk, einem Ein- / Ausgabewerk, einem Speicherwerk und  Bus-System. Das Bus-System verbindet die Komponenten miteinander. Grundlage nahezu jedes Betriebssystem Ein-/Ausgabewerk = HDD; Speicherwerk = RAM je dicker der Pfeil, desto mehr Informationen pro Sekunde Von-Neumann-Flaschenhals Nur eine angeschlossene Komponente kann zur selben Zeit schreibend auf das Bussystem zugreifen, da es sonst zu einer Kollision kommen würde. Das macht das Gerät insgesamt langsam. KollisionSollten einmal zwei (oder mehr) angeschlossene Komponenten zur selben Zeit auf den Bus schreiben, so kommt es zu einer Überlagerung der Signale, wodurch diese unbrauchbar werden. Man nennt dies eine Kollision auf dem Bus. Strategien zur KollisionsvermeidungDamit Rechner trotz Von-Neumann-Flaschenhals funktionieren kann, sind Strategien zur Vermeidung von Kollisionen auf Bus nötig. Sind negativ für Geschwindigkeit, mit der Datenübertragung über den Bus möglich ist und des gesamten Rechners. Komponenten eines VNR CPU Die CPU ist ein zentraler Bestandteil eines Computers. Sie besteht in erster aus Steuerwerk, Rechenwerk sowie Registern. Register ist digitaler Speicherbereich, der auf CPU angesiedelt ist, und Gruppe von binären Werten (Bits) speichern kann. → Anzahl der gleichzeitig in einem Register speicherbaren Bits nennt man die Breite des Registers oder Registerbreite→ Bei einer Breite von n Bit spricht man auch von einem n-Bit-Register. (4, 8, 16, 32 oder 64 Bit.) Steuerwerk Bestandteil der CPU und für die sequentielle Abarbeitung des im Speicherwerk befindlichen Programms zuständig. → sendet die Adresse des aktuellen Befehls an das Speicherwerk → erhält als Antwort genau jenen Befehl, der an der übermittelten Adresse innerhalb des Speicherwerks steht.→ Sobald das Steuerwerk den Befehl erhalten hat, wird dieser ausgeführt. Damit die Adresse des aktuellen Befehls vom Steuerwerk verwaltet werden kann, muss es einen Speicherbereich dafür geben. → Verwendet wird dazu ein Register: Program Counter, kurz: PC. Damit der vom Speicherwerk empfangene Befehl verwaltet werden kann, muss es einen Speicherbereich dafür geben.→ Verwendet wird dazu ein Register: Befehlsregister, kurz: IR. Die Adresse des aktuellen Befehls kann über das vorhandene Bus-System an das Speicherwerk gesendet werden. → Verbindung der Register PC sowie IR mit dem Bus-System muss daher gegeben sein. Ein Bus (Binary Unit System) dient zur parallelen Übertragung einer Gruppe von Bits. →  Die Anzahl der parallel übertragbaren Bits auf einem Bus nennt man die Breite des Busses oder Busbreite. (4, 8, 16, 32 oder 64) schreibender Zugriff: wenn eine an diesem Bus angeschlossene Komponente eine Gruppe von Bits auf Bus gibt. (Senden) lesender Zugriff: wenn eine an Bus angeschlossene Komponente Gruppe von Bits vom Bus entgegennimmt. (Empfangen) → Es können beliebig viele Komponenten zur gleichen Zeit Informationen über den Bus empfangen, jedoch nur eine Senden Ein Adressbus ist ein Bus, bei dem die parallel übertragene Gruppe von Bits als Adresse zu interpretieren ist.Ein Datenbus ist ein Bus, bei dem die parallel übertragene Gruppe von Bits als Daten zu interpretieren ist.# Rechenwerk Führt vom Steuerwerk in Auftrag gegebene Berechnungen durch. Hauptbestandteil ist ALU Vom Rechenwerk bereitgestellte Funktionen Addition der Operanden (A + B) Subtraktion (A - B) Multiplikation (A * B) Konjunktion (logisches UND, bitweise) Disjunktion (logisches ODER, bitweise) Vergleich von A und B (bitweise) etc. Speicherwerk Das Speicherwerk ist in eine endliche Anzahl gleichgroßer (aber verhältnismäßig kleiner) Speicherzellen unterteilt (RAM) → Jede Zelle verfügt dabei über eine eindeutige Adresse. → Es kann nur Informationen speichern bei eingeschaltetem Rechner.→ Speicherwerk kann den Wert einer adressierten Speicherstelle auslesen und zur Verfügung stellen oder andersherum Ein Steuerbus ist ein Bus, bei dem die parallel übertragene Gruppe von Bits als Steuerinformation zu interpretieren ist.Ein- / Ausgabewerk Das Ein-/Ausgabewerk ist in der Von-Neumann-Architektur nicht näher spezifiziert. Man kann es sich vorstellen als eine Art von "Stellvertreter" für alle weiteren Komponenten eines modernen Rechners. Z.B. also für Komponenten wie: Monitor mit Grafikkarte Festplatte mit Controller Netzwerkkarte mit Controller Maus mit Controller Tastatur mit Controller etc. Für jede Komponente ist ein eigener Controller vorgesehen, der das Bus-System mit dem eigentlichen Gerät verbindet. Vom Quellcode zum Prozessor Compiler übersetzt Quellcode in Maschinensprache-> Compiler muss wissen welche CPU weil unterschiedlich Sprache-> z.B: 16 Bit CPU = Befehle von 16 Bit können überführt werden void main (void){   int x = 2;   int y = 5;   int z = x + y;} zu 00000000110000100000000100001101000000001100010100000001000011100000000010001101000000011000111000000001000011110000001110000000 Maschinensprache in Einzelteile zerlegen -> Wenn Nummer = 1, dann geht es um die Zahl, sonst um die Speicherzelle-> die Befehle werden auf dem ACC durchgeführt Reserve Befehl Nr. Operant Bedeutung Nr. Befehl Bedeutung 000000 000000 000000 000000 000000 000000 000000 000000 001 010 001 010 001 011 010 111 1 0 1 0 0 0 0 0 000010 001101 000101 001110 001101 001110 001111 000000 Lade den Wert 2 in ACC Speichere ACC in Speicherzelle 13 Lade den Wert 5 in ACC Speichere ACC in Speicherzelle 14 Lade Speicherzelle 13 in ACC Addiere Speicherzelle in 14 zu ACC Speichere ACC in Speicherzelle 15 Programm beenden 000 001 010 011 100 101 110 111 NOOP LOAD STOREADD SUB EQUAL JUMPHALT No Operation Was laden Speicher Addieren Minimieren Vergleichen Überspringe Beenden Befehlsformat Das Befehlsformat definiert für jeden einzelnen Befehl, wie dieser codiert ist: Opcode - Binäre Codierung, aus der sowohl der Befehl, als auch zusätzlich benötigte Steuerinformationen hervorgehen. Klassifizierungen - Bei den Befehlsformaten werden verschiedene Klassifizierungen unterschieden: Einadressformat | Zweiadressformat | Dreiadressformat Das Einadressformat entspricht dem Format Vom Quellcode zum Prozessor. Hier wird für die einzelnen Befehle nur der Opcode und die Adresse eines Operanden (deshalb Einadressformat) angegeben. Bedeutung des Akkumulators Wird ein zweiter Operand benötigt, so wird vorausgesetzt, dass dieser sich im Register Akkumulator befindet. Das bei der Abarbeitung des Befehls berechnete Ergebnis wird per Definition wieder im Akkumulator gespeichert.Ablauf der Steuerung CPU - Steuerwerk PC und IR sind im Steuerwerk Für den Ablauf gibt es 2 Voraussetzungen1. der PC muss auf 0 stehen2. Das Programm muss im RAM sein Es wird folgender Zyklus durchlaufen: Fetch: Über Adressbus wird Befehl der aktuelle Nummer vom PC an RAM und Befehl des Steuerwerks übergeben über den Databus werden die Information der Speicherzelle in das Steuerwerk übermittelt über den Steuerungsbus wird die Art des Befehl mit übergeben, z.B: lesen wenn mehrere Programme im Ram gespeichert sind wird zuerst die Basis zu Programm Counter (PC) addiert Decode: stellt die Weichen für CPU, erhöht den PC um 1 Execute: Führt den Befehl aus nach Durchlauf des Zyklus, wird PC um einen Wert erhöht und Zyklus beginnt neu Wenn ein Programm starten soll wird der Programmcounter auf 0 gesetzt Wenn B anfangen soll wird der Basis Register auf 512 gesetzt das Instruktionregister (IR) speichert den letzten Inhalt der auf dem PC zeigt interlegt CPU - Rechenwerk Das Rechenwerk führt vom Steuerwerk in Auftrag gegebene Berechnungen durch. In der ALU werden Funktionen durchgeführt. Die Werte werden schließlich im Akkumulator zwischengespeichert, wo sie ausgelesen werden können. Speicherwerk (RAM) in endliche Anzahl gleichgroßer Speicherzellen unterteilt jede Zelle verfügt über eine eindeutige Adresse kann Wert einer adressierten Speicherstelle auslesen oder Wert in eine Speicherzelle schreiben. Ein- / Ausgabewerk Transaktion von Informationen über verschiedene Peripheriegeräte (Maus, Tastatur, Monitor, ...). Für jedes Gerät gibt es einen Controller. Register auf der CPU - Stackregister Stackregister ist eine Datenstruktur, die in der CPU abgespeichert wird Im Stackregister wird der Stackpointer, der oberste Punkt des Stacks, gespeichert. Daten aufnehmen und wieder abgeben Zugriff über die Befehle PUSH sowie POP  möglich Int x = 5; wird im Data Bereich gespeichert Int i = new Integer (5); ist eine neue Instanz und wird daher im Heep abgespeichert Stack/Heep flexible in der Kapazität nutzbar Speicher ist voll, wenn Stack und Heep sich berühren Jedes Programm hat eigenen Speicherbereich Basisregister und Limitregister Basisregister enthält als Wert die Adresse der Speicherstelle mit ersten Befehl des aktiven Prozesses Im Limitregister wird die Größe des Speicherbereiches gespeichert und schützt überbelastung wichtig, um mehrere Programme im RAM zu halten Ein Programm, dass ausgeführt wird, wird Prozess genannt ein Prozess darf nur in seinem RAM-Bereich ablaufen z.B: A: Basis: 0, Limit 512; B: Basis 512:, Limit 256 in Fetch Phase muss PC Wert kleiner sein als im Limitregister: PC < Limit -> dann darf Prozess ausgeführt werden am Anfang von Fetch wird Basis und PC addiert, die Nummer wird über Adressebus zum RAM übergeben Mehrere Prozesse gleichzeitig im Speicher Starte den Rechner. Lade nacheinander mehrere Programme in den Hauptspeicher. Die Befehle des ersten Programms werden zusammenhängend ab Speicherzelle 0 abgelegt, die Befehle der weiteren Programme jeweils zusammenhängend in freien Speicherbereichen danach. Treffe für jedes Programm die nötigen Vorarbeiten für seine spätere Ausführung. Starte in Speicherzelle 0 mit der Ausführung des ersten Befehls des ersten Prozesses. Führe entsprechend des Ablaufs alle weiteren Befehle dieses ersten Prozesses aus. Wenn Ausführung des ersten Prozesses beendet (HALT-Befehl), wird CPU auf zweiten Prozess vorbereitet. Starte mit dem ersten Befehl des zweiten Prozesses... Swapping: Aus- und Einlagern von kompletten Prozessen→ Wenn mehr Programme gleichzeitig in den Hauptspeicher aufgenommen werden sollen, als verfügbare Hauptspeicher WER oder WAS lagert Prozesse aus oder ein? - BETRIEBSSYSTEM Unter Swapping versteht man das Aus- bzw. Einlagern eines kompletten Prozesses. → Entscheidend ist hier der Begriff kompletter Prozess, also sowohl der Programmtext, als auch alle zugehörigen Daten. → Daten aus Datensegment im Hauptspeicher und alle zu diesem Prozess gehörigen Daten aus Registern der CPU berücksichtigen Limitregister zum Speicherschutz→ mehrere Prozesse gleichzeitig im Hauptspeicher erfordert eine Berücksichtigung von Sicherheitsbelangen.→ sichergestellt werden, dass Prozess nicht auf Speicherzellen im Hauptspeicher zugreift, die anderen Prozess zugeordnet sind.Interrupt-Controller Interrupt-Controller: Interrupt-Signale von Komponenten des Rechners entgegen zu nehmen, und die CPU über das Vorliegen von einem (oder mehreren) Interrupts zu informieren. → Die CPU ist dann für die Abarbeitung des Interrupts zuständig. → Dies geschieht, indem eine sogenannte Interruptbehandlungsroutine aufgerufen wird. Interruptbehandlungsroutine (ISR): eine Reihe von Anweisungen, die einem bestimmten Interrupt zugeordnet ist und deren Anweisungen auf einer CPU ausgeführt werden können. Keine negative Beeinträchtigung→ Interrupt unterbrochene Prozess muss später ohne negative Beeinträchtigung weiter ausgeführt werden können→ Das vom Prozess erarbeitete Ergebnis darf sich nicht unterscheiden Einen Interrupt nennt man eine präzise Unterbrechung, falls alle der folgenden Bedingungen erfüllt sind: Der Programmzähler des unterbrochenen Prozesses wird an einer bekannten Stelle gesichert. Alle Befehle des unterbrochenen Prozesses, die vor dem Befehl ausgeführt werden müssen, auf den der Programmzähler zeigt, sind vollständig abgearbeitet. Kein Befehl des unterbrochenen Prozesses, der nach dem Befehl ausgeführt werden muss, auf den der Programmzähler zeigt, ist bereits abgearbeitet. Der Ausführungszustand des Befehls des unterbrochenen Prozesses, auf den der Programmzähler zeigt, ist bekannt. Einen Interrupt nennt man eine unpräzise Unterbrechung, falls mindestens eine der für einen präzisen Interrupt genannten Bedingungen nicht erfüllt ist. Gründe für eine Interrupt-Auslösung: Auslösung aufgrund einer Speicherschutzverletzung. Auslösung durch einen Hardware-Taktgeber zur quasi-gleichzeitigen Ausführung mehrerer Prozesse. Auslösung durch ein E/A-Gerät während der Kommunikation zwischen CPU und E/A-Gerät Speicherschutzverletzung→ Stellt das Steuerwerk während der Abarbeitung eines Prozesses fest, dass der aktive Prozess auf einen Speicherbereich im Hauptspeicher zugreifen möchte, der ihm selbst nicht zugeordnet ist, so handelt es sich um eine Speicherschutzverletzung, die durch einen Interrupt angezeigt wird.→Reaktion: Speicherschutzverletzung verursachende Prozess wird ohne zu speichern beendet Interruptablauf - Beispiel: Eine Datei soll in den RAM-Speicher innerhalb eines Prozesses abgespeichert werden. 1. CPU schickt Anforderung eines Datenworts an die Festplatte und führt danach einen Kontextwechsel aus2. HD löst Interrupt aus. Interrupt wird an Interrupt-Controller gesendet und in Queue gespeichert.3. Der Interrupt-Controller meldet den Interrupt dem Steuerwerk.4. Nach letzten Execute-Phase des aktuellen Prozesses werden Registerinhalte gesichert. Die Interruptbehandlungsroutine wird ausgeführt. Datenwort wird mit Speicherzelle und Befehl (wirte) wird an Hauptspeicher geschickt (Adressbus, Databus, Steuerbus) Kontextwechsel Festplatte braucht mehr Zeit als die CPU CPU macht beim Warten einen Kontextwechsel -> ein anderer Prozess wird abgearbeitet Während Kontextwechsels werden Registerinhalte des vorherigen Prozesses gesichert und des neuen Prozesses geladen. Kontextwechsel versus Interrupt Der Unterschied zwischen Kontextwechsel und Interrupt, ist die Dauer der Unterbrechung Kontextwechsel: sehr aufwendig, da viele Informationen auf unterschiedliche Register abgespeichert werden  Interrupt: arbeitet mit dem ISR und somit handelt es sich nur um ein Programm, dass für sich selbst sichert Gründe für eine Interrupt-Auslösung Auslösung aufgrund einer Speicherschutzverletzung Auslösung durch einen Hardware-Taktgeber zur quasi-gleichzeitigen Ausführung mehrerer Prozesse. Auslösung durch ein E/A-Gerät während der Kommunikation zwischen CPU und E/A-Gerät. Quasi-gleichzeitige Ausführung mehrerer Prozesse→ indem sich die betreffenden Prozesse in kleinen Zeiteinheiten auf der CPU abwechseln WER oder WAS bestimmt, wann es Zeit ist, einen Prozess zu unterbrechen und die CPU einem anderen Prozess zuzusprechen?WER oder WAS bestimmt, welcher Prozess als nächstes die CPU bekommt? → Wir brauchen ein Betriebssystem! Hardware-Taktgeber löst in sehr kleinen zeitlichen Abständen einen Interrupt auslöst → Wird entschieden, dass es Zeit für einen Prozesswechsel auf CPU ist, so kann ein anderer Teil des Betriebssystems aufgerufen werden, der den nächsten Prozess auswählt und ihm die CPU übergibt. Kommunikation mit E/A-Geräte (Festplatte/Monitor/Maus/Tastatur/...)→ CPU kommuniziert nicht direkt mit diesen Komponenten, sondern mit einem Controller,  speziell für die Komponente zuständig Steuerregister Datenregister: Datenwort hinterlegen Zustandsregister Datentransfer und Interrupts Die CPU sendet die Adresse des gewünschten Datenwortes an den Festplatten-Controller. Der Festplatten-Controller besorgt das Datenwort von der Festplatte und stellt es in seinem Datenregister zur Verfügung. Der Festplatten-Controller sendet einen Interrupt zum Interrupt-Controller. Der Interrupt-Controller nimmt den Interrupt entgegen und verwaltet ihn. Der Interrupt-Controller informiert die CPU über den Interrupt des Festplatten-Controllers. Die CPU startet die zugehörige Interruptbehandlungsroutine. Die Behandlungsroutine kopiert das Datenwort in ein Register auf der CPU. Die Behandlungsroutine sendet das Datenwort von der CPU zum Hauptspeicher. Der Hauptspeicher legt das Datenwort in der gewünschten Speicherzelle ab. Die Interruptbehandlungsroutine informiert den Interrupt-Controller darüber, dass der Interrupt fertig behandelt ist. DMA - Controller Direct Memory Access-Controller ist eine Hardware-Komponente, die die Geschwindigkeit des Gesamtsystems erhöht. → Erreicht werden soll dies durch Reduzierung der Anzahl an Interrupts, die bei der Kommunikation zwischen der CPU und den E/A-Geräten ausgelöst werden und durch die Spezialisierung des DMA-Controllers.→ Die Daten sollen zwischen dem Hauptspeicher und einem weiteren DMA-fähigen Peripheriegerät übertragen werden. Vorher: Bei einem Datentransfer ohne DMA-Controller ereignete sich ein Interrupt pro Datenwort. mit DMA-Controller: nur noch ein Interrupt für die gesamte Übertragung Lösung: Datenwörter direkt zwischen dem Hauptspeicher und einem DMA-fähigen Peripheriegerät auszutauschen CPU muss lediglich zu Beginn und am Ende der Übertragung eingreifen. Allgemeiner Ablauf 1. Die CPU versorgt aus Steuerwerk DMA-Controller mit Informationen zu beteiligte Komponenten, Start- und Zieladresse, Anzahl zu übertragener Datenwörter und Übertragungsrichtung und erteilt  DMA-Controller Erlaubnis, mit Datenübertragung zu beginnen.2. Der DMA-Controller steuert die Übertragung aller Datenwörter 3. HD gibt die Datenwörter zurück 4. DMA lässt die Datenwörter auf den RAM schreiben Wenn alle Daten übertragen sind, informiert DMA-Controller mit einem Interrupt über den Abschluss des Datentransfers Der Interrupt-Controller empfängt den Interrupt und leitet ihn an die CPU weiter Auf CPU wird die zugehörige ISR ausgeführt und die Datenübertragung per DMA ist abgeschlossen. MMU - Memory Management Unit Unterstützt das Betriebssystem bei der Verwaltung des Hauptspeichers trägt zu einer Flexibilität und besseren Ausnutzung des vorhandenen physischen Speichers (RAM) bei durch die Einführung einer MMU wird das BS bei der Umrechnung von virtuellen in physische Speicheradressen unterstützt Wie es bisher ohne MMU ist ohne MMU wird mit dem Basisregisters und Limitregister gearbeitet für jeden Prozess am zusammenhängenden Speicherteil nachteilig: wenig flexibel -> es muss bereits zu Beginn festgelegt werden, wie groß dieser Speicherbereich ist. Um Flexibilisierung der Speicherverwaltung zu erreichen, wird in BS Konzepte einer virtuellen Speicherverwaltung integriert Wir brauchen ein Betriebssystem! Virtuelle Speicherverwaltung Unter dem physischen Speicher eines Computers versteht man den tatsächlich in dieses Gerät verbauten Speicher, soweit er direkt von der CPU oder der MMU angesprochen werden kann. Eine Seite ist ein zusammenhängender Block von Speicherzellen des physikalischen Speichers (RAM). Die Größe einer Seite entspricht der Größe eines Seitenrahmens. Unter dem virtuellen Speicher eines Prozesses versteht man den Speicherbereich, der einem Prozess durch das Betriebssystem zur Verfügung gestellt wird. Ein Seitenrahmen ist ein zusammenhängender Block von Speicherzellen des virtuellen Speichers (RAM). Der physische Speicher bezieht sich auf den Computer, während der virtuelle Speicher auf einen Prozess bezogen wird! Unter einer physischen Speicheradresse versteht man eine Adresse innerhalb des physischen Speichers eines Rechners. Unter einer virtuellen Speicheradresse versteht man eine Adresse innerhalb des virtuellen Speichers eines Prozesses. Count Programm (Assembler) Dieses Programm stellt den Ablauf eine Zyklus dar 1. PC gibt den Wert zum RAM über2.  Befehl mit PC Wert wird ausgeführt und läuft über den Data Bus zum IR3. Danach wird der Decoder angestoßen die Weiche im MUX zu stellen 4. Im ALU wird der Befehl geladen 5. Im AC wird dann die geladenen Zahl zwischengespeichert Einführung in die Betriebssysteme Wir brauchen ein Betriebssystem! Nur Zusammenspiel von Hard- und Software ergibt am Ende ein Hochleistungssystem, welches gleichzeitig flexibel und bedienbar ist. Ein Betriebssystem ist ein Programm, das dem Benutzer und Anwendungsprogrammen elementare Dienste bereitstellt. Das Betriebssystem steuert und überwacht die Abwicklung von Programmen und regelt den Betrieb des Rechnersystems. Zentrale Aufgabe eines BS Die zentrale Aufgabe eines Betriebssystems ist die Betriebsmittelverwaltung. Verwaltung, Aus- und Einlagern mehrerer Prozesse Verwaltung des Hauptspeichers und Versorgung Prozesse mit Teilen des Hauptspeichers Auswahl des jeweils nächsten Prozesses für die CPU Datei-/Verzeichnisverwaltung auf Datenträgern und Verwaltung Ein-/Ausgabegeräte Zwischen Benutzer und Hardware Der Benutzer bedient ein / mehrere Anwendungsprogramme Anwendungsprogramme geben Rückmeldungen an den Anwender oder nutzt Betriebssystem, um mit Hardware zu kommunizieren. Betriebssystem empfängt Aufträge von Anwendungsprogrammen. AP erhalten Rückmeldungen vom BS über abgelehnten und ausgeführten Aufträge. Die Hardware führt Befehle aus, die ihr vom BS in Auftrag gegeben wurden. Das BS erhält Rückmeldungen der Hardware. Auch bei Hardware-Fehlern wird das Betriebssystem informiert. Wichtige Fachbegriffe Fachbegriff Bedeutung Anwendungsprogramm löst ein/mehrere Probleme, die Benutzer stellt (Textverarbeitung / Client / Browser) Systemprogramm Computerprogramm, welches der Verwaltung des Betriebs eines Computers dient Betriebssystem stellt Dienste; steuert Ablauf von Programmen; regelt den Rechnersystembetrieb. Betriebsmittel Hardware- oder Software-Ressource. Hardware-Ressource einzelne Hardware-Komponente des Rechners (CPU / RAM / Controller) Software-Ressource Prozess oder Datei auf einem beliebigen Datenträger Betriebsmittel Prozess Programmtext, Hauptspeicherdaten (Stack, Heap) und auf CPU (Registerinhalte). Betriebsmittel Datei Programmdatei oder Datendatei Entziehbares Betriebsmittel Betriebsmittel, das dem Prozess ohne negative Folgen entzogen könnte (z.B: CPU) Nicht entziehbares Betriebsmittel Betriebsmittel, das Prozess so lange zur Verfügung steht, wie dieser es benötigt. exklusiv nutzbaren Betriebsmittel zu beliebigen Zeitpunkt nur maximal einem Prozess zugeordnet (z.B: Drucker) gemeinsam nutzbar Betriebsmittel quasi-gleichzeitig von mehreren Prozessen genutzt werden kann (z.B: Festplatte) Betriebsmittel / Betriebssystemarten Ein Programm kann mehrfach gestartet werden, somit können aus einem Programm so mehrere Prozesse resultieren! Jeder Prozess besitzt eigene Daten, auf die nur er Zugriff hat und mehrere Prozesse müssen sich auf der CPU abwechseln Prozesse benötigen während ihrer Abarbeitung verschiedene Betriebsmittel, um alle anfallenden Aufgaben erledigen zu können. Damit sind jedem gestarteten Prozess eine Menge von Betriebsmitteln zugewiesen. → Ein Prozess benötigt (mindestens) die Betriebsmittel Festplatte, ausführbare Datei X sowie RAM, um aus der Datei X auf der Festplatte in den Arbeitsspeicher geladen zu werden.→ Ein Prozess benötigt das Betriebsmittel CPU um befehlsweise abgearbeitet zu werden.→ Ein Prozess benötigt das Betriebsmittel Grafikkarte um eine Ausgabe auf dem Bildschirm zu erzeugen. → sind nicht alle Betriebsmittel während der Laufzeit mit dem Prozess verbunden→ effizienter, wenn Betriebsmittel nur dann angefordert werden, wenn sie tatsächlich benötigt werden Betriebsmittel sind Prozessen zugeordnet Betriebsmittel für Prozess wird benötigt, um ... Festplatte, ausführbare Datei X sowie RAM aus der Datei X auf der Festplatte in den Arbeitsspeicher geladen zu werden CPU befehlsweise abgearbeitet zu werden Grafikkarte eine Ausgabe auf dem Bildschirm zu erzeugen nicht alle Betriebsmittel sind während der gesamten Laufzeit mit Prozess verbunden effizienter, wenn Betriebsmittel nur dann angefordert werden, wenn benötigt und wieder freigegeben werden Betriebssystemarten Betriebssysteme für Beschreibung Großrechner (z/OS von IBM) verarbeitet schnell viele Anfragen mit hoher E/A-Rate und Speicherkapazität im Stapelbetrieb (Batch-Jobs) oder sind transaktionsorientiert Server (Unix/Linux) werden über Netzwerk von verschiedenen Clients angesprochen Anwender an den Clients erwarten schnelle Reaktionszeit Einsatzzwecke liegen beispielsweise bei: File-Server / Print-Server Laptops/Personal Computer (Windows 10) Anwender tätigt eine Eingabe und Betriebssystem reagiert darauf. Batch-Job zum Multitasking Batch-Jobs→ In den Anfangsjahren der Rechnerentwicklung wurden auszuführende Programme als sogenannte Batch-Jobs verarbeitet → Jeder Prozess (Batch-Job) wurde nach dem Start komplett bis zu seinem Ende bearbeitet,→ erst im Anschluß startete der nächste Prozess (Batch-Job) und belegte die CPU ebenfalls bis zu seiner Terminierung. Multitasking→ mehrere Prozesse können sich bei ihrer Abarbeitung auf der CPU abwechseln→ Diese geänderte Vorgehensweise markiert einen gewaltigen Meilenstein in der InformatikAbarbeitung von Befehlen auf CPU Kernel-Mode Arbeitet CPU Kernel-Mode, ist jeder Befehl zur Ausführung zugelassen kann auf Speicherbereiche für Daten- und Programmtext und auf Betriebsmittel zugreifen Durch ein Steuer- oder Kontrollregister auf der CPU wird der Kernel-Mode angezeigt. Betriebssystem arbeitet im Kernel-Mode User-Mode Arbeitet CPU im User-Mode, ist nur eingeschränkter Befehlssatz zugelassen nicht alle Befehle erlaubt, kann nicht auf alle Speicherbereiche und Betriebsmittel zugreifen Durch ein Steuer- oder Kontrollregister auf der CPU wird der User-Mode angezeigt. Anwendungsprogramme arbeiten im User-Mode Übergang vom Kernel-Mode in User-Mode ist unproblematisch, da hierbei die Rechte eingeschränkt werden Das Betriebssystem veranlasst Übergang, wenn es dem Prozess eines Anwendungsprogramms die CPU zuteilt. Übergang vom User-Mode in den Kernel-Mode funktioniert nur indirekt über einen Systemaufruf denn Prozess eines Anwendungsprogramms darf nicht über die umfassenden Rechte des Kernel-Modes verfügen Unter einem Systemaufruf versteht man den von einem im User-Mode ablaufenden Prozess getätigten Aufruf einer vom Betriebssystem zur Verfügung gestellten Funktion, welche nur im Kernel-Mode ausgeführt werden kann. Durch Systemaufruf gibt der im User-Mode Prozess Kontrolle zurück an BS, welches die Funktion stellvertretend ausführt. BS führt Sicherheitsüberprüfungen durch und prüft, ob alle Gegebenheiten für die Ausführung sprechen. Ist Funktion ausgeführt, wird zur Beendigung des Systemaufrufs wieder in den User-Mode zurückgeschaltet BS gibt Kontrolle zurück an aufrufenden Prozess, der ein Ergebnis seines Systemaufrufs zum Reagieren empfängt Beispiel: Ein Anwendungsprogramm möchte auf eine Datei zugreifen. im User-Mode ablaufender Prozess eines Anwendungsprogramms möchte auf eine Datei zugreifen Diese E/A-Handlung ist nur im Kernel-Mode zugelassen. Betriebssystem stellt Anwendungsprogramm diese Systemaufrufen zur Verfügung: open | read | write | close Wird jetzt ein Systemaufruf getätigt, so entspricht dies der Auslösung eines Interrupts der im User-Mode laufende Prozess wird angehalten die Interrupt-Service-Routine wird ausgeführt (dadurch wird Betriebssystem-Code ausgeführt es wird in den Kernel-Mode geschaltet und Überprüfungen werden durchgeführt der Dateizugriff wird entweder erlaubt und durchgeführt oder verweigert, es wird in den User-Mode zurückgeschaltet, angehaltene Prozess wird wieder gestartet und ihm wird Rückgabewert mit Ergebnis des Systemaufrufs gegeben Systemaufruf durch Programmierer import java.io.FileWriter; import java.io.IOException; public class Beispiel_Systemaufrufe { public static void main(String[] args) { FileWriter fw; try { // Hier folgen drei Systemaufrufe: Anwenwendung wird angehalten, nach Überprüfung sendet BS Befehle richtung Festplattencontroler fw = new FileWriter("hallo.txt"); // Datei wird zum Schreiben geöffnet fw.write("Hallo Systemaufruf!"); // Hallo Systemaufruf! wird in geöffnete Datei geschrieben fw.close(); //Datei wird wieder geschlossen } catch (IOException e) { // BS sorgt dafür, dass Fehlermeldung generiert wird System.out.println("Es ist ein Fehler aufgetreten: \r\n" + e.toString() ); } // CPU von Kernelmode wieder auf Usermode, Programm läuft weiter } } Der Anwender muss über Systemaufrufe nichts wissen, er nutzt nur Methoden, alles weitere geschieht im Hintergrund. Prozessverwaltung Prozesskontext Prozess ist Programm in Ausführung. Prozesskontext hat Informationen, die Prozess bei Ausführung auf CPU benötigt. Zum Kontext eines Prozesses gehören unter anderem: Die Werte in den betreffenden Registern der CPU (Program Counter, Instruction Register, Stack Register, Flags, etc.) Die Belegung des Caches mit Befehlen und Daten des Prozesses Die Belegung des Hauptspeichers mit Programmtext und Daten des Prozesses Prozess-Kontextwechsel auf CPU sind alle Tätigkeiten, um von auf CPU aktiven Prozess A auf Prozess B zu kommen Dafür werden Tätigkeiten vom Steuerwerk der CPU in Zusammenarbeit mit dem Betriebssystem durchgeführt: Sichere alle notwendigen Registerinformationen des scheidenden Prozesses A an einer bekannten Stelle (damit sie von dort später wiederhergestellt werden können). Lade alle notwendigen Registerinformationen des neuen Prozesses B in die entsprechenden Register auf der CPU. Lade alle notwendigen Befehle und Daten des neuen Prozesses B in den Cache. Es ist leicht verständlich, dass jeder Kontextwechsel eine gewisse Zeit für seine Durchführung beansprucht.Prozesse erzeugen Jeder Prozess erhält zur Unterscheidung und Verwaltung direkt bei seiner Erzeugung eine eindeutige Prozess-ID Während Laufzeit eines BS werden Prozesse erzeugt, abgearbeitet, unterbrochen, weiter abgearbeitet und beendet Bei Start eines Rechners passiert folgendes: Wird Rechner eingeschaltet, startet BS, wobei  ein Mechanismus den ersten Prozess erzeugt (PID = 0, Leerlaufprozess) Ausgehend vom ersten Prozess starten weitere Prozesse, die zum BS gehören für Erfüllung der Aufgabe des BS dann startet Anwender Anwendungsprogramme, die jeweils als eigener Prozess vom BS verwaltet werden allgemein hängt es vom Betriebssystem ab, wie genau die Erzeugung eines Prozesses erfolgt: Unter Unix/Linux gibt es dazu einen Systemaufruf fork und ist sehr einfach unter Windows heißt dieser Systemaufruf CreateProcess und ist sehr kompliziert Fork - Linux Systemaufruf fork macht von aufrufenden Prozess (Elternprozess) Kopie (Kindprozess) Kindprozess erhält eigene Prozess-ID, übernimmt Informationen des Elternprozesses Kindprozess ist nach fork unabhängig vom Elternprozess eigenständige Systeminstanz Sowohl Eltern- als auch Kindprozess laufen nach dem "klonen" an gleicher Stelle weiter fork liefert Rückgabewert und auf das fork folgende Anweisung wird ausgeführt Rückgabewert von fork > 0; fork = 0: Kindprozess; fork < 0: Es ist Fehler aufgetreten. CreateProcess - Windows Der Systemaufruf CreateProcess besteht aus sechs Hauptphasen bei der Prozesserzeugung. Anschließend ist der neue Prozess komplett erstellt und wartet auf die Zuteilung der CPU. 1. beginnt mit dem Öffnen der EXE-Datei. 2. erstellt notwendige Verwaltungsobjekte. 3. erstellt notwendige Verwaltungsobjekte. 4. informiert das Windows-Subsystem über den hier neu erstellten Prozess. 5. leitet die Ausführung des neu erstellten Prozesses ein. 6. nimmt alle abschließenden Initialisierungen vor. Prozesskontrollblock In Prozesskontrollblock fasst das Betriebssystem alle zu einem einzelnen Prozess gehörenden Informationen zusammen. Sobald ein neuer Prozess erzeigt wird, legt das Betriebssystem einen Prozesskontrollblock als Verwaltungsstruktur an. Für jeden Prozess existiert somit ein eigener PCB. Windows jeder unter Windows erzeugter Prozess wird durch eine Instanz der Datenstruktur EPROCESS repräsentiert Linux die Deklaration läuft über die Datenstruktur task_struct Prozesstabelle In der Prozesstabelle fasst das Betriebssystem alle Informationen aller erzeugter Prozesse zusammen. In der Praxis kann die Prozesstabelle ganz einfach als Liste aller Prozesskontrollblöcke realisiert werden. Prozesszustände Wird ein Prozess innerhalb eines Betriebssystems erzeugt, so bedeutet dies nicht, dass er auch sofort auf der CPU ausgeführt wird. Direkt nach Erzeugung befindet sich Prozess im Zustand Bereit wartet auf die Zuteilung der CPU Sobald er die CPU bekommt, wechselt er in den Zustand Rechnend. CPU kann wieder entzogen werden und Prozess zurück in Bereit Prozess wechselt vom Zustand Rechnend in den Zustand Blockiert hat Befehl ausgeführt, der auf sich warten lässt (z.B: E/A-Geräte) CPU ist für einen anderen Prozess bereit Tritt das gewünschte Ereignis ein, meldet sich beispielsweise das E/A-Gerät mit dem Ergebnis ISR merkt, dass Festplatt was fertig gestellt hat für blockierten Prozess Prozess wechselt durch ISR vom Zustand Blockiert in den Zustand Bereit. Hier wartet er wieder auf die Zuteilung der CPU. Prozessverwaltung → Eine der Aufgaben eines Betriebssystems ist ja die Verwaltung der erzeugten Prozesse→ Dabei kommen Prozesskontrollblock und Prozesstabelle zum Einsatz. Prozessverwaltung aus Admin-Sicht unter Windows→ Auch viele Informationen aus dem Prozesskontrollblock eines Prozesses werden hier zur Laufzeit des Prozesses sichtbar. Prozessverwaltung aus Admin-Sicht unter Linux→ auf Kommandozeile gibt es Programme, womit Administrator Aufschluss über die aktuell gestarteten Prozesse bekommt.→ ps | pstree | top | htopThreads Thread oder Leichtgewichtigen Prozess ist Teil eines Prozesses, der einen unabhängigen Kontrollfluss repräsentiert. Ein Prozess kann aus mehreren Threads bestehen, somit mehrere voneinander unabhängige, nebenläufige Kontrollflüsse BEISPIEL Ein Textverarbeitungsprogramm wird gestartet. Somit existiert auf dem Computersystem ein Textverarbeitungs-Prozess. Dieser Prozess startet intern mehrere Threads, die jeweils bestimmte Aufgaben übernehmen: Thread 1: realisiert den Texteditor. Er reagiert also auf Eingaben des Users mit Tastatur oder Maus. Thread 2: realisiert eine "Alle 10 Minuten automatisch im Hintergrund speichern"-Funktion. Thread 3: realisiert die automatische Rechtschreibprüfung in kleinen zeitlichen Abständen Das Thread-Konzept wird von Betriebssystemen unterstützt und können deshalb auf Kernel-Ebene realisiert sein Unterstützt Betriebssystem keine Threads, so kann auf der User-Ebene ein spezielles Programm Bereitstellung übernehmen Wird die Java-Laufzeitumgebung auf einem Betriebssystem installiert, laufen Threads auf beiden Ebenen Bei Systemen ohne jegliche Thread-Unterstützung ist ein Prozess praktisch gleichzusetzen mit einem Thread. Wenn ein Prozess nur einen Thread besitzt, ist dieser betrachtete Prozess praktisch gleichzusetzen mit seinem Thread. Bei Thread-Kontextwechsel auf der CPU wird aktiver Thread A durch einen anderen Thread B ersetzt. Vorteile Nachteil Thread-Kontextwechsel leichter als Prozess-Kontextwechsel. Threads eines Prozesses haben Zugriff auf alle Betriebsmittel, welche Prozess zugeordnet sind. Der Anwendungsprogrammierer kann die Funktionalität der Gesamtanwendung in unterschiedliche Threads aufteilen, welche jeder für sich einfacher zu implementieren ist. Threads eines Prozesses haben Zugriff auf Betriebsmittel, welche Prozess zugeordnet sind. Anwendungsprogrammierer müssen über Kenntnisse bei der Programmierung von Threads verfügen. Scheduling Beim Scheduling geht es um die Zuteilung des Betriebsmittels CPU zu den einzelnen Prozessen. Unter Scheduling versteht man die Tätigkeit des Aufteilens der verfügbaren Prozessorzeit auf alle Prozesse. Unter Scheduler  versteht man den Teil des Betriebssystems, welcher die Scheduling-Tätigkeit durchführt. Er ist zuständig zu entscheiden, welcher Prozess als nächstes die CPU bekommt. Umsetzung dieser Entscheidung obliegt dem Dispatcher. Dispatcher entzieht bei Kontextwechsel dem aktiven Prozess die CPU, um sie dem nächsten Prozess zuzuteilen. Ziele: Möglichst viele Prozesse werden in  kurzer Zeit abgearbeitet. Effizienz: zur Verfügung stehenden Ressourcen werden  ausgelastet. Fairness: Die Ressourcen werden den Prozessen gerecht zugeteilt, das heißt, kein Prozess wird dauerhaft vernachlässigt. Scheduling-Verfahren First Come First Serve (FCFS)arbeitet Prozesse in  Reihenfolge ihres Starts ab. Zuerst erzeugter Prozess darf auch als erstes in den Zustand Rechnend wechseln. Während Rechenzeit kann Prozess durch  Interrupt unterbrochen werden. Direkt nach Interrupt setzt er  Arbeit auf der CPU fort. Shortest Job First (kurz: SJF): Von allen  Prozessen auf  System bekommt derjenige als erstes die CPU mit der kürzesten Laufzeit Shortest Remaining Time Next (kurz: SRTN) ist eine Abwandlung des SJF-Verfahrens. Hierbei bekommt immer derjenige Prozess die CPU, welcher die kürzeste Restlaufzeit besitzt. Wenn Prozess A(5) aus Blocked hinaus kommt, kommt er vor Prozess B(8) wieder in Running, wenn Prozess C(6) von Running in Blocked wechselt. Round Robin (RR) teilt die  zur Verfügung stehende CPU-Zeit in kleine Zeitscheiben. Prozesse werden in eine initiale Reihenfolge gebracht und der erste Prozess bekommt die CPU, er darf diese genau bis zum Ablauf seines Zeit-Quantums nutzen, danach in der Reihenfolge. Priority Scheduling (kurz: PS) Jedem Prozess wird eine Priorität zugewiesen. Der Prozess mit der höchsten Priorität bekommt als erstes die CPU.Synchronisation Bei der Synchronisation geht es um Mechanismen zur Vermeidung von Problemen, die bei der nebenläufigen Ausführung von Prozessen oder Threads in Verbindung mit gemeinsam genutzten Betriebsmitteln entstehen können. Nebenläufigkeit ist quasi-parallele Ausführung von Befehlen mehrerer Prozesse oder Threads mit Kontextwechsel auf CPU. Beim Race Conditions nutzen zwei oder mehr Prozesse ein oder mehrere Betriebsmittel gemeinsam, wobei das Ergebnis der Ausführung von der zeitlichen Reihenfolge der Zugriffe der Prozesse oder Threads auf das Betriebsmittel abhängt. kritischer Abschnitt sind Programmteile, die während Ausführung auf der CPU nicht durch kritische Abschnitte anderer Prozesse oder Threads unterbrochen werden dürfen, sofern Prozesse auf gemeinsam genutzte Betriebsmittel zugreifen. Aktives Warten - Prozesse und Threads synchronisieren Unter aktivem Warten versteht man ständige Abfragen eines Sperrkennzeichens am Eingang eines kritischen Abschnitts. dafür wird das Polling genutzt, um ständig Abfragen durchzuführen um einen Prozess oder einen Thread zu sperren wird das genannte Sperrkennzeichen, was sich als Sperrzeichen äußert public class Beispiel_Aktives_Warten { static int counter = 0; // gemeinsam genutztes Betriebsmittel static int lock = 0; // Sperrvariable public static class Thread_A extends Thread { public void run() { do_something(); // unkritisch count_from_10(); // kritisch !!! do_something_else(); // unkritisch } private void do_something() { // unkritischer Abschnitt System.out.println("Thread_A: unkritisch"); } private void count_from_10() { // Vorsicht: kritischer Abschnitt! while (lock == 1); // wenn lock auf 1 ist, dann ist das Thread in der While-Schleife gefangen lock = 1; // wenn lock 0 war wird er hier auf 1 gesetzt und die Methode durchlaufen counter = 10; counter++; counter++; System.out.println("A-Counter: " + counter); lock = 0; //die methode ist durchlaufen, auch wenn zwischen durch ein anderer } //Thread dran war, ab hier kann ein anderer Thread durchlaufen werden private void do_something_else() { // unkritischer Abschnitt System.out.println("Thread_A: wieder unkritisch"); } } public static class Thread_B extends Thread { public void run() { System.out.println("Thread_B ist gestartet."); while (lock == 1); // Semikolon beachten! lock = 1; counter = 20; counter++; counter++; System.out.println("B-Counter: " + counter); lock = 0; } } public static void main(String[] args) { Thread a = new Thread_A(); Thread b = new Thread_B(); a.start(); b.start(); } } Kontextwechsel im ungünstigsten Moment kann dazu führen, dass zwei oder mehr Prozesse oder Threads sich gleichzeitig in ihrem kritischen Abschnitt befinden. es gibt Mechanismus, welcher eine Sperrvariable innerhalb einer atomaren Aktion abfragen und setzen kann eine solche Aktion ist atomar, ausgeführt werden müssen und (logisch) nicht unterbrochen werden dürfen Eine Möglichkeit bietet dafür der TSL-Assemblerbefehl: CPU sorgt bei der Ausführung des TSL-Befehls dafür, dass zwei Dinge innerhalb einer Aktion (atomar!) passieren, weder ein Kontextwechsel, noch ein Interrupt können den TSL-Befehl unterbrechen Kopiere den aktuellen Wert der lock-Variablen aus Speicherzelle 25 in das Register R1 Schreibe in Speicherzelle 25 den Wert 1, setze also lock = 1. EQUAL-Befehl vergleicht Wert aus Register 1 mit der Zahl 0. Abhängig vom Ergebnis muss Prozess entweder in Schleife warten oder darf kritischen Bereich ausführen. 10: TSL 25 ; Hier passieren zwei Dinge als atomare Aktion: ; --> Wert aus Speicherzelle 25 in Akkumulator kopieren ; --> Zahl 1 in Speicherzelle 25 schreiben (setze lock=1) 11: EQUAL #0 ; Prüfe: Ist ACC == 0? (Eigentlich: ist lock == 0?) 12: JUMP 10 ; Prüfung ergab FALSE 13: ... ; Prüfung ergab TRUESemaphore Vorteil: es wird aufs Aktive Warten verzichtet und somit wird weniger CPU-Zeit verschwendet, indem der wartende Prozess durch einen Kontextwechsel in den Zustand Blockiert gebracht wird Datenstruktur, welche ganzzahligen Zähler, Warteschlange bereitstellt und zwei atomare Operationen P() und V() definiert. der ganzzahliger Zähler (int) kann keine negativen Werte annehmen. Warteschlange ist Datenstruktur, die nach dem FIFO-Prinzip arbeitet und als zur geordneten Aufnahme von Prozessen dient. Die Operation P() wird in einigen Quellen auch als down()-Operation betitelt Hat die Zählervariable einen positiven Wert (>0), dann verringere den Wert der Zählvariablen um 1. Wenn Zählvariable den Wert 0 hat, dann blockier aufrufenden Prozess und fügt ihn an das Ende ihrer Warteschlange analog up() anstatt V(). wenn die Warteschlange nicht leer ist, dann entblockiere den ersten Prozess der Warteschlange. ist die Warteschlange leer, dann erhöhe den Wert der Zählervariable um 1. Mit "entblockieren" wird der erste Prozess aus der Warteschlange in den Zustand "Bereit" geändert. ein binären Semaphor ist ein Semaphor, dessen ganzzahliger Zähler nur die Werte 0 oder 1 annehmen kann. Mutex ist ein binären Semaphor, der mit einem wechselseitigen Ausschluss arbeitet und das aktive Warten ersetzt Wenn ein Thread in kritischen Abschnitt befindet, darf andere Thread nicht in seinen kritischen Abschnitt eintreten Reihenfolgedurchsetzung ist dabei sehr wichtig: Erst wenn erste Prozess Zugriff erledigt hat, darf der zweite Zählsemaphor ist ein Semaphor, der den Zugriff auf eine begrenzte Anzahl eines Betriebsmittels regelt. Der Zugriff auf das Betriebsmittel stellt deshalb einen kritischen Abschnitt dar und muss geschützt werden. Erzeuger- / Verbraucherproblem: Erzeuger erzeugt etwas, was Verbraucher verbraucht. Natürlich kann Verbraucher erst etwas verbrauchen, wenn zuvor Erzeuger etwas erzeugt hat. Erzeuger kann nur soviel erzeugen, bis alle Lagerplätze für Erzeugnis belegt sind. Dann muss Verbraucher wieder verbrauchen, bis Erzeuger wieder etwas erzeugen kann. Ein Semaphor hat keinen ungünstigen Moment, weil die P() Methode atomar ist!Deadlocks Eine Menge von Prozessen befindet sich in einem Deadlock-Zustand, wenn jeder Prozess aus der Menge auf ein Ereignis wartet, das nur ein anderer Prozess aus der Menge auslösen kann. Wenn sich mehrere Prozesse in Deadlock-Zustand befinden, so sagt man auch vereinfachend: Es ist ein Deadlock aufgetreten. Vier Bedinnungen damit ein Deaklock auftritt: Mutual exclusion condition: Eine Ressource steht einem Prozess nur exklusiv zur Verfügung Wait for condition: Prozesse warten und behalten dabei Kontrolle über bereits Ressourcen No preemption condition: Ressourcen können Prozess nicht entrissen werden. Circular wait condition: Es gibt eine zyklische Kette von Prozessen Prinzip des ersten Kontos P1: Schnappt sich K1 Kontextwechsel P2: Schnappt sich K2 Kontextwechsel P3: Möchte K1 haben ist aber belegt: blockiert; Kontextwechsel P1: Möchte K2 haben ist aber belegt: blockiert; Kontextwechsel P2: schnappt sich K3: Fetch, Decode, Execute Deadlocks ignorieren"Es gibt keine Deadlocks, weil ich daran glaube, dass es keine Deadlocks gibt!", sagt das Betriebssystem.Zum Ignorieren von Deadlocks kommt in Betriebssystemen üblicherweise der Vogel-Strauß-Algorithmus zum Einsatz. Deadlocks vermeidenEin Betriebssystem könnte von vorneherein so konstruiert werden, dass Deadlocks gar nicht möglich sind. Verhinderung von Deadlocks Prozess nur dann weitere Ressource zuzusprechen, wenn sichergestellt ist, dass in der Zukunft kein Deadlock entstehen kann Allgemein ist davon auszugehen, dass die Erkennung, Vermeidung oder Verhinderung von Deadlocks sehr aufwendig ist. Eine ausnahmlose Abdeckung aller denkbarer Fälle scheint nahezu unmöglich.Interprozesskommunikation Bei der Interprozesskommunikation geht es um den Austausch von Informationen zwischen zwei (oder mehr) Prozessen bzw. Threads. Damit alle Beteiligten die ausgetauschten Informationen in gleicher Weise verstehen können, sind bestimmte Regeln der Kommunikation einzuhalten, das sogenannte Protokoll. Zwei Threads kommunizieren über gemeinsame Variablen→ Synchronisation Threads beim Zugriff auf gemeinsamen Datenbereiche wird erforderlich, da es zu kritischen Abläufen kommt Zwei Prozesse kommunizieren über gemeinsame Speicherobjekte (Datein)→ Prozess A erzeugt während Laufzeit Daten und speichert diese in einer Datei ab. → zweiter Prozess B liest Datei zu einem späteren Zeitpunkt ein und kann so die enthaltenen Informationen weiterverarbeiten.→ sorgt Betriebssystem nur für eine Synchronisation beim gleichzeitigen Zugriff der beiden Prozesse auf die (z.B. über Semaphore).→ Falls Prozess B Dateiinhalt ausliest, bevor Prozess A die Informationen hineingeschrieben hat, so ist nicht zu erwarten, dass Prozess B das erwartete Ergebnis berechnen kann Zwei Prozesse kommunizieren über Shared Memory→ Man spricht von Shared Memory, wenn Teil des Hauptspeichers gemeinsam mehreren Prozessen zur Verfügung gestellt wird Zwei Prozesse kommunizieren über Pipes→ Einweg-Kommunikationskanäle, die Prozess ermöglichen, Daten über das BS als Datenstrom an anderen Prozess zu übertragen Zwei Prozesse kommunizieren über Sockets→ Sockets sind eine vom Betriebssystem bereitgestellte Kommunikationsmöglichkeit über TCP Speicherverwaltung Die Speicherverwaltung oder Hauptspeicherverwaltung ist ein Teil des Betriebssystems und erledigt alle erforderlichen Arbeiten zur Verwaltung des physikalischen und des virtuellen Speichers eines Computers. Virtuelle Speicherverwaltung Ein Prozess sollte auch dann noch ablaufen können, wenn er nur teilweise im Hauptspeicher ist. Wichtig ist, dass die Teile des Prozesses (Daten und Code) im physikalischen Speicher sind, die gerade benötigt werden. Der Speicherbedarf eines Prozesses sollte größer als der physikalisch vorhandene Hauptspeicher sein können. Ein Seitenrahmen versteht man einen zusammenhängenden Block von Speicherzellen des physikalischen Speichers. Eine Seite ist ein Block von Speicherzellen des virtuellen Speichers. Blockgröße einer Seite ist Größe eines Seitenrahmens. alle Seiten eines Systems haben stets die gleiche Größe die Aufgabe der MMU besteht in der Umrechnung von virtuellen in physikalische Adressen Seitentabellen werden benötigt, damit MMU die Umrechnung einer virtuellen Adresse in eine physikalische Adresse vornehmen kann Für jeden vom Betriebssystem zu verwaltenden virtuellen Adressraum gibt es jeweils eine zugehörige Seitentabelle Jeder Prozess besitzt seine eigene Seitentabelle! MMU prüft in der Seitentabelle des aktuellen Prozesses den Eintrag an entsprechenden Stelle aus der virtuellen Adresse. Ist P/A-Bit = false (0), kommt es zu Page-Fault (Seitenfehler) Liegt daran, dass noch keine physische Seite eingelagert wurde Die Seite muss vom DMA-Controller in den RAM-Speicher geladen werden Ist der RAM bereits voll, kommen Seitenersetzungsverfahren ins Spiel. Ist das dann P/A-Bit = true (1), kann die Rahmennummer aus der Tabellenzeile entnommen werden. MMU guckt sich sich bei 0000 das present absent bit an, weil es eine 1 ist, kann es umgerechnet werden wird im RAM bei 001 abgespeichert wenn die fetch Phase beendet ist, wird der PC um 1 hochgesetzt und auf 0000001 gesetzt so viel wie in Seitenrahmen reinpasst muss der DMA-Controlller kopieren bei Pagefault wird der Prozess auf blocket gesetzt, da er so nicht weiterarbeiten kann wenn alle Daten im Ram sind wird ein Interrrupt eingestellt und es geht auf Ready Prozess kann mit den Daten im Ram arbeiten und wenn Sceduler den Prozess wieder nimmt geht es wieder in Running KONTEXTWECHSEL Wert des PC wird überschrieben mit Wert vom virtuellen Speicher B In Seitentabelle wird gesehen das absent 0 ist ->Seitenfehler -> muss in Ram eingelagert werden (egal welche Stelle) Present wird zu Absend in 111 wird der Wert des PC gespeichert DLL Datein sorgen dafür, dass weniger Speicher gebraucht wird Swapping und Paging Unter Swapping versteht man das Aus- bzw. Einlagern eines kompletten Prozesses. Swapping kommt nur bei Betriebssystemen zum Einsatz, die keine virtuelle Speicherverwaltung unterstützen! eine Alternative  zur virtuellen Speicherverwaltung mit Hilfe der MMU, ist das Paging, welches flexibler als Swapping agiert. Unter Paging versteht man das Ein- bzw. Auslagern von Teilen eines Prozesses. Eine Seite enthält einen bestimmten Teil eines Prozesses. Die Gesamtheit aller Seiten eines Prozesses repräsentiert somit den kompletten Prozess. Eine (virtuelle) Seite kann einerseits in einem (physikalischen) Seitenrahmen eingelagert sein. befindet sich die Seite im RAM und der zugehörige Prozess kann auf die Befehle Daten innerhalb der Seite zugreifen. Zum Einsatz kommt hier die Adressumrechnung mit Hilfe von MMU und Seitentabelle. Andererseits kann eine (virtuelle) Seite auf einen Hintergrundspeicher (wie beispielsweise die Festplatte) ausgelagert sein. so steht die Seite nicht im RAM zur Verfügung, Zugriff des Prozesses auf Befehle schlägt fehl ->Page fault ausgelagerte Seite muss vom Hintergrundspeicher in Seitenrahmen eingelagert werden. Anschließend kann die Adressumrechnung mit Hilfe von MMU und Seitentabelle. Beim Paging werden virtuelle Seiten in (physikalische) Seitenrahmen eingelagert, oder andersrum Page Fault Page fault tritt auf, falls die MMU bei der Umrechnung einer virtuellen in eine physische Adresse feststellt, dass die benötigte (virtuelle) Seite nicht in einem (physischen) Seitenrahmen eingelagert ist. Seitenersetzung Tritt  Seitenfehler auf, lagert BS virtuelle Seite aus Hintergrundspeicher in freien Seitenrahmen des physikalischen Speichers Entscheidend ist bei der Einlagerung, ob es einen freien Seitenrahmen gibt Falls ja: dieser für die Einlagerung der benötigten Seite genutzt werden Falls nein: Seitenersetzung entscheidet, welche momentan eingelagerte virtuelle Seite in HS verschoben wird Was bei der Seitenersetzung passiert Die MMU stellt fest, dass virtuelle Seite B nicht in Seitenrahmen eingelagert ist und löst einen Seitenfehler aus. Es wird festgestellt, dass kein freier Seitenrahmen verfügbar ist, das Seitenersetzungsverfahren wird deshalb gestartet. Die zu ersetzende Seite E wird bestimmt, sie ist derzeit in Seitenrahmen X eingelagert. Die zu ersetzende Seite E wird in den Hintergrundspeicher geschrieben,. damit ist ihr Inhalt gesichert Die benötigte Seite B wird eingelagert, ihr Inhalt wird in den Seitenrahmen X geschrieben Schreiben der zu ersetzenden Seite E in den Hintergrundspeicher kostet viel Zeit! Das ist schlecht für das Gesamtsystem. →  sinnvoll, eine zu ersetzende Seite nur dann in den Hintergrundspeicher zu kopieren, wenn dies auch tatsächlich notwendig ist. Das Modifiziert-Bit → BS kann mit dem M-Bit feststellen, ob die Inhalte einer eingelagerten Seite modifiziert und zum auslagern bereit sind Das M-Bit ist gesetzt, also 1:Der Inhalt der zugehörigen Seite wurde modifiziert. Das M-Bit ist nicht gesetzt, also 0:Der Inhalt der zugehörigen Seite wurde nicht modifiziert. Seitenersetzungsverfahren → Paging Die optimale Seitenersetzung kann nicht programmiert werden. No Recently Used→ Welche Seite wurde in der Vergangenheit am längsten nicht genutzt? Für jede einzelne Seite wird mit Hilfe eines einzelnen Bits festgehalten, ob die betreffende Seite referenziert wurde. Das R-Bit ist gesetzt, also 1: Inhalt der Seite wurde referenziert, es wird verwendet. Das R-Bit ist nicht gesetzt, also 0: Inhalt der Seite wurde nicht referenziert, es wird nicht verwendet. First-In-First-Out → Die Seiten, die zuerst im RAM gespeichert wurden, werden als erstes überschrieben.In der Praxis hat dieses Verfahren keine  Bedeutung, da die ausgelagerte Seite oft benötigt wird → hohen Zahl an Seitenfehlern Working Set bei vielen nacheinander auf der CPU ausgeführten Befehlen werden nur wenig verschiedene virtuelle Seiten angesprochen → versucht, alle zum Working Set eines Prozesses gehörenden Seiten ständig im Hauptspeicher zu halten Second Chance er prüft, ob diese Seite in der letzten Zeit auch angesprochen wurde. Falls nein: sie wird ersetzt Falls ja: wird mit der am zweitlängsten eingelagerten Seite fortgefahren. Auch hier wird zunächst geprüft, ob Seite in der letzten Zeit angesprochen wurde. Usw. Shared Memory Mehrere Prozesse sollen die Möglichkeit haben, dass bestimmte Speicherbereiche gemeinsam genutzt werden können.Dies ist eigentlich nicht erwünscht! Grund ist: RAM kann man nie genug haben Beispiel: Was passiert nun, wenn das gleiche Programm mehrmals gestartet wird? Dann resultieren daraus auch mehrere Prozesse.Wenn für jeden Prozess der gleiche Programmtext in unterschiedliche Bereiche des Hauptspeichers eingelagert: Redundanz gemeinsam genutzte Speicher entspricht einem bestimmten Seitenrahmen des physikalischen Speichers (z.B: DLL-Dateien)Dieser eine Seitenrahmen kann nun sehr einfach in alle virtuellen Adressräume der beteiligten Prozesse eingebunden werden-> Nötig ist dazu allein ein entsprechender Eintrag in allen betreffenden Seitentabellen. Bedenke: Jeder Prozess besitzt seinen eigenen virtuellen Speicher und damit auch seine eigene Seitentabelle!Geräteverwaltung Unter der Geräteverwaltung fasst man alle Aufgaben und Tätigkeiten des Betriebssystems zusammen, welche einer optimierten Zusammenarbeit zwischen dem Betriebssystem und den Peripheriegeräten dienen. Rolle der Geräteverwaltung Wenn Prozesse mit Peripheriegeräten kommunizieren, tätigen sie Systemaufruf→ dadurch wird Betriebssystem mit der gewünschten Kommunikation beauftragt . Geräteverwaltung ist Bestandteil des Betriebssystems → realisiert eine Schnittstelle zwischen den Peripheriegeräten und  Betriebssystem muss mit unterschiedlichsten Hardware-Geräten kommunizieren können Die Geräteverwaltung besitzt sowohl geräteabhängige, als auch geräteunabhängige Teile. geräteabhängigen Teile sind die sogenannten Gerätetreiber. geräteunabhängigen Teile werden durch unterschiedlicher Geräteklassen realisiert Gerätetreiber Gerätetreiber ist eine Softwarekomponente, welche Interaktionen zwischen BS und Controller des Peripheriegeräts steuert. die Geräteverwaltung enthält verschiedene Treiber mit gleichem Ablauf:1. Initialisierung des Geräte-Controllers2. Gerät dem Betriebssystem bekannt machen3. Bereitstellen einer Schnittstelle zum Geräte-Controller4. Interruptbehandlung für ein Gerät5. Bereitstellen einer Schnittstelle zur Geräteverwaltung Initialisierung des Geräte-Controllers Treiber initialisiert den Controller seines zugehörigen Geräts beim Systemstart→ Damit stehen gültige Werte in  Registern des Controllers  → das Gerät selbst wird über seinen Controller bereit für die Entgegennahme von Befehlen Gerät dem Betriebssystem bekannt machen Ein Treiber macht der Geräteverwaltung des Betriebssystems das Gerät bekannt, damit kann das Gerät vom BS genutzt werden Bereitstellen einer Schnittstelle zum Geräte-Controller Treiber bildet Schnittstelle zwischen Geräteverwaltung und Controller des Geräts → Treiber muss wissen, welche Befehle der Controller zur Verfügung stellt→ wie diese anzusprechen  und in welcher Weise die Rückgabewerte zu interpretieren sind. Interruptbehandlung für ein Gerät Gerätetreiber ist zuständig für die Behandlung von Interrupts, die durch das zugehörige Gerät ausgelöst werden. Die Interruptbehandlungsroutine ist Teil des Gerätetreibers! Der Treiber ist Teil der Geräteverwaltung, welche wiederum ein Teil des BS ist Außer Festplatten gibt es noch viel weitere Geräte, die von der Geräteverwaltung des Betriebssystems unterstützt werden müssen, und für die ein Treiber eingebunden ist. Lange nicht alle Geräte unterstützen den Einsatz eines DMA-Controllers!→ die Interruptverarbeitung im Treiber kann unterschiedlich ablaufen: mit DMA oder kein DMA→ das Interruptkonzept eine einfache Reaktionsmöglichkeit des Treibers auf die ungefragt eintreffenden Daten Bereitstellen einer Schnittstelle zur Geräteverwaltung Treiber muss auch mit der Geräteverwaltung des Betriebssystems kommunizieren→ Er ist Mittel zwischen beiden Welten mit Geräteklassen, mit jeweils eigenen Schnittstelle.→ Treiber muss von Geräteverwaltung für Geräteklasse gedachte Funktionen implementierenGeräteklassen Im Zuge seiner geräteunabhängigen Teile der Implementierung definiert die Geräteverwaltung des Betriebssystems unterschiedliche Geräteklassen. Zu den wichtigsten beiden Klassen gehören die blockorientierten Geräte, sowie die zeichenorientierten Geräte. Blockorientierte Geräte übertragen Daten jeweils in kompletten Blöcken, beim Lesen und Schreiben von diesem Gerät (zb. Festplatte) → Typische Blockgrößen liegen zwischen 512 und 32 768 Byte. → Jeder Datenblock ist direkt adressierbar.→ BEISPIEL: Lade Datenblock Nr. 723 von Festplatte | Ändere fünfte Byte wie | Schreibe Datenblock Nr. 723 zurück auf Festplatte.→ Es können also immer nur komplette Datenblöcke gelesen oder geschrieben werden. Zeichenorientierte Geräte erzeugen/empfangen Datenstrom. Zeichenfolge zum Gerät oder vom Gerät übertragen. Zeichen sind nicht adressierbar. Beispiele für zeichenorientierte Geräte sind: Maus, Tastatur, Netzwerkkarte, ... Schnittstelle für zeichenorientierte / blockorientierte Geräte→ Geräteverwaltung definiert Standardschnittstelle, welche Treiber zeichenorientierten/blockorientierte Geräte unterstützen → Darin vorgesehen sind beispielsweise Funktionen für: die Initialisierung des Geräts, das Lesen eines Zeichenstroms vom Gerät...→ Diese Funktionen werden vom Gerätetreiber implementiert. Zusammenarbeit von Treiber und Geräteverwaltung→ ist ein zeichenorientiertes Gerät am System angeschlossen, so wird sein Treiber in den Hauptspeicher geladen→ Der Treiber implementiert Funktionen (initDevice(), readBlock(), writeBlock(), handleInterrupt(). Durch das Laden des Treibers in den Hauptspeicher steht ab diesem Moment fest, ab welcher Adresse im Hauptspeicher der ausführbare Code der genannten Funktionen beginnt. Dies gilt für jeden geladenen Treiber, also für jedes unterstützte Gerät.Dateiverwaltung Datei Eine Datei ist ein Bestand an zusammengehörigen digitalen Daten, die dauerhaft auf Speichermedium gespeichert sind. → Durch die Einschränkung auf digitale Daten entsteht eine Abgrenzung zu jeglicher Art von nicht-digitalen Daten CRUD-Operationen→ auf den Speichermedien müssen Dateien angelegt, gelesen, verändert und gelöscht werden können→ CRUD-Operationen: Create, Read, Update, Delete Organisation von Daten auf Speichermedien und die Bereitstellung der CRUD-Operationen geschieht mit Hilfe eines Dateisystems.Dateisystem Ein Dateisystem ist der Teil eines BS, der geordnete Ablage und Wiederfinden von Dateien auf Speichermedien ermöglicht die erforderlichen Zugriffsmöglichkeiten werden für die verwalteten Dateien bereitstellt Zugriffsmöglichkeiten auf einzelne Dateien werden mit den CRUD-Operationen angesproche Ein Dateisystem stellt darüber hinaus noch Operationen zur Verfügung: Verwalten von Verzeichnissen, Speicherplatz und von Datei- oder Verzeichnisattributen Kopieren von Dateien oder Verzeichnissen Verschieben von Dateien oder Verzeichnissen Laufe der Jahrzehnte wurden bemerkenswert viele verschiedene Dateisysteme entwickeltDateisystemkonzepte Von Windows unterstützte Dateisysteme: CDFS - UDF - FAT12 - FAT16 - FAT32 - exFAT - NTFS → Eine Unterstützung weiterer Dateisysteme ist nur durch die Installation zusätzlicher Treiber möglich. Ein Datenträger (Disk) ist ein physisches Speichermedium, welches in der Lage ist, digitale Daten dauerhaft zu speichern. → Festplatte - CD - DVD - USB-Stick Unter einem Sektor versteht man einen Hardware-adressierbaren Block auf einer Disk. → Festplatte ist aufgeteilt in eine herstellungsbedingte Anzahl an Sektoren mit einer Größe von 512 Byte→ Multipliziert mit der Anzahl der Sektoren ergibt sich so die Gesamt-Speicherkapazität einer Festplatte. Unter einer Partition versteht man eine Folge von zusammenhängenden Sektoren, kann identisch mit Volume sein. Ein Volume ist ein dem Nutzer des Betriebssystems bereitgestellten Speicherbereich für Dateien und Verzeichnisse (C: / D:). Ein Volume kann aus mehreren Partitionen bestehen→ Zwei Festplatten mit gleichgroßen Partition können unter Windows zu gespiegelten Volume zusammengefasst werden (RAID) Ein Cluster ist einen adressierbaren Block in einem Dateisystem, der Zusammenfassung von Sektoren einer Disk darstellt. → Ein Cluster besteht aus einem oder mehreren Sektoren→ Seine Größe ist stets ein ganzzahliges Vielfaches der Sektorgröße→ Da Cluster vom Dateisystem verwaltet werden, liegen alle Sektoren eines Clusters stets auf demselben Volume. Unter einer Datei versteht man eine Zusammenfassung von Clustern, eine Datei ist auf genau einem Volume gespeichertWindows unterstützte Dateisysteme FAT - File Allocation Table Eine Tabelle, über die einerseits eine Zuordnung von Clustern zu Dateien verwaltet wird, andererseits gibt die FAT Aufschluss über freie und belegte Cluster eines Dateisystems. Freie Cluster freie Cluster: 4, 7, 10, 13, 14, 18, 19, 28 und 30.→ Sobald eine Datei auf dem durch diese FAT verwaltete Dateisystem gespeichert werden soll, wird die Datei - entsprechend ihrer Größe - auf freien Cluster verteilt Datei zusammensetzenBeim Zugriff auf eine Datei, welche auf einem Dateisystem gespeichert ist, das durch die FAT verwaltet wird, muss das Betriebssystem die zu dieser Datei gehörigen Cluster ermitteln: Datei computer.txt beginnt in Cluster 6. (Information kommt aus Verzeichniseintrag) Das Betriebssystem sucht in der FAT die Zeile 6 Hier gibt es einen Verweis auf Cluster-Nr. 9 Zeile 9 verweist auf Cluster-Nr. 24. Zeile 24 verweist auf Cluster-Nr. 2. Zeile 2 verweist auf Cluster-Nr. 8. Zeile 8 verweist auf "nil", was bedeutet, dass kein weiterer Cluster folgt.→ Somit kann der Inhalt der Datei computer.txt durch die Inhalte der folgenden Cluster zusammengesetzt werden: 6, 9, 24, 2, 8 Beim Zusammensetzen des Dateiinhalts ist Clustereihenfolge zu beachten. NTFS - New Technology File System → Das Tool ntfsinfo.exe liefert eine Reihe von Informationen zu den verwendeten Größen für Volume, Sektor, Cluster, etc. → Im Master File Table (kurz MFT) speichert NTFS-Dateisystem Informationen zu Dateien / Verzeichnissen eines mit NTFS formatierten Volumes. Beispiel: → ein Sektor (0,1,2,3,...) ist 512 Byte groß → ein Cluster ist 2048 Byte groß→ es soll eine Datei (3000 Byte) abgespeichert werden→ BS: das Dateisystem benötigt 2 Cluster! Als Partition werden die zusammenhängenden, aufeinanderfolgenden Datenblöcke eines Teils eines Volumes bezeichnet. Die Umrechnung zwischen Clustur und Sektor passiert über den Treiber Wenn ich die Nummer des Clusters habe, kann ich die Nummer des zugehörigen Sektors berechnen