Documente Academic
Documente Profesional
Documente Cultură
Sectiuni critice
Problema: fiecare proces P(i) al unei colectii de procese P(i:1..n) executa ciclic o sectiune
critica in care are acces exclusiv la anumite resurse partajate urmata de o sectiune
necritica in care foloseste doar resurse locale.
Se utilizeaza tipul special sem si primitivele P si V. Rolul lor este asigurarea excluderii
mutuale intre procesele care acceseaza sectiunea critica.
Producatori si consumatori
Problema: se considera mai multi producatori si mai multi consumatori care comunica
printr-un singur tampon partajat. Un producator pune o valoare in tampon, iar un
consumator ia o valoare din tampon.
Trebuie asigurat ca valorile nu sunt suprascrise si nu sunt citite din tampon de mai multe
ori.
var buf: T;
var gol: sem := 1; plin: sem := 0;
Producator (i: 1..M)::
var v: T;
do true ->
v := produce ();
P(gol);
buf := v;
V(plin)
od;
od;
Semafoarele gol si plin sunt binare si asigura excluderea mutuala. La un moment dat, un
singur proces (fie Producator, fie Consumator) depune sau extrage o valoare din buf.
Consumator::
var w: T;
var prim: int := 1;
do true ->
P(plin);
w := buf[prim]; prim := prim mod k + 1;
V(gol);
consuma (w);
od;
Semafoarele gol si plin sunt generale. Ele numara locurile goale din buf, respectiv
valorile depuse in buf. Procesul Producator acapareaza un loc gol (daca nu exista atunci
se blocheaza pana apare unul) si depune o valoare. Procesul Consumator acapareaza o
valoare depusa (daca nu exista atunci se blocheaza pana apare una) si preia valoarea din
buf. Operatiile de depunere si de extragere nu se exclud. Producator poate depune o
valoare in pozitia ultim din buf in timp ce Consumator preia una din pozitia prim din
buf.
od;
Problema filozofilor
Cinci filozofi stau in jurul unei mese rotunde si isi petrec timpul gandind si mancand. In
mijlocul mesei este o farfurie cu spaghete. Pentru a putea manca, un filozof are nevoie de
doua furculite. Pe masa sunt cinci furculite, fiecare situate intre doi filozofi vecini.
Regula este ca fiecare filozof poate folosi furculitele din imediata sa apropiere. Problema
este sa se scrie un program care simuleaza comportarea filozofilor. In particular, trebuie
evitata situatia in care nici un filozof nu poate acapara ambele furculite (de exemplu
furculita din stanga sa si nu ii mai da drumul).
Filozof (5)::
do true ->
P(f[1]); P(f[5]);
mananca;
V(f[1]); V(f[5]);
gandeste
od;
Daca toti filozofii ar lua mai intai furculita din stanga si apoi pe cea din dreapta se poate
ajunge la blocare definitiva prin asteptare circulara: fiecare asteapta o resursa pe care
procesul care a acaparat-o nu o elibereaza. Solutia ca sa se evite asteptarea circulara este
ca unul din filozofi sa procedeze altfel si anume sa ia mai intai furculita din dreapta si
apoi pe cea din stanga.
Problema: exista doua tipuri de procese, cititori si sciitori care impart o resursa. Mai multi
cititori pot avea acces simultanla resursa comuna daca nici un scriitor nu o modifica in
acelasi timp. Un scriitor poate modifica resursa daca ea nu este acesata de nici un cititor.
Algoritmul tine evidenta numarului de cititori nr care folosesc resursa. Solutia acorda
preferinta cititorilor: daca un cititor acapareaza resursa, alti cititori pot sa i se alature si sa
citeasca. Doar cand ultimul cititor a terminat, resursa este eliberata (V(rw)).
"Split binary semaphore": folosit pentru a implementa atat excluderea mutuala cat si
sincronizarea conditionata. Implementat astfel: