Philosophenproblem
Philosophenproblem
Auf einen Blick
Fünf Philosophen sitzen um einen Tisch, zwischen je zweien liegt eine Gabel. Zum Essen braucht jeder beide Nachbargabeln. Der naive Algorithmus führt direkt in einen Deadlock — das klassische Lehrbeispiel für Synchronisation.
Das Szenario
while (true) {
denken();
nimm(linkeGabel);
geistesBlitz();
nimm(rechteGabel);
essen();
legeGabelnZurück();
}
Nehmen alle gleichzeitig zuerst die linke Gabel, hält jeder eine und wartet ewig auf die rechte → Circular Wait, alle vier Deadlock-Bedingungen erfüllt.
Interaktiv: Deadlock & Lösung
Wechsle zwischen dem naiven Ablauf (Deadlock) und der Lösung:
Lösungsansätze
Jeder Ansatz bricht gezielt eine Deadlock-Bedingung:
- Ressourcen-Ordnung (Bedingung Circular Wait): Gabeln global nummerieren, immer zuerst die kleinere nehmen. Der Zyklus kann sich nicht schließen. (im interaktiven Element gezeigt)
- Asymmetrie: Ein Philosoph nimmt erst rechts, dann links.
- Kellner / zählende Semaphore (Bedingung Hold and Wait): höchstens 4 Philosophen dürfen gleichzeitig nach Gabeln greifen.
- Beide Gabeln atomar anfordern (alles-oder-nichts).
Warum das wichtig ist
Das Problem modelliert reale Situationen, in denen Prozesse mehrere Semaphoren/Sperren gleichzeitig brauchen — etwa Datenbank-Transaktionen, die mehrere Tabellen sperren.
Verwandte Notes
Deadlocks · Semaphoren · Kritischer Abschnitt & Mutual Exclusion