hwr-notes/Betriebssysteme/Zusammenfassung_Deadlocks.md
2026-04-09 11:24:56 +02:00

7.6 KiB

Zusammenfassung: Deadlocks (Verklemmungen)

1. Grundlagen: Ressourcen und Prozesse

Prozesse benötigen zur Ausführung Ressourcen (Prozessor, Speicher, Dateien, Drucker, Laufwerke). Um das Phänomen Deadlock zu verstehen, muss man zunächst die Art der Ressourcen unterscheiden.

Arten von Ressourcen

1. Preemptable (Unterbrechbar/Entziehbar):

  • Diese Ressourcen können einem Prozess weggenommen werden, ohne dass das System abstürzt oder Fehler entstehen.
  • Beispiel: CPU (durch Scheduling) oder Arbeitsspeicher (auf Standard-PCs durch Paging/Swapping auf die Festplatte).
  • Hinweis: Auf Smartphones ist RAM oft nicht entziehbar, da diese meist kein Swapping unterstützen. 2. Non-preemptable (Nicht-unterbrechbar/Nicht-entziehbar):
  • Diese Ressourcen können nicht entzogen werden, ohne dass der Prozess oder die Aufgabe scheitert.
  • Beispiel: Drucker (ein halb gedrucktes Blatt kann nicht von einem anderen Job fortgesetzt werden), DVD/Blu-ray-Brenner.
  • Fokus: Deadlocks entstehen meistens im Kampf um diese nicht-entziehbaren Ressourcen.

Definition eines Deadlocks

Ein Deadlock ist ein Zustand, in dem mehrere Prozesse aufeinander warten. Jeder Prozess wartet auf ein Ereignis (z. B. Freigabe einer Ressource), das nur ein anderer Prozess in dieser wartenden Gruppe auslösen kann. Da alle warten, passiert nichts mehr.

2. Die 4 Strategien des Betriebssystems

Wie geht ein OS mit Deadlocks um? Es gibt vier fundamentale Ansätze:

  1. Ignorieren (Ignoring): So tun, als ob es keine Deadlocks gibt.
  2. Erkennen (Recognizing): Zulassen, aber erkennen und beheben.
  3. Vermeiden (Avoiding): Dynamisch zur Laufzeit entscheiden, ob eine Zuweisung sicher ist.
  4. Verhindern (Preventing): Das System statisch so designen, dass Deadlocks strukturell unmöglich sind.

3. Strategie 1: Ignorieren (Der Strauß-Algorithmus)

Dies ist der einfachste Ansatz: Das Betriebssystem ignoriert die Möglichkeit eines Deadlocks komplett. Wenn einer auftritt, bleiben die Prozesse ewig hängen, bis der Benutzer eingreift (z. B. Prozess killt oder neu startet).

Rechtfertigung

  • Wahrscheinlichkeit: Wenn Deadlocks sehr selten auftreten (z. B. einmal alle 5 Jahre), aber reguläre Hardware-Abstürze wöchentlich passieren, lohnt sich der Aufwand für eine komplexe Deadlock-Lösung nicht.
  • Performance: Lösungen kosten oft Leistung oder Komfort. Ingenieure nehmen selten massive Performance-Einbußen in Kauf, um ein extrem seltenes Problem zu lösen.
  • Dieser Ansatz ist technisch "falsch", aber wirtschaftlich oft die Realität (Windows, Linux und macOS nutzen diesen Ansatz in vielen Bereichen).

4. Voraussetzungen: Die Coffman-Bedingungen

Damit ein Deadlock überhaupt entstehen kann, müssen vier Bedingungen gleichzeitig erfüllt sein (Coffman's Conditions):

  1. Mutual Exclusion (Gegenseitiger Ausschluss): Eine Ressource darf nur von einem Prozess exklusiv genutzt werden (nicht teilbar).
  2. Hold and Wait (Besitzen und Warten): Ein Prozess besitzt bereits Ressourcen und fordert weitere an, während er die alten behält.
  3. No Preemption (Nicht-Entziehbarkeit): Ressourcen können nicht gewaltsam weggenommen werden; der Besitzer muss sie freiwillig zurückgeben.
  4. Circular Wait (Zirkuläres Warten): Es gibt eine Kette von Prozessen (A wartet auf B, B wartet auf C ... C wartet auf A), die im Kreis aufeinander warten.

5. Strategie 2: Erkennung (Recognizing)

Das System lässt Deadlocks zu, überwacht aber den Zustand, um sie zu erkennen und dann zu lösen.

Der Ressourcengraph

Zur Erkennung baut das OS einen Graphen auf:

  • Kreise: Stellen Prozesse dar (P).
  • Rechtecke: Stellen Ressourcen dar (R).
  • Pfeil P → R: Prozess fordert Ressource an (Request).
  • Pfeil R → P: Prozess besitzt Ressource (Assignment).

Analyse

Das OS prüft diesen Graphen mittels Algorithmen (Tiefensuche, Rekursion) auf Zyklen.

  • Wird ein Zyklus (Kreis) gefunden, liegt ein Deadlock vor.
  • Beispiel: P1 hat Kamera, will HDD. P2 hat USB, will Kamera... P5 hat HDD, will USB. Dies bildet einen geschlossenen Kreis → Deadlock.

Behebung (Recovery)

Wenn ein Deadlock erkannt wurde, muss er durchbrochen werden:

  1. Killing (Prozessabbruch): Einen Prozess im Zyklus beenden. Brachial, aber einfach. Am besten trifft es Prozesse, die ohne Datenverlust neu gestartet werden können (z. B. Compiler).
  2. Preemption (Entzug): Einer Ressource temporär den Besitzer wegnehmen. Hängt stark von der Hardware ab und ist oft manuell oder gar nicht möglich.
  3. Rollback (Zurücksetzen): Prozesse erstellen regelmäßig Checkpoints (Sicherungspunkte des Zustands). Bei Deadlock wird ein Prozess auf einen früheren Zeitpunkt zurückgesetzt (bevor er die kritische Ressource anforderte). Er verliert die Arbeit seit dem Checkpoint, aber der Deadlock ist gelöst

6. Strategie 3: Vermeidung (Avoiding)

Hier wird versucht, Deadlocks dynamisch zu umgehen, bevor sie entstehen. Das System entscheidet bei jeder Anfrage: "Ist es sicher, diese Ressource jetzt zu vergeben?"

Das Konzept des sicheren Zustands

  • Ein Zustand ist sicher, wenn es einen Weg gibt, alle Prozesse nacheinander zu bedienen, ohne dass sie blockieren.
  • Das OS führt Buch darüber, welcher Prozess was braucht. Droht ein "unsicherer Zustand" (Clinch), wird die Ressource nicht vergeben, und der Prozess muss warten.

Das Problem

Avoiding funktioniert nur, wenn das OS in die Zukunft sehen kann. Es muss im Voraus wissen:

  • Welche Prozesse laufen werden.
  • Wann genau sie welche Ressourcen brauchen. Da diese Informationen in der Realität fast nie vorliegen, ist diese Strategie in der Praxis kaum anwendbar.

7. Strategie 4: Verhinderung (Preventing)

Dieser Ansatz ist statisch. Das System wird so designt, dass mindestens eine der vier Coffman-Bedingungen (siehe Punkt 4) niemals erfüllt werden kann. Wenn eine Bedingung fehlt, ist ein Deadlock mathematisch unmöglich. Man greift gezielt die einzelnen Bedingungen an:

A. Angriff auf "Mutual Exclusion" (Exklusivität)

  • Idee: Ressourcen gar nicht exklusiv vergeben.
  • Lösung: Spooling. Beispiel Drucker: Kein Prozess greift direkt auf den Drucker zu. Nur ein "Drucker-Daemon" darf das. Prozesse schreiben ihre Daten in eine Datei (Spool-Verzeichnis). Da Prozesse nur Dateien schreiben (was parallel geht) und nicht auf den Drucker warten, gibt es keinen Deadlock am Drucker.

B. Angriff auf "Hold and Wait" (Besitzen und Warten)

  • Idee: Verhindern, dass jemand Ressourcen hortet und auf neue wartet. Lösung 1: Ein Prozess muss alle benötigten Ressourcen ganz am Anfang anfordern. Bekommt er sie, läuft er. Wenn nicht, wartet er mit leeren Händen.
  • Nachteil: Man weiß oft nicht am Start, was man später braucht. Ressourcen werden verschwendet (lange belegt, aber erst am Ende genutzt).
  • Beispiel: Mainframe-Batch-Jobs (JCL) müssen oft alle Ressourcen im Header definieren. Lösung 2: Wer eine neue Ressource will, muss erst alle alten zurückgeben und dann alles zusammen neu anfordern.

C. Angriff auf "No Preemption" (Nicht-Entziehbarkeit)

  • Idee: Ressourcen gewaltsam wegnehmen.
  • Problem: Bei Druckern oder CD-Brennern führt das zu Chaos/Datenmüll.
  • Lösung: Virtualisierung (siehe Spooling). Die Hardware wird "versteckt", aber das geht nicht bei allen Ressourcen (z. B. Datensätzen in Datenbanken).

D. Angriff auf "Circular Wait" (Zirkuläres Warten)

  • Idee: Kreise unmöglich machen.
  • Lösung: Hierarchische Anforderung.
    • Alle Ressourcen bekommen eine Nummer (1 bis N).
    • Regel: Ein Prozess darf Ressourcen nur in aufsteigender Reihenfolge anfordern.
    • Wer Ressource Nr. 5 hat, darf Nr. 6 anfordern, aber niemals Nr. 2.
    • Damit ist ein Kreis (A → B → A) mathematisch ausgeschlossen.