Das Erzeuger-/Verbraucherproblem


Beim Erzeuger- / Verbraucherproblem produziert ein Erzeuger Güter, die er in einem Raum lagert. Der Lagerraum hat nur eine begrenzte Kapazität. In dem folgenden Beispiel können im Lagerraum nicht mehr als drei Güter aufbewahrt werden. Ein Verbraucher entnimmt die Güter aus dem Lagerraum und verbraucht sie anschließend. Ein Problem besteht darin, daß das Lagern und die Entnahme der Waren nicht gleichzeitig stattfinden darf. Das heißt, das Betreten des Lagerraums muß für den Erzeuger und den Verbraucher unter wechselseitigem Ausschluß geschehen. Natürlich muß auch eine Reihenfolge eingehalten werden, der Erzeuger muß zuerst produzieren und lagern, bevor der Verbraucher entnehmen und verbrauchen kann. Der Erzeuger sollte allerdings auch nicht mehr produzieren können, als er lagern kann.
Dieses Problem kann mit Hilfe von drei Semaphoren gelöst werden. Der erste Semaphor bestimmt, wieviele Güter gelagert werden können. Der zweite Semaphor setzt die Reihenfolge durch, der dritte regelt den wechselseitigen Ausschluß für den Zugriff auf den Lagerraum.

Das folgende Applet veranschaulicht dieses Problem:
Die rosafarbenen Quadrate stellen die Semaphore dar. Sie müssen zunächst durch Anklicken der Felder S0.INIT(3), S1.INIT(0) und S2.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 beiden Prozesse, die grau unterlegt und im unteren Feld dargestellt sind, angeklickt werden. Die einzelnen Programmschritte können nur in der angegebenen Reihenfolge abgearbeitet werden. So muß der Erzeuger immer erst die Funktion "S0.P(1)" ausführen, bevor er die "erzeugt"-Funktion ausführen kann. Anschließend muß er die Funkton "S2.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&oumlln hoch zurück weiter