|
Hat man nur einen Prozessor, so kann man es sich praktisch
nicht leisten, daß wartende Prozesse immer wieder die Arbeit des
laufenden Prozesses unterbrechen, um anzufragen, ob nicht in der Zwischenzeit
der kritische Abschnitt frei geworden ist. Der Ausweg ist das Aufstellen
von Signalen, sogenannte Semaphore, die die Prozesse passieren lassen,
wenn der kritische Abschnitt frei ist, und vor denen sich die Prozesse
in eine Warteschlange einreihen, wenn der kritische Abschnitt nicht frei
ist.
Vom Grundprinzip her, kann man sich einen Signalzähler
vorstellen, der genau so viele positive Punkte enthält, wie Prozesse
gleichzeitig den kritischen Abschnitt betreten können. Schließen
sich die Prozesse gegenseitig aus, so ist die Zahl 1. In unserem Fall ist
der Zähler 4.
Jedesmal, wenn ein Prozeß den kritischen Abschnitt betreten möchte, wird der Zähler um eins heruntergesetzt.
Wenn ein Prozeß den kritischen Abschnitt verläßt,
setzt er dabei den Zähler um eins hoch.
Ist nach dem Signalisieren des Wunsches, den kritischen
Abschnitt zu betreten, der Wert des Zählers negativ geworden, so muß
sich der Prozeß in die Warteschlange einreihen. Andernfalls kann
er passieren. In der Warteschlange muß aber der Prozeß nicht
mehr ständig nachsehen, ob der Weg frei ist, sondern er wird abgeholt,
wenn ein anderer Prozeß den kritischen Abschnitt verläßt.
Dieser gibt nämlich an den Zähler durch, daß er um eins
hochgesetzt wird. Dieses Signal führt dazu, daß zusätzlich
der nächste Prozeß aus der Warteschlange in den kritischen Abschnitt
geschickt wird. Ob es noch Prozesse in der Warteschlange gibt, oder diese
leer ist, läßt sich leicht am Zahlenwert des Zählers erkennen.
Betrachten wir dazu das Beispiel der speisenden Philosophen:
Hier entsteht eine Verklemmung, wenn mehr als 4 Philosophen gleichzeitig nach einem Stäbchen greifen. Man führt also ein Semaphor ein, das die Anzahl der Philosophen, die Zugriff auf ein Stäbchen haben, auf maximal 4 begrenzt. Bekommt auch der 5.Hunger, so muß er warten, bis einer der anderen 4 satt ist und sein Stäbchen hingelegt hat.
Das ist aber noch nicht alles. Es kann ja immer nur einer der Philosophen das Stäbchen aufnehmen. Hier setzen wir ein Semaphor mit dem Zähler 1. Das heißt, daß der Philosoph bevor er zugreifen kann, dieses Signal passieren und auf 0 setzen muß. Der nächste, der das Stäbchen haben möchte, setzt das Signal auf -1, was zur Folge hat, daß er nicht passieren kann und warten muß, bis sein Nachbar satt ist, das Stäbchen ablegt und das Signal beim passieren wieder auf 0 setzt. Er braucht allerdings nicht ständig nachzusehen, denn der eben gesättigte Philosoph wird, bevor er wieder zu denken anfängt, den Zähler betrachten. Ist die angezeigte Zahl 0 (er hat ja die Minus 1 gerade um 1 erhöht), gibt es wenigstens einen Nachbarn der wartet. Diesen muß er dann informieren, daß das Stäbchen wieder zu haben ist.
Wie meistens hat auch das Verfahren mit Semaphoren Nachteile.
Für das Problem der Philosophen werden z. B. zwei Semaphore benötigt.
Bei komplexeren Aufgaben können es bedeutend mehr werden, die sich
noch dazu über das ganze Programm verteilen. Da ist die Gefahr, daß
beim Programmieren z. B. das Hochsetzen des Zählers nach dem Verlassen
des kritischen Abschnitts vergessen wird, relativ hoch.
Einen Ausweg bieten Monitore.
|