Documente Academic
Documente Profesional
Documente Cultură
Operaţii permise:
1) initial(s,s0)
2) wait(s) :
if s>0
then ss-1
else procesul curent este blocat
3) signal(s) :
if există procese blocate
then unul dintre ele este deblocat
else ss+1
Excluderea reciprocă
Pentru realizarea excluderii reciproce, vom plasa secţiunea critică apare între
"parantezele" wait şi signal:
wait(s);
SC
signal(s);
SNC
Semafoare în Java
class Semafor {
private int value = 0;
public Semafor(int initial) { value = initial; }
public synchronized void W() {
value--;
if (value < 0)
try { wait(); }
catch(InterruptedException e) { }
}
public synchronized void S() {
value++;
if (value <=0 ) notify();
}
}
Observaţii:
- constructorul clasei realizează, odată cu crearea unui obiect, şi iniţializarea
valorii value a semaforului;
- metodele W şi S corespund primitivelor wait şi signal descrise mai sus, ce
operează asupra semafoarelor;
- fie sem un semafor, deci un obiect de tipul Semafor. Atunci operaţiile
wait(sem) şi signal(sem) din modelul general propus de Dijkstra vor trebui
înlocuite respectiv prin sem.W() şi sem.S().
Schiţă de demonstraţie:
1) Există procese blocate dacă şi numai dacă valoarea lui value este negativă.
În acest caz, numărul proceselor blocate este -value;
2) prin notify() firul curent îşi continuă executarea. Firul trezit (dacă
există) devine gata de executare, dar datorită modificatorului synchronized nu
poate fi preluat de către un procesor decât când firul ce a executat notify()
părăseşte metoda sincronizată.
Jocul vieţii
Procesul Celula(i,j)
if a[i,j]=1
then k a[i,j+1]+a[i-1,j+1]+a[i-1,j]+a[i-1,j-1]+
a[i,j-1]+a[i+1,j-1]+a[i+1,j]+a[i+1,j+1];
wait(s); nr nr+1; signal(s);
wait(sem);
if a[i,j]=1
then if (k<2) or (k>4)
then a[i,j] 0
Procesul Control
while nr<m*n do ;
for i:=1 to m*n do
signal(sem)
Observaţii:
- sunt introduse doar două semafoare, indiferent de dimensiunile tabelului de celule;
- semaforul sem are în permanenţă valoarea 0 (joacă rolul unei bariere).
Procesul Cons
repeat
wait(ocupate);
wait(ExRec);
ia(ch); write('C',ch,' ');
signal(ExRec);
signal(libere)
until ch='z'
Filozoful Fi
repeat
filozoful i gândeşte
wait(AccesLiber);
wait(b[i]);
wait(b[(i mod nf)+1]);
wait(s); write('M',i:1,' '); signal(s);
filozoful i mănâncă
wait(s); write('G',i:1,' '); signal(s);
signal(b[i]);
signal(b[(i mod nf)+1]);
signal(AccesLiber)
until false
Este evident că mesajul de început al activităţii de a mânca trebuie inserat
imediat după ce se trece de semafoarele care controlează posibilitatea de a fi ridicate
beţişoarele din stânga şi dreapta filozofului.
Ceva mai puţin evident este că mesajul de început al activităţii de a gândi
trebuie inserat imediat înainte (şi nu după) semnalările repunerii beţişoarelor pe masă.
Dacă mutăm acest mesaj după operaţiile signal ce corespund repunerii beţişoarelor
pe masă, lucrurile se vor desfăşura correct din punctual de vedere al cerinţelor
problemei, dar incorrect din punctul de vedere al semalării acţiunilor. Astfel este
posibil să apară pe ecran secvenţa:
G4 G3 G1 G5 G2 M1 M2 G1 ...
deoarece mesajul "G1 " apare după ce filozoful 1 repune beţişoarele pe masă, între
timp filozoful 2 începând să mănânce.
Se consideră o carte la care au acces mai mulţi cititori şi mai mulţi scriitori.
Este permis ca mai mulţi cititori să aibă acces simultan la conţinutul cărţii, dar dacă un
scriitor operează asupra cărţii (completează, şterge, modifică etc.) atunci nici un alt
scriitor şi nici un alt cititor nu au acces la carte. Mai precis:
1) un cititor poate începe operaţia de citire dacă şi numai dacă nici un scriitor nu este
în curs de a scrie în carte;
2) un scriitor poate începe operaţia de scriere dacă şi numai dacă nici un cititor şi nici
un alt scriitor nu au acces la carte.
Procesele Cititori :
repeat
deschide(i,cit); preia informaţia dorită
inchide(i,cit); prelucrează informaţia citită
until false
Procesele Scriitori :
repeat
redactează un text nou; deschide(i,scr);
introdu textul in carte; inchide(i,scr);
until false
procedure deschide(i,caz)
if caz=citire
then wait(ExRec);
if nrcit=0 then wait(sem);
wait(s); write('C',i:1,'( '); signal(s);
nrcit++;
signal(ExRec);
else wait(sem);
wait(s); write('S',i:1,'( '); signal(s);
end
Proiecte