Documente Academic
Documente Profesional
Documente Cultură
Cu alte cuvinte, fiecare membru al setului aşteaptă pentru o resursă ce poate fi eliberată numai de un
proces blocat. Astfel, niciun proces nu poate rula, nu poate elibera resurse, intrând într-o stare de
aşteptare din care nu mai pot ieşi (nu mai pot fi “trezite”)
Din punct de vedere al blocajului, resursele pot fi clasificate în două mai categorii:
- resurse partajabile (preemptable resources)
- resurse nepartajabile (nonpreemptable resources)
Resursele partajabile pot fi preluate de la posesorul acestora fără efecte secundare. Deci ele pot fi
utilizate în comun de mai mulţi utilizatori. Un exemplu de astfel de resursă este memoria. Potenţialele
stări de blocare care implică această categorie de resurse pot fi rezolvate prin realocarea acestor resurse
de la un proces la altul.
În schimb, resursele nepartajabile nu pot fi utilizate în acelaşi timp de mai multe procese. Ele nu pot fi
luate de la posesor fără a produce efecte secundare. Un exemplu din această categorie este imprimanta
(mai mulţi utilizatori nu pot să tipărească în acelaşi timp la imprimantă).
Resursele nepartajabile sunt cele care conduc la blocaje propriu-zise. Astfel, în cele ce
urmează, stările de interblocări vor fi asociate cu acest gen de resurse.
În fig. 1 este ilustrat un exemplu din realitatea înconjurătoare şi anume un blocaj în trafic. În acest caz
procesele sunt automobilele iar resursele sunt date de spaţiile pe care acestea le ocupă.
Considerăm un alt exemplu, în care două procese P1 şi P2 vor să tipărească un fişier de pe disc.
- P1 a obţinut permisiunea de tipărire şi va elibera această resursă după tipărirea unui fişier
- P2 a obţinut permisiuea de accesare a discului, eliberând resursa după citirea unui fişier
- P1 încearcă să obţină permisiunea de accesare a discului dar e nevoit să aştepte ca P 2 să elibereze această resursă
- P2 încearcă să obţină şi el permisiunea de tipărire dar e nevoit să aştepte ca P1 să elibereze resursa respectivă
Aceasta este o stare de blocare deoarece fiecare proces aşteaptă după o resursă ce poate fi
eliberată de celălalt proces, care este însă blocat.
1
Fig. 1. Exemplu de blocaj al maşinilor în trafic
Cofman şi alţii (1971) au identificat patru condiţii necesare care, îndeplinite simultan, duc la
apariţia fenomenului de interblocare. Aceste condiţii sunt:
1. Excluderea mutuală. Existenţa excluderii mutuale presupune că un proces a obţinut resursa şi există
o coadă de aşteptare a altor procese la aceeaşi resursă.
2. Ocupare şi aşteptare (hold and wait). Există cel puţin un proces care a obţinut resursa dar care
aşteaptă şi alte resurse suplimentare care, la rândul lor, sunt utilizate de alte procese.
3. Imposibilitatea achiziţionării forţate. Un proces nu poate achiziţiona forţat o resursă aferentă altui
proces decât după eliberarea resursei de către acel proces.
4. Aşteptare circulară. Există un şir de procese P1, P2, …,Pn, toate în aşteptare, în aşa fel încât P1
aşteaptă eliberarea resursei de către P2, P2 aşteaptă eliberarea resursei de către P3, …….,Pn aşteaptă
eliberarea resursei de către P1.
Pentru a avea loc un blocaj trebuie să fie îndeplinite simultan toate cele patru condiţii. Astfel, dacă una
din ele este absentă, nu are loc niciun blocaj.
Modelarea interblocărilor
În anul 1972, Hold a arătat că cele patru condiţii menţionate mai sus pot fi modelate folosindu-se
grafuri orientate. Aceste grafuri conţin două tipuri de noduri:
- procesele Pj (indicate prin cercuri)
- resursele Ri (indicate prin pătrate)
Arcele grafului sunt de două tipuri (fig.2):
- arce “cerere” – orientate de la un nod process la un nod resursă – semnifică faptul că procesul Pj
a solicitat resursa Ri şi aşteaptă achiziţionarea acesteia (procesul este blocat, în aşteptarea
resursei);
- arce “alocare” – orientate de la un nod resursă la un nod proces – semnifică faptul că resursa Ri a
fost alocată procesului Pj.
2
Fig.2. Tipuri de arce orientate. (a) arc cerere;
(b) arc alocare
În fig. 3 este ilustrată o situaţie de interblocare, folosind aceste grafuri orientate. În acest caz,
resursele sunt simple, fiind alcătuite dintr-un singur element. În graful din această figură se poate
observa că proceselor P1 şi P2 le sunt alocate resursele R1 şi respectiv R2. Totodată, P1 a solicitat resursa
R2 (deţinută de P2) iar P2 a solicitat resursa R1 (deţinută de R1). Acesta este un exemplu de blocare, în
care ambele procese vor aştepta pentru totdeauna. Existenţa unei bucle în graf, în cazul unor resurse
simple indică o situaţie de blocare.
Obs.: În cazul unor resurse multiple, existenţa unei bucle nu semnifică o stare de blocare.
1. Ignorarea blocării
(algoritmul struţului – “bagă-ţi capul în nisip şi prefă-te că nu s-a întâmplat nimic)
Algoritmul struţului se bazează pe o ignorare totală a blocajelor, în speranţa că “nu se va
întâmpla nimic rău”. Abordarea de acest gen este folosită cînd probabilitatea de apariţie a blocajelor este
mică (mult mai mică decât cea de apariţie a unor altor fenomene mai grave). Majoritatea sistemelelor de
operare, incluzând Unix şi Windows, utilizează această abordare, făcînd practic un compromis între
comoditate şi corectitudine.
2a. Detectarea în cazul în care se utilizează o singură resursă din fiecare tip
Acesta este cel mai simplu caz, în care o stare de blocare poate fi indicată folosind grafurile
orientate (fig.2). Dacă în graf există unul sau mai multe cicluri atunci există o stare de blocaj. Orice
proces care face parte din ciclul respectiv este blocat. În cazul în care nu există cicluri, sistemul nu este
în stare de blocaj.
3
Pentru detectarea unor astfel de cicluri în grafurile orientate sunt folosiţi diverşi algoritmi
de căutare. Vom indica în continuare un astfel de algoritm [1], care inspectează graful respectiv şi se
încheie fie când a fost detectat un ciclu fie când, în urma căutărilor, nu a fost găsit nici unul.
Acest algoritm presupune următorii paşi [1]:
1. Pentru fiecare nod N al grafului, se execută următorii cinci paşi, cu nodul N - nod de start.
2. Se iniţializează o listă de noduri (L) cu lista vidă. Toate arcurile sunt nemarcate.
3. Se adaugă nodul curent în lista L. Dacă acest nod apare de două ori în listă, graful conţine un ciclu. În
acest caz algoritmul se opreşte (STOP)
4. Dintr-un nod dat, se verifică dacă există arce nemarcate care pleacă din acel nod. Dacă da, se continuă
cu pasul 5, altfel se continuă cu pasul 6.
5. Se alege oricare arc nemarcat şi se marchează. Nodul în care intră acel arc devine nod curent. Se
continuă apoi cu pasul 3.
6. Se elimina nodul din listă şi se merge la nodul precedent (acesta devine noul nod curent). Daca este
nodul initial, STOP. Dacă nu, se merge la pasul 3.
2b. Detectarea în cazul utilizării mai multor resurse din fiecare tip
În această situaţie se presupune că există copii multiple ale unor resurse. Algoritmul de căutare
este unul matriceal, care detectează blocajul de-a lungul a n procese Pi (i=1, ...,n). Resursele sunt grupate
în m clase notate cu Ej (1 j m) (cele de acelaşi tip aparţinând aceleiaşi clase).
Resursele existente sunt grupate împreună, într-un vector E (fig.4). La un moment dat, unele
resurse vor fi disponibile iar altele nu (sunt alocate altor procese). Vom nota cu A vectorul asociat
resurselor disponibile (fig.4) – acesta conţine clasele Aj, care dau numărul de copii pentru resursa j, care
este disponibilă.
Utilizarea algoritmului presupune definirea a două matrici (fig.4):
- matricea de alocare curentă, C
- matricea cu solicitările proceselor, R
E ( E1 , E2 ,..., Em ) ; A ( A1 , A2 ,..., Am )
(resurse existente) (resurse disponibile)
C11 C12 C13 ... C1m R11 R12 R13 ... R1m
C C22 C23 ... C2 m R R22 R23 ... R2m
C 21 (1) ; R 21 (2)
... ... ... ... ... ... ... ... ... ...
Cn1 Cn 2 Cn 3 ... Cnm Rn1 Rn 2 Rn3 ... Rnm
Fig. 4. Cele patru structuri de date, necesare pentru algoritmul de detectare a blocajelor
Obs.:
O anumită linie din matricea C corespunde alocării curente pentru un anumit proces. De exemplu,
linia 2 corespunde alocărilor curente pentru procesul P2;
O anumită linie din matricea R corespunde solicitărilor unui anumit proces. De exemplu, linia 2 este
asociată cu solicitarea procesului P2.
Algoritmul de detecţie se bazează pe compararea între vectori. În cazul în care fiecare element
dintr-un vector A este mai mic sau egal decât elementul corespunzător din B, putem defini relaţia AB,
dintre cei doi vectori:
AB AkBk, 1km
4
Îniţial, fiecare proces se spune că este nemarcat. Pe măsură ce algoritmul respectiv avansează,
marcarea proceselor simbolizează faptul că ele nu sunt blocate. Astfel, la încheierea algoritmului,
procesele nemarcate vor fi cele blocate. Paşii corespunzători sunt următorii:
1. Se caută un proces nemarcat, Pi, astfel încât elementele din linia sa asociată (linia i) în matricea R
să fie mai mici sau egale decât elementele corespunzătoare ale vectorului A (se pot satisface
solicitările de alocare ale procesului)
2. Dacă un asemenea proces există, se adaugă linia i din matricea C la vectorul A, se marchează
procesul respectiv şi se trece la pasul 1.
3. Dacă un asemenea proces nu există, algoritmul se încheie.
Procesul P1 are alocată o singură resursă: un scaner, procesul P 2 are alocate 2 discuri şi un CD
ROM iar procesul P3 are alocate un plotter şi 2 scanere. Astfel, matricea C de alocare curentă va avea
trei linii (asociate celor 3 procese existente) şi 4 coloane (asociate celor 4 clase de resurse):
0 0 1 0
C 2 0 0 1
0 1 2 0
2 0 0 1
R 1 0 1 0
2 1 0 0
Pentru rularea algoritmului de detecţie, ne uităm după un proces a cărui solicitare poate fi
satisfăcută. Prima nu poate fi îndeplinită deoarece nu mai sunt CD ROM-uri disponibile. Nici a doua nu
poate fi satisfăcută, nemaifiind scanere disponibile. A treia solicitare este îndeplinită astfel că
procesul P3 rulează, returnând apoi toate resursele sale, astfel încât vectorul cu resurse disponibile va
fi:
A= (2 2 2 0)
În această fază, procesul P2 poate rula deoarece cele 2 scanere vor fi acum disponibile. După aceea, el va
returna resursele sale iar vectorul A va fi:
A= (4 2 2 1)
5
Singurul proces rămas poate rula şi el acum – astfel, nu există situaţii de blocaj în sistem.
Dacă presupunem că procesul P2 ar avea alocat (în afară de cele 2 discuri şi un CD ROM) şi un plotter.
În acest caz, solicitarea procesului P3 (care are nevoie şi de un plotter) n-ar mai putea fi îndeplinită.
Astfel, niciuna din cereri nu poate fi satisfăcută, sistemul intrând în stare de blocare.
6
Un mare dezavantaj în acest caz: procesul care solicită mai multe resurse publice poate fi nevoit
sa aştepte la infinit, timp în care cel puţin una dintre resursele solicitate e alocată permanent altor
procese.
Obs.: Existând o anumită ordine de planificare a proceselor, este posibil ca o stare sigură să conducă
la una nesigură.
Ideea de bază în jurul căreia se construiesc algoritmii destinaţi evitării apariţiei blocajelor este
necesitatea ca în urma oricărei operaţii de alocare a resurselor, sistemul să rămână întotdeauna într-o
stare sigură. Deoarece iniţial sistemul se afla într-o astfel de stare, ori de câte ori unul dintre procese
formulează cerere pentru resursă disponibilă, sistemul trebuie să hotărască dacă resursa va fi alocată
imediat sau dacă procesul trebuie să aştepte, cererea fiind satisfăcută numai în cazul în care prin alocarea
resursei sistemul rămâne într-o stare sigură.