Das Philosophenproblem


Sitzen fünf Philosophen an einem runden Tisch, auf dem fünf Teller randvoll gefüllt mit Spaghetti gedeckt sind, zwischen denen sich fünf einzelne Gabeln befinden, so gibt es ein Problem: ein Philosophenproblem! Philosophen können nur mit zwei Gabeln Spaghetti essen. Daraus folgt, daß nie alle Philosophen gleichzeitig essen können. Zum Essen braucht jeder Philosoph die Gabeln zu seiner linken und rechten Seite, hat er diese genommen, können seine beiden Tischnachbarn nicht essen. Den größten Teil des Tages beschäftigen sich Philosophen damit, tiefgründige Gedanken zu wälzen. So denken sie, nachdem sie sich zu Tisch gesetzt haben, erst einmal über Sinn und Unsinn der Nahrungsaufnahme nach. Jeder Philosoph braucht in der Regel unterschiedlich viel Zeit, wenn er sich mit dieser Frage zu beschäftigt. Kommt es jedoch einmal vor, daß alle Philosophen gleich lange nachgedacht haben und anschließend alle gleichzeitig ihre linke Gabeln aufnehmen, dann kann keiner essen, weil ihm seine rechte Gabel fehlt. Diesen Zustand nennt man "deadlock". Die Philosophen würden in dieser Situation verhungern, weil keiner von ihnen auf die Idee käme, seine linke Gabel wieder hinzulegen.

Die fünf Philosophen sind in dem folgenden Beispiel als Prozesse realisiert worden, und die Gabeln werden von fünf Semaphoren gebildet, die mit dem Wert 1 initialisiert werden.

Das folgende Applet veranschaulicht dieses Problem:
Die rosafarbenen Quadrate stellen die Semaphore dar. Sie müssen zunächst durch Anklicken der Felder S0.INIT(1) bis S4.INIT(1) initialisiert werden. Daraufhin erscheinen bei jedem Semaphor drei Zahlen. Die kleine Zahl links oberhalb des Semaphors kennzeichnet seine Nummer. Die große Zahl rechts innerhalb gibt seinen count-Wert an, und die kleine Zahl links unten sagt aus, wieviele Prozesse sich im Warteraum des Semaphors befinden. Nach der Initialisierung können die Programmschritte der fünf Prozesse, die grau unterlegt und im unteren Feld dargestellt sind, angeklickt werden. Die einzelnen Programmschritte können nur in der angegebenen Reihenfolge abgearbeitet werden. Die Philosophen müssen immer erst die Funktion "denkt" ausführen, bevor sie die "Sx.P(1)"-Funktion ausführen können. Anschließend müssen sie die Funktion "Sx.P(1)" ausführen usw. Der zuletzt bearbeitete Programmschritt der Prozesse wird durch einen kleinen Pfeil gekennzeichnet. Das Feld, das zuletzt angeklickt wurde, wird gelb hinterlegt.



FH-Köln hoch zurück weiter