You are on page 1of 10

UVOD

Situacija u kojoj dva ili više međusobno zavisnih procesa blokirani čekaju na resurse koje nikada neće
dobiti naziva se zaglavljivanje (deadlock), odnosno uzajamno blokiranje, mrtvi čvor, mrtva brava i sl.
Ovakvo zaglavljivanje je trajno i za posledicu često ima zaglavljivanje čitavog sistema. Takođe, ako sistem
sadrži procese koji su zaglavljeni, smatra se da je i on zaglavljen. Slikoviti primeri zaglavljivanja mogu se
naći u svakodnevnom životu. Na primer, ukoliko četiri kolone automobila istovremeno sa četiri strane uđu
u raskrsnicu (slika 4.1.), pri tome poštujući pravilo desne strane, blokiraće jedni druge tako da će i ostali
učesnici u saobraćaju biti zaglavljeni.

Slika 4.1. Zaglavljivanje

Da bi došlo do zaglavljivanja, neophodno je da su u sistemu istovremeno ispunjena sledeća četiri uslova:

1. Uzajamno isključivanje (Mutual Exclusion) – podrazumeva da u jednom trenutku tačno jedan proces
može da koristi resurs, dok ostali moraju da sačekaju njegovo oslobađanje.
2. Čekanje i držanje (Wait and Hold) – dok proces drži resurse sa kojima radi, može da zahteva nove koji
su mu potrebni za dalje izvršavanje i da čeka one koji trenutno nisu raspoloživi.
3. Nemogućnost prekidanja (No Preemtion) – podrazumeva da operativni sistem nema pravo da oduzme
resurse koje je dodelio procesu i kasnije mu ih vrati, kako bi te resurse, u međuvremenu, dodelio
drugim procesima. Dakle, resurse može osloboditi samo proces koji ih je dobio na korišćenje.
4. Kružno čekanje (Currier wait) – podrazumeva da u sistemu može da postoji lanac procesa koji čekaju
jedni na druge, tj. na resurse koji su im dodeljeni, čineći pri tome krug (slika 4.5.). Dakle, svaki proces
drži resurse koji su mu dodeljeni i čeka na druge koje drži sledeći proces u nizu i tako do poslednjeg
koji zahteva resurse koje drži prvi proces.

Postoje razni pristupi kada je u pitanju odnos prema zaglavljivanju, ali se na osnovu mera koje se
primenjuju, mogu svrstati u sledeće četiri grupe:

• Sprečavanje (Deadlock prevention) – pristup koji podrazumeva sistemske mere koje se


implementiraju u operativni sistem i kojima se isključuje mogućnost zaglavljivanja.
• Izbegavanje (Deadlock avoidance) – dinamičke mere koje se preduzimaju kako bi se sistem
vodio kroz stanja koja obezbeđuju da ne dođe do zaglavljivanja. U odnosu na sprečavanje,
izbegavanje je liberalnija mera, ali se i ovim pristupom garantuje da do zaglavljivanja neće
doći.
• Detekcija i oporavljanje (Deadlock detection and recovery) – pristup koji dozvoljava da do
zaglavljivanja dođe, ali ima mehanizme za otkrivanje da li je do zaglavljivanja došlo, tretman
procesa koji su zaglavljeni i eventualno spašavanje dela rezultata koji su dobijeni pre
zaglavljivanja u slučajevima kada je to moguće.
4.1. MERE ZA SPREČAVANJE ZAGLAVLJIVANJA
Mere za sprečavanje zaglavljivanja su statičke, sistemske mere koje obično nisu algoritamski zahtevne, a za
cilj imaju da u startu definisanjem pravila za izvršavanje procesa, eliminišu bar jedan od uslova koji dovode
do zaglavljivanja. Najčešće su troškovi ovih algoritama mali, ali su zato ograničenja velika.

4.1.1. Prevencija čekanja i držanja


Glavna ideja za eliminisanje uslova čekanje i držanje je uvođenje ograničenja koje onemogućava da proces
drži neke resurse dok traži nove. Obično se koriste dva pristupa za rešavanje ovakvih problema.

Prvi pristup podrazumeva da pre nego što počne sa izvršavanjem, proces zahteva da mu se dodele svi
potrebni resursi i da u izvršavanje krene tek kada ih sve dobije. Loša strana ovakvog pristupa je to što za
vreme svog izvršavanja proces drži sve potrebne resurse i time onemogućava druge procese da ih koriste u
trenucima kada su njemu nepotrebni. Na primer, ako proces treba da pročita fajl sa fleš memorije, snimi ga
na disk, modifikuje i na kraju odštampa, ovakvim pristupom proces bi na početku zahtevao sve potrebne
resurse (fleš memorija, disk, štampač) i držao ih do kraja, tj. završetka štampanja. Štampač bi u tom slučaju
bio nedostupan ostalim procesima i u trenucima dok proces prenosi podatke ili dok se oni modifikuju.
Takođe, često na početku nije poznato koji će resursi biti potrebni procesu u toku izvršavanja, što dodatno
otežava upotrebu ovakvog algoritma.

Drugi pristup rešava problem prethodnog jer podrazumeva da proces traži resurse u trenucima kada su mu
potrebni, ali da pre svakog uzimanja novih resursa ima obavezu da one koje drži vrati operativnom sistemu
kako bi operativni sistem doneo odluku da li će ih ponovo dodeliti njemu ili ih ustupiti nekom drugom
procesu. Na ovaj način postiže se da proces ne drži nijedan resurs u trenutku kada traži nove. Kada je
prethodni primer u pitanju, proces bi prvo zatražio fleš memoriju i disk kako bi obavio transfer. Na kraju bi
oslobodio te resurse, pa zatražio štampač. Štampač bi tako sve do poslednje operacije procesa (štampanja)
bio na raspolaganju drugim procesima.

4.1.2. Eliminisanje nemogućnosti prekidanja


Mere kojima se uklanja uslov nemogućnost prekidanja se zasnivaju na ideji da se, u slučaju kada se potrebe
procesa ne mogu zadovoljiti, otpuštaju svi resursi koje je držao. Naime, kada proces drži neke resurse a
zahteva druge koji mu se ne mogu odmah dodeliti, on otpušta sve resurse koje drži i ustupa ih drugim
procesima na korišćenje. Pri tome, oduzeti resursi se dodaju na listu onih koje proces čeka. Proces će biti
ponovo pokrenut u trenutku kada povrati svoje stare resurse, ali i dobije nove koje je zahtevao. Jasno je da
ovakav pristup sigurno ne dovodi do zaglavljivanja, ali i da se vrlo lako može dogoditi da zahtevniji procesi
dugo čekaju da dođu u posed svih resursa koji su im potrebni.

4.1.3. Prevencija kružnog čekanja


Da do kružnog čekanja ne dođe, obično se koriste rešenja koja podrazumevaju označavanje, tj. enumeraciju
tipova (klasa) resursa. Ideja je da se svakom resursu dodeli jedan broj, a da proces koji drži određene
resurse može da zahteva samo one resurse kojima je dodeljen veći broj od brojeva njegovih resursa. Na
primer, neka je R = {R1, …, Rn} skup svih resursa u sistemu. Svakom resursu se dodeljuje jedan ceo broj F(Ri)
= k. Ako je Ri resurs sa najvećim brojem koji drži dati proces, u svom daljem izvršavanju taj proces može
zahtevati samo resurse Rj takve da je F(Rj) > F(Ri). Pri tome, proces resurse nižeg ranga (manje vrednosti
dodeljenog broja) može zahtevati u trenutku kada otpusti sve resurse višeg ranga.
4.2. MERE IZBEGAVANJA
Za razliku od mera sprečavanja, koje u startu eliminišu neki od neophodnih uslova da do zaglavljivanja
dođe, mere izbegavanja su dinamičke mere koje se preduzimaju u određenim momentima u zavisnosti od
stanja u sistemu. Iz tog razloga troškovi algoritma su obično veći nego kada su mere sprečavanja u pitanju,
ali se sa druge strane povećava efikasnost sistema jer se resursi koriste optimalnije.

4.2.1. Bankarev algoritam


Postoje različiti pristupi za izbegavanje zaglavljivanja. Jedan veoma efikasan, a pri tome i ne previše
komplikovan, je Bankarev algoritam. Ime je dobio po principu davanja zajmova u bankama. Naime,
korisnici traže od banke kredite kako bi mogli da realizuju svoje projekte. Banka ima ograničene resurse, a
korisnici znaju kolika je maksimalna količina novca koja im je potrebna. Vremenom, korisnici traže
određenu količinu novca (kredite), a banke procenjuju da li će im i u kojem trenutku izaći u susret. Novac
banci mogu vratiti samo korisnici koji su uspeli da završe svoje projekte tako što su prethodno od banke
dobili (kroz jedan ili više kredita) maksimalnu prijavljenu količinu novca. Vraćeni novac je onda, uz novac
koji je ostao u banci, na raspolaganju svim ostalim korisnicima koji nisu završili svoje projekte. Međutim,
ukoliko banka ne napravi dobru procenu može se dogoditi da ostane bez novca i da zbog toga neki od
korisnika ne budu u mogućnosti da završe svoj projekat. Ta situacija je analogna zaglavljivanju pri radu sa
procesima.

U skladu sa prethodnim, Bankarev algoritam podrazumeva da je pre početka izvršavanja svakog od procesa
poznat maksimalni broj resursa svakog tipa koji će mu biti potreban. Ideja je da se dinamički ispituje
pokušaj dodele resursa kako bi se obezbedilo da nikada ne dođe do kružnog čekanja. Stanje dodele resursa
je definisano brojem raspoloživih, dodeljenih resursa i maksimalnim zahtevima procesa. Smatra se da je
stanje sistema bezbedno ako sistem može u određenom redosledu da dodeljuje resurse kako bi svaki
proces mogao da završi sa radom, tj. da ne dođe do zaglavljivanja, a da se pri tome svi procesi izvrše.
Redosled kojim se vrši ovakva dodela resursa procesima naziva se bezbedna sekvenca.

Slika 4.2. Bezbedno i nebezbedno zaglavljivanje

Definicija: Sekvenca procesa <P1 , P2 , …, Pn> je bezbedna za tekuće stanje dodele resursa akko se potrebe
svakog procesa Pi mogu zadovoljiti slobodnim resursima i resursima koje trenutno drže procesi Pj (j < i).

Ako potrebni resursi za proces Pi nisu odmah dostupni, tada proces Pi mora da sačeka dok se svi Pj (j < i) ne
izvrše. Kada procesi Pj (j < i) završe sa radom, Pi dobija potrebne resurse, izvrši se, a zatim vrati sve resurse
koje je koristio. Kada završi proces Pi tada Pi+1 može da dobije potrebne resurse i tako dalje.
Definicija: Sistem je u bezbednom stanju akko postoji bezbedna sekvenca.

Važno je napomenuti da, ako stanje nije bezbedno, to ne znači da će sigurno doći do zaglavljivanja, već da
postoji mogućnost da do njega dođe (slika 4.2.).

Osnovna ideja Bankarevog algoritma je da se resursi procesima dodeljuju tako da se sistem sprovodi kroz
niz bezbednih stanja kako bi se izbegla mogućnost da dođe do zaglavljivanja. Kao što je već napomenuto,
banke vode računa da novac rasporede tako da zadovolje potrebe što većeg broja svojih klijenata. One će se
truditi da kreditiraju perspektivne klijente i ne bi trebalo da dopuste da se novac dodeli jednom ili grupi
klijenata, a da pri tome ne ostane sredstava za ostale. Analogno, kada je Bankarev algoritam u pitanju, pri
dodeli resursa vodi se računa o tome da sistem uvek bude u bezbednom stanju, odnosno, po zahtevu
procesa za dobijanje resursa vrši se provera da li postoji mehanizam kojim će se novododeljeni zajam
kasnije (kada proces kojem je dodeljen završi svoj rad) vratiti i biti na raspolaganju drugim procesima.

Za prikaz ovog algoritma potrebno je definisati sledeće promenljive:

n – broj procesa,

m – broj resursa.

Niz raspoloživo dužine m ukazuje na broj raspoloživih resursa određenog tipa.

raspoloživo[j] = k, označava da ima k raspoloživih instanci resursa Rj.

Matrica max dimenzije n×m definiše maksimalne zahteve svakog procesa.

max[i,j] = l – proces Pi zahteva najviše l instanci resursa Rj.

Matrica dodeljeno dimenzije n×m definiše broj resursa svakog tipa koji je trenutno dodeljen svakom
procesu.

dodeljeno[i,j] = h – proces Pi je trenutno u posedu h instanci Rj.

Matrica potrebno dimenzije n×m prikazuje preostale potrebe svakog procesa za resursima.

potrebno[i,j] = s – procesu Pi je potrebno s instanci resursa Rj.

Iz prethodnih definicija može se zaključiti da matrica potrebno predstavlja razliku matrica max i dodeljeno.

potrebno[i,j] = max[i,j] – dodeljeno[i,j].

Da bi se jednostavnije objasnili neki od algoritama, promenljive dodeljeno[i] i potrebno[i] označavaju nizove


dužine m koji predstavljaju sve dodeljene i potrebne resurse za proces i. Drugim rečima, ovi nizovi su, u
stvari, vrste odgovarajućih matrica.

Potrebno je definisati i nejednakost dva niza iste dimenzije. Tako je niz A „manji ili jednak“ od niza B ako
svaki njegov element ima manju ili bar jednaku vrednost od vrednosti odgovarajućeg elementa niza B:

.
Sa ovako definisanim promenljivama može se ilustrovati algoritam kojim se proverava da li je sistem u
bezbednom stanju (algoritam 4.1.).

Neka su radni i gotov nizovi dužine m i n.

Algoritam 4.1. Provera stanja


//Inicijalizacija

radni = raspoloživo;

gotov[i] = 0, za i = 0, 1, …, n – 1;

sledeći_proces_u_sekvenci:

//Provera da li postoji proces koji može biti zadovoljen raspoloživim

//resursima

IF (ne postoji i takvo da je gotov[i] == 0 i potrebno[i] £ radni)

idi na kraj;

ENDIF

//Pronalazi se proces koji može biti zadovoljen raspoloživim resursima

Odaberi prvo i takvo da je gotov[i] == 0 i potrebno[i] £ radni;

//Radnom skupu se dodaju resursi procesa koji ima mogućnost da se izvrši

radni = radni + dodeljeno[i];

gotov[i] = 1;

idi na sledeći_proces_u_sekvenci;

kraj:

//Ako su svi procesi imali mogućnost sa se izvrše – stanje je bezbedno

IF (gotov[i] == 1 za svako i)

bezbedno_stanje = true;

ELSE

bezbedno_stanje = false;

