|
Semaphor
#
Zelle
#
Hazy
#
∘
Strich
∘
nix
|
|
|
|
Sem:
P
V
Zelle:
g
t
g'
t'
Hazy:
r
s
nix
|
Sem:
P
V
Zelle:
g
t
g'
t'
Hazy:
r
s
nix
|
|
|
|
|
HazyCondition
|
- Flag ob Bedingung derzeit erfüllt, initial gelöscht
- Wartemenge für Prozesse, initial leer
-
Prozess steht in Wartemenge, obwohl Flag gesetzt.
-
Wenn Flag gesetzt, dann Wartemenge leer.
|
Operation |
Flag |
Wartemenge |
required() |
löschen |
hinein, blockieren |
satisfied() |
setzen |
heraus, deblockieren |
|
required | satisfied |
- Flag gesetzt?
- Ja:
- Nein:
- Aufrufer blockieren
- Aufrufer in Wartemenge legen
|
- Wartemenge enthält Element?
- Ja:
- Prozess P aus Wartemenge nehmen
- P deblockieren
- Nein:
|
|
Semaphor
|
- Zähler, initial 0 oder positiv
- Wartemenge für Prozesse, initial leer
-
Prozess steht in Wartemenge, obwohl Zähler > 0.
-
Wenn Zähler > 0, dann Wartemenge leer.
|
Operation |
Zähler |
Wartemenge |
P() |
runter |
hinein, blockieren |
V() |
hoch |
heraus, deblockieren |
|
P | V |
- Zähler > 0 ?
- Ja:
- Nein:
- Aufrufer blockieren
- Aufrufer in Wartemenge legen
|
- Wartemenge enthält Element?
- Ja:
- Prozess P aus Wartemenge nehmen
- P deblockieren
- Nein:
|
|
Zelle
|
- Flag ob Zelle gefüllt, initial gelöscht (Zelle leer)
- Inhalt der Zelle falls gefüllt, initial egal (weil nicht gefüllt)
- Wartemenge für Prozesse, initial leer
-
Prozess steht in Wartemenge, obwohl Zelle gefüllt,
also Flag gesetzt.
-
Wenn Flag gesetzt, dann Wartemenge leer.
|
Operation |
Flag |
Inhalt |
Wartemenge |
give() |
setzen |
merken |
hinein, blockieren |
take() |
löschen |
(vergessen) |
heraus, deblockieren |
|
give (Wert) | take(): Wert |
- Wartemenge enthält Element?
- Ja:
- Prozess P aus Wartemenge nehmen
- Rückgabe-Wert von P setzen
- P deblockieren
- Nein:
- Inhalt auf Wert setzen
- Flag setzen Zelle nun gefüllt
|
- Flag gesetzt? d.h. Zelle gefüllt?
- Ja:
- Inhalt als Rückgabewert nehmen
- Flag löschen Zelle nun leer
- Nein:
- Aufrufer blockieren
- Aufrufer in Wartemenge stecken
|
give' (Wert) | take'(): Wert |
- Wartemenge ist leer?
- Ja:
- Inhalt auf Wert setzen
- Flag setzen Zelle nun gefüllt
- Nein:
- Prozess P aus Wartemenge nehmen
- Rückgabe-Wert von P setzen
- P deblockieren
|
- Flag gelöscht? d.h. Zelle leer?
- Ja:
- Aufrufer blockieren
- Aufrufer in Wartemenge stecken
- Nein:
- Inhalt als Rückgabewert nehmen
- Flag löschen Zelle nun leer
|
|