Suche Home Einstellungen Anmelden Hilfe  

Semaphore

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.

zurück zur Gliederung

zurück zur Startseite

Benutzer: gast • Besitzer: didaktik • Zuletzt geändert am: