Sunteți pe pagina 1din 7

Curs 8 . (Sisteme de operare, Fiz.

-Info, anul III)

Situaţii de blocare (deadlocks) - modele, detecţie şi prevenire

În cazul unui sistem de operare multiprogramming, se poate întâmpla deseori ca să existe o


concurenţă între procese în ceea ce priveşte utilizarea unui număr finit de resurse. Aceste resurse pot fi
împărţite în două mari categorii:
 fizice – componentele hardware ale SC (procesor, memorie, hard disc, dispozitive periferice etc)
 logice – software, programe de aplicaţii, fişiere etc
Dacă un anumit proces solicită o resursă indisponibilă, acesta va intra într-o stare de aşteptare. Pe
de altă parte, dacă această resursă este folosită de un alt proces care se află şi el într-o stare de aşteptare,
apare fenomenul de interblocare (blocaj, impas) (deadlock). În această situaţie procesele rămân
blocate, menţinănd ocupate resursele sistemului şi împiedicând rularea altor procese.
O definiţie formală pentru blocare:
Un set de procese este într-o stare “deadlock” dacă fiecare proces din set
aşteaptă pentru un eveniment cauzat doar de un alt proces din acel set

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”)

Obs.:  de obicei, evenimentul pentru care se aşteaptă este eliberarea de resurse.


 numărul proceselor, împreună cu numărul şi tipul de resurse implicate nu prezintă importanţă.

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

Utilizarea unei anumite resurse presupune următoare secvenţă de evenimente:


1. Solicitare
2. Alocare
3. Folosire
4. Eliberare
Procesele pot să solicite, să folosească şi să elibereze resursa iar deciziile de alocare sunt realizate
de către sistemul de operare. Dacă resursa nu este disponibilă, atunci când este solicitată, procesul
solicitant este forţat să aştepte. În cadrul unor anumite SO, acest proces este automat blocat şi trezit
ulterior, când resursa e disponibilă. În alte SO, se generează un cod de eroare, procesul solicitant
trebuind să aştepte şi să încerce după aceea din nou.

Condiţii necesare pentru apariţia interblocării

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.

Fig.3. Exemplu de interblocare

Obs.: În cazul unor resurse multiple, existenţa unei bucle nu semnifică o stare de blocare.

În general, există patru abordări legate de stările de blocare:


1. Ignorarea blocării
2. Detectarea şi revenirea din starea de blocare
3. Prevenirea blocării – prin modificarea condiţiilor care pot conduce la această stare.
4. Evitarea dinamică a blocării – printr-o alocare corespunzătoare a resurselor

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.

2. Detectarea şi revenirea din starea de blocare


În acest caz este permisă apariţia blocării, sistemul de operare reacţionând în momentul în care ea
este descoperită. Acţiunile ce au loc după detectarea blocării (acţiuni de revenire) se fac în scopul
rezolvării problemei respective.

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 AB,
dintre cei doi vectori:
AB  AkBk, 1km

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.

Exemplu de utilizare a algoritmului de detecţie [1]:


Se consideră 3 procese şi 4 clase de resurse (discuri, plottere, scanere şi compact discuri (CD
ROM)), cu vectorul E de forma:

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
 

Rezultă un vector A de forma:


A= (2 1 0 0)

Fiecare proces solicită resurse adiţionale, matricea asociată fiind de forma:

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.

2c. Recuperarea din starea de blocare


Presupunând că algoritmul de detecţie a găsit o stare de blocaj, pot fi utilizate câteva metode de revenire
din această stare (de rezolvare a blocării):
 Preempţiune: obţinerea de resurse de la unele procese, folosite apoi pentru deblocarea altor procese
(operaţiunea se poate face şi forţat, dacă este cazul)
 Revenire: procesele sunt verificate periodic, în sensul că starea lor este reţinută într-un fişier, putând fi
restartată ulterior. Aceste informaţii conţin imaginea memoriei şi starea resurselor. Astfel, la apariţia
unei stări de blocare, resursele pot fi recuperate. Procesele care sunt blocate pot fi aduse la o stare
anterioară iar resursele asociate pot fi date altor procese.
 Eliminarea proceselor: este o soluţie de ultim moment, în care unul sau mai multe procese pot fi
eliminate, în ideea în care alte procese ar putea sa fie deblocate. Distrugerea trebuie realizată astfel încât
consecinţele asupra sistemului să fie minime.

