Echtzeitverarbeitung Inhaltverzeichnis 1. EINLEITUNG 4 1.1. Definition: Echtzeitverarbeitung 4 1.2. Programmieransätze 4 1.3. Annahmen der klassischen Programmierung 4 1.4. Literatur 5 1.5. Trend 5 2. EIGENSCHAFTEN VON ALGORITHMEN 6 2.1. Ausführung nebenläufiger Anweisungen 7 2.2. Abhängigkeiten von Prozessen 9 2.2.1. Konkurrenz 2.2.2. Kooperation 9 9 2.3. Prozessverwaltung 10 2.4. Zustände von Prozessen 10 2.5. Planung (Scheduling) 11 2.5.1. Planung auf niedriger Ebene 2.5.2. Zeitgerechte Einplanung 11 13 2.6. Unterbrechungen (Interrupts) 15 2.7. Interrupts versus Sampling 15 3. SYNCHRONISATION 16 3.1. Synchronisationsbedarf bei: 16 3.2. Synchronisationsarten 17 3.3. Kritische Abschnitte (critical sections/ regions) 17 3.4. Synchronisationsprobleme 18 3.5. Petri Netze 18 3.5.1. 3.5.2. 3.5.3. 3.5.4. 3.5.5. Petri-Netze ohne Marken Interpretation als „Kanal-Instanz Netz“ (channel agency nets) Petri-Netze mit Marken Synchronisation in Petri-Netzen Petri-Netze mit unterscheidbaren Marken 18 19 20 22 25 2 3.6. Verklemmungen (Deadlocks) 3.6.1. Verklemmungsvermeidung durch Bedarfsangabe 3.7. Schlossvariablen 3.7.1. Einseitige Synchronisation 3.7.2. Mehrseitige Synchronisation 4. WHAT REALLY HAPPENED ON MARS? 26 28 29 29 29 38 3 1. Einleitung 1.1. Definition: Echtzeitverarbeitung Zeitkritische Anwendungen innerhalb ihres Zeitrahmens ausführen, maximal bis zur Deadline. Prozess gibt Echtzeitanforderungen vor. 1.2. Programmieransätze time-triggered zeitgesteuert synchrone Programmierung - SPS (speicherprogrammierbare Steuerung) event-triggered ereignisgesteuert asynchrone Programmierung - - E Sensoreingaben P Programm A Ausgabe Aktorik - - Tasks (Threads), Interrupts können auftreten, Programm kann dadurch sehr lange dauern nicht deterministisch aber flexibel Fokus der Vorlesung, obwohl weniger geeignet als linke Variante es gibt Abhängigkeiten zwischen Tasks, die synchronisiert werden müssen bei geteilten Betriebsmitteln Möglichkeit zum Deadlock am Eingang werden alle Signale (Alarm, Daten) erfasst das Programm läuft ohne Unterbrechung durch, selbst bei Alarm erst beim nächsten Durchlauf wird darauf eingegangen zeitsicher unflexibel, determiniert, sicher für Echtzeit 1.3. Annahmen der klassischen Programmierung - 1 Rechner führt genau ein Programm aus 1 Programm wird genau auf einem Rechner ausgeführt 1 Programm erfüllt seine Funktion unabhängig vom Startzeitpunkt und benötigt Bearbeitungszeit 4 Fallen diese Annahmen weg, sind Programme - nebenläufig (concurrent) - verteilt (distributed) - echtzeitabhängig (real-time dependet) 1.4. Literatur Nebenläufige Programme (Springer Verlag) Real Time Systems (Flugzeug auf Cover) Real Time Systems (Satellit auf Cover) 1.5. Trend Dezentralisierung durch verteilte Systeme Multiprozessorsysteme konzentriertes System verteiltes System Kommunikation über gemeinsame Speicher ohne gemeinsamen Systembus: Prozessor 1 Kommunikation über Bussysteme (Netz) Prozessor 1 Feldbus, Ethernet Prozessor 2 Prozessor 2 Speicher 1 Systembus 1 Speicher 2 Systembus 2 Synchronisierung über Nachrichten Speicher 1 gemeinsamer Speicher Speicher 2 mit gemeinsamen Systembus: Prozessor 1 Prozessor 2 Systembus Speicher 1 gemeinsamer Speicher Speicher 2 Synchronisierung über globale Variablen 5 2. Eigenschaften von Algorithmen sequentieller Ablauf Bsp. v = x; w = x; x = y; Programme, deren Ablauf eindeutig vorherbestimmt ist, heißen deterministisch. Deterministische Programme liefern bei jeder Ausführung mit gleichen Eingabedaten identische Ergebnisse Bsp. x = i; y = j; //Eingabe v = x; w = x; x = y; v = w = i; x = y = j; //Ausgabe Ein Programm, das bei gleichen Eingaben gleiche Ausgaben produziert, heißt determiniert. Deterministische Programme liefern determinierte Ergebnisse. „Deterministisch“ bezieht sich auf Ablauf (Reihenfolge des Ablaufs vorhersehbar), „determiniert“ bezieht sich auf Ergebnis. => Können determinierte Ergebnisse auch ohne deterministische Programme erzeugt werden? Verzicht auf Sequentialität kann bedeuten: - die Anweisungen können parallel von mehreren Prozessoren ausgeführt werden oder - die Anweisungen können in einer beliebigen Folge sequentiell von einen Prozessor ausgeführt werden → das ist die Definition von Nebenläufigkeit Bsp. v = x; //mit zweiter Anweisung austauschbar w = x; //erste und zweite Anweisung sind folglich nebenläufig x = y; Definition: Eine unteilbare Anweisung wird von einem Prozessor ohne Unterbrechung ausgeführt. Falls die Anweisung nicht unteilbar ist, kann die Ausführung in mehreren Schritten erfolgen. Ist eine Anweisung nebenläufig, ist auch jeder Schritt nebenläufig. 6 Bsp. Parallele Ausführung auf zwei Prozessoren, → t A1 Prozessor 1 Prozessor 2 A2 B1 A3 B2 nebenläufig auf einem Prozessor, wenn Anweisungen unteilbar, → t Variante 1 Variante 2 A1 B1 A2 A3 B1 B2 A1 B2 A2 A3 nebenläufig auf einem Prozessor, wenn Anweisungen teilbar, verzahnte Ausführung möglich (interleafing), Reihenfolge von A und B muss gewahrt werden (z.B. A2 nicht vor A1), → t eine mögliche Variante B1 A1 A2 B2 A3 Begriffe: nebenläufig ≠ parallel Parallelität ist eine spezielle Form der Nebenläufigkeit: nebenläufige Anweisungen sind parallel, wenn sie auf verschiedenen Prozessoren ausgeführt werden. 2.1. Ausführung nebenläufiger Anweisungen Bei der Ausführung können nebenläufige Anweisungen per Definition beliebig (= nicht deterministisch) sequentialisiert werden. Wird trotz Nichtdeterminismus ein deterministisches Ergebnis erwartet, müssen alle möglichen Sequentialisierungen das gleiche Ergebnis liefern. Bsp. conc x = x+1 || x = x+1 end conc Schritt Anweisung 1 Anweisung 2 x 0 i 1 x = x+1 i+1 2 x = x+1 i+2 Annahme: Anweisung x = x+1 ist unteilbar, gleiches Ergebnis bei umgekehrter Reihenfolge Annahme: Anweisung erfolgt nicht unteilbar, sondern in folgender Sequenz: load x, r //Inhalt von x ins Register r Laden inc r //r inkrementieren store r, x //r nach x schreiben Verzahnte Ausführung (eine Möglichkeit): 7 Schritt 0 1 2 3 4 5 6 Anweisung 1 Anweisung 2 load x, r inc r load x, r inc r store r, x store r, x x r i i i i i i+1 i+1 ? i i+1 i i+1 i+1 i+1 Falsches Ergebnis, weil Anweisung unteilbar. Annahme: verschiedene Register für jede Anweisung: Schritt 0 1 2 3 4 5 6 Anweisung 1 Anweisung 2 load x, r1 load x, r2 inc r1 inc r2 store r1, x store r2, x x r1 i ? i i i i i i+1 i i+1 i+1 i+1 i+1 i+1 r2 ? ? i i i+1 i+1 i+1 Falsches Ergebnis (ein Beispiel reicht aus, um Nebenläufigkeit zu widerlegen) Bei Nebenläufigkeit determiniertes Ergebnis nur wenn alle Sequentialisierungen auf der Ebene der unteilbaren Anweisungen das gleiche Ergebnis liefern. Selbst wenn die Anweisung x = x+1 unteilbar ist, kann die parallele Ausführung Probleme bereiten: Schritt Prozessor 1 Prozessor 2 x 0 i 1 x = x+1 x = x+1 i+1 Die Determiniertheit ist bei Mehrprozessorsystemen selbst bei Unteilbarkeit der Anweisungen nicht gewährleistet. Problem der Nichtreproduzierbarkeit bei nebenläufigen Anweisungen (Fehler können z.B. nur bei einer bestimmten Ausführungsreihenfolge auftreten und sind kaum zu finden). Definition: Prozess (Rechnerprozess, Task) Ein Prozess ist eine sequentielle Folge von Aktivitäten, durch die eine in sich geschlossene Aufgabe bearbeitet wird. Prozesse sind virtuelle Objekte zur Strukturierung von Programmsystemen. In der Regel sind Prozesse von einander abhängig. 8 2.2. Abhängigkeiten von Prozessen 2.2.1. Konkurrenz Gleichzeitige Benutzung eines gemeinsamen Betriebsmittels. 2.2.2. Kooperation Produzenten-Konsumenten Systeme Produzent Produzent Konsument Konsument Kommunikation nur in eine Richtung Bsp. Buchungssystem im Supermarkt 3 Tasks Lesen Lesen Buchung Buchung Strichcode Drucken Drucken Zettel Prozesse sind Nebenläufig, d.h. „Drucken“ kann nebenläufig von „Lesen“ und „Buchen“ passieren. Es ist aber nicht unabhängig, es kann erst gedruckt werden, wenn Daten vom Buchungssystem eintreffen. Auftraggeber-Auftragnehmer Systeme (Client-Server) Auftraggeber Auftraggeber Auftragnehmer Auftragnehmer Bsp. Bordcomputer Bordcomputer Verkehrsrechner Verkehrsrechner Kooperation und Konkurrenz schließen sich nicht aus. Teilaufgaben kooperierender Prozesse können in Konkurrenz zueinander stehen. (Mischform) Synchronisation koordiniert die Kooperation und Konkurrenz zwischen Prozessen (= bringt die Aktivitäten verschiedener nebenläufiger Prozesse in eine bestimmte Reihenfolge). Synchronisation erfordert Kommunikation (und umgekehrt): - zum Abstimmen zweier Aktivitäten können Prozesse Informationen austauschen - ein Informationsaustausch erfordert die Abstimmung der Aktivitäten von Informationsabgabe und –aufnahme 9 2.3. Prozessverwaltung Hat die Aufgabe, Prozesse in geordneter Weise einen Prozessor zur Verfügung zu stellen. Prozesse benötigen neben dem Prozessor noch weitere Betriebsmittel (BM, ressources). Definition: Betriebsmittel Das sind alle Elemente einer Rechenanlage, die von einem Prozess benutzt werden können (Ausgabegeräte, Speicherbereiche, …) Eigenschaften vom Betriebsmittel: - exklusiv, Zugriff nur durch einen Prozess zu jedem Zeitpunkt - entziehbar (preemtive), Prozess gibt das BM ab und kann nach Wiederzuweisung so arbeiten, als hätte er es nie abgegeben (nicht entziehbar z.B. Drucker) - wiederverwendbar (reusable), z.B. RAM, aber nicht ROM 2.4. Zustände von Prozessen Anmelden (wird erschaffen, läuft aber noch nicht) existent Start unbekannt Neustart Zuteilung des Prozessors bereit wartet auf Prozessor in Warteschlange Abmeldung beendet durch vollständige Abarbeitung laufend Entzug des Prozessor Fremdblockade (BM außer Prozessor fehlt) Eigenblockade (BM nicht zur Verfügung außer Prozessor) blockiert Betriebssystem (OS) ist auch ein Task (Prozess) mit höchster Priorität. Operationen, die zu Zustandsübergängen führen, können immer nur vom laufenden Prozess durchgeführt werden. Prozesse können sich nicht selbst starten oder „de blockieren“. Verwaltungsprozess (Scheduler) läuft in regelmäßigen Abständen und bei allen Aktionen, die Zustandswechsel erfordern. Bsp. Anweisung in PEARL (Programmiersprache für Echtzeit, heute kaum noch genutzt, ADA beliebter) Terminate Druckmessung; AFTER 24HRS ACTIVATE Druckmessung; … Suspend Druckmessung; … Continue Druckmessung; 10 Bereitliste der Prozessverwaltung Zuteilung zu Prozessor 1. Prozess G 2. Prozess J 3. Prozess B 4. Prozess M Stellung in Liste gibt augenblickliche Priorität an Warteschlange Verschiedene Zuteilungsstrategien: FIFO, LIFO 2.5. Planung (Scheduling) Ist die Methode, nach der Priorität von Prozessen bestimmt wird. Planung ist auf verschiedenen Ebenen möglich: - niedrige Ebene: Vergabe eines BM (Prozessor) - mittlere Ebene: mehrere BM-Anforderungen im Zusammenhang - höchste Ebene: alle Prozesse im Zusammenhang betrachten Planung ist Teil der Prozessverwaltung und kostet Rechenzeit (Overhead). Ziel: möglichst sinnvolle Systemauslastung. Planungskriterien verschieden je nach Anwendung: - Interaktive Systeme: alle Benutzer sollen möglichst gleichmäßig schnell vorankommen, „Faire“ Planung vermeidet „Aushungern“ von Prozessen (Starvation, Prozess erhält auf Dauer mindestens ein BM nicht) - Echtzeitsysteme: Deadlines entscheidend, nicht unbedingt Fairness 2.5.1. Planung auf niedriger Ebene Berücksichtigung eines BM → Prozessorbeschränktes System (processor bound system) Zuteilung des Prozessors Start bereit Beendigung laufend Entzug des Prozessor Warten auf BM wird nicht betrachtet → kein „blockiert“ Zustand 11 a) Einplanung nach Wartezeit (FIFO) Strategie geht davon aus, dass ein gestarteter Prozess ohne Unterbrechung bis zum Ende abgearbeitet wird. Ungeeignet für Echtzeitanforderungen. Positiv: minimaler Aufwand, objektives Kriterium Negativ: alle Prozesse werden gleich behandelt (kurzer dringender Prozess muss auf langen, bereits gestarteten warten) b) Einplanung nach Laufzeit, Prozess mit kürzester Laufzeit wird zuerst bearbeitet (shortet job first) Welcher Prozess ist der kürzeste? Schätzungen der Benutzer (Extra-Kosten oder Abbruch bei überschreiten des angegebenen Schätzwerts). Ununterbrochene Abarbeitung eines Prozesses oder Unterbrechung beim Eintreffen eines kürzeren Prozesses? Bei zweiten Fall Gefahr des Aushungerns. c) Zyklische Einplanung (round-robin Scheduling) Jeder Prozess erhält feste Zeitscheiben (time slots). Anpassung an verschiedene Prozesse durch verschieden große Zeitscheiben. Optimale Festlegung der Dauer schwierig. Slots zu lang: Leerlauf bei kurzen Prozessen. Slots zu kurz: Overhead bei Prozesswechsel steigt, wenn Prozesse im Slot nicht beendet werden können. d) Mehrstufige Warteschlangen (multi-level queues) Annahme: Prozess behält seinen „Charakter“ während seiner Existenz (kurzer bzw. langer Prozess) Prozessor Priorität der Warteschlange 1 2 3 2 4 Warteschlangen der jeweiligen Priorität 5 1 2 3 4 5 3 1 neu gestarteter Prozess kommt an das Ende der Warteschlange mit höchster Priorität Abarbeiten des Prozesses für bestimmte Zeitscheibe noch nicht fertig → Warteschlange mit niedrigerer Priorität Abarbeitung nur, falls keine Prozesse auf höherer Ebene warten nicht fertig → unterste Ebene mit zyklischer Einplanung Kurze Prozesse werden begünstigt, lange Prozesse sinken schnell in Warteschlange mit niedrigster Priorität. Länge der Zeitscheiben unterschiedlich für verschiedene Warteschlangen. Planung wird wesentlich komplexer, wenn mehrere BM betrachtet werden. 12 2.5.2. Zeitgerechte Einplanung Zeiten und Zeitschranken bei der Ausführung eines Prozesses: Restlaufzeit L(t0) Spielraum S = tZ - tE Restantwortzeit a(t0) Laufzeit L = tE – tS Zeit tA tS frühester tatsächlicher Startzeitpunkt t0 tE tatsächlicher Endzeitpunkt tZ spätester Endzeitpunkt (Deadline) Definition: Zeitgerechte (timely) Einplanung Alle Prozesse können vor ihrem spätesten Endzeitpunkt tZ beendet werden. Einplanung nach Antwortzeiten (Earliest Deadline First) Jeder Prozess hat eine vorgegebene Deadline tZ. Prozess mit kürzester Antwortzeit wird dem Prozessor zugeteilt. a1 s1 P1 Antwortzeit ai a2 s2 P2 Spielraum si a3 s3 P3 Deadline 1 4 t Antwortzeit von Betrachtungszeitpunkt (hier t = 0) bis Deadline. Antwortzeiten nehmen linear ab mit der Zeit, unabhängig davon, ob sie bearbeitet werden oder nicht. ai 6 5 4 a1 3 a2 2 a3 Vorab-Planung wird nur einmal durchgeführt. 1 1 Prozessorbelegung P3 1 2 3 4 P2 2 3 5 6 t P1 4 5 6 t Zuerst P3, da es kürzestes ai besitzt. Dann P2 wegen zweitkürzester ai. Nach jedem Zeitschritt schaut OS, ob es neuen Prozess mit kürzerer ai gibt. Dann wäre Entzug des Prozessors und Prozesswechsel nötig. 13 Einplanung nach Spielraum (least laxity) Man benötigt Laufzeit, viel schwieriger zu Ermitteln. Voraussetzung: für jeden Prozess ist Laufzeit und Antwortzeit bekannt → Prozess mit kleinsten Spielraum erhält den Prozessor. Planungszeitpunkte: Prozess mit kleinstem Spielraum erhält den Prozessor. si 4 3 2 1 a3 Solange Pi bearbeitet wird, ist si konstant. Für alle wartenden Prozesse nimmt si linear ab. a2 1 Prozessorbelegung a1 2 3 4 5 6 t P2 P3 P2 P1 P1 1 2 3 4 5 6 t In Einprozessorsystemen sind beide Varianten optimal. In Mehrprozessorsystemen ist die Strategie nach Antwortzeiten nicht mehr zeitgerecht (siehe folgendes Beispiel). Einplanung nach Spielraum ist in Mehrprozessorsystemen zeitgerecht, falls die frühesten Startzeitpunkte aller Prozesse gleich sind. Falls nicht siehe Beispiel 2. Beispiel 1 Prozessorvergabe bei gleichen frühesten Prozessstartzeiten Einzuplanende Prozesse: Beispiel 2 Prozessvergabe bei unterschiedlichen frühesten Prozessstartzeiten Einzuplanende Prozesse: Laufzeit Laufzeit P1 P1 spätester Endzeitpunkt P2 spätester Endzeitpunkt P2 Zeit P3 Prozessorvergabe nach Antwortzeit: P3 frühester Startzeitpunkt P4 P5 Verletzung der Antwortzeit Prozessor 1 P2 P6 P1 P7 Prozessor 2 Zeit P3 Prozessorvergabe nach Spielraum: Prozessvergabe nach Spielraum: Verletzung der Antwortzeit Prozessor 1 Prozessor 1 P1 P1 P2 P3 P3 P4 P3 P7 Prozessor 2 Prozessor 2 P2 Zeit P5 P6 Zeit Zeit 14 Zeitgerechte Prozessorvergabe: Prozessor 1 P2 P1 P4 P6 P5 P7 Prozessor 2 P2 P3 Zeit 2.6. Unterbrechungen (Interrupts) Sie veranlassen den Prozessor, seine laufenden Aktivitäten zu unterbrechen, um andere Aktivitäten auszuführen. Zwei Arten: a) Externes Ereignis (external event) löst Unterbrechung zu einem unvorhersehbaren Zeitpunkt asynchron zur Programmausführung aus. („echte“ Unterbrechung, „real“ interrupt) b) Internes Ereignis (internal event) wird durch die gerade vom Prozessor ausgeführte Operation ausgelöst, tritt also synchron zur Programmausführung auf. (Ausnahmebedingung, exception). Asynchrone Unterbrechungen werden durch Unterbrechungswerk (interrupt unit) hardwaremäßig realisiert → Unterbrechungsbehandlungsroutine (interrupt handler). Synchrone Unterbrechungen = Ausnahmebedingungen → Ausnahmebehandlungsroutine (exception handler). 2.7. Interrupts versus Sampling 1 = Sensor unter Wasser 0 = sonst Sensor Wasser Interrupt ungünstig bei Wellengang (ähnlich dem Prellen beim Schalter) Wand Nur bei geordneten Reaktionszeiten, die nicht durch Sampling zu erreichen sind, sind Interrupts nötig. Im Grenzbereich wird eine Folge von Interrupts ausgelöst. Besser Sampling (per Software alle paar Momente den Eingangsport abfragen), mitteln des Signals über einen bestimmten Zeitraum. 15 3. Synchronisation Kooperierende oder konkurrierende Prozesse erfordern Synchronisation. Durch Synchronisation wird die Unabhängigkeit der Abfolge von Aktivitäten verschiedener Prozesse eingeschränkt. 3.1. Synchronisationsbedarf bei: a) Schreib-Schreib-Konflikt 2 Prozesse verändern eine Variable nebenläufig (conc zur Deklaration nebenläufiger Prozesse) conc x = x+1 || x = x+1 end conc Problem: nichtdeterministisch Lösung: Unteilbarkeit der Aktivitäten b) Schreib-Lese-Konflikt Mögliche Inkonsistenzen, wenn ein Prozess Daten schreibt, während sie ein anderer nebenläufig liest. Bsp. Kontoführungssystem, 2 nebenläufige Prozesse: Registrieren einer Einnahme und Abfrage des Kontostandes Input Zahlungsart Input Betrag nein Prozess 1: „Registrieren“ t = 0: Ein_Gesamt = 100, Ein_Schecks = 0 Betrag = 200 Zahlungsart = Scheck? als Scheck ja Ein_Schecks = Ein_Schecks + Betrag Ein_Gesamt = Ein_Gesamt + Betrag Stop Ein_Gesamt nein Output nach Berechnung Unterbrechung, zweiter Prozess dann Fortsetzung Ein_Gesamt = 300 Ende Prozess 2: „Kontostand“ Output = 100 Ein_Gesamt > 0 ja 200 200% 100 Ein _ Schecks 100% Ein _ Gesamt Stop Output nach Ende zurück zu Prozess 1 16 t Registrieren Kontostand Ein_Gesamt Ein_Schecks 0 100 0 1 Ein_Schecks + 200 100 200 2 Output 100 200 3 Ein_Gesamt + 200 300 200 Bei ungünstiger Abfolge können Inkonsistenzen entstehen. 3.2. Synchronisationsarten Unterscheidung je nachdem ob die Reihenfolge durch die Synchronisation von vornherein feststeht oder nicht. a) Einseitige Synchronisation Zwei Aktivitäten A1 und A2 A1 → A2 („→“ = geschieht vor) A2 wird so lange verzögert bis A1 beendet ist. Synchronisation hat keine Auswirkungen auf A1. Anweisung AWAIT „Wartebedingung“ blockiert einen Prozess bis Bedingung erfüllt ist. Registrierung von AWAIT noch offen: wie erfährt der Prozess das Eintreffen der Bedingung? b) Mehrseitige Synchronisation (multilateral) Zwei Aktivitäten A1 und A2 verschiedener Prozesse A1 ↔ A2 („↔“ = nicht zusammen mit (transitiv)) Anweisungen schließen sich gegenseitig aus. Reihenfolge liegt nicht fest: läuft A2 muss A1 warten bis A2 endet und umgekehrt. Keine Aktivität unterbricht die andere. Bsp. Produzenten-Konsumenten-System A1 (schreibt x) ↔ A2 (liest x, schreibt y) ↔ A3 (liest y) ——————————————————————> Datenfluss Zwischen A1 und A3 keine Abhängigkeiten, konfliktfrei, nicht transitiv. 3.3. Kritische Abschnitte (critical sections/ regions) Sind Anweisungen, deren Ausführung einen gegenseitigen Anschluss erfordert. Jede Klasse kritischer Abschnitte besitzt eine Ordnung, die angibt, wie viel kritische Abschnitte dieser Klasse zu einer Zeit ausgeführt werden dürfen. Bsp. ftp_zugriff: critical (100) 100 bedeutet maximale Zahl nebenläufiger Prozesse im kritischen Abschnitt Syntax: crit ftp_zugriff do … kritischer Abschnitt end_crit 17 Prozess muss vor dem Betreten eines kritischen Abschnitts Erlaubnis einholen vom OS. Wenn besetzt, dann warten. 3.4. Synchronisationsprobleme a) Betriebsmittelnutzung Alle Prozesse, die ein bestimmtes BM exklusiv nutzen wollen (z.B. Prozessor), bilden eine kritische Klasse der Ordnung 1. Stehen n BM einer Sorte zur Verfügung (z.B. Drucker), dann kritischer Abschnitt der Ordnung n. b) Leser und Schreiber Alle Lese- und Schreibzugriffe auf eine Variable bilden eine Klasse kritischer Abschnitte. Nebenläufiger Zugriff beliebig vieler Leser möglich, Schreiber (-prozesse) benötigen exklusiven Zugriff. Unterscheidung nach Reihenfolge des Zugangs: Erstes Leser-Schreiber Problem Schreiber muss warten bis alle Leser fertig sind. Neu hinzukommender Leser kann Schreiber überholen. Zweites Leser-Schreiber Problem Schreiber wartet auf begonnene Leser. Neue Leser müssen warten, bis Schreiber fertig ist. Alle komplexen Synchronisationsvorgänge lassen sich in elementare einseitige und mehrseitige Synchronisationen zerlegen. 3.5. Petri Netze Dienen zur Modellierung nebenläufiger Systeme. 1962 von Petri in seiner Dissertation entwickelt. Seither zahlreiche Varianten und Erweiterungen. Wozu modellieren? Nachweis von Eigenschaften (z.B. Verklemmungsfreiheit) am Modell. 3.5.1. Petri-Netze ohne Marken Gerichteter Graph mit 2 Arten von Knoten (Stellen, Transitionen) verbunden durch Menge von Kanten (= Flussrelation). 18 Stellen (places) Transition Eingansstellen mit gerichteter Kante zu einer Transition Ausgangsstellen, eine gerichteter Kante führt von einer Transition weg Isolierte Teilnetze = unabhängige nebenläufige Systeme Zwei Stellen nicht direkt verbinden, immer Transitionen dazwischen. 3.5.2. Interpretation als „Kanal-Instanz Netz“ (channel agency nets) Stelle = Kanal (passive Systemkomponente, z.B. Speicher Layer) Transition = Instanz (aktive Systemkomponente, Verarbeiten von Informationen oder Material) Bsp. Materialverwaltung Bestellannahme Lieferauftrag Auslieferung Lieferfertige Waren Kanal Bestellung Instanz Produktionsauftrag Produktion Lager Teilnetze müssen gleiche Eingänge und Ausgänge haben, eingehende Kanten enden immer an Transitionen und abgehende Kanten auf Stellen. Für jeden Verfeinerungsschritt muss die Netzstruktur erhalten bleiben. 19 Verfeinerung von Auslieferung: Lieferauftrag Lieferschein Versenden Verpacken verpackte Produkte Lieferfertige Waren Lieferscheinerstellung Lager Petri-Konzept um Dynamik erweitern → Marken. 3.5.3. Petri-Netze mit Marken Modellierung der dynamischen Eigenschaften eines Systems durch Markierung der Stellen und Definition von Schaltregeln. Geläufigste Form eines Petri-Netzes mit Marken sind: Stellen-Transitions-Netze (state transition nets) Zustand eines Systems wird durch Marken (token) in den Stellen beschrieben. Zustandänderung erfolgt durch Schalten (firing) von Transitionen. Bsp. Schalten einer Transition = Marken a) vorher b) nachher Schaltregeln bei Stellen-Transitions-Netzen a) Transition kann erst dann Schalten, wenn alle Stellen ihres Vorbereiches „markiert“ sind (= mindestens je eine Marke enthalten). b) Durch das Schalten wird je eine Marke aus jeder Stelle des Vorbereichs genommen (verarbeitet, vernichtet). c) Durch das Schalten wird in jeder Stelle des Nachbereiches eine Marke erzeugt. → Anzahl der Marken im Netz muss nicht konstant bleiben 20 Die Kapazität einer Stelle ist die maximale Anzahl an Marken, die sie aufnehmen kann. Kapazität = 5 ohne Angabe: Kapazität = ∞ Die Gewichtung einer Kante gibt an, wie viele Marken beim Schalten transportiert werden. Gewichtung = 4 Bsp. Schalten mit gewichteten Kanten 3 3 2 2 a) vorher b) nachher Transition kann nur Schalten, wenn die Schaltregeln bezüglich Kantengewichtung und Stellenkapazität nicht verletzt werden. Bsp. nichtschaltende Transitionen 1 2 Markenmangel Markenüberfluss Petri-Netze heißen todesgefährdet, wenn ein Zustand eintreten kann, in dem keine Transition mehr schalten kann (aufgrund leerer Stellen im Vorbereich oder voller Stellen im Nachbereich). Bsp. lebendig todesgefährdet 21 Systeme, die im Endlosbetrieb laufen sollen, müssen durch ein lebendiges Petri-Netz beschrieben werden können. Bei lebendigen Petri-Netzen kommt es weder zu Markenmangel, noch Markenüberfluss. 3.5.4. Synchronisation in Petri-Netzen Stellen-Transitions-Netze erlauben die Modellierung nebenläufiger Systeme: Transitionen sind Aktivitäten, Markierungen von Stellen beschreiben den Zustand des Systems. Bsp. t1; conc t2 || t3 end conc; t4 erst t1, dann t2 und t3 nebenläufig (Reihenfolge egal), am Ende t4 t2 t1 t4 t3 Sieht parallel aus, soll aber nebenläufig sein. Die Dauer der Transitionen (=Aktivitäten) wird meist nicht explizit modelliert (könnte aber). Trotzdem sieht man: - t2 und t3 können erst starten, wenn t1 beendet ist - t4 kann erst starten, wenn t2 und t3 beendet sind Bsp. t2 t1 t4 t3 Nichtdeterminiertheit im Petri-Netz (wird t2 oder t3 ausgeführt?) → Konflikt !!Völlig anderes Netz als im ersten Beispiel. Einseitige Synchronisation Vor dem Ausführen von t2 muss die Bedingung b von einem anderen Prozess erfüllt werden: 22 t1 t2 t3 Gegenseitiger Ausschluss für kritische Abschnitte einer Klasse k (K = kritischer Abschnitt): P1: t1; crit K do t2 end krit; t3 P2: t2; crit K do t5 end krit; t6 t2 crit end crit t1 t3 t4 t6 crit end crit t5 Semaphor/ Schlüssel zu crit kritischer Abschnitt Bsp. Buchungssystem, 3 Prozesse: Lesen, Buchung, Drucker Produzenten und Konsumenten: Lesen Buchen Pufferspeicher Drucken Datenfluss leer Lesen n Marken Abnehmen Ausgabepuffer mit m freie Plätze voll Ablegen leer Buchen Eingabepuffer mit n freie Plätze m Marken Abnehmen voll Ablegen Drucken 23 Lesen: liest erst, wenn was zu lesen da ist (nicht eingezeichnet) Buchen: ist Produzent und Konsument Drucken: reiner Konsument Ablegen im Puffer setzt freien Pufferplatz voraus. Abnehmen aus Puffer setzt einen beschriebenen Pufferplatz voraus. Bei unterschiedlich schnellen Prozessen wird über die Kapazität des Puffers synchronisiert. Leser und Schreiber: Je 4 Aktivitäten sind zu modellieren: - Arbeiten im unkritischen Bereich - Betreten des kritischen Abschnitts (k.A.) - Arbeiten im kritischen Abschnitts - Verlassen des kritischen Abschnitts Leser Eintritt Eintritt Schreiber 3 S unkritischer Abschnitt k.A. k.A. unkritischer Abschnitt 3 Schlüssel, Semaphor 3 Leser Austritt Austritt 3 Schreiber Problem: Schreiber könnten ausgehungert werden Lösung: Funktion implementieren, damit neue Leser warten, wenn es einen Schreiber gibt, der in den kritischen Abschnitt will In jedem Zyklus können sich mehrere Marken befinden (z.B. 3). Jede Marke repräsentiert den Zustand eines Prozesses der jeweiligen Klasse. Initiale Markenbelegung der Stelle S = Anzahl der Leser, die gleichzeitig im kritischen Abschnitt arbeiten können. Schreiber kann nur in den kritischen Abschnitt, wenn keine Leser mehr im kritischen Abschnitt → alle 3 Marken in Stelle S. Schreiber entfernt bei Eintritt in kritischen Abschnitt alle 3 Marken aus S → Zugriff für Leser gesperrt. Speisende Philosophen: P1 Pi = Philosophen Si = Stäbchen P2 S2 S1 P0 S3 S0 S4 P4 P3 2 Stäbchen zum Essen benötigt 3 Zustände: Denken, Warten aus 2 S, Essen Deadlock, wenn alle Philosophen gleichzeitig essen wollen, je ein Stäbchen in die Hand nehmen und aufs zweite warten 24 Jeder Philosoph wird durch einen Zyklus mit je einem Prozess modelliert. Zustand der Stäbchen wird durch Belegung der entsprechenden Stelle modelliert. P0 Denken Speisen P4 S0 S4 P1 S1 S3 S2 P3 P2 Ist vereinfachtes Modell durch „Faltung“ möglich? Philosophen Netz ist nicht falsch, entspricht als Modell aber nicht mehr der ursprünglichen Aufgabenstellung: Philosophen und Stäbchen haben ihre „Identität“ verloren (Platz nicht mehr berücksichtigt), jeder kann zu beliebigen Stäbchen greifen. → Abhilfe: individuelle Marken 2 2 freie Stäbchen 3.5.5. Petri-Netze mit unterscheidbaren Marken Individuelle Marken werden z.B. durch eine Zahl gekennzeichnet. Transitionen schalten erst bei Vorliegen bestimmter Marken → Schaltbedingung. Bsp. 8 5 3 17 1 42 4 10 Schaltbedingung x (firing condition) z x = 2y y z = 2x + y Schaltwirkung (firing result) a) vorher 5 3 17 x x = 2y y z = 2x + y z 20 1 42 10 b) nachher 25 x = 8, y = 4, Marken durch Schalten verbraucht, z = 20, neue Marke erzeugt Wenn keine Schaltbedingung angegeben: Schalten wie sonst, d.h. unabhängig von bestimmten Marken. wenn keine Schaltwirkung angegeben: Marken werden unverändert in den Nachbereich übernommen. Bsp. Speisende Philosophen Philosophen 0 123 4 i st1 = i st2 = (i+1) mod 5 i st1 = i st2 = (i+1) mod 5 0 st1, st2 123 4 freie Stäbchen st1, st2 Diese Netze werden auch als Prädikats-Transitions-Netze (predicate transition nets) bezeichnet. Vorteile: - übersichtlicher als Stellen-Transitions-Netze - mächtiger Formalismus, z.B. auch mit Schaltbedingung „Temperatur > 42“ Nachteil: - schwierige Handhabung - bei komplizierten Problemen nicht mehr anschaulich 3.6. Verklemmungen (Deadlocks) Verklemmungen treten dann auf, wenn Prozesse auf Ereignisse warten, die nicht mehr auftreten können. Bsp. 2 Studenten brauchen beide ein zweibändiges Lehrbuch. Student 1 leiht Band 1 aus, will Band 2 später holen. Student 2 leiht Band 2 aus. Student 1 will Band 1 nicht zurückgeben, bevor er Band 2 hat. Ebenso gedenkt Student 2 mit seinem Buch umzugehen. band1, band2: critical(1); exklusives Betriebsmittel = kritische Abschnitte der Ordnung 1 26 2 nebenläufige Prozesse Student 1: process crit band1 do band1 lesen crit band2 do band2 lesen end crit end crit end process Student 2: process crit band2 do band2 lesen crit band1 do band1 lesen end crit end crit end process Verklemmung bei Ausführungsreihenfolge: Student 1 Student 2 crit band1 do crit band2 do Deadlock crit band2 do crit band1 do Modellierung mit Petri-Netz: band1 ausleihen band2 ausleihen band1 band2 band2 ausleihen process Student 1 band1 ausleihen beide Bände zurückgeben process Student 2 Netz ist todesgefährdet. Verklemmung muss nicht sofort oder immer auftreten, sondern nur wenn beide Transitionen in der Ausgangslage gleichzeitig (direkt nacheinander) schalten. Verklemmungen beim Streit um BM können nur auftreten, wenn die 4 notwendigen und hinreichenden Bedingungen erfüllt sind: 1. die BM sind nur exklusiv nutzbar 2. die BM können nicht entzogen werden 3. die Prozesse geben die erhaltenen BM nicht frei, wenn sie auf die Zuteilung weiterer BM warten 4. es gibt eine zyklische Kette von Prozessen, von denen jeder mindestens ein BM besitzt, das der nächste Prozess in der Kette benötigt 27 Bsp. zu 4., zyklischer BM-Graph BM Student 2 band1 band2 Student 1 hat band1 und will ihn behalten will band2 Kein zeitlicher Ablauf, sondern „Schnappschuss“ zu bestimmen Zeitpunkt. 3.6.1. Verklemmungsvermeidung durch Bedarfsangabe Wunsch: bei der Anforderung vom BM feststellen, ob eine Zuteilung gefahrlos möglich ist Prozess P2 P2 läuft P1 bereit band1 P2 fordert band2 an bei Knick Prozesswechsel band2 gleichzeitiger Ablauf Prozess P1 P1 fordert band1 an P1 läuft, P2 bereit hier beginnt kritischer Bereich, da darf man nicht rein, sonst tot Auch wenn sich die Prozesse schon in einem Zustand befinden, der unweigerlich zu einer Verklemmung führt, können sie noch ungestört arbeiten. Vorausschauende Prüfung nötig mit Kenntnissen über die zukünftigen Anforderungen von Prozessen. Schwierig, daher in der Praxis oft nur Verklemmungserkennung (match dog timer) oder Verklemmungsbeseitigung durch Prozessabbruch (Rücksetzpunkt sinnvoll). Verklemmungsvermeidung durch Regeln Regeln aufstellen, so dass mindestens eine Bedingung 1 … 4 (s.o.) nicht erfüllt ist. Bsp. Buchausleihe 1. gemeinsame Nutzung erlauben 2. Bücher müssen zurückgegeben werden 3. bei Anforderung eines neuen Buches müssen alle bisherigen geliehenen Bücher zurückgegeben werden 4. band1 muss immer vor band2 ausgeliehen werden Regeln sind Problemspezifisch und nicht unproblematisch. 28 3.7. Schlossvariablen Bisher: Synchronisation durch AWAIT und CRIT Anweisung Jetzt: Implementation mit Standard-Sprachschnittstellen 3.7.1. Einseitige Synchronisation AWAIT Bedingung kann ersetzt werden durch: while not Bedingung repeat … nichts tun end repeat 3.7.2. Mehrseitige Synchronisation Prozesse müssen Zwecks Synchronisation miteinander kommunizieren, z.B. über gemeinsamen Variablen. Problem: Schutz vor gemeinsamen Variablen durch gemeinsame Variablen!? Abstrakt: Schlossvariable S regelt Zugang zu kritischen Abschnitt: S: lockvar P: process S∙lock … kritischer Abschnitt S∙unlock end process Bsp. Priester laufen auf schmalen Weg eine Vulkanwand lang, um in den Vulkan Opfergaben hinein zu werfen. Da es auf dem Weg keine Beleuchtung gibt, können sich zwei aufeinander zu bewegende Priester umrennen und herunterstürzen. Deshalb muss am Weganfang sichergestellt werden, dass sich nur ein Priester auf dem Weg befindet. Implementation (2 Prozesse) Ausschluss über boolesche Variable. Vor Eintritt gesetzt, nach verlassen gelöscht. P1 disable Interrupt P2 besetzt = true nein besetzt = true P1 im k.A. ja besetzt = true ja nein besetzt = true P2 im k.A. enable Interrupt Problem: Prozesswechsel zwischen Abfragen und Verschließen ● mögliche Abhilfe: spezielle unteilbare Operation (kein Standard-Sprachmittel) oder Unterbrechung verhindern → alternative Ansätze mit Standardoperationen 29 Ansatz 1: zwei boolesche Variablen Priester schaut vor dem Betreten des Weges, ob ein anderer Priester einen Stein in seine Schüssel gelegt hat, wenn nicht legt er einen Stein in seine Schüssel. Wenn ja, wartet er. P1 k.A. P2 P2 ja krit2 = true krit1 krit2 P1 krit1 = true nein nein krit1 = true krit2 = true P1 im k.A. ja P2 im k.A. P1 guckt, ob krit2 besetzt. Falls nicht, dann krit1 = true und P1 im kritischen Abschnitt. Falls ja, dann wartet P1 vor krit2. Gleiches Problem wie bei der booleschen Variablen: Unterbrechbarkeit zwischen Abfrage und Verschließen. Ansatz 2: erst Abschließen, dann Abfragen Priester legen zuerst Stein in eigene Schüssel und schauen dann in andere Schüssel. P1 P2 krit1 = true krit2 = true krit2 = true ja ja krit1 = true nein P1 im k.A. nein P2 im k.A. Problem: Deadlock, falls die jeweils ersten Anweisungen gleichzeitig ausgeführt werden → beide warten Ansatz 3: „Besetztzeichen“ beim Warten zurücknehmen P2 P1 krit2 = true krit1 = true krit2 = true P1 im k.A. nein ja krit1 = true krit1 = false warten krit1 = true P2 im k.A. nein ja krit2 = false warten krit2 = true 30 Bsp. Prozesswechsel (true = 1, false = 0) P1 P2 krit1 = true krit2 = true krit1 krit2 false false true false true true krit2 = true? krit1 = true? krit1 = false false true krit2 = false false false warten warten krit1 = true krit2 = true … … true true false true „Aushungern“ durch „Nach Ihnen“ Problem, z.B.: - Ausweichen einer Person (rechts – links – rechts …) - Vortritt bei Tür - … Unterschied zwischen Aushungern und Verklemmung: Aushungern kann sich lösen, Verklemmen nicht Ansatz 4: Abwechselnder Zutritt k.A. ändert nach Rückkehr P2 favorit auf 1 favorit P1 P1 P2 favorit = 2 ja favorit = 1 nein nein P1 im k.A. P2 im k.A. favorit = 2 favorit = 1 ja wartet bis favorit = 1 Streng abwechselnder Zugriff. Problem wenn Prozesse unterschiedlich häufig. Terminiert (beenden, nicht mehr ablaufen) ein Prozess, dann wartet der andere ewig. Ansatz 5: Kombination aus Ansatz 3 und 4 P2 ähnlich wie im folgenden Bild P1, nur mit anderen Variablennamen oder -werten ● 2 Warteschleifen 31 P1 krit1 = true k.A. 1 krit2 = true ja nein favorit = 1 nein krit1 favorit krit2 P1 im k.A. krit1 = false 2 favorit = 2 favorit ≠ 1 krit1 = false nein krit1 = true ja Bsp. 1 P1 P2 aktiv aktiv krit1 krit2 favorit 0 0 1 1 0 1 1 1 1 warten in Schleife 1 aktiv warten in Schleife 2 in k.A. fertig aktiv k.A. 1 0 1 0 0 2 0 1 2 Bsp. 2 P1 fertig P2 aktiv k.A. fertig aktiv (favorit wird nur im Konfliktfall abgefragt) k.A. fertig krit1 krit2 favorit 0 0 2 0 1 2 0 0 1 0 1 1 0 0 1 Kein strenges Abwechseln der Prozesse, häufigere Prozesse können beliebig oft ungehindert zugreifen, bis anderer Prozess Zugriff verlangt. Aushungern von Ansatz 3 wird durch Favorisierung vermieden. Favorisierung wechselt gerecht, Prozesse werden gleich behandelt. Favorisierung nur im Konfliktfall, kein Problem mit unterschiedlichen Häufigkeiten. Problem: Algorithmus funktioniert nicht mit mehr als 2 Prozessen, enormer Aufwand das zu ändern Problem mit Schlossvariablen: aktives Warten (Prozess in Warteschleife muss aktiv den Wert einer Variablen abfragen) Abhilfe: OS holt Prozess aus der Warteschleife 32 Semaphore Sind abstrakte Datentypen, enthalten Zähler und Warteschlange. 2 Operationen auf Semaphoren: a) P Operation (passieren) erniedrigt den Wert des Semaphorzählers um 1. Ist der Wert negativ, wird der die Operation ausführende Prozess in die Warteschlange des Semaphors eingeordnet und blockiert. b) V Operation (freigeben) erhöht den Zähler um 1. Falls Warteschlange nicht leer (Zähler ≤ 0), wird Prozess an erster Stelle der Warteschlange bereit gestellt. Beide Operationen werden vom OS ausgeführt. Aktion Prozess P(S) P Operation auf Semaphor S als Eintrittsprotokoll Aktion OS S=S–1 ist S < 0? nein: Prozess darf in k.A. ja: Prozess in Warteschlange von S nein: S ≥ 0 Prozess im k.A. t ↓ fertig V(S) V Operation auf Semaphor S als Austrittprotokoll S=S+1 ist S ≤ 0? nein: Warteschlange leer, nichts zu tun ja: Prozess an erster Stelle der Warteschlange bereit stellen Bsp. Flugzeug, 3 (Initialwert) Toiletten (k.A.), 5 Reisende (Prozesse R1 bis R5) R1 R2 R3 R4 R 5 P P P t V ↓ P P P V V S k.A. 3 2 1 0 1 0 -1 -2 -1 0 R1 R1, R2 R1, R2, R4 R1, R4 R1, R3, R4 R1, R3, R4 R1, R3, R4 R3, R4, R5 R3, R5, R2 Warteschleife (Reihenfolge wichtig) R5 R5, R2 R2 33 bereit laufend blockiert an Semaphor S1 blockiert an Semaphor Sn Bsp.: erstes Leser und Schreiber Problem (Leser haben Priorität) Synchronisation soll mit Semaphoren gelöst werden: - Leser soll Priorität haben - Zahl der Leser im k.A. durch Variable l_zähler dargestellt - Blockieren eines Schreibers durch Semaphor ls_ausschluss (Initialwert = 1) sobald mindestens ein Leser oder Schreiber im k.A., Blockieren der Leser sobald ein Schreiber im k.A. - gleichzeitiger Zugriff zweier Leser auf l_zähler kritisch, daher Schutz durch Semaphor lz_schutz (Initialwert = 1) ls_ausschluss, lz_schutz : Semaphor(1); //in Klammern der Initialwert l_zähler : integer = 0; lz_schutz • P Leser l_zähler = l_zähler + 1 ja l_zähler = 1? ls_ausschluss • P nein lz_schutz • V Leser im k.A. lz_schutz • P l_zähler = l_zähler - 1 ja l_zähler = 0? ls_ausschluss • V nein lz_schutz • V 34 Schreiber ls_ausschluss • P Leser im k.A. ls_ausschluss • V Bsp. 2 Leser, 1 Schreiber L1 L2 S lz_schutz l_zähler ls_ausschluss 1 0 1 aktiv 0 0 1 aktiv -1 (blockiert L2) 0 1 aktiv -1 1 0 k.A. 0 (Freigabe von L2) 1 0 aktiv 0 2 0 k.A. 1 2 0 aktiv 1 2 -1 (blockiert S) aktiv 0 2 -1 Austritt 0 1 -1 1 1 -1 aktiv 0 1 -1 Austritt 0 0 0 (Freigabe von S) 1 0 0 aktiv 1 0 0 Schreiben 1 0 0 Blockiert Schreiber, kann jederzeit von neuen Lesern überholt werden. Gefahr des Aushungerns der Schreiber. Bsp.: zweites Leser-Schreiber Problem Schreiber haben Priorität, sollen so schnell wie möglich in kritischen Abschnitt. Leser im k.A. dürfen Arbeit noch beenden. Neue Leser müssen nach Anmeldung des Schreibers warten bis Schreiber fertig ist. Idee: neuer Semaphor, der die Leser aufhält: l_halt Leser Schreiber (grob) l_halt • P 1. Schreiber → l_halt • P erster Teil des bisherigen Algorithmus ls_ausschluss • P k.A. l_halt • V ls_ausschluss • V k.A. letzter Schreiber → l_halt • V restlicher Teil des bisherigen Algorithmus nötig: Schreibzähler und Semaphor, der Schreibzähler schützt 35 Schreiber: sz_schutz • P s_zähler = s_zähler + 1 ja l_zähler = 1? l_halt • P nein sz_schutz • V ls_ausschluss • P k.A. Austrittsprotokoll entsprechend (wie bei Leseprozess, letzter Schreiber → l_halt • V) L1 L2 L3 S l_halt Warteschlange von l_halt 1 aktiv (dekrementiert ls_ausschluss) k.A. 0 1 0 1 aktiv k.A. aktiv (wartet an ls_ausschluss) aktiv (wartet an l_halt) fertig aktiv (wartet an l_halt) 0 -1 L3 -1 L3 -2 L3, L2 -1 0 -1 -1 L3, L2 L2 L2, S fertig (letzter Leser gibt ls_ausschluss frei) k.A. fertig k.A. aktiv fertig Schreiber muss sich wie die Leser in die Warteschlange von l_halt einreihen, wenn l_halt ≤ 0. noch ein Semaphor: l_vorhalt inklusive Warteschlange (Schreiber kümmert sich nicht um l_vorhalt) 36 Weiterer Semaphor nötig, weil höchstens ein Leser am Semaphor l_halt wartet. Erster Schreiber, der l_halt blockieren will, kann weitere Leser, die bei l_vorhalt warten überholen. Leser l_vorhalt • P l_halt • P Durch l_vorhalt höchstens ein Leser in Warteschlange von l_halt vor wartenden Schreiber. bisheriger Algorithmus l_halt • V l_vorhalt • V k.A. l_vorhalt l_halt ls_ausschluss k.A. Schutzhüllen/ Warteschlangen 37 4. What really happened on Mars? Mars Pathfinder Mission, Landung am 4.7.1997, Sojourner Rouver. Nach einigen Tagen Probleme mit Systemresets, die zu Datenverlusten führten. Single CPU, VxWorks als realtime embedded System Kernel der Fa. Wind River Systems. Versuche an der 1:1 Kopie im Labor (JPL) den Fehler zu reproduzieren → Erfolg nach 18h. Was war der Fehler? Verschiedene Tasks: frequent, high priority infrequent, low priority very infrequent, medium priority Bus management task Meteorological data gathering task Communication task Task A Task C Task B Information Bus Zugriffssteuerung durch „Mutex“ (Mutal Exclusion Locks) = Semaphore (1 = erste Ordnung) Soll-Verlauf A und C Zugriff per Mutex auf gemeinsame Ressource (kritischer Abschnitt). priority A B greift nicht auf Ressource über Mutex zu, hat aber höhere Priorität als C. B C t Ist-Verlauf ohne B C A t Normaler Fall, ist zu erwarten. A wartet auf Ressource, C kann nicht unterbrochen werden, weil es gemeinsame Ressourcen nutzt wie A. Ist-Verlauf mit B priority inversion C B C an der Stelle meldete Watchdogtimer immer: A nicht beendet A t B kann unterbrechen, weil es höhere Priorität hat und nicht Information Bus nutzt. Weil Task A so lange für Abarbeitung braucht, denkt OS, er wäre hängen geblieben → Reset. 38 Lösungsmöglichkeiten a) Priority Inheritance Task mit niedriger Priorität „erbt“ die Priorität eines Tasks, der Zugriff verlangt. A C mit Priorität von A C t b) Priority Ceiling Jede Ressource bekommt die Priorität des höchsten Tasks + 1, der auf die Ressource zugreifen will. Jeder Task, der auf die Ressource zugreift, bekommt für diese Zeit die Priorität der Ressource. 39