Betriebssysteme (BS) Unterbrechungen. Überblick: Vorlesungen. - Software - Agenda. Agenda. Anwendung(en) Hardware

Ähnliche Dokumente
Betriebssystembau (BSB) Unterbrechungen - Software -

Betriebssysteme (BS)

Betriebssystembau (BSB)

Betriebssystembau. 4. Übung. Michael Engel Arbeitsgruppe Eingebettete Systemsoftware. Lehrstuhl für Informatik 12 TU Dortmund

Betriebssystembau (BSB)

Betriebssystembau (BSB)

Betriebssystembau (BSB) Unterbrechungen - Synchronisation -

Betriebssystembau (BSB) Unterbrechungen - Synchronisation -

Betriebssysteme (BS)

Betriebssysteme (BS) VL 5 Unterbrechungen, Synchronisation. Daniel Lohmann.

Betriebssysteme (BS) VL 5 Unterbrechungen, Synchronisation. Volkmar Sieh / Daniel Lohmann.

Betriebssystembau (BSB)

Übung zu Betriebssystembau (Ü BS)

Betriebssysteme (BS) Unterbrechungen - Synchronisation - Überblick: Vorlesungen. Agenda. Agenda. Anwendung(en) Hardware. Motivation / Problem

Betriebssystembau (BSB)

i386 Interrupt-Deskriptortabelle (IDT)

Betriebssystembau. 3. Übung. Michael Engel Arbeitsgruppe Eingebettete Systemsoftware. Lehrstuhl für Informatik 12 TU Dortmund

Konzepte von Betriebssystem- Komponenten Ausnahme- / Unterbrechungsbehandlung

Betriebssystembau (BSB)

Programmunterbrechungen

Übung zu Betriebssysteme

Programmunterbrechungen. Betriebssysteme, c Wolfgang Schröder-Preikschat

Konzepte von Betriebssystem-Komponenten. Ausnahme- / Unterbrechungsbehandlung

Betriebssysteme (BS)

Betriebssysteme (BS) Koroutinen und Fäden. Überblick: Vorlesungen. Agenda. Agenda. Anwendung(en) Hardware. Motivation: Quasi-Parallelität

Betriebssysteme 1. Thomas Kolarz. Folie 1

(Ausnahmebehandlung)

Betriebssystembau (BSB)

Betriebssysteme (BS)

Betriebssysteme (BS) Unterbrechungen. Überblick: Vorlesungen. - Hardware - Überblick. Sinn und Zweck von Unterbrechungen. Anwendung(en) Hardware

Betriebssysteme (BS)

Übung zu Betriebssysteme

Betriebssystembau (BSB)

Betriebssystembau (BSB)

(a) Wie unterscheiden sich synchrone und asynchrone Unterbrechungen? (b) In welchen drei Schritten wird auf Unterbrechungen reagiert?

3.2 Prozessumschaltung

Übung 1 - Betriebssysteme I

Just-In-Time-Compiler (2)

Übung zu Betriebssysteme

3.5 Unterbrechungsbehandlung (interrupt handling)

Software ubiquitärer Systeme

Grundlagen Rechnerarchitektur und Betriebssysteme

Lehrveranstaltung: PR Rechnerorganisation Blatt 8. Thomas Aichholzer

Just-In-Time-Compiler (2)

Kap.2 Befehlsschnittstelle. Prozessoren, externe Sicht

2 Systemdienste. Wiederholungsempfehlung: Rechnerorganisation

Übung zu Betriebssysteme

DOSEMU. Vortrag im Hauptseminar Konzepte und Techniken virtueller Maschinen und Emulatoren. Matthias Felix FAU. 13.

Technische Informatik 1

Betriebssysteme Teil 3: Laufzeitsystem für Programme

Proseminar: Konzepte von Betriebsystem-Komponenten (KVBK)

"Organisation und Technologie von Rechensystemen 4"

I Einführung in Betriebssysteme


