Informatik

Deadlock: erkennen, verhindern und auflösen

Deadlock: erkennen, verhindern und auflösen
Deadlock: erkennen, verhindern und auflösen
Für Quiz, Lückentext, Lernkarten und Fortschritt ist JavaScript nötig. Alle Inhalte und Lösungen bleiben direkt lesbar.

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.

Deine Lernziele

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.

Definition

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.

Definition

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.

Beispiel

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.

Teste dich
Frage 1 von 1LeichtWelche Beschreibung trifft den Kern eines Deadlocks?
Lösung: Mehrere Prozesse warten zyklisch aufeinander und keiner der Beteiligten kommt weiter. — Ein Deadlock braucht eine gegenseitige Abhängigkeit innerhalb einer beteiligten Gruppe. Bloße Langsamkeit oder gemeinsame, konfliktfreie Nutzung genügt nicht.
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.

  1. Mutual Exclusion – wechselseitiger Ausschluss: Mindestens eine benötigte Ressource ist exklusiv nutzbar.
  2. Hold and Wait – Belegen und Warten: Ein Prozess hält bereits eine Ressource, während er eine weitere anfordert.
  3. No Preemption – kein erzwungener Entzug: Eine belegte Ressource wird nur vom haltenden Prozess freigegeben; das System entzieht sie nicht einfach.
  4. 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.
Merke

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.

Teste dich
Frage 1 von 1MittelZwei Prozesse fordern exklusive Locks nur in der festen Reihenfolge L1, dann L2 an. Welche Coffman-Bedingung wird dadurch verhindert?
Lösung: Circular Wait — Eine globale Reihenfolge verhindert, dass sich die Anforderungen zu einem Kreis schließen. Prozesse können weiterhin Locks halten oder warten, aber nicht zyklisch aufeinander.
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.
Beispiel

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.

Merke

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.

Teste dich
Frage 1 von 1MittelEin Zuteilungsgraph enthält einen Zyklus. Eine beteiligte Ressource besitzt mehrere Instanzen. Was darfst du sicher schließen?
Lösung: Ein Deadlock ist möglich, aber der Zyklus allein beweist ihn nicht. — Bei mehreren Instanzen musst du zusätzlich prüfen, ob eine freie oder später freigegebene Instanz einen Prozess aus der Wartekette lösen kann.
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.

Teste dich
Frage 1 von 2LeichtWelche Strategie hebt mindestens eine Coffman-Bedingung grundsätzlich auf?
Lösung: Prävention — Prävention verändert die Regeln des Systems. Vermeidung bewertet dagegen den erwarteten Folgezustand jeder einzelnen Zuteilung.
Frage 2 von 2SchwerEin Programm besitzt zwei exklusive Locks. Alle Threads können so umgebaut werden, dass sie die Locks stets in derselben Reihenfolge anfordern. Welche Maßnahme passt am besten?
Lösung: Eine globale Lock-Reihenfolge festlegen, um Circular Wait zu verhindern. — Die gemeinsame Reihenfolge ist eine präventive Maßnahme. Sie erhält die Locks, schließt aber die zyklische Anforderung aus.
Deadlock, Livelock und Starvation unterscheiden

Drei Probleme können Fortschritt verhindern, aber aus verschiedenen Gründen.

ProblemVerhalten der BeteiligtenFortschritt
DeadlockProzesse warten passiv in einer geschlossenen KetteKeiner der Beteiligten kommt weiter
LivelockProzesse bleiben aktiv und reagieren ständig aufeinanderKeiner der Beteiligten kommt weiter
StarvationEin Prozess wird dauerhaft benachteiligtAndere 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.

Teste dich
Frage 1 von 1MittelEin Scheduler vergibt eine frei werdende Ressource immer an Prozesse mit hoher Priorität. Ein Prozess niedriger Priorität wartet unbegrenzt, während andere fertig werden. Was liegt vor?
Lösung: Starvation — Der benachteiligte Prozess verhungert, weil die Auswahl unfair ist. Es gibt weder eine notwendige zyklische Wartekette noch erfolglose Aktivität aller Beteiligten.
Karteikasten
Karteikasten

Überlege zuerst selbst und drehe die Karte anschließend zum Prüfen um.

Alles auf einen Blick
Mindmap
  • 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
Abschluss-Check
Teste dich
Frage 1 von 3LeichtWelche Aussage über die Coffman-Bedingungen ist richtig?
Lösung: Fehlt mindestens eine der vier Bedingungen, kann im Coffman-Modell kein Deadlock entstehen. — Die vier Bedingungen beschreiben gemeinsam die Voraussetzungen. Eine einzelne Bedingung zeigt höchstens ein Teilrisiko.
Frage 2 von 3MittelA hält R und fordert S. B hält S und fordert R. R und S haben je genau eine Instanz. Was zeigt der Graph?
Lösung: Einen Deadlock zwischen A und B — Die Kanten bilden A → S → B → R → A. Da jede beteiligte Ressource genau eine Instanz hat, beweist der Zyklus den Deadlock.
Frage 3 von 3SchwerEin System kennt den maximalen Ressourcenbedarf aller Prozesse. Vor jeder Zuteilung prüft es, ob danach noch eine sichere Prozessfolge existiert. Welche Strategie nutzt es?
Lösung: Deadlock-Vermeidung — Die Laufzeitprüfung auf einen sicheren Folgezustand ist das Kennzeichen der Vermeidung. Eine unsichere Anforderung wird nicht bewilligt, obwohl noch kein Deadlock vorliegen muss.

Passend dazu