3. Prevenirea stării de blocare


În cazul în care cel puţin una din cele patru condiţii de blocare nu sunt îndeplinite, starea de
blocare nu se mai produce. Astfel, pentru a preveni blocarea, trebuie atacate aceste condiţii.

 Atacarea condiţiei de excludere mutuală


- Resursele partajabile nu necesită acces mutual exclusiv – deci ele nu vor fi niciodată implicate într-o
interblocare. Un exemplu elocvent de astfel de resurse este dat de fişierele “read only” (pot fi accesate
numai pentru citire). Dacă mai multe procese încearcă în paralel să deschidă un astfel de fişier, li se
poate acorda accesul simultan.
Totuşi, pentru orice sistem de operare, trebuie ţinut cont de resursele nepartajabile ( care nu pot
fi folosite în comun) – pentru acest tip de resurse, condiţia de excludere mutuală este automat îndeplinită
(spre exemplu, imprimanta nu poate fi folosită simultan de către mai multe procese).
În general, nu este posibilă prevenirea blocării prin atacarea condiţiei de excludere mutuală.
Totuşi, aceasta poate fi atacată prin folosirea unor tehnici de tip “spooling”.
 Tehnica “spooling” presupune o separare a operaţiilor de intrare de cele de ieşire şi o executare în
paralel a acestora (reprezintă o modalitate eficientă de exploatare a sistemelor de calcul seriale)
( SPOOLing = Simultaneous Peripheral Operations OnLine )
Unele dispozitive (de exemplu imprimanta) utilizează această tehnică, prin care se poate preveni
blocajul.

 Atacarea condiţiei “hold and wait”


Dacă s-ar putea preveni aşteptarea unor resurse suplimentare pentru procesele ce deţin deja
anumite resurse, s-ar putea elimina blocajele. În acest sens, există două modalităţi de atacare:
1. Se poate impune ca, înainte de a-şi începe execuţia, procesele să solicite toate resursele de care au
nevoie.
În acest caz apare însă o primă problemă legată de faptul că majoritatea proceselor nu cunosc
dinainte câte resurse le-ar trebui. O a doua problemă este aceea că resursele nu pot fi utilizate optim
(multe din resurse pot fi alocate dar neutilizate o lungă perioadă de timp).
2. Se poate impune ca un proces care solicită noi resurse, să renunţe temporar la toate resursele pe
care le deţine, pentru ca ulterior să le obţină din nou, împreună cu noile resurse.

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.

 Atacarea condiţiei de imposibilitate a achiziţionării forţate


În cadrul acestei metode, pentru a putea preveni starea de blocare, ar trebui permisă
achiziţionarea forţată. Însă preluarea forţată a unei resurse nepartajabile nu se poate aplica, în general.

 Atacarea condiţiei de aşteptare circulară


O modalitate de eliminare a condiţiei de aşteptare circulară este limitarea resurselor. De
exemplu, un proces să deţină o singură resursă la un moment dat. Pentru a obţine o a doua resursă
trebuie mai întâi să o elibereze pe prima. Însă această impunere ar fi inacceptabilă în unele situaţii (de
exemplu, pentru un proces care trebuie să tipărească la imprimantă un fişier foarte mare).
O altă modalitate constă în ordonarea completă a tuturor tipurilor de resurse, asociind fiecărui
tip un număr întreg. Prin această numerotare, noile resurse pot fi obţinute în ordinea strictă a valorilor
asociate. Starea de blocare poate fi prevenită deoarece graful de alocare a resurselor nu conţine cicluri în
acest caz.
Totuşi, soluţia aceasta este greu de pus în aplicare deoarece este ar fi imposibil de jonglat cu
numerotarea pentru toate resursele unui sistem de operare.

4. Evitarea dinamică a blocării


În acest caz se folosesc aşa numiţii algoritmi de evitare, care folosesc conceptul de stare. La
orice moment de timp, această stare curentă este descrisă de vectorii E, A şi de matricile C şi R (conform
fig. 4).
O stare este sigură dacă nu este blocată, existând o secvenţă de alocare a resurselor ce permite
tuturor proceselor să poată fi încheiate [1]. Cu alte cuvinte, într-o stare sigură este garantată execuţia
tuturor proceselor. În caz contrar, se spune că starea respectivă este nesigură.

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ă.

S-ar putea să vă placă și