Technische Informatik I - HS 18

Betriebssysteme. G: Parallele Prozesse. (Teil B: Klassische Problemstellungen, Mutual Exclusion, kritische Regionen)

Rechnerarchitektur und Betriebssysteme (CS201): Frühe Betriebssysteme, geschützte CPU-Befehle, CPU-Modus

Kap.2 Befehlsschnittstelle. Prozessoren, externe Sicht

Betriebssystembau (BSB) Einführung

Unterprogramme mittels Stack (Forts.)

Wie groß ist die Page Table?

Architektur und Organisation von Rechnersystemen

Rainbow-OS Architekturseminar Thema: Interrupt-Controller

Betriebssysteme. Tutorium 2. Philipp Kirchhofer

Name: ES2 Klausur Thema: ARM Name: Punkte: Note:

Mikrocomputertechnik. Unterprogramm

Computer-Systeme Teil 11: Routinen

Teil VIII Von Neumann Rechner 1

Was machen wir heute? Betriebssysteme Tutorium 3. Organisatorisches. Prozesskontrollblock (PCB) Programmieraufgaben. Frage 3.1.a

Memory Models Frederik Zipp

Vorlesung 5: Interrupts

Übung zu Betriebssystemtechnik

32 Bit Konstanten und Adressierung. Grundlagen der Rechnerarchitektur Assembler 78

Assembler. Dr.-Ing. Volkmar Sieh. Department Informatik 4 Verteilte Systeme und Betriebssysteme Friedrich-Alexander-Universität Erlangen-Nürnberg

Betriebssysteme. Vorlesung im Herbstsemester 2010 Universität Mannheim. Kapitel 6: Speicherbasierte Prozessinteraktion

Interruptverarbeitung

Systeme I: Betriebssysteme Kapitel 4 Prozesse. Wolfram Burgard

Teil 1: Prozessorstrukturen

Mikrocomputertechnik. 6. Exceptionhandling ( Ausnahmebearbeitung)

Systeme I: Betriebssysteme Kapitel 4 Prozesse. Maren Bennewitz

Vorkurs Informatik WiSe 17/18

G Einführung in Betriebssysteme

Schreiben von Pages. Schreiben einer Page in den Swap Space ist sehr teuer (kostet millionen von CPU Zyklen).

Betriebssystembau (BSB) Einführung

Hinweise C-Programmierung

Name : Klasse : Punkte : Note :

Single- und Multitasking

Einführung. Anwendung. logischer Adreßraum. Kontrollfluß (Thread) = CPU führt Instruktionen aus. Was charakterisiert einen Kontrollfluß?

Betriebssystembau (BSB)

Übungsblatt 10 (Block C 2) (16 Punkte)

Betriebssysteme (BS) VL 1 Einführung. Vorwort. Voraussetzungen. Lernziele

Transkript:

Betriebssysteme (BS) Überblick: Vorlesungen Daniel Lohmann Unterbrechungen - Software - Lehrstuhl für Informatik 4 Verteilte Systeme und Betriebssysteme ezugriff (Treiber) Anwendung(en) Unterbrechungsbehandlung Hardware Interprozesskommunikation Unterbrechungssynchronisation Thema der heutigen Vorlesung Prozessverwaltung Kontrollflussabstraktion Betriebssystementwicklung 1 2 Agenda Agenda Begriff und Grundannahmen Interrupt, Exception, Trap präzise und unpräzise Unterbrechungen automatisch durch Kopplungsroutine Rückkehr Zustandsänderung Beispiele Problemanalyse Synchronisationstechniken Zusammenfassung Begriff und Grundannahmen Interrupt, Exception, Trap präzise und unpräzise Unterbrechungen automatisch durch Kopplungsroutine Rückkehr Zustandsänderung Beispiele Problemanalyse Synchronisationstechniken Zusammenfassung 3 4

