|
Mutex
#
Barrier
#
Semaphor
#
∘
Strich
∘
nix
|
|
|
|
Mu:
L
v
U
v
∘
k
v
Ba:
L
U
S
Sem:
P
V
nix
|
Mu:
L
v
U
v
∘
k
v
Ba:
L
U
S
Sem:
P
V
nix
|
|
|
|
|
IAD lockSyn | IAD lockTry |
|
|
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:
|
|
Mutex
|
- Flag ob Sperre frei, initial gesetzt
- Wartemenge für Prozesse, initial leer
-
Prozess steht in Wartemenge, obwohl Sperre frei,
also Flag gesetzt.
-
Wenn Flag gesetzt, dann Wartemenge leer.
|
Operation |
Flag |
Wartemenge |
lockSyn() |
löschen |
hinein, blockieren |
unlockAsyn() |
setzen |
heraus, deblockieren |
lockTry() |
löschen |
|
unlockTry() |
|
heraus, deblockieren |
|
lockSyn | unlockAsyn |
- Flag gesetzt? Sperre noch frei?
- Ja:
- Nein:
- Aufrufer blockieren
- Aufrufer in Wartemenge legen
|
- Wartemenge enthält Element?
- Ja:
- Prozess P aus Wartemenge nehmen
- P deblockieren
- Nein:
|
lockTry | unlockTry |
- Flag gesetzt? Sperre noch frei?
- Ja:
- Flag löschen
- Erfolg melden
- Nein:
|
- Wartemenge enthält Element?
- Ja:
- Prozess P aus Wartemenge nehmen
- P deblockieren
- Erfolg melden
- Nein:
- Misserfolg melden Aufrufer behält Sperre
|
|
- Schranke k, initial wählbar
- Zähler wieviele "drin" sind, initial 0
- Wartemenge für Prozesse, initial leer
-
Prozess steht in Wartemenge, obwohl Zähler < k.
-
Wenn Zähler < k, dann Wartemenge leer.
|
Operation |
Zähler |
Wartemenge |
Schranke k |
lockSyn() |
erhöhen |
hinein, blockieren |
|
unlockAsyn() |
vermindern |
heraus, deblockieren |
|
setLimit() |
erhöhen |
heraus, deblockieren |
setzen |
|
lockSyn | unlockAsyn |
- Zähler < k ? Sperre noch frei?
- Ja:
- Nein:
- Aufrufer blockieren
- Aufrufer in Wartemenge stecken
|
- Zähler = 0 ? Sperre nicht gesetzt?
- Wartemenge ist leer oder Zähler >= k ?
- Ja:
- Nein:
- Prozess P aus Wartemenge nehmen
- P deblockieren
|
setLimit | |
- k auf neuen Wert setzen
- solange Zähler < k und Wartemenge nicht leer:
- Prozess P aus Wartemenge nehmen
- P deblockieren
- Zähler erhöhen
|
|