ENDIF
Niz radni se inicijalizuje tako da bude jednak nizu raspoloživih resursa u prvom trenutku izvršavanja. Ovaj
niz predstavlja niz resursa koji su na raspolaganju procesima. Niz gotov, koji nosi informaciju o tome da li i-
ti proces ima uslova da se izvrši sa raspoloživim resursima, inicijalizuje se na nulu. U koraku
sledeći_proces_u_sekvenci se traži proces koji nije imao uslove da se izvrši (gotov[i] == 0), a u trenutnom
radnom nizu postoje raspoloživi resursi koji su mu potrebni da bi se izvršio. Ako takav proces postoji, u
sledećem koraku se niz radni proširuje sa resursima koje je i-ti proces držao jer se pretpostavlja da on
može da završi sa radom i oslobodi dodeljene i svoje resurse. U tom slučaju se vrednost gotov[i] postavlja
na 1 i ponovo, sada sa većim radnim nizom, traži proces koji može biti zadovoljen. Ako u koraku kraj ne
postoji proces koji zadovoljava postavljene uslove, to znači da je algoritam završio sa radom i da treba
proveriti da li je sistem u bezbednom stanju ili ne. Ukoliko se prolazom kroz niz gotov utvrdi da su svi
procesi imali uslove da dobiju potrebne resurse, iskoriste ih i vrate, onda je sistem u bezbednom stanju. U
suprotnom sledi da nije pronađena bezbedna sekvenca i da zbog toga sistem nije u bezbednom stanju.

Kada sistem dobije zahtev za resursima od nekog procesa, on pokreće Bankarev algoritam kako bi doneo
odluku da li će dodeliti resurse procesu, odložiti ili odbiti zahtev. Neka je zahtev[i] niz zahteva procesa Pi u
nekom trenutku. Prema Bankarevom algoritmu, kada proces izvrši zahtev za resursima, preduzimaju se
koraci opisani u algoritmu 4.2.

Algoritam 4.2. Dodela resursa


//Provera da li su zahtevi u skladu sa najavljenim pre početka izvršavanja

IF (potrebno[i] < zahtev[i])

Došlo je do greške jer proces prevazilazi svoje prethodno definisane

maksimalne zahteve;

ENDIF

IF (raspoloživo < zahtev[i])

Resursi nisu raspoloživi pa će Pi morati da sačeka;

ENDIF

//Sistem pokušava da dodeli tražene resurse procesu Pi modifikujući

//stanje na sledeći način:

raspoloživo = raspoloživo – zahtev[i];

dodeljeno[i] = dodeljeno[i] + zahtev[i];

potrebno[i] = potrebno[i] – zahtev[i];

IF (provera stanja sistema je bezbedna)

transakcija je završena, a proces Pi je dobio svoje resurse;

ELSE
Pi će morati da sačeka zahtevane resurse iz zahtev[i] a sistem se vraća na

staro stanje dodele resursa;

ENDIF
4.3. DETEKCIJA ZAGLAVLJIVANJA
Detekcija zaglavljivanja je koncept koji ne garantuje da do zaglavljivanja neće doći, već dopušta da do njega
dođe, a onda se primenjuju mere da se takva situacija otkloni. Otkrivanje da je do zaglavljivanja došlo može
biti aktivno i pasivno. Aktivno otkrivanje je pristup u kojem se podrazumeva da se, korišćenjem algoritama
za detekciju, proverava da li je došlo do zaglavljivanja. Učestalost provere zavisi od frekvencije
zaglavljivanja i može varirati na različitim sistemima. Pasivan pristup podrazumeva da se provera vrši u
situacijama kada se registruje da u sistemu nema aktivnosti ili da nešto nije u redu.

Stanje sistema se može modelovati korišćenjem grafova. Čvorovi ovakvih grafova su procesi (koji se obično
predstavljaju krugovima) i resursi (predstavljeni pravougaonicima). Resursi sa više instanci se
predstavljaju sa više tačaka u pravougaoniku. Grane grafova su u stvari oznake da li neki proces drži neki
resurs što se označava strelicom od resursa ka procesu dok strelica od procesa ka resursu označava da neki
proces zahteva taj resurs, ali ga trenutno ne drži. Na slici 4.3. prikazana je situacija u sistemu sa dva procesa
i jednim resursom. Proces P1 zahteva resurs R1, dok proces P2 drži resurs R1.