Begriffe das Verständnis der Begriffe ist unterschiedlich... zwecks Klärung begeben wir uns auf die technische Ebene Begriffe das Verständnis der Begriffe ist unterschiedlich... zwecks Klärung begeben wir uns auf die technische Ebene Grob können drei Fälle unterschieden Seitenfehler Schutzfehler Division durch 0 Grob können drei Fälle unterschieden Systemaufruf Haltepunktinstruktion Alarm durch Zeitgeber Taste gedrückt NMI 5 6 Begriffe: Intel IA-32 Begriffe: Motorola/Freescale CPU32 das Verständnis der Begriffe ist unterschiedlich... zwecks Klärung begeben wir uns auf die technische Ebene das Verständnis der Begriffe ist unterschiedlich... zwecks Klärung begeben wir uns auf die technische Ebene (software-generated) exceptions fault, trap oder abort Intel IA-32-Architektur (x86): exceptions und interrupts software(-generated) interrupts internal exception Motorola/Freescale CPU32-Architektur (68k): Alles ist eine exception instruction trap exception external (hardwaregenerated) interrupts external exception (= interrupt) 7 8

Begriffe: Infineon TC1 das Verständnis der Begriffe ist unterschiedlich... zwecks Klärung begeben wir uns auf die technische Ebene Begriffe: Literatur (Stallings) das Verständnis der Begriffe ist unterschiedlich... zwecks Klärung begeben wir uns auf die technische Ebene (synchronous) hardware trap Infineon TC1-Architektur (TriCore): traps und interrupts (synchronous) software trap Trap Behandlung eines Fehlers oder eines Ausnahmezustandes William Stallings: Betriebssysteme: Prinzipien und Umsetzung Supervisor-Aufruf Aufruf einer Betriebssystemfunktion (asynchronous) hardware trap NMI DMA-Fehler interrupt Interrupt Reaktion auf ein externes asynchrones Ereignis 9 10 Begriffe: Literatur (Silberschatz) Begriffe: Literatur (Tanenbaum) das Verständnis der Begriffe ist unterschiedlich... zwecks Klärung begeben wir uns auf die technische Ebene das Verständnis der Begriffe ist unterschiedlich... zwecks Klärung begeben wir uns auf die technische Ebene exception Behandlung eines Fehlers oder eines Ausnahmezustandes Silberschatz et al : Operating System Concepts software interrupt / trap Aufruf einer Betriebssystemfunktion Interrupts are an unpleasant fact of life Andrew S. Tanenbaum: Modern Operating Systems (ältere Ausgabe) interrupt Reaktion auf ein externes asynchrones Ereignis 11 12

