Professional Documents
Culture Documents
4 Zaglavljivanje
4 Zaglavljivanje
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.
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:
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.
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.
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.
n – broj procesa,
m – broj resursa.
Matrica dodeljeno dimenzije n×m definiše broj resursa svakog tipa koji je trenutno dodeljen svakom
procesu.
Matrica potrebno dimenzije n×m prikazuje preostale potrebe svakog procesa za resursima.
Iz prethodnih definicija može se zaključiti da matrica potrebno predstavlja razliku matrica max i dodeljeno.
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.).
radni = raspoloživo;
gotov[i] = 0, za i = 0, 1, …, n – 1;
sledeći_proces_u_sekvenci:
//resursima
idi na kraj;
ENDIF
gotov[i] = 1;
idi na sledeći_proces_u_sekvenci;
kraj:
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.
maksimalne zahteve;
ENDIF
ENDIF
ELSE
Pi će morati da sačeka zahtevane resurse iz zahtev[i] a sistem se vraća na
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.
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.
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.
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:
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.