Slika 4.3. Primer stanja resursa i procesa u sistemu

Detekcija zaglavljivanja kod sistema u kojem svi resursi imaju po jednu instancu se svodi na pronalaženje
ciklusa u grafu. Graf koji se posmatra nastaje kada se iz grafa koji opisuje stanje sistema uklone resursi, a
grane povežu procese koji čekaju jedni na druge. Grana povezuje dva procesa ako jedan čeka na resurse
drugog da bi se izvršio. Ukoliko u grafu postoji ciklus, to znači da postoji zaglavljivanje. Na slici 4.4. prikazan
je primer stanja sistema a na slici 4.5. odgovarajući graf za detekciju zaglavljivanja.

Slika 4.4. Stanje sistema


Slika 4.5. Detekcija ciklusa i zaglavljivanja

Kada su sistemi gde resursi mogu imati više instanci u pitanju, ciklus u grafu ne povlači obavezno da je
došlo do zaglavljivanja.

4.3.1. Oporavak od zaglavljivanja


Kada se utvrdi da je došlo do zaglavljivanja, sistem bi trebalo da interveniše i pomogne da se ovakva
situacija prevaziđe. Najjednostavnija akcija koju operativni sistem može da uradi je da suspenduje
blokirane procese, oduzme im resurse a odluku o njihovoj sudbini prepusti korisnicima. U praksi se više
koriste potpuno automatizovane operacije kod kojih se ne očekuju intervencije korisnika. Najčešće se
koriste dva pristupa, od kojih jedan podrazumeva prekidanje jednog ili više zaglavljenih procesa, a drugi
oduzimanje resursa zaglavljenim procesima.

Algoritam za oporavak prekidanjem procesa, koji se prvi nameće, podrazumeva da se uklone svi blokirani
procesi. Ovo rešenje je veoma neefikasno jer se takvim postupkom gube rezultati do kojih su procesi došli
dok se nisu zaglavili. Malo zahtevniji algoritam podrazumeva da se uklanja jedan po jedan od procesa u nadi
da će se sistem izvesti iz zaglavljenog stanja. U tom slučaju, u svakom koraku, treba odabrati proces koji
treba ukloniti. Ovo obično nije lak zadatak. Pri odabiru procesa, koji će biti prekinut, operativni sistem
može uzimati neke od sledećih kriterijuma:

• Prioritet procesa – trebalo bi prvo prekinuti procese nižeg prioriteta.


• Koliko se dugo proces izvršava i koliko ima do završetka – ideja je da se prekidaju procesi koji su
najkasnije počeli da se izvršavaju, a da se prekidanje onih koji su pri kraju (ako je to moguće
odrediti) odlaže do poslednjeg trenutka.
• Koje resurse proces koristi i koji su mu potrebni da završi sa radom – teži se da se prekidaju procesi
koji su veliki potrošači resursa ili procesi koji drže resurse koji su potrebni mnogim drugim
procesima.

Pristup koji podrazumeva oduzimanje resursa se zasniva na ideji da se određenim procesima oduzmu
resursi kako bi se uz pomoć tih resursa otklonilo zaglavljivanje. Pri tome bi trebalo da se vodi računa o
tome da se takvi procesi ostave u stanju koje je pogodno da kasnije mogu nastaviti sa radom. Trivijalno,
proces se može vratiti na početak, ali je korisnije pronaći tačku u izvršavanju od koje on može nastaviti
kada se steknu uslovi i pri tome sačuvati rezultate izvršavanja pre oduzimanja resursa. U ovakvim
situacijama trebalo bi voditi računa i o tome da se istom procesu ne oduzimaju resursi više puta, već da se
poštuje neka vrsta pravednosti. Iako to nije očigledno, ponekad oduzimanje resursa procesu koji nije
zaglavljen može dovesti do oslobađanja resursa koji mogu omogućiti da se sistem ne zaglavi.

You might also like