Kap. 3 Prozess- synchro- nisation Version vom 05.10.2009 Kap. 3 - Inhalt Kritische Abschnitte Software-Lösungen Semaphore Hardware-Lösungen Synchronisationsprobleme Prozeßkommunikation Verklemmungen Folie 2
Kritische Abschnitte I Prozesse heissen nebenläufig (konkurrent), wenn sie zur gleichen Zeit existieren. Ziele: o Vermeidung ungewollter gegenseitiger Beeinflussung o Unterstützung gewollter Kooperation wie: Sharing von Betriebsmitteln, Übermittlung von Signalen, Nachrichtenaustausch, etc. o Fazit: Mechanismen zur Synchronisation und Kommunikation sind notwendig Folie 3 Kritische Abschnitte II Bei Programmen, die nebenläufigen Prozessen zugrunde liegen, unterscheidet man: 1. Unkritische Abschnitte, in denen nicht auf gemeinsame Daten zugegriffen wird (oder von allen Prozessen nur lesend) 2. Kritische Abschnitte, in denen auf gemeinsame Daten zugegriffen wird (nicht nur lesend) Zerlegung in kritische und unkritische Abschnitte ist eindeutig. Folie 4
Kritische Abschnitte III Situation: Drucker-Spooler Folie 5 Kritische Abschnitte IV Folie 6
Kritische Abschnitte V - Forderungen (Dijkstra 1965) Zwei Prozesse dürfen nicht gleichzeitig in ihren kritischen Abschnitten sein (Gegenseitiger Ausschluß, mutual exclusion). Jeder Prozeß, der am Eingang eines kritischen Abschnitts wartet, muß irgendwann den Abschnitt auch betreten dürfen: kein ewiges Warten darf möglich sein (fairness condition). Ein Prozeß darf außerhalb eines kritischen Abschnitts einen anderen Prozeß nicht blockieren. Es dürfen keine Annahmen über die Abarbeitungsgeschwindigkeit oder Anzahl der Prozesse bzw. Prozessoren gemacht werden. Folie 7 Kritische Abschnitte VI Gegenseitiger Ausschluß Folie 8
Kritische Abschnitte VII Modellproblem: Wir betrachten zyklische Prozesse der Gestalt: Prolog Kritischer Abschnitt Epilog Unkritischer Abschnitt Folie 9 Kritische Abschnitte VIII Welche Verfahren gibt es? Software-Lösungen für 2 oder mehr Prozesse Hardware-Lösungen Betriebssystem-Lösungen (Semaphore/Mutexe) Lock-Files (langsam) File/Record-Locking (nur für Filezugriff) Nachrichten-Lösungen (sehr allgemein) Abstrakte Datentypen (Monitore) Folie 10
Software-Lösungen I - erster Versuch Naiver Ansatz: mutual exclusion mit globaler Variabler Wartesperre errichten, bis kritischer Abschnitt frei Prozeß 1 Prozeß 2...... WHILE dran 1 DO NoOp END; Kritischer Abschnitt WHILE dran 2 DO NoOp END; Kritischer Abschnitt dran := 2; dran := 1;...... Problem: nur abwechselnde Benutzung des kritischen Abschnitts, Prozeß blockiert sich selbst (nicht-notw. Blockade und fairness verletzt bei ewigem Warten) Folie 11 Software-Lösungen II : zweiter Versuch Verbesserung: Zugang nur blockiert beim Aufenthalt in krit. Abschnitt Prozeß 1 Prozeß 2...... WHILE drin2=true DO NoOp END; drin1 := TRUE; Kritischer Abschnitt WHILE drin1= TRUE DO NoOp END; drin2 := TRUE; Kritischer Abschnitt drin1 := FALSE; drin2 := FALSE;...... Problem: Unterbrechbarkeit der Vor-Protokolle Folie 12
Software-Lösungen III : dritter Versuch Verbesserung: Vertauschung im Protokoll Prozeß 1 Prozeß 2...... DO drin1 := TRUE; WHILE drin2 = TRUE DO NoOp END; Kritischer Abschnitt drin2 := TRUE; WHILE drin1 = TRUE DO NoOp END; Kritischer Abschnitt drin1 := FALSE; drin2 := FALSE;...... Besser? Folie 13 Software-Lösungen IV : vierter Versuch Algorithmus von Peterson Verbesserung: eine globale Variable, 2 Prozeß-Zustandsvariable. Initialisierung: Interesse1 = Interesse2 = FALSE Prozeß 1 Prozeß 2...... Interesse1 := TRUE; dran := 1; WHILE dran=1 AND Interesse2=TRUE DO NoOp END; Kritischer Abschnitt Interesse2 := TRUE; dran := 2; WHILE dran=2 AND Interesse1=TRUE DO NoOp END; Kritischer Abschnitt Interesse1 := FALSE; Interesse2 := FALSE;...... Folie 14
Software-Lösungen V - Diskussion Es gibt Verallgemeinerungen auch für n>2 Prozesse, die mit Arrays von Zustandsvariablen arbeiten! Probleme: o Busy Waiting o Notwendigkeit gemeinsamer Variabler o Kompliziertheit o Viele Fehlermöglichkeiten Folie 15 Semaphore I Semaphore (Signalbarken, Dijkstra 1965) Passieren P(s) Aufruf vor krit. Abschnitt, Warten falls besetzt Verlassen V(s) Aufruf nach krit. Abschnitt, Aktivieren eines wartenden Prozesses Synchronisierung zweier Prozesse - Initialisierung s = 1 Prozeß 1 Prozeß 2...... P(s) Kritischer Abschnitt V(s) P(s) Kritischer Abschnitt V(s)...... Folie 16
Semaphore IIa Implem. durch busy waiting Software Pseudo-Code Semaphore=Zähler, initial s=1 PROCEDURE P(VAR s:integer) BEGIN WHILE s<=0 DO NoOp END; Ununterbrechbar, sobald s>0 s:=s-1; gefunden wird END P; PROCEDURE V(VAR s:integer) BEGIN s:=s+1; END V; Ununterbrechbar! Problem: spin locks können fairness verletzten, wenn niedrig-priorer Prozeß im krit. Abschnitt Folie 17 Semaphore III Implem. durch Schlafen Software Pseudo-Code Datenstruktur TYPE Semaphor = RECORD PROCEDURE P(VAR s:semaphor) value: INTEGER; BEGIN list : ProcessList; s.value:=s.value-1; END; IF s.value < 0 THEN einhängen(myid,s.list); sleep; Initial: s.value:=1 END; END P; PROCEDURE V(VAR s:semaphor) VAR PID: ProcessId; BEGIN IF s.value < 0 THEN PID:=aushängen(s.list); wakeup(pid); END; s.value:=s.value +1; END V; Folie 18
Semaphore IV Impl. durch Schlafen Implementierung von Semaphoren als Systemaufrufe ist üblich. Dabei erfolgt Benutzung der BS-internen Routinen zum Sich-Schlafen-Legen und Aufwecken. Wesentlich ist die Unteilbarkeit der Implementierung von P() und V(): Auf Einprozessorsystemen: Unteilbarkeit kann durch Sperren aller Unterbrechungen wahrend der Ausführung von P() und V() erreicht werden. Zulässig, da nur wenige Maschineninstuktionen zur Implementierung notig sind. Folie 19 Semaphore V Impl. durch Schlafen Auf Multiprozessorsystemen: Jedem Semaphor wird eine mittels Test-and-Set realisierte Sperrvariable mit Aktivem Warten vorgeschaltet. Hierdurch kann zu jedem Zeitpunkt nur höchstens ein Prozessor den Semaphor manipulieren. Beachte: Unterschiede zwischen Aktivem Warten auf den Zugang zum Semaphor, der einen kritischen Abschnitt schützt (einige Instruktionen, Mikrosekunden) und Aktivem Warten auf den Zugang zum kritischen Abschnitt selbst (problemabhangig, Zeitdauer nicht vorab bekannt oder begrenzt). Folie 20
Semaphore VI Klassifizierung Zählsemaphore Wertebereich 0, 1, 2, 3,... Für allgemeinere Aufgabenstellungen geeignet, z.b. für Erzeuger-Verbraucher-Problem Binäre Semaphore Wertebereich 0, 1 Nur für gegenseitigen Ausschluß geeignet : Mutexe Folie 21 Semaphore VII UNIX IPC-Paket Das IPC-Paket von UNIX System V besteht aus : Semaphoren Shared Memory Message Queues und bietet dafür die Systemaufrufe semget, semop, semctl shmget, shmat, shmdt, shmctl msgget, msgsnd, msgrvc, msgctl sowie die Komandos ipcs und ipcrm an. Folie 22
Semaphore VIII in Unix Manipulation von Arrays von Semaphoren: semctl() semget() semop() Semaphorkontrolloperationen: Initialisierung, Löschen, etc. Semaphor erzeugen bzw. Öffnen Verallgemeinerte Semaphoroperationen, als Spezialfall einfache P() und V()-Operation Folie 23 Semaphore IX in Unix Mutexe für Threadkommunikation pthread_mutex_t <- Datentyp pthread_mutex_lock() pthread_mutex_unlock() Folie 24
Semaphore X - in Windows NT Prozesse CreateSemaphore() OpenSemaphore() WaitForSingleObject ReleaseSemaphore() Erzeugen Initialisieren (Sema,TimeOutVal) P(s) V(s) Threads Semaphore = Typ CRITICAL_SECTION InitializeCriticalSection(S) EnterCriticalSection(S) P(s) LeaveCriticalSection(S) V(s) Kernprozesse Spin locks: keine Referenzen zu Disk-Speicher, keine traps&syscalls Folie 25 Semaphore XI - Atomare Aktionen Beispiel: Geldtransaktion Sie überweisen 2000. Computerabsturz! Abbuchung 2000 Empfänger-Gutbuchung 2000 Wo ist das Geld? Keine oder neue Überweisung = Verlust! Forderung: Atomare Aktion Entweder vollständige Transaktion oder gar keine! ( roll back bei Abbruch) Folie 26
Semaphore XII - Probleme Mögliche Fehler bei P/V-Anwendung Vertauschung : alle sind nun gleichzeitig im krit. Abschnitt V(mutex);... krit. Abschnitt...; P(mutex); Replikation oder Weglassen: ewiges Warten P(mutex);... krit. Abschnitt...; P(mutex); Falsche Reihenfolge Erzeuger P(freiePlätze); P(mutex); putinbuffer(item); V(mutex); V(belegtePlätze); Erzeuger-Verbraucher-Problem Erzeuger P(mutex); P(freiePlätze); putinbuffer(item); V(mutex); V(belegtePlätze); Folie 27 Hardware-Lösungen I - Atomare Aktionen Interrupts ausschalten (Probleme: timer, power failure, I/O) Atomare Instruktionsfolgen Test And Set (test and set lock) PROCEDURE TestAndSet(VAR target:boolean): BOOLEAN VAR tmp:boolean; tmp:=target; target:= TRUE; RETURN tmp; END TestAndSet; Swap PROCEDURE swap(var source,target: BOOLEAN) VAR tmp:boolean; tmp:=target; target:=source; source:=tmp; END swap; Fetch And Add PROCEDURE fetchandadd(var a, value:integer) VAR tmp:boolean; tmp:=a; a:=tmp+value; RETURN tmp; END fetchandadd; Folie 28
Hardware-Lösungen II : Synchronisation Mit TSL: Initialisierung: lock :=0; Prozeß 1 Prozeß 2...... enter: rg := test_and_set(lock); if rg > 0 then goto enter; enter: rg := test_and_set(lock); if rg > 0 then goto enter; Kritischer Abschnitt Kritischer Abschnitt lock := 0; lock := 0;...... Problem:? Folie 29 Synchronisationsprobleme I - Überblick Präzedenzrelationen Speisende Philosophen Erzeuger-Verbraucher-Problem readers/writers-problem Der schlafender Friseur... Folie 30
Synchronisationsprobleme II - Prozesse Präzedenzgraph A B E C D Implementierung mit Semaphoren PROCESS A: TaskBodyA; V(b); V(c); END A; PROCESS B: P(b); TaskBodyB; V(d1);V(e); END B; PROCESS C: P(c); TaskBodyC; V(d2); END C; PROCESS D: P(d1); P(d2); TaskBodyD; END D; PROCESS E: P(e); TaskBodyE; END E; Globale Variable b,c,d1,d2,e mit 0 initialisieren. Folie 31 Synchronisationsprobleme III Speisende Philosophen Philosophen essen/denken Zum Essen braucht man 2 Gabeln Aufgabe: wie kommt man zu koordiniertem Essen und Denken, bzw. wie verhindert man das Verhungern? Folie 32
Synchronisationsprobleme IV Speisende Philosophen Ausgangspunkt für Lösung: wo liegt das Problem? Folie 33 Synchronisation V - Erzeuger-Verbraucher 1. Erzeuger-Prozeß erzeugt Daten 2. Verbraucher-Prozeß verbraucht Daten 3. Unterschiedliche Erzeuger/Verbraucher-Raten 4. Endlicher Puffer zur Zwischenspeicherung der Daten 5. Protokoll? Folie 34
Synchronisation VI - Erzeuger-Verbraucher Lösung Semaphoren einführen: belegteplätze:=0, freieplätze:=n, mutex:=1 Erzeuger LOOP produce( item) P(freiePlätze); P(mutex); putinbuffer( item); V(mutex); V(belegtePlätze); END Verbraucher LOOP P(belegtePlätze); P(mutex); getfrombuffer( item); V(mutex); V(freiePlätze); consume( item); END Folie 35 Synchronisation VII - Erzeuger-Verbraucher Mögliche Fehler bei Semaphor-Lösung Falsche Reihenfolge Erzeuger-Verbraucher-Problem Erzeuger P(freiePlätze); P(mutex); putinbuffer(item); V(mutex); V(belegtePlätze); Erzeuger P(mutex); P(freiePlätze); putinbuffer(item); V(mutex); V(belegtePlätze); Folie 36
Synchronisation IX readers/writers Das berühmte readers/writers-problem (Courtois et. alt. 1971) modelliert den Zugriff auf eine Datenbank. Beispiel: Datenbank für Reservierungssystem einer Fluggesellschaft mit vielen konkurrierenden Prozessen, die Lese- und Schreibwünsche haben. Wenn mehrere Prozesse gleichzeitig lesen, ist dies akzeptabel, aber wenn ein Prozeß schreibt, darf kein anderer Prozeß zugreifen, nicht einmal lesend. Folie 37 Synchronisation X : readers/writers - Problem Aufgabe: Koordination Lesen-Schreiben von Dateien Erstes readers/writers-problem (Vorrang für Leser) Ein Leser soll nur warten, falls ein Schreiber bereits Zugriffsrecht zum Schreiben bekommen hat. Dies bedeutet, daß kein Leser auf einen anderen Leser warten muß, nur weil ein Schreiber wartet. Problem: Schreiber wartet ewig Zweites readers/writers-problem (Vorrang für Schreiber) Wenn ein Schreiber bereit ist, führt er das Schreiben so schnell wie möglich durch. Wenn also ein Schreiber bereit ist, die Zugriffsrechte zu bekommen, dürfen keine neuen Leser mit Lesen beginnen. Problem: Leser wartet ewig Folie 38
Synchronisation XI - readers/writers Semaphore ReadSem : Anzahl der Leser im krit. Abschnitt RWSem : mutex f. Lesen/Schreibvorgang Lesen Schreiben P(ReadSem); readcount:=readcount+1; IF readcount=1 THEN P(RWSem) END; V(ReadSem);... Reading_Data();... P(ReadSem); readcount:=readcount-1; IF readcount=0 THEN V(RWSem) END; V(ReadSem); P(RWSem);... Writing_Data();... V(RWSem); Folie 39 Synchronisation XII Der schlafende Friseur Folie 40
Synchronisation XIII Der schlafende Friseur Im Friseursalon stehen der Friseurstuhl und n Stühle zum Warten Wenn kein Kunde da ist, schläft der Friseur im Friseurstuhl Wenn ein Kunde hereinkommt, weckt er den schlafenden Friseur Falls zusätzliche Kunden kommen, während der Friseur die Haare eines Kunden schneidet, nehmen sie auf einem der Warte-Stühle Platz, falls welche frei sind. Andernfalls gehen sie wieder. Problem: Friseur und Kunden sind so zu programmieren, daß keine Race-Conditions auftreten. Dieses Problem ähnelt Problemen bei Warteschlangen mit mehreren Beratern und eingehenden Beratungswünschen. Folie 41 Prozeßkommunikation I Gegenüber der Prozeßsynchronisation ist die Kommunikation zwischen Prozessen ein allgemeineres Problem, bei dem es um die Übertragung von Nutzdaten geht. Dabei können auch Prozesse auf verteilten Rechnern betrachtet werden. Überblick: Signale (keine Nutzdaten, nur Info über Ereignis) Pipes Nachrichtensysteme Shared Memory Folie 42
Prozeßkommunikation II Signale Problem: Synchrones Warten blockiert Prozesse Abhilfe: Benachrichtigung durch asynchrone Signale (Software-Interrupts) o Aufsetzen der Reaktion auf ein Signal, z.b. sigaction() o Abarbeiten des Programms o Bei Signaleintritt Abarbeiten der angegebenen ISR o Weiterarbeiten im Programm Folie 43 Prozeßkommunikation III Signale POSIX Signale Folie 44
Prozeßkommunikation IV - Signale System Calls for Process Management s : Errorcode pid : Prozeß-ID residual : verbleibende Zeit vom vorigen Alarm Folie 45 Prozeßkommunikation V - Nachrichtenaustausch Allgemeinere Form der Kommunikation ohne gemeinsamen Speicher Nachrichtenausstausch ist sowohl für zentralisierte als auch verteilte Systeme möglich Aufgabe: Bereitstellung eines Mechanismus, mit dem Prozesse einander Nachrichten zukommen lassen können, ohne über gemeinsamen Speicher zu verfügen Folie 46
Prozeßkommunikation VI - Nachrichtenaustausch Operationen: - send( msg,... ) Senden einer Nachricht durch Sender(-Prozeß) - receive ( msg,... ) Empfangen einer Nachricht durch Empfänger (-Prozeß) Folie 47 Prozeßkommunikation VII - Nachrichtenaustausch Verbindung: - Verbindung ist notwendig, sie heißt Kommunikationskanal - Ein Prozeß kann mehrere Kanäle zur gleichen Zeit aufrecht erhalten - Anzahl der Teilnehmer eines Kanals Regelfall: 2 - Sonderfälle: > 2 - Richtung des Kanals: unidirektional - bidirektional Folie 48
Prozeßkommunikation VIII - Nachrichtenaustausch Wichtige Entwurfsaspekte: Adressierung, Pufferung, Nachrichtenstruktur, Implementierung Adressierung - direkt: Sender gibt Name des Empfängers an und umgekehrt - indirekt: Kommunikation erfolgt über Zwischenstationen, sog. Mailboxen Pufferung - Kapazität eines Kanals: Anzahl der Nachrichten, die darin gespeichert werden können, um Sender und Empfänger zeitlich zu entkoppeln Folie 49 Prozeßkommunikation IX - Nachrichtenaustausch Kapazität Null (keine Pufferung): Rendevouz (Ada) - Warten ohne Pufferung aufeinander: Sender wird blockiert, wenn sein send vor dem receive stattfindet. Empfänger wird blockiert, wenn receive vor dem send stattfindet. Nachricht wird ohne Zwischenspeicherung vom Sendern zum Empfänger kopiert. Folie 50
Prozeßkommunikation X - Nachrichtenaustausch Beschränkte Kapazität - Warteraum der Kapazität N - send blockiert bei vollem Warteraum - receive blockiert bei leerem Warteraum Unbeschränkte Kapazität - Blockierung nur bei receive (leerer Warteraum) - Warteplätze werden von Sender oder Empfänger mitgebracht Folie 51 Prozeßkommunikation XI - Nachrichtenaustausch Nachrichtenstruktur - bei typisierten Nachrichten Message = Kopf + Daten TYPE tmessage= RECORD EmpfängerAdresse: STRING; AbsenderAdresse: STRING; NachrichtenTyp: tmsgtyp; SequenzNummer: INTEGER; Länge: CARDINAL; Data: POINTER TO tblock; // oder inline END; - untypisierten Nachrichten: Bytestrom Folie 52
Prozeßkommunikation XII - Nachrichtenaustausch Implementierung - Buffer ist im BS-Kern angesiedelt -Bei send wird Nachricht aus dem Adressraum des Prozesses in den Puffer im Kern kopiert. -Bei receive wird Nachricht aus dem Puffer im Kern in den Adreßraum des Empfängers kopiert Folie 53 Prozeßkommunikation XIII - Nachrichtenaustausch Struktur einer Mailbox = Nachrichtenpuffer z.b. TYPE Mailbox = RECORD SenderQueue: tlist; EmpfängerQueue: tlist; MsgQueue : tlist; MsgZahl : INTEGER; einhängen(tmsg):procedure; aushängen(tmsg):procedure; END Folie 54
Prozeßkommunikation XIV - Nachrichtenaustausch Verbindungsorientierte Kommunikation openconnection (Adresse) send(message)/ receive(message) closeconnection Feststellen, ob der Empfänger existiert und bereit ist: Aufbau der Verbindung Nachrichtenaustausch; Leeren der Nachrichtenpuffer, Beenden der Verbindung Verbindungslose Kommunikation send (Adresse, Message) / receive(adresse, Message) Folie 55 Prozeßkommunikation XV - Adressierung Eindeutige Adressierung: Qualifizierte ID mit PID Adresse = Prozeß-ID.RechnerName.Firma.Land z.b. 5024.syssrv1.informatik.fh-wiesbaden.de Problem: Prozeß wechselt ID bei Neustart, Aufgabe bleibt Lösung: logische ID, nicht physische. Beispiel: Drucker Prädikatsadresse: Spezifikationen als Adresse (IF 386-CPU AND Java_installiert AND Drucker) =True: fühle dich angesprochen, sonst nicht. Arbeitsverteilung! Folie 56
Prozeßkommunikation XVI Pipes Unix pipe(), dup() - unidirektionale Kommunikation Programm1 Programm2.. Programm N Programm 1 write() read() Programm 2 Nur zwischen Prozessen möglich, deren Vorfahr die Pipe erzeugt hat. Unix Named Pipes (FIFOs) : Einträge im Filesystem: mkfifo(), mknod() Folie 57 Prozeßkommunikation XVII Pipes Windows NT CreatePipe() Bidirektionale pipes Globale Kommunikation: named pipes Folie 58
Prozeßkommunikation XVIII Message Queues Unix Message Queues sind wie Semaphore und Shared Memory Teil des IPC-Pakets msgctl() msgget() msgsnd() msgrcv() Management der Queue Queue erzeugen, öffnen Message senden Message empfangen Folie 59 Prozeßkommunikation XIX - Synchronisation Synchronisation durch Kommunikation putinbuffer(item) send(consumer,item) Item internen Puffer, geregelt mit P() und V() getfrombuffer(item) receive(producer,item) interner Puffer Item, geregelt mit P() und V() Erzeuger LOOP produce(item); send(consumer,item); END Verbraucher LOOP receive(producer,item); consume(item); END Folie 60
Prozeßkommunikation XX - Synchronisation Synchronisierung von n Prozessen durch ein Nachrichtensystem mit indirekter Adressierung Initialisierung: create_mailbox(mutex); send(mutex, message); Prozeß 1 Prozeß 2...... receive(mutex, msg) receive(mutex, msg) Kritischer Abschnitt Kritischer Abschnitt send(mutex, msg) send(mutex, msg)...... Folie 61 Prozeßkommunikation XXI - Synchronisation Zusammenfassung: Nachrichtensysteme unter Unix Pipes (pipe(), dup(), read(), write(), close()) Named Pipes (FIFOs) (mknod(), open(), read(), write(), close()) Stream Pipes (socket_pair(), read(), write(), close()) IPC Message Queues (msgget(), msgsnd(), msgrcv, msgctl()) UNIX Domain Sockets / Internet Domain Sockets (socket(), bind(), listen(), connect(), accept(), send(), recv(), read(), write(), close(), select(), sendto(), revcfrom()) Folie 62
Prozeßkommunikation XXII Shared Memory Unix Shared Memory gehört wie Semaphore und Message Queues zum IPC-Paket shmctl() shmget() shmat() shmdt() Management des SM-Segmentes SM-Segment erzeugen, öffnen SM-Segment in Prozeß-Adreßraum einblenden SM-Segment ausblenden Zur Synchronisation des Zugriffs sind i.a. Semaphore, etc. notwendig Folie 63 Verklemmungen I (deadlocks) (a) Möglicher Deadlock. (b) Entstandener Deadlock. Folie 64
Verklemmungen II Beispiel: Datei bearbeiten und ausdrucken durch zwei Prozesse P1 P1 P2 P2 hat die Datei, will den Drucker hat den Drucker, will die Datei Drucker Folie 65 Verklemmungen III Notwendige und hinreichende Bedingungen 1. Beschränkte Belegung (mutual exclusion) semaphorgeregelter Zugang 2. Zusätzliche Belegung (hold-and-wait) hat Drucker, will Datei 3. Keine vorzeitige Rückgabe (no preemption) behält Datei bzw. Drucker 4. Gegenseitiges Warten (circular wait) P1 wartet auf P2, P2 wartet auf P1 Folie 66
Verklemmungen IV Strategien: das Problem ignorieren, die Verklemmungen erkennen und beseitigen, die Verklemmungen vermeiden, die Verklemmungen verhindern (unmöglich machen). eine der Bedingungen (1) (4) verhindern Folie 67 Verklemmungen V Erkennen und beseitigen Anzeichen: viele Prozesse warten, aber CPU ist idle Prozesse müssen zu lange warten Betriebsmittelgraph (resource allocation graph) P 1 P 3 B 3 B 1 B 2 P 4 P 5 P 2 B 4 Verklemmungsbedingungen erfüllt bei Zyklen im Graphen Folie 68
Verklemmungen VIII Beseitigen Prozesse abbrechen z.b. verklemmten Prozeß oder Prozeß mit notw. BM Prozesse zurücksetzen auf check point und verklemmenden Prozess warten lassen Betriebsmittel entziehen von verklemmtem Prozeß und warten, bis BM frei werden. Folie 69 Verklemmungen IX Verklemmungsbedrohte Zustände vermeiden Test: Banker-Algorithmus (Dijkstra 1965) konservative Kreditausleihe eines Bankers: Gib nur Kredit, wenn auch die Wünsche von anderen, vorgemerkten Kunden berücksichtigt werden können bei sichergestellter Rückzahlung. Verklemmung-JA = Verklemmungsbedrohung; sie muß nicht eintreten, wenn rechtzeitig BM zurückgegeben werden. Vermeidung: lehne eine neue BM-Anforderung ab, wenn der Test sagt, daß dies zu einer Verklemmung führen kann. Aber: Realität unbekannte BM-Forderungen der Zukunft Prozeßzahl + BM-Zahl wechselt Laufzeit-+Speicherintensiver Algorithmus Folie 70
Verklemmungen X Unmöglich machen Verhindere eine der vier Bedingungen 1. Beschränkte Belegung (mutual exclusion) BM fest nur einem Service-Prozeß zuordnen 2. Zusätzliche Belegung (hold-and-wait) Nur ein BM pro Prozeß (aber: lesen und drucken nicht gleichzeitig) Alle nötigen BM auf einmal anfordern (nicht bekannt und Vergeudung!) Alle BM zurückgeben vor Neuanforderung (Verwaltungsaufwand!) 3. Keine vorzeitige Rückgabe (no preemption) Vorzeitiger Prozeß-Abbruch kann Inkonsistenzen verursachen 4. Gegenseitiges Warten (circular wait) Ordnungsrelation für BM einführen (Linearisierung) Folie 71 Verklemmungen XI Beispiele Ordnungsrelation Durchnumerieren der BM derart, daß nur höhere Nummern angefordert werden (nicht immer möglich). Anordnung von Ressourcen Ressourcen-Graph Folie 72