Begriffe: Unser Verständnis in BS Begriffe: Unser Verständnis in BS Trap durch ausgelöst - auch die trap oder int für Systemaufrufe - nicht definiertes Ergebnis (z.b. Division durch 0) - Hardware-Problem (z.b. Busfehler) - Betriebssystem muss eingreifen (z.b. Seitenfehler) - ungültige (z.b. bei Programmfehler) Eigenschaften - oft vorhersagbar, oft reproduzierbar - Wiederaufnahme oder Abbruch der auslösenden Aktivität Unterbrechung (engl. Interrupt): durch Hardware ausgelöst - Hardware verlangt die der Software (Zeitgeber, Tastatursteuereinheit, Festplattensteuereinheit,...) Eigenschaften: - nicht vorhersagbar, nicht reproduzierbar - in der Regel Wiederaufnahme der unterbrochenen Aktivität Trap durch ausgelöst - auch die trap oder int für Systemaufrufe - nicht definiertes Ergebnis (z.b. Division durch 0) - Hardware-Problem (z.b. Busfehler) - Betriebssystem muss eingreifen (z.b. Seitenfehler) - ungültige (z.b. bei Programmfehler) Eigenschaften - oft vorhersagbar, oft reproduzierbar - Wiederaufnahme oder Abbruch der auslösenden Aktivität Unterbrechung (engl. Interrupt): durch Hardware ausgelöst - Hardware verlangt die der Software (Zeitgeber, Tastatursteuereinheit, Festplattensteuereinheit,...) Eigenschaften: - nicht vorhersagbar, nicht reproduzierbar - in der Regel Wiederaufnahme der unterbrochenen Aktivität 13 14 Grundannahmen Grundannahmen: Behandlungsroutine Wir betrachten Behandlung von Unterbrechungen unter den folgenden Grundannahmen: 1. Die CPU startet die Behandlungsroutine automatisch. 2. Die Unterbrechungsbehandlung erfolgt im Systemmodus. 3. Das unterbrochene Programm kann fortgesetzt. 4. Die Maschineninstruktionen verhalten sich atomar. 5. Die Unterbrechungsbehandlung kann unterdrückt. 1. Die CPU startet die Behandlungsroutine automatisch. die Zuordnung einer Behandlungsroutine Ermittlung der Unterbrechungsursache nötig Hauptspeicher Vektortabelle Behandlung Int. 1 Behandlung Int. 2 Behandlung Int. 3 Varianten: Register enthält Startadresse der Vektortabelle Tabelleneinträge enthalten Code Programmierbarer Event Controller behandelt die Unterbrechung in Hardware Tabelle enthält Deskriptoren Behandlungsroutine hat eigenen Prozesskontext 15 16

Expansionsrichtung Grundannahmen: Systemmodus 2. Die Unterbrechungsbehandlung erfolgt im Systemmodus. Unterbrechungen sind der einzige Mechanismus, um nicht-kooperativen Anwendungen die CPU zu entziehen nur das BS darf uneingeschränkt auf e zugreifen die CPU schaltet daher vor der Unterbrechungsbehandlung in den privilegierten Systemmodus Varianten: bei 16-Bit-CPUs ist eine Aufteilung in Benutzer-/Systemmodus eher die Ausnahme bei 8-Bit-CPUs (oder kleiner) gibt es diese Aufteilung nicht Grundannahmen: Kontextsicherung 3. Das unterbrochene Programm kann fortgesetzt. notwendiger Zustand wird automatisch gesichert ggf. auch geschachtelt, Stapel Ebene 2 Ebene 1 Ebene 5 RTE RTE PC 0 PC 0 PC 0 SR 0 SR 0 SR 0 PC 2 SR 2 verzögert Ebene 1 PC 0 SR 0 RTE Varianten: weitere Informationen über die Ursache auf dem Stapel keine Prioritäten spezieller Interrupt-Stack Kontextsicherung in Registern 17 18 Grundannahmen: Atomares Verhalten 4. Die Maschineninstruktionen verhalten sich atomar. definierter CPU-Zustand zu Beginn der Behandlungsroutine Wiederherstellbarkeit des Zustands Grundannahmen: Atomares Verhalten 4. Die Maschineninstruktionen verhalten sich atomar. Befehlsverarbeitung bei superskalaren Prozessoren: (stark vereinfacht!) trivial bei CPUs mit klassischem von-neumann-zyklus nicht-trivial bei modernen CPUs: verarbeiten holen dekodieren ausgeben verarbeiten zurückschreiben Fließbandverarbeitung: Befehle müssen annuliert Superskalare CPUs: zusätzlich Befehlsreihenfolge merken verarbeiten Im Idealfall alle Stufen immer benutzt, d.h. mehrere Befehle parallel. Wann soll geprüft, ob eine Unterbrechungsanforderung anliegt? 19 20

Grundannahmen: Atomares Verhalten 4. Die Maschineninstruktionen verhalten sich atomar. Grundannahmen: Unterdrückung 5. Die Unterbrechungsbehandlung kann unterdrückt. Trotz der Schwierigkeiten liefern die meisten CPUs präzise Unterbrechungen : All instructions preceding the instruction indicated by the saved program counter have been executed and have modified the process state correctly. All instructions following the instruction indicated by the saved program counter are unexecuted and have not modified the process state. If the interrupt is caused by an exception condition raised by an instruction in the program, the saved program counter points to the interrupted instruction. The interrupted instruction may or may not have been executed, depending on the definition of the architecture and the cause of the interrupt. Whichever is the case, the interrupted instruction has either completed, or has not started execution. J. E. Smith and A. R. Pleszkun, Implementing Precise Interrupts in Pipelined Processors, IEEE Transactions on Computers, Vol. 37, No. 5, 1988 Beispiele: Motorola 680x0: entsprechend der Priorität Intel x86: global mit sti, cli Interrupt Controller: jede Quelle einzeln automatische Unterdrückung erfolgt auch durch die CPU vor Betreten der Behandlungsroutine 21 22 Grundannahmen: Unterdrückung Agenda 5. Die Unterbrechungsbehandlung kann unterdrückt. automatische Unterdrückung erfolgt auch durch die CPU vor Betreten der Behandlungsroutine Unterbrechungen nicht vorhersagbar, theoretisch beliebig häufig Stapelüberlauf könnte nicht ausgeschlossen unterdrückt wird (durch die Hardware) die Behandlung... pauschal aller Unterbrechungen (sehr restriktiv) Unterbrechungen niedriger oder gleicher Priorität (weniger restriktiv) - bestimmte e bevorzugt bessere Modelle mit Hilfe von Software (z.b. in Linux): Begriff und Grundannahmen Interrupt, Exception, Trap präzise und unpräzise Unterbrechungen automatisch durch Kopplungsroutine Rückkehr Zustandsänderung Beispiele Problemanalyse Synchronisationstechniken Zusammenfassung Unterbrechungen, die bereits behandelt, unterdrückt - hohe Reaktivität ohne Bevorzugung einzelner e 23 24

der Zustand eines Rechners ist enorm groß alle Prozessorregister - szeiger, Stapelzeiger, Vielzweckregister, Statusregister,... der komplette Hauptspeicherinhalt, Caches der Inhalt von E/A-Registern bzw. Ports, Festplatteninhalte,... jeglicher benutzter Zustand, dessen asynchrone Änderung das unterbrochene Programm nicht erwartet,... darf während der Unterbrechungsbehandlung nicht modifiziert muss gesichert und später wiederhergestellt die CPU sichert (je nach Typ) automatisch... minimal wenige Bytes (nur szeiger und Statusregister) alle Register skonzepte totale Sicherung die Behandlungsroutine sichert alle Register, die nicht automatisch gesichert wurden Nachteil: eventuell wird zu viel gesichert Vorteil: gesicherter Zustand leicht zugreifbar partielle Sicherung die Behandlungsroutine sichert nur die Register, die im weiteren Verlauf geändert bzw. nicht gesichert und wieder hergestellt machbar, wenn die eigentliche Behandlung in einer Hochsprache wie C oder C++ implementiert ist Vorteile: - nur veränderter Zustand wird auch gesichert - evtl. weniger en zum Sichern und Wiederherstellen nötig Nachteil: gesicherter Zustand verstreut 25 26 Übergang auf die Hochsprachenebene Übergang auf die Hochsprachenebene nicht-portabler Maschinencode sollte minimiert die eigentliche Unterbrechungsbehandlung erfolgt in einer Hochsprachenfunktion unterbrochenes Programm autom. Sicherung Wiederherstellung rte Kopplungsroutine ( wrapper -Funktion) (partiell/total) Aufruf Rückkehr jsr rts eigentliche Behandlung (Sicherung der benutzten nicht-flüchtigen Register) nicht-portabler Maschinencode sollte minimiert die eigentliche Unterbrechungsbehandlung erfolgt in einer Hochsprachenfunktion Beispiel MC680x0 autom. Sicherung Zustandswiederherstellung Unterbrechungsbehandlungsroutine unterbrochenes Kopplungsroutine Programm ( wrapper Funktion) totale Sicherung: moveml d0-d7/a0-a6,sp@-... moveml sp@+,d0-d7/a0-a6 (partiell/total) Aufruf partielle Sicherung: moveml d0-d1/a0-a1,sp@- Zustands-... wiederher- stellung moveml sp@+,d0-d1/a0-a1 Rückkehr Wiederherstellung rte jsr rts Unterbrechungsbehandlungsroutine eigentliche Behandlung (Sicherung der benutzten nicht-flüchtigen Register) Sprache: beliebig Assembler! Hochsprache Sprache: beliebig Assembler! Hochsprache 27 28

Flüchtige und nicht-flüchtige Register Wiederherstellung eine Aufteilung, die der (C/C++) Übersetzer vornimmt nicht-flüchtig - der Übersetzer garantiert, dass der Wert dieser Register über Funktionsaufrufe hinweg erhalten bleibt - ggf. in der aufgerufenen Funktion gesichert und wiederhergestellt flüchtig (engl. scratch registers) - wenn die aufrufende Funktion den Wert auch nach dem Aufruf noch benötigt, muss das Register selbst (beim Aufrufer) gesichert - normalerweise für Zwischenergebnisse verwendet üblicherweise gibt es jedoch einen Standard an den sich alle Übersetzer halten Beispiel x86: - eax, ecx, edx und eflags gelten als flüchtig die Kopplungsroutine muss alle gesicherten Registerinhalte am Ende wieder laden... und dann nicht mehr verändern! mit einer speziellen (z.b. rte oder iret) wird der vorherige Zustand wiederhergestellt Lesen des automatisch gesicherten Zustands von Supervisor-Stack Setzen des gesicherten Arbeitsmodus (Benutzer-/Systemmodus) und Sprung an die gesicherte Adresse Das BS kann den Zustand auch vor dem rte/iret ändern. Dies wird gerne ausgenutzt, um BS-Code im Benutzermodus auszuführen. 29 30 Agenda Zustandsänderungen... Begriff und Grundannahmen Interrupt, Exception, Trap präzise und unpräzise Unterbrechungen automatisch durch Kopplungsroutine Rückkehr Zustandsänderung Beispiele Problemanalyse Synchronisationstechniken Zusammenfassung sind Sinn und Zweck der Unterbrechungsbehandlung etreiber müssen über den Abschluss einer E/A Operation informiert der Scheduler muss erfahren, dass eine Zeitscheibe abgelaufen ist müssen mit Vorsicht durchgeführt Unterbrechungen können zu jeder Zeit auftreten kritisch sind Daten/Datenstrukturen, die der normale Kontrollfluss und die Unterbrechungsbehandlung sich teilen 31 32

Beispiel 1: Systemzeit per Zeitgeberunterbrechung wird die globale Systemzeit inkrementiert z.b. einmal pro Sekunde mit Hilfe einer Betriebssystemfunktion time() kann die Systemzeit abgefragt Beispiel 1: Systemzeit hier schlummert möglicherweise ein Fehler... das Lesen von global_time erfolgt nicht notwendigerweise atomar! 32-Bit-CPU: mov global_time, %eax 16-Bit-CPU (little endian): mov global_time, %r0; lo mov global_time+2, %r1; hi /* globale Zeitvariable */ extern volatile time_t global_time; kritisch ist eine Unterbrechung zwischen den beiden Leseinstruktionen bei der 16-Bit-CPU /* Systemzeit abfragen */ time_t time () { return global_time; /* Unterbrechungs- * * behandlung */ void timerhandler () { global_time++; global_time Resultat hi / lo r1 / r0? 002A FFFF?? mov global_time, %r0 002A FFFF? FFFF /* Inkrementierung */ 002B 0000? FFFF mov global_time+2, %r1 002B 0000 002B FFFF 33 34 Beispiel 1: Systemzeit hier schlummert möglicherweise ein Fehler... das Lesen von global_time erfolgt nicht notwendigerweise atomar! 32 Bit Problem: CPU: mov global_time, %eax 16 Bit CPU (little endian): mov global_time, %r0; lo mov global_time+2, %r1; hi Alle 18,2 Stunden kann die Systemzeit (kurz) um etwa die gleiche Zeit vorgehen. kritisch ist Leider eine Unterbrechung ist das Problem nicht zwischen verlässlich den beiden Leseinstruktionen reproduzierbar. bei der 16 Bit CPU? mov global_time, %r0 global_time hi / lo Resultat r1 / r0 002A FFFF?? 002A FFFF? FFFF /* Inkrementierung */ 002B 0000? FFFF mov global_time+2, %r1 002B 0000 002B FFFF Beispiel 2: Ringpuffer Unterbrechungen wurden eingeführt, damit das System nicht aktiv auf Eingaben warten muss während gerechnet wird, kann die Unterbrechungsbehandlung Eingaben in einem Puffer ablegen Rechne sinnvoll verarbeite Eingaben mal wieder Zeit [Puffer nicht leer] Lese Eingabe vom Eingabe im Puffer ablegen [Puffer nicht voll] 35 36

Beispiel 2: Ringpuffer Unterbrechungen wurden eingeführt, damit das System nicht aktiv auf Eingaben warten muss während gerechnet wird, kann die Unterbrechungsbehandlung Eingaben Problem: in einem Puffer ablegen Wenn die Eingabe nicht schnell genug verarbeitet, kann der Puffer voll. Die Behandlungsroutine kann die Eingabe dann nicht im Puffer ablegen. In diesem Fall Lese Eingabe geht die Eingabe Rechne verloren. vom sinnvoll verarbeite Eingaben mal wieder Zeit [Puffer nicht leer] Eingabe im Puffer ablegen [Puffer nicht voll] 37 Beispiel 2: Ringpuffer auch die Pufferimplementierung ist kritisch... // Pufferklasse in C++ class BoundedBuffer { char buf[size]; int occupied; int nextin, nextout; public: BoundedBuffer(): occupied(0), nextin(0), nextout(0) { void produce(char data) { // Unterbrechungsbehandlung: int elements = occupied; // Elementzähler merken if (elements == SIZE) return; // Element verloren buf[nextin] = data; // Element schreiben nextin++; nextin %= SIZE; // Zeiger weitersetzen occupied = elements + 1; // Zähler erhöhen char consume() { // normaler Kontrollfluss: int elements = occupied; // Elementzähler merken if (elements == 0) return 0; // Puffer leer, kein Ergebnis char result = buf[nextout]; // Element lesen nextout++; nextout %= SIZE; // Lesezeiger weitersetzen occupied = elements 1; // Zähler erniedrigen return result; // Ergebnis zurückliefern ; 38 Beispiel 2: Ringpuffer Ausführung auch die Pufferimplementierung ist kritisch... Zustand char consume() { int elements = occupied; // 1 if (elements == 0) return 0; char result = buf[nextout]; //'a' nextout++; nextout %= SIZE; void produce(char data) { // 'b' int elements = occupied; // 1! if (elements == SIZE) return; buf[nextin] = data; nextin++; nextin %= SIZE; occupied = elements + 1; // 2 'a'?? 1 1 0 buf [0] [1] [2] occ. nextin nextout 'a'?? 1 1 0 buf [0] [1] [2] occ. nextin nextout 'a' 'b'? 2 2 0 buf [0] [1] [2] occ. nextin nextout Beispiel 2: Ringpuffer auch die Pufferimplementierung ist kritisch... Ausführung Zustand 'a'?? 1 1 0 char consume() { int elements = occupied; // 1 if (elements Problem: == 0) return 0; buf [0] [1] [2] occ. nextin nextout char result = buf[nextout]; //'a' 'a'?? 1 1 0 nextout++; Beim nächsten nextout %= Aufruf SIZE; von consume() buf [0] hat [1] occupied [2] occ. nextin nextout den Wert 0. Damit wird kein Ergebnis geliefert. Die void produce(char data) { // 'b' int elements Datenstruktur = occupied; ist in einem // 1! inkonsistenten Zustand. if (elements == SIZE) return; buf[nextin] = data; 'a' 'b'? 2 2 0 nextin++; nextin %= SIZE; occupied = elements + 1; // 2 buf [0] [1] [2] occ. nextin nextout occupied = elements 1; // 0 return result; // 'a' buf 'a' 'b'? 0 2 0 [0] [1] [2] occ. nextin nextout occupied = elements 1; // 0 return result; // 'a' buf 'a' 'b'? 0 2 0 [0] [1] [2] occ. nextin nextout 39 40

Zustandsänderung: Analyse selbst einzelne Zuweisungen müssen nicht atomar sein Abhängigkeit vom CPU-Typ, Übersetzer und Codeoptimierung Pufferspeicher ist endlich Behandlungsroutine warten Daten können verloren gehen Pufferdatenstruktur kann kaputt gehen aufgrund von... inkonsistenten Zwischenzuständen bei Änderungen durch den normalen Kontrollfluss Zustandsänderungen während des Lesens (inkonsistente Kopie!) Änderungen mit Hilfe einer Kopie, die nicht mehr dem Original entspricht das Problem ist nicht symmetrisch der normale Kontrollfluss unterbricht nicht die Unterbrechungsbehandlung kann ausgenutzt! Agenda Begriff und Grundannahmen Interrupt, Exception, Trap präzise und unpräzise Unterbrechungen automatisch durch Kopplungsroutine Rückkehr Zustandsänderung Beispiele Problemanalyse Synchronisationstechniken Zusammenfassung 41 42 Harte Synchronisation Weitere Techniken in der nächsten VL durch Unterdrückung von Unterbrechungen können race conditions vermieden Operationen auf gemeinsamen Daten so atomar schlaue (optimistische) Verfahren Datenstruktur geschickt wählen - möglichst wenige geteilte Elemente char consume() { // normaler Kontrollfluss: disable_interrupts(); // Unterbrechungen verbieten int elements = occupied; // Elementzähler merken if (elements == 0) return 0; // Puffer leer, kein Ergebnis char result = buf[nextout]; // Element lesen nextout++; nextout %= SIZE; // Lesezeiger weitersetzen occupied = elements 1; // Zähler erniedrigen enable_interrupts(); // Unterbrechungen zulassen return result; // Ergebnis zurückliefern Probleme: Gefahr des Verlusts von Unterbrechungsanforderungen hohe und schwer vorherzusagende Unterbrechungslatenzen - mit weichen Konsistenzbedingungen arbeiten optimistisch herangehen - i.d.r. tritt keine Unterbrechung im kritischen Abschnitt auf - falls doch, wird der schaden festgestellt und repariert - ggf. wird die Operation auch wiederholt Pro-/Epilogmodell Aufteilung der Unterbrechungsbehandlung in zwei Phasen - der kritische Teil wird durch einen Softwaremechanismus verzögert - schnelle Reaktion weiterhin möglich 43 44

Zusammenfassung die korrekte Behandlung von Unterbrechungen gehört zu den schwierigsten Aufgaben im Betriebssystembau Quelle der Asynchronität - gleichzeitig Segen und Fluch auf Registerebene - Assemblerprogrammierung! - Abhängigkeit vom Übersetzer (z.b. flüchtige/nicht-flüchtige Register) unterschiedliche Modelle (Prioritäten, u.s.w.) Zustandsänderungen in der Unterbrechungsbehandlung müssen wohl überlegt sein kritische Abschnitte schützen Fehler schwer zu finden (nicht verlässlich reproduzierbar!) 45