Suche Home Einstellungen Anmelden Hilfe  

Schloßvariable (lock variable)

Wie bisher deutlich geworden ist, müssen die nebenläufigen Prozesse synchronisiert werden (Kooperation und Konkurrenz). Die zeitliche Abfolge beim Eintritt der einzelnen Prozesse in einen kritischen Abschnitt muß aufeinander abgestimmt werden.

Kritischer Abschnitt heißt für unsere Philosophen, sie haben Hunger. Solange nur einer essen möchte, gibt es keine Probleme. Aber wenn zwei benachbarte Philosophen auf einmal zulangen wollen, müssen sie sich erst vergewissern, daß zwei Stäbchen zur Verfügung liegen. Wenn der eine nachschaut, darf kein anderer das Stäbchen wegnehmen. Also ein Zugriffsverbot für die beiden Nachbarn.

Deswegen denkt man sich eine Variable aus, die den Zugang zum kritischen Abschnitt regelt. Allgemein:

Eine Klasse kritischer Abschnitte wird mit einer Schlossvariablen versehen.
Alle Prozesse, die diesen kritischen Abschnitt betreten müssen, müssen zuerst mit dem Schloß den kritischen Abschnittes sperren und beim Verlassen diesen mit Hilfe dieser Variablen wieder freigeben.
Für den Philosophen heißt das, er muß sich überzeugen, daß zwei Stäbchen zum Essen für ihn frei sind. Nach dem Essen muß er die Stäbchen wieder so auf den Tisch ablegen, daß sie für die anderen Philosophen zu erreichen sind.

Programmtechnisch ist die Schlossvariable eine abstrakte Datenstruktur, auf die alle Prozesse zugreifen müssen, wenn sie den kritischen Abschnitt betreten wollen.  Den Vorgang kann man sich folgendermaßen vorstellen:

Ein Prozess kommt an den kritischen Abschnitt. Das Schloss findet er offen vor. Er betritt den Abschnitt und verschließt von innen das Schloss. Somit kann kein anderer folgen.
Ist er fertig mit seiner Verrichtung, verläßt er den Abschnitt und öffnet das Schloss wieder. Der Nächste hat nun Zutritt.
Jede Klasse kritischer Abschnitte benötigt eigene Schlossvariablen.Die Implementierung dieser Variablen muß so erfolgen, daß folgende Dinge geregelt werden:
1. Die Sicherung der kritischen Abschnitte
wenn Prozess P1  sich im kritischen Abschnitt befindet, darf kein 2. Prozess Zutritt erhalten.
(Immer nur einer der Philosophen greift auf die Stäbchen zu. Von dem Augenblick an, wo er sich überzeugt, daß zwei Stäbchen auf dem Tisch liegen, darf kein anderer Philosoph nach einem Stäbchen greifen)
2. Verklemmungsvermeidung
es darf nicht vorkommen, daß ein Prozess im kritischen Abschnitt "hängenbleibt" und somit das Betreten des Abschnittes durch andere Prozesse verhindert wird.
(zwei benachbarte Philosophen wollen essen; jeder hat ein Stäbchen; das zwischen ihnen liegende wollen beide nehmen => wird nicht gelingen, "Hände verklemmen")
3. Verhindern des Aushungerns
will ein Prozess P1 den kritischen Abschnitt nicht betreten, so soll P2 nicht warten  müssen, bis P1 diesen kritischen Abschnitt mal benötigt (z. B. aus Gründen der "fairen" Verteilung der Betriebsmittel)
(zwei Philosophen wollen gleichzeitig zugreifen, lassen aber immer dem anderen den Vortritt -    Hunger!!!!!!!)
In der Literatur werden verschiedene Implementierungen vorgestellt, mit  denen diese Probleme bewältigt werden. Allerdings geht es widerspruchsfrei nur für 2 nebenläufige Prozesse auf einem Prozessor. Treten mehrere Prozesse nebenläufig auf, gibt es neue Probleme.

Nachteile der Schloßvariablen:
Wenn ein Prozess auf das Eintreten der Bedingung "offene Schloßvariable" wartet, fragt er diese Variable immer wieder ab, bis sie den Abschnitt freigibt. Dazu muß er den Prozessor immer wieder benutzen. Somit kann der Prozessor aber nicht für andere Prozesse bereit stehen bzw. wird in der Arbeit für diese immer wieder unterbrochen. Diesen Vorgang nennt man aktives Warten. Ein Philosoph fragt ständig den anderen Essenden neben ihm: "ist dein Stäbchen frei?". So kann der  Essende nicht weiter essen, schließlich ist er höflich und spricht nicht mit vollen Mund. Also wird der Fragende nie zu dem zweiten Stäbchen kommen.

Zum anderen kann die Zahl der aktiven Prozesse nicht variabel gehalten werden, sondern muß von Anfang an bekannt sein. Hat er es immer mit einem oder zwei Nachbarn zu tun?

Als Drittes kommt die Schwierigkeit dazu, daß kein Prozess im kritischen Abschnitt terminieren darf. D. h. zu jeder Öffnung eines kritischen Abschnittes für P1 muß eine Freigabe für P2  gehören, wenn P1 den Abschnitt verläßt. Sonst ist eine Synchronisation der Prozesse gefährdet, d. h. der Philosoph muß das Stäbchen wieder zurücklegen, wenn er satt ist und nicht weiter in der Hand halten, vielleicht die Stirn kratzen o.ä..

Ausweg: Semaphore

zurück zur Gliederung

zurück zur Startseite

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