Typowe problemy synchronizacji procesów

Transkrypt

Typowe problemy synchronizacji procesów
Semafory
Semafor jest zmienną całkowitą, na której stowarzyszone operacje:
• czekaj (wait, P)
• sygnalizuj (signal, V)
wykonywane są w sposób niepodzielny.
Zmiennej semaforowej nadaje się początkowo pewną wartość ( w
szczególności 1)
Realizacja operacji P(sem)
czekaj aż wartość sem > 0
sem := sem – 1;
Realizacja operacji V(sem)
sem := sem + 1;
Jeśli wartość początkowa semafora jest 1 to mamy do czynienia z tzw.
semaforem binarnym (zwyczajowo operacje na nim oznaczamy PB,
VB)
Semafor binarny rozwiązuje problem sekcji krytycznej.
sem := 1;
. . .
PB(sem);
wykonaj sekcję krytyczną;
VB(sem);
Typowe problemy synchronizacji procesów
Problemu producenta-konsumenta
Przypadek nieograniczonego bufora:
s – semafor binarny chroniący sekcji krytycznej
sk – semafor konsumenta, określa ilość elementów w buforze i
zawiesza procesy konsumenta w sytuacji pustego bufora
s = 1;
sk = 0
Producent
while true do
produkuj;
PB(s);
dodaj do bufora;
V(sk)
VB(sk);
Konsument
while true do
P(sk);
PB(s)
odczytaj z bufora;
VB(s);
konsumuj;
Przypadek ograniczonego bufora:
sp – semafor producenta, określa ilość wolnych pozycji w buforze i
zawiesza procesy producenta w sytuacji pełnego bufora
sp := n;
Producent
while true do
produkuj;
P(sp);
PB(s);
dodaj do bufora;
V(sk)
VB(sk);
Konsument
while true do
P(sk);
PB(s)
odczytaj z bufora;
V(sp);
VB(s);
konsumuj;