Deadlock: erkennen, verhindern und auflösen
Ein Deadlock oder eine Verklemmung entsteht, wenn mehrere Prozesse oder Threads in einer geschlossenen Kette aufeinander warten: Jeder hält etwas fest, das ein anderer braucht, und keiner kann ohne die fehlende Ressource fortfahren. Ohne äußeren Eingriff kommt die ganze beteiligte Gruppe nicht weiter.
Auf dieser Seite lernst du, einen Deadlock an den vier Coffman-Bedingungen und in einem Betriebsmittelzuteilungsgraphen zu erkennen. Außerdem kannst du passende Gegenmaßnahmen auswählen und Deadlock, Livelock und Starvation unterscheiden.
Hake ab, was du schon kannst — und komm am Ende hierher zurück!
Wenn zwei Prozesse nicht mehr weiterkommen
Stell dir zwei Threads vor. Thread A besitzt lock1 und fordert lock2 an. Gleichzeitig besitzt Thread B lock2 und fordert lock1 an. Beide warten darauf, dass der andere sein Lock freigibt. Das geschieht aber erst, nachdem der jeweilige Thread weiterarbeiten konnte.
Ressource
Eine Ressource ist etwas, das ein Prozess für seine Arbeit benötigt, zum Beispiel eine Datenbanksperre, eine Datei, ein Gerät oder ein Speicherbereich. Manche Ressourcen dürfen zu einem Zeitpunkt nur von einem Prozess benutzt werden.
Deadlock
Ein Deadlock ist eine zyklische Wartesituation: Jeder beteiligte Prozess wartet auf eine Ressource oder ein Ereignis, das nur ein anderer Prozess derselben Gruppe freigeben oder auslösen kann. Die Beteiligten sind blockiert und erzielen ohne Eingriff keinen Fortschritt.
Nicht jede mögliche ungünstige Reihenfolge führt tatsächlich zum Deadlock. Gibt A lock1 frei, bevor B lock2 belegt, kann der Ablauf problemlos enden. Entscheidend ist also der konkrete Zustand zur Laufzeit.
Ein System besitzt zu Beginn 200 GByte freien Hauptspeicher. Prozess P1 belegt 80 GByte, P2 belegt 70 GByte. Damit sind 150 GByte belegt und 50 GByte frei.
P1 fordert nun weitere 60 GByte, P2 weitere 80 GByte. Keine der beiden Anforderungen passt in die verbleibenden 50 GByte. Wenn beide Prozesse ihren bereits belegten Speicher erst nach der zusätzlichen Zuteilung freigeben, warten beide dauerhaft. Der Zustand ist verklemmt.
Die vier Coffman-Bedingungen prüfen
Vier Bedingungen müssen gleichzeitig vorliegen, damit ein Deadlock nach dem Coffman-Modell möglich ist. Fehlt mindestens eine, kann in diesem Modell kein Deadlock entstehen.
- Mutual Exclusion – wechselseitiger Ausschluss: Mindestens eine benötigte Ressource ist exklusiv nutzbar.
- Hold and Wait – Belegen und Warten: Ein Prozess hält bereits eine Ressource, während er eine weitere anfordert.
- No Preemption – kein erzwungener Entzug: Eine belegte Ressource wird nur vom haltenden Prozess freigegeben; das System entzieht sie nicht einfach.
- Circular Wait – zyklisches Warten: Es gibt eine geschlossene Kette. Jeder Prozess wartet auf eine Ressource des nächsten, und der letzte wartet auf eine Ressource des ersten.
Prüfe nicht nur, ob mehrere Prozesse warten. Suche nach einer geschlossenen Wartekette und kontrolliere danach, ob die Ressourcen exklusiv, schrittweise belegt und nicht entziehbar sind.
Im Lock-Beispiel sind alle vier Bedingungen erfüllt: Die Locks sind exklusiv. Beide Threads halten je ein Lock und warten auf das zweite. Das gehaltene Lock wird nicht entzogen. A wartet auf B und B auf A.
Eine feste Erwerbsreihenfolge verändert genau diesen entscheidenden Punkt. Wenn alle Threads stets zuerst lock1 und danach lock2 anfordern, kann keine Kette entstehen, in der einer die Reihenfolge umkehrt. Circular Wait ist ausgeschlossen.
Einen Zuteilungsgraphen lesen
Ein Betriebsmittelzuteilungsgraph stellt Prozesse und Ressourcen als zwei verschiedene Arten von Knoten dar. Seine gerichteten Kanten haben eine feste Bedeutung:
- Prozess → Ressource: Der Prozess fordert die Ressource an und wartet darauf.
- Ressource → Prozess: Die Ressource ist dem Prozess zugeteilt.
Gegeben ist dieser Zustand:
- Ressource R → Prozess A: A hält R.
- Prozess A → Ressource S: A fordert S an.
- Ressource S → Prozess B: B hält S.
- Prozess B → Ressource R: B fordert R an.
Du kannst dem geschlossenen Weg folgen:
A → S → B → R → A
A wartet über S auf B, während B über R auf A wartet. Besitzen R und S jeweils genau eine Instanz, beweist dieser Zyklus einen Deadlock.
Bei mehreren Instanzen eines Ressourcentyps ist die Bewertung vorsichtiger. Ein Zyklus ist dann ein Warnsignal, aber nicht immer ein Beweis: Eine weitere Instanz könnte von einem Prozess außerhalb des Zyklus freigegeben werden. Dadurch könnte ein wartender Prozess enden und den Kreis auflösen.
Kein Zyklus bedeutet: kein Deadlock im Graphen. Ein Zyklus mit genau einer Instanz jeder beteiligten Ressource bedeutet: Deadlock. Bei mehreren Instanzen bedeutet ein Zyklus nur: Deadlock möglich.
Deadlocks verhindern, vermeiden und auflösen
Gegenmaßnahmen setzen an unterschiedlichen Zeitpunkten an. Deshalb ist es wichtig, die Strategien nicht zu vermischen.
Prävention: eine Bedingung unmöglich machen
Bei der Prävention wird das System so entworfen, dass mindestens eine Coffman-Bedingung nicht erfüllt werden kann. Beispiele sind:
- Ressourcen gemeinsam nutzbar machen, sofern das fachlich möglich ist;
- alle benötigten Ressourcen auf einmal anfordern;
- entziehbare oder virtualisierte Ressourcen verwenden;
- alle Ressourcen in einer festen globalen Reihenfolge anfordern.
Die feste Reihenfolge ist oft besonders praktikabel. Sie verhindert Circular Wait, kann aber die Gestaltung einschränken. Alle Ressourcen auf einmal anzufordern kann Wartezyklen ebenfalls vermeiden, bindet jedoch möglicherweise Ressourcen, die erst später benötigt werden.
Vermeidung: nur sichere Zuteilungen erlauben
Bei der Vermeidung bleiben die Coffman-Bedingungen grundsätzlich möglich. Das System prüft vor einer Zuteilung, ob danach noch eine Reihenfolge existiert, in der alle Prozesse ihren maximalen Restbedarf erhalten, enden und ihre Ressourcen freigeben können. Dann ist der Zustand sicher.
Ein unsicherer Zustand ist noch nicht automatisch ein Deadlock. Er bedeutet: Unter der angenommenen maximalen Nachfrage ist keine garantiert erfolgreiche Reihenfolge mehr bekannt. Vermeidungsverfahren wie der Bankieralgorithmus lassen eine Anforderung deshalb warten. Dafür muss der maximale Bedarf im Voraus bekannt sein.
Erkennen und anschließend auflösen
Ein System kann Deadlocks zunächst zulassen, regelmäßig nach Wartezyklen suchen und einen gefundenen Deadlock auflösen. Mögliche Eingriffe sind:
- einen beteiligten Prozess oder eine Transaktion abbrechen;
- eine geeignete Ressource entziehen;
- einen Prozess auf einen früheren Sicherungszustand zurücksetzen.
Diese Eingriffe können Arbeit oder Daten kosten. Die Opferwahl muss daher berücksichtigen, welcher Abbruch wenig Schaden verursacht und ob ein konsistenter Zustand wiederhergestellt werden kann. Derselbe Prozess sollte nicht ständig zum Opfer werden, sonst droht Starvation.
Deadlock, Livelock und Starvation unterscheiden
Drei Probleme können Fortschritt verhindern, aber aus verschiedenen Gründen.
| Problem | Verhalten der Beteiligten | Fortschritt |
|---|---|---|
| Deadlock | Prozesse warten passiv in einer geschlossenen Kette | Keiner der Beteiligten kommt weiter |
| Livelock | Prozesse bleiben aktiv und reagieren ständig aufeinander | Keiner der Beteiligten kommt weiter |
| Starvation | Ein Prozess wird dauerhaft benachteiligt | Andere Prozesse können weiterkommen |
Beim Livelock ändern Prozesse ihren Zustand, lösen aber das Problem nicht. Zwei Personen in einem schmalen Gang weichen beispielsweise immer gleichzeitig auf dieselbe Seite aus. Beide sind aktiv, doch niemand kommt vorbei.
Bei Starvation, auch Verhungern genannt, werden Ressourcen zwar frei und andere Prozesse machen Fortschritt. Ein bestimmter Prozess erhält die benötigte Ressource wegen einer unfairen Auswahl jedoch immer wieder nicht.
Karteikasten
Überlege zuerst selbst und drehe die Karte anschließend zum Prüfen um.
Alles auf einen Blick
- Deadlock
- Erkennen
- zyklisches Warten
- Zuteilungsgraph
- Voraussetzungen
- Mutual Exclusion
- Hold and Wait
- No Preemption
- Circular Wait
- Behandeln
- Prävention
- Vermeidung
- Erkennung und Auflösung
- Abgrenzen
- Livelock
- Starvation
- Erkennen
Mit Google fortfahren