|
Klassisch
Rendezvous
Allgemein
Semaphor
∘
Strich
∘
nix
|
|
|
|
Kl:
Sa
v
Ws
v
Rdvz:
S
W
Allg:
S
a
v
s
W
s
v
a
Sem:
P
V
nix
|
Kl:
Sa
v
Ws
v
Rdvz:
S
W
Allg:
S
a
v
s
W
s
v
a
Sem:
P
V
nix
|
|
|
|
|
ClassicSignal
|
- Zähler für vorliegende Signale, initial 0
- Wartemenge für Prozesse, initial leer
-
Prozess steht in Wartemenge, obwohl Signal vorliegt,
also Zähler > 0.
-
Wenn Zähler > 0, dann Wartemenge leer.
|
signalAsyn | waitSyn |
- Wartemenge enthält Element?
- Ja:
- Prozess P aus Wartemenge nehmen
- P deblockieren
- Nein:
|
- Zähler > 0 ?
- Ja:
- Nein:
- Aufrufer blockieren
- Aufrufer in Wartemenge legen
|
signalTry | waitTry |
- Wartemenge enthält Element?
- Ja:
- Prozess P aus Wartemenge nehmen
- P deblockieren
- Erfolg melden
- Nein:
|
- Zähler > 0 ?
- Ja:
- Zähler vermindern um 1
- Erfolg melden
- 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.
|
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:
|
|
Rendezvous
|
- Wartemenge S für Signalgeber, initial leer
- Wartemenge W für Signalnehmer, initial leer
-
Beide Mengen enthalten ein Element.
-
Mindestens eine Wartemenge muss leer sein. Anders ausgedrückt:
Wenn Wartemenge S nicht leer, dann Wartemenge W leer.
(oder umgekehrt)
|
signalSyn | waitSyn |
- Wartemenge W enthält Element?
- Ja:
- Prozess P aus Wartemenge W nehmen
- P deblockieren
- Nein:
- Aufrufer blockieren
- Aufrufer in Wartemenge S legen
|
- Wartemenge S enthält Element?
- Ja:
- Prozess P aus Wartemenge S nehmen
- P deblockieren
- Nein:
- Aufrufer blockieren
- Aufrufer in Wartemenge W legen
|
|
UniversalSignal
|
- Menge S für vorliegende Signale, initial leer
- Menge W für erwartete Signale, initial leer
-
Ein Signal wird erwartet, obwohl es vorliegt.
Also beide Mengen enthalten ein Element.
-
Wenn Menge S nicht leer, dann Menge W leer.
-
Elemente der Mengen sind Prozessreferenzen, die null sein dürfen.
-
Beide Mengen können null mehrfach enthalten.
|
signalAsyn | waitAsyn |
- Menge W enthält Element?
- Ja:
- Referenz P aus Menge W nehmen
- P deblockieren, falls nicht null
- Nein:
- Referenz null in Menge S legen
|
- Menge S enthält Element?
- Ja:
- Referenz P aus Menge S nehmen
- P deblockieren, falls nicht null
- Nein:
- Referenz null in Menge W legen
|
signalSyn | waitSyn |
- Menge W enthält Element?
- Ja:
- Referenz P aus Menge W nehmen
- P deblockieren, falls nicht null
- Nein:
- Aufrufer blockieren
- Aufrufer in Menge S legen
|
- Menge S enthält Element?
- Ja:
- Referenz P aus Menge S nehmen
- P deblockieren, falls nicht null
- Nein:
- Aufrufer blockieren
- Aufrufer in Menge W legen
|
signalTry | waitTry |
- Menge W enthält Element?
- Ja:
- Referenz P aus Menge W nehmen
- P deblockieren, falls nicht null
- Erfolg melden
- Nein:
|
- Menge S enthält Element?
- Ja:
- Referenz P aus Menge S nehmen
- P deblockieren, falls nicht null
- Erfolg melden
- Nein:
|