Documente Academic
Documente Profesional
Documente Cultură
Solutia cu semafoare
Notatie: se introduc doua operatii primitive P si V si variabila s de
tip semafor
P(s) :: <await (s>0) s = s-1;>
V(s) :: <s = s+1>
Producatori si consumatori
Problema: M producatori si N consumatori comunica printr-un
tampon partajat care are un singur element.
Trebuie asigurat ca valorile sa nu fie supra-scrise si sa nu fie citite
din tampon de mai multe ori.
Constrangeri ale accesului la tampon
producatorii au acces doar cand tamponul este gol
consumatorii au acces doar cand tamponul este plin
cand un producator pune o valoare in tampon marcheaza tampon plin
un alt producator nu poate supra-scrie tamponul
cand un consumator ia o valoare din tampon marcheaza tampon gol
un alt consumator nu poate citi aceeasi valoare ca precedentul
un singur semafor nu este suficient pentru a controla accesul!
Solutia controlul accesului poate fi asigurat doar de 2 semafoare
gol, pentru accesul producatorilor
plin, pentru accesul consumatorilor
Producator - solutia
typeT buf;
sem gol = 1, plin = 0; /* sem. binare */
process Producator [i= 1 to M]{
typeT v; /* variabila locala */
while (true){
v = produce (); /* produ o valoare v */
/* asteapta buf gol */
P(gol);
buf = v;
/* marcheaza buf plin */
V(plin)
}
}
Consumator solutia
typeT buf;
sem gol = 1, plin = 0; /* sem. binare */
1 2 3 k
ultim prim
Algoritmi Paraleli si distribuiti 10
Universitatea Politehnica Bucureti - Facultatea de Automatic i Calculatoare
Producatorii
typeT buf[1:k];
sem gol = k, plin = 0; /*sem. generalizate*/
int prim = 1, ultim = 1; /*variabile partajate*/
sem mutexP = 1, mutexC = 1;
Consumatorii
typeT buf[1:k];
sem gol = k, plin = 0; //sem generalizate
int prim = 1, ultim = 1;
sem mutexP = 1, mutexC = 1;
process Consumator[i = 1 to N]{
typeT w;
while (true){
P(plin); /*acapareaza un loc plin*/
P(mutexC); /*intra sectiune critica consumatori*/
w = buf[prim]; prim = prim mod k + 1;
V(mutexC);
V(gol);
consuma (w);
}
}
Algoritmi Paraleli si distribuiti 15
Universitatea Politehnica Bucureti - Facultatea de Automatic i Calculatoare
Procesul cititor
sem rw = 1;
sem mutexR = 1; /*accesul la nr este exclusiv ptr. cititori*/
int nr = 0;
process Cititor [i = 1 to m]{
while (true){
P(mutexR); /*necesara pentru accesul exclusiv la nr*/
nr = nr+1;
if (nr == 1) P(rw); /*daca prim cititor*/
V(mutexR);
citeste din resursa comuna;
P(mutexR)
nr = nr-1;
if (nr == 0) V(rw); /*daca ultim cititor*/
V(mutexR);}
}
Procesul scriitor
sem rw = 1, mutexR = 1;
int nr = 0;
Conditii si semafoare
Pentru specificarea conditiilor se definesc
int nr = 0; /*nr cititori care folosesc resursa */
int nw = 0; /*nr scriitori care folosesc resursa */
int dr = 0; /*nr cititori intarziati */
int dw = 0; /*nr scriitori intarziati */