Documente Academic
Documente Profesional
Documente Cultură
====================================
I. Planificare
~~~~~~~~~~~~~~
In cadrul mutiprogramarii, mai multe procese pot concura simultan pentru
controlul unui procesor. Alegerea procesului care va rula in continuare
este facuta de o componenta a SO numita PLANIFICATOR (SCHEDULER), pe baza
unui ALGORITM DE PLANIFICARE (SCHEDULING ALGORITHM).
Multe dintre problemele planificarii proceselor apar si la thread-uri.
Tratam pentru inceput planificarea proceselor.
I.1. Introducere in problema planificarii:
-----------------------------------------La sistemele de prelucrare pe loturi, cu intrari sub forma imaginilor de
cartele stocate pe benzi magnetice, algoritmul de planificare era simplu:
se executa urmatoarea operatie de pe banda.
Odata cu sistemele cu divizarea timpului (timesharing systems), algoritmul
de planificare a devenit mai complex, deoarece in general erau mai multi
utilizatori care asteptau un serviciu. Anumite calculatoare mari inca mai
combina prelucrarea pe loturi cu divizarea timpului, cerand planificatorului
sa decida daca controlul revine unui lot de operatii sau unui utilizator de
la un terminal (un lot de operatii ar putea fi o cerere de a executa
succesiv mai multe programe, dar in cele ce urmeaza vom presupune ca este
o cerere de a executa un singur program). Pe aceste masini tipul de alocare
a procesorului este o resursa limitata, deci performanta planificatorului
este importanta.
Odata cu aparitia calculatoarelor personale numarul de procese concurente
a devenit mai mic (de multe ori era unul singur), deci planificatorul nu
avea prea multe de facut, iar calculatoarele au devenit mai rapide, a.i.
capacitatea procesorului nu mai era o resursa limitata. In plus, daca
doua procese ruleaza simultan (de ex. un procesor de texte si un program
de calcul tabelar) conteaza mai putin care se executa primul, deoarece
utilizatorul probabil asteapta sa se termine ambele.
In cazul statiior de lucru si serverelor de retea de nivel inalt avem din
nou multe procese in competitie pentru procesor, a.i. planificarea este din
nou importanta. De ex. daca sistemul are de ales intre un proces ce
redeseneaza ecranul dupa ce utilizatorul a inchis o fereastra si un proces
care trimite posta electronica din coada de asteptare, planificarea este
importanta pentru felul in care este perceput raspunsul - daca inchiderea
ferestrei ar fi intarziata 2 sec. pana se trimite posta, utilizatorul ar
considera sistemul lent, pe cand intarzierea postei cu 2 sec. nu ar fi
perceptibila.
Pe langa alegerea corecta a procesului ce trebuie executat, comutarea
intre procese este costisitoare - prea multe comutari de proces pe secunda
pot consuma mult timp procesor.
Comportamentul proceselor
------------------------In general procesele alterneaza intre calcule in rafala si cereri de
operatii de I/O. Se considera I/O in sens propriu acele situatii cand
procesul se blocheaza asteptand ca un dispozitiv extern sa-si termine
sarcina.
4
4
4
8
------------------------| B | C | D | A
|
------------------------executarea sarcinilor in
ordinea "shortest job first"
-------------------------------------------------Este unul dintre cei mai vechi, simpli, si des folositi algoritmi; nu exista
risc de infometare.
Algoritm: procesele sunt puse intr-o coada (sau o lista parcursa circular);
primului proces i se aloca o CUANTA de timp in care i se permite sa ruleze;
daca procesul este inca in executie la sfarsitul cuantei, sau daca se
blocheaza din diferite motive, planificatorul il trece la sfarsitul cozii
si comuta la procesul urmator; procesele sunt manevrate fara prioritati.
Parametrul prin care pot fi ajustate performantele planificarii este
lungimea cuantei:
- o cuanta prea mica poate cauza prea multe comutari de proces, micsorand
eficienta procesorului; de ex. daca comutarea de proces dureaza 1 msec iar
lungimea cuantei este 4 msec, 20 % din timpul UCP este consumat pe sarcini
administrative, ceea ce e prea mult;
- o cuanta prea mare poate cauza timpi de raspuns prea mari pentru cereri
interactive scurte; de ex. daca intr-un sistem cu divizarea timpului cuanta
este de 100 msec si 10 utilizatori tasteaza Enter aprox. in acelasi timp
lansand cate o comanda, in lista vor fi adaugate 10 procese, care vor fi
pornite la interval de 100 msec (presupunand ca fiecare isi foloseste in
intregime cuanta); atunci ultimul utilizator ar putea astepta 1 sec pana sa
inceapa sa i se execute comanda, percepand un asemenea timp de raspuns
pentru o comanda scurta drept incetineala;
- daca cuanta este mai mare decat rafala medie de utilizare a procesorului,
comutarea fortata a proceselor se va intampla rar, obtinandu-se astfel o
imbunatatire a performantei, deoarece comutarile vor avea loc doar atunci
cand sunt logic necesare (cand un proces se blocheaza si nu mai poate
continua).
Planificarea bazata pe prioritati (Priority Scheduling):
-------------------------------------------------------Algoritm: fiecare proces primeste o prioritate, iar cel cu prioritatea
cea mai mare va fi rulat primul; pentru a evita situatia cand procesele
cu prioritate mare ruleaza prea mult nepermitand accesul la procesor al
altor procese, planificatorul poate scadea continuu (la fiecare intrerupere
de ceas) prioritatea procesului curent, iar cand aceasta scade sub cea a
urmatorului in ierarhie, se va comuta pe noul proces.
Prioritatile se pot atribui proceselor:
- static (la crearea lor), de ex. in functie de categoria din care face
parte utilizatorul care le-a lansat (la o universitate: decan, profesor,
student), in functie de pretul platit de beneficiar (la un centru de
calcul: prioritate mare = 100 $ ora, medie = 75 $ ora, mica = 50 $ ora);
in UNIX/Linux exista comanda "nice" cu care un utilizator poate sa-si
lanseze comanda cu o prioritate micsorata; mai exact, prioritatea este
data de un numar 0-39, care cu cat este mai mic prioritatea este mai mare;
prioritatea implicita este 20; prin comanda "nice -nr comanda" se va lansa
comanda "comanda" cu prioritatea 20+nr (doar utilizatorul "root" poate
folosi un nr<0);
- dinamic, de catre sistem, pentru a indeplini anumite scopuri; de ex. cand
un proces limitat de I/O doreste procesorul, ar trebui sa i se aloce
imediat, intrucat va trece repede la urmatoarea cerere de I/O, care apoi
se poate desfasura in paralel cu alte procese care efectueaza calcule (a
face procesul orientat I/O sa astepte mult timp procesorul ar insemna ca
el sa ocupe memorie inutil pe o perioada lunga de timp); un algoritm simplu
pentru a deservi eficient procesele orientate I/O consta in a folosi o
prioritate 1/f, unde f este fractiunea din cuanta de timp pe care procesul
void process_B(void){
down(&resource1);
down(&resource2);
use_both_resources();
up(&resource2);
up(&resource1);
}
use_both_resources();
up(&resource2);
up(&resource1);
}
void process_B(void){
down(&resource2);
down(&resource1);
use_both_resources();
up(&resource1);
up(&resource2);
}
B
cerere S
cerere T
eliberare S
C
cerere T
cerere R
eliberare T
eliberare S
eliberare T
eliberare R
A
B
C
A
B
C
cere
cere
cere
cere
cere
cere
R
S
T
S
T
R (cu interblocare)
(A)
^
|
|
|
[R]
(B) (C)
^
|
|
|
[S] [T]
2
(C)
^
|
|
|
[T]
(A)
^
|
|
|
[R]
(B)
^
|
|
|
[S]
(C)
^
|
|
|
[T]
3
(A) (B) (C)
^| ^| ^|
|'-.|'-.|'-.
| || || |
| V| V| |
[R] [S] [T] |
^
|
'----------'
6
A
C
A
C
A
A
cere R
cere T
cere S
cere R
elibereaza R
elibereaza S
(A) (B)
^^
||
|'--.
| |
[R] [S]
(C)
^
|
|
|
[T]
3
(A) (B) (C)
^^
|'-.
|'--. | |
| | | |
[R] [S] [T] |
^
|
'----------'
4
'--. | |
| | |
[R] [S] [T] |
|
|
'----------'
5
| |
| |
[R] [S] [T] |
|
|
'----------'
6
acum, dupa pasul 6, poate fi rulat B obtinand S, deoarece A s-a terminat iar
C are toate resursele necesare; chiar daca B s-ar bloca apoi cerand T, nu ar
aparea interblocare ci B doar va astepta pana cand C se termina.
In general, sunt folosite patru strategii pentru a lua masuri impotriva
interblocarilor:
1. Ignorarea in totalitate a problemei; poate ca daca o ignori, si ea te va
ignora.
2. Detectarea si restaurarea (detection and recovery): interblocarile sunt
lasate sa apara, iar cand apar sunt detectate si se iau masuri.
3. Evitarea dinamica (dynamic avoidance), printr-o alocare cu atentie a
resurselor.
4. Prevenirea (prevention), prin negarea uneia din cele patru conditii
necesare pentru aparitia interblocarii.
Vom examina fiecare din aceste strategii in urmatoarele patru sectiuni:
2.3 Algoritmul strutului (The Ostrich Algorithm):
------------------------------------------------Metoda: ingnorare (asemeni strutului care isi baga capul in nisip si
pretinde ca nu exista nici o problema).
Eliminarea interblocarilor se face in general cu costuri mari in ceea ce
priveste performanta sau restrictii suplimentare asupra proceselor, asa ca
uneori este de preferat ignorarea problemei decat rezolvarea ei cu un pret
prea mare - de exemplu daca intr-un sistem interblocarile apar in medie
odata la 5 ani, dar sistemul cade saptamanal din cauza defectarii hardului,
erorilor de compilator si erorilor de programare din SO, inginerii nu vor
fi dispusi sa elimine interblocarile cu pretul unei scaderi mari a
performantei.
Se impune deci un echilibru intre ce e convenabil si ceea ce este corect.
Majoritatea SO, inclusiv UNIX, Linux, Windows, ignora anumite interblocari
potentiale care exista in ele si pe care le lasa sa duca la caderea
sistemului; acestea pot fi legate de anumite tabele ale sistemului folosite
la gestiunea unor anumite tipuri de entitati si care au un numar fixat de
intrari, fiind posibil sa rezulte blocaje daca se umplu.
Exemplu din UNIX/Linux:
tabela de procese are un numar fixat de intrari; daca este plina, apelul
"fork()" efectuat de un proces pentru a crea un proces copil va esua;
in cazul unui asemenea esec, o abordare inteleapta ar fi ca procesul sa
astepte o vreme si apoi sa incerce din nou; daca insa tabela are 100 de
intrari si 10 procese care ruleaza doresc sa creeza cate 12 copii, dupa
ce fiecare va efectuat 9 "fork()" tabela de procese este plina si toate
cele 10 procese initiale vor cicla la infinit tot incercand sa efectueze
"fork()"; acesta este un caz mai degraba de livelock;
probleme similare apar atunci cand se umple tabela de i-noduri a discului
(cu care se gestioneaza fisierele, fiecare primind cate un i-nod), sau
spatiul folosit pentru interschimbarea paginilor in memorie (swap space),
ambele fiind resurse limitate.
A
B
C
D
E
F
G
detine R si cere S
nu detine resurse, dar cere T
nu detine resurse, dar cere S
detine U si cere S si T
detine T si cere V
detine W si cere S
detine V si cere U
4. Daca mai exista arce nemarcate care pornesc din nodul curent, executa
pasul 5, altfel executa pasul 6.
5. Alege la intamplare un arc nemarcat care pleaca din nodul curent si
marcheaza-l; apoi, mergand pe acel arc, ia urmatorul nod ca nod curent si
reia de la pasul 3.
6. Scoate nodul din lista; daca este nodul initial, reia de la pasul 2 cu
urmatorul nod N din graf; daca nu este nodul initial, revino la nodul
anterior din lista, i.e. cel care a fost curent imediat inaintea acestuia,
considera-l ca nod curent si reia de la pasul 4.
7. Aici se ajunge daca pasul 1 a fost incheiat (deci pasii 2-6 au fost
efectuati pentru fiecare nod N din graf) si nu s-a gasit nici un ciclu;
atunci graful nu contine cicluri si algoritmul se termina.
Obs: de fapt, algoritmul ia fiecare nod si parcurge in adancime
(depth-first) presupusul arbore cu radacina in el, iar daca in felul
acesta revine la un nod deja intalnit, graful are ciclu; parcurgerea
se face prin backtracking.
Aplicam algoritmul grafului din exemplul de mai sus, alegand sa procesam
nodurile in ordine de la stanga la dreapta si de sus in jos (ordinea nu
conteaza), adica: R, A, B, C, S, D, T, E, F, U, V, W, G; vom evidentia
valoarea lui N, continutul lui L si arcele marcate (pe verticala):
|R|A|B|C|D|D|T|E|F|U|V|W|G
N
L
|A|S|T|S|S|T|E|V|S|D|G|F|U
------------------------------------------------------R
[]
| | | | | | | | | | | | |
[R]
| | | | | | | | | | | | |
[RA]
|x| | | | | | | | | | | |
[RAS]
|x|x| | | | | | | | | | |
[RA]
|x|x| | | | | | | | | | |
[R]
|x|x| | | | | | | | | | |
------------------------------------------------------A
[]
| | | | | | | | | | | | |
[A]
| | | | | | | | | | | | |
[AS]
| |x| | | | | | | | | | |
[A]
| | | | | | | | | | | | |
------------------------------------------------------B
[]
| | | | | | | | | | | | |
[B]
| | | | | | | | | | | | |
[BT]
| | |x| | | | | | | | | |
[BTE]
| | |x| | | |x| | | | | |
[BTEV]
| | |x| | | |x|x| | | | |
[BTEVG]
| | |x| | | |x|x| | |x| |
[BTEVGU]
| | |x| | | |x|x| | |x| |x
[BTEVGUD]
| | |x| | | |x|x| |x|x| |x
[BTEVGUDT]
| | |x| | |x|x|x| |x|x| |x
==> ciclu: TEVGUDT
Detectarea interblocarii cu mai multe resurse din fiecare tip:
-------------------------------------------------------------Fie n procese P1, ..., Pn si m clase de resurse.
Fie E1, ..., Em vectorul de resurse existente (existing resource vector);
el spune ca pentru fiecare 1<=i<=m exista in sistem Ei resurse de clasa i
(altfel formulat: Ei instante ale clasei de resurse i).
Fie A1, ..., Am vectorul de resurse disponibile (available resource vector);
el spune ca in prezent pentru fiecare 1<=i<=m sunt disponibile Ai resurse
de clasa i.
Fie matricea (Cij)1<=i<=n,1<=j<=m matricea de alocare curenta (current
allocation matrix); ea spune ca in prezent pentru fiecare i,j, procesul
Pi detine Cij resurse de clasa j.
Fie matricea (Rij)1<=i<=n,1<=j<=m matricea de cereri (request matrix); ea
spune ca pentru fiecare i,j, procesul Pi cere Cij resurse de clasa j
(in plus fata de cele pe care deja le detine).
Exista un invariant important al acestor patru structuri de date - anume
fiecare resursa este fie alocata fie disponibila; cu alte cuvinte, in
orice moment avem:
n
pentru orice 1<=j<=m, (suma Cij) + Aj = Ej.
i=1
Definim comparatia a doi vectori cu m elemente pointwise, adica X <= Y d.d.
pentru orice 1<=j<=m, Xj<=Yj.
Algoritm de detectare a interblocarii (algoritmul lui E. G. Coffman, 1971):
- initial fiecare proces este nemarcat; pe masura ce algoritmul progreseaza,
procesele vor fi marcate indicand faptul ca isi pot termina treaba si deci
nu se afla in interblocare; orice proces nemarcat dupa terminarea
algoritmului se afla in interblocare;
- se efectueaza pasii:
1. Cauta un proces nemarcat Pi, pentru care randul i din R este mai mic
sau egal cu A (ca vector).
2. Daca este gasit un asemenea proces, aduna randul i din C la A,
marcheaza procesul si reia de la pasul 1.
3. Daca nu exista un asemenea proces, algoritmul se termina.
Obs: La pasul 1 se cauta un proces care poate fi rulat pana la terminare
(el este caracterizat prin faptul ca cererile lui pot fi satisfacute cu
resursele disponibile in prezent); procesul respectiv va rula pana se va
termina, moment in care va elibera resursele detinute, care vor deveni din
nou disponibile; procesul va fi apoi marcat ca terminat (pasul 2).
Repetand pasii 1-2 obtinem o ordine in care putem rula procesele fara
interblocare; daca toate pot fi cuprinse in aceasta ordine, nici unul nu
se afla in interblocare; daca raman procese ce nu pot rula niciodata, ele
se afla in interblocare.
Desi algoritmul este nedeterminist, putand alege intre mai multe ordini
de rulare, rezultatul final este acelasi.
/0 0 1 0\
/2 0 0 1\
Exemplu: E=(4,2,3,1), A=(2,1,0,0), C= |2 0 0 1|, R=|1 0 1 0| (3 procese)
\0 1 2 0/
\2 1 0 0/
alegere
A
-------------------------3
(2,2,2,0)
2
(4,2,2,1)
1
(4,2,3,1)
==> sistemul nu contine nici o interblocare;
/2 0 0 1\
Varianta: R=|2 1 0 1| ==> interblocare.
\2 1 0 0/
deci:
A detine 3 resurse si
in final de 9;
B detine 2 resurse si
in final de 4;
C detine 2 resurse si
in final de 7;
in total sunt alocate
d m
------------| A | 3 | 9 |
------------| B | 4 | 4 |
------------| C | 2 | 7 |
------------libere: 1
(b)
d m
------------| A | 3 | 9 |
------------| B | 0 | - |
------------| C | 2 | 7 |
------------libere: 5
(c)
d m
------------| A | 3 | 9 |
------------| B | 0 | - |
------------| C | 7 | 7 |
------------libere: 0
(d)
d m
------------| A | 3 | 9 |
------------| B | 0 | - |
------------| C | 0 | - |
------------libere: 7
(e)
d m
------------| A | 4 | 9 |
------------| B | 4 | 4 |
------------| C | 2 | 7 |
------------libere: 0
(g)
d m
------------| A | 4 | 9 |
------------| B | 0 | - |
------------| C | 2 | 7 |
------------libere: 4
(h)
indiferent cum vor fi formulate, chiar si in cazul cel mai defavorabil cand
fiecare isi va cere toate resursele ramase deodata; daca nu, starea este
nesigura, chiar daca nu este o interblocare (nu avem garantia ca
interblocarea se poate evita); altfel spus, starea este nesigura d.d. in
cazul cel mai defavorabil este o interblocare.
2. Punctele din interiorul regiunii delimitata de instructiunile I1,I2,I5,I6
in diagrama de mai devreme reprezentau zone nesigure intr-un sens mai tare:
indiferent cum vor fi formulate cererile ulterioare ale proceselor (nu
numai in cazul cel mai defavorabil) se ajunge la interblocare;
Algoritmul bancherului pentru o singura resursa:
-----------------------------------------------Un algoritm ce poate evita interblocarile ii apartine lui Dijkstra (1965);
el s.n. ALGORITMUL BANCHERULUI (BANKER'S ALGORITHM) si este o extensie a
algoritmului de detectarea a interblocarii prezentat mai devreme.
Algoritmul verifica daca acceptarea unei cereri duce la o stare nesigura;
daca da, este respinsa (amanata), daca nu, este indeplinita.
Situatia seamana cu cea a unui bancher care a deschis linii de credit unui
grup de clienti, fiecare primind un numar de unitati de credit si putand
veni din cand in cand sa faca imprumuturi in limita numarului lor de
unitati, iar bancherul fiind constient ca nu toti au nevoie imediat de
creditul lor maxim a rezervat un numar mai mic de unitati disponibile;
atunci, daca un client vine la un moment dat si mai cere un imprumut
(in limita numarului sau de unitati), bancherul trebuie sa verifice daca
acordandu-i imprumutul, cu unitatile disponibile ramase banca poate
functiona indiferent ce alte cereri vin ulterior; daca nu, cererea este
respinsa.
Exemplu: fie procesele A - D, 10 unitati de resursa disponibile si starile:
d m
------------| A | 0 | 6 |
------------| B | 0 | 5 |
------------| C | 0 | 4 |
------------| D | 0 | 7 |
------------libere: 10
(a)
d m
------------| A | 1 | 6 |
------------| B | 1 | 5 |
------------| C | 2 | 4 |
------------| D | 4 | 7 |
------------libere: 2
(b)
d m
------------| A | 1 | 6 |
------------| B | 2 | 5 |
------------| C | 2 | 4 |
------------| D | 4 | 7 |
------------libere: 1
(c)
--------------------| A | 1 | 1 | 0 | 0 | E = (6, 3, 4, 2)
--------------------- A = (5, 3, 2, 2)
| B | 0 | 1 | 1 | 2 | P = (1, 0, 2, 0)
--------------------| C | 3 | 1 | 0 | 0 |
--------------------| D | 0 | 0 | 1 | 0 |
--------------------| E | 2 | 1 | 1 | 0 |
--------------------R (resurse de care mai este nevoie)
found = TRUE;
}
}
if (! found) return FAIL;
}
return OK;
In practica, algoritmul bancherului nu este foarte util, deoarece este greu
ca sistemul sa cunoasca in avans necesarul maxim de resurse ale unui proces;
de asemenea, numarul de procese nu este fix, variaza dinamic (de ex. pe
masura ce noi utilizatori se conecteaza/deconecteaza), iar unele resurse pot
disparea brusc (unitatile de banda se pot defecta).
2.6 Prevenirea interblocarii:
----------------------------Am vazut ca evitarea interblocarii este aproape imposibila, pentru ca
necesita informatii despre cereri viitoare, care in general nu sunt
cunoscute. Atunci putem incerca sa prevenim interblocarea asigurand ca cel
putin una din cele 4 conditii ale lui Coffman nu este indeplinita niciodata.
Combaterea conditiei de excludere mutuala:
-----------------------------------------Daca nici o resursa nu poate fi alocata exclusiv unui singur proces, nu
vom avea niciodata interblocari. Pentru resursele care in mod nativ trebuie
alocate exclusiv, se pot crea resurse logice intermediare, care pot fi
alocate neexclusiv, si un proces care coreleaza resursa intermediara cu
cea initiala.
De exemplu pentru imprimanta se creaza o coada de asteptare (spooling), in
care mai multe procese pot genera date simultan, iar singurul proces care
cere efectiv impromanta este procesul care gestioneaza tiparirea (printer
daemon in UNIX/Linux); deoarece acest proces nu cere alte resurse, astfel
se elimina interblocarea pentru imprimanta.
Limitari:
- nu toate dispozitivele pot face spooling - de ex. tabela de procese;
- competitia pentru spatiul de pe disc pentru spooling poate duce ea la
interblocare; de ex. doua procese umplu fiecare cate 1/2 din spatiu si
nici unul n-a terminat de produs datele de iesire; atunci, daca procesul
ce gestioneaza imprimanta a inceput deja tiparirea, imprimanta va
ramane nefolosita asteptand ca procesul ale carui prime date au fost
printate sa furnizeze si restul datelor (de aceea, procesul care
gestioneaza imprimanta este facut a.i. sa tipareasca doar atunci cand
sunt disponibile toate datele de iesire); oricum, avem o interblocare
pe disc;
Idee frecvent aplicata: evitati alocarea unei resurse atunci cand nu este
absolut necesara si incercati sa va asigurati ca vor exista cat mai
putine procese care ar putea cere resursa.
Combaterea conditiei de detinere si asteptare:
---------------------------------------------Daca am putea impiedica procesele care detin resurse sa mai astepte
preluarea altor resurse, am putea preveni interblocarea. Este o strategie
mai promitatoare.
Metode:
- impunem proceselor sa isi ceara toate resursele de la inceputul executiei;
daca sunt disponibile, procesul isi va aloca tot ce ii trebuie si va putea
rula pana se va termina; daca nu sunt disponibile toate resursele, procesul
nu va aloca nimic ci doar va astepta;
in acest sens, unele sisteme mari de prelucrare pe loturi (mainframe
batch systems) cer utilizatorului sa listeze toate resursele pe prima linie
a fiecarei lucrari (job);
limitari:
* multe procese nu stiu cate resurse vor avea nevoie inainte de a incepe
sa ruleze (de fapt, daca ar fi stiut, am fi putut aplica algoritmul
bancherului);
* resursele nu vor fi folosite in mod optim; de ex. daca un proces citeste
date de pe o banda, le analizeaza o ora, apoi scrie rezultatul atat pe
banda cat si la imprimanta, va bloca si banda si imprimanta o ora;
- impunem fiecarui proces care cere o resursa sa elibereze temporar toate
resursele pe care le detine; apoi va incearca sa ia dintr-o data tot ce are
nevoie.
Combaterea conditiei de lipsa a preemptiei:
------------------------------------------Este mai putin promitatoare decat combaterea conditiei 2. Daca unui proces
i s-a alocat imprimanta si este in timpul printarii, luarea fortata de la el
a imprimantei pentru ca un plotter cerut nu este disponibil ar fi derutanta
in cel mai bun caz si imposibila in cazul cel mai rau.
Combaterea conditiei de asteptare circulara:
-------------------------------------------Modalitati de combatere:
- impunem regula ca orice proces sa aibe dreptul la o singura resursa la
un moment dat; daca are nevoie de o a doua, trebuie sa o elibereze pe
prima;
limitari: de ex. daca un proces are nevoie sa scoata la imprimanta un
fisier urias de pe banda magnetica, restrictia este inacceptabila (el
trebuie sa detina si banda si imprimanta);
- realizarea unei numerotari globale a resurselor si impunerea regulii ca
procesele pot cere oricate resurse vor, dar cererile trebuie facute in
ordinea numerelor - de ex. un proces poate cere intai o imprimanta si
apoi o banda, dar nu intai o banda si apoi o imprimanta;
intr-adevar, procesul ce detine resursa cu numarul cel mai mare nu va
cere o resursa deja alocata - cel mult va cere resurse cu numere si mai
mari, care sunt disponibile; in final el se va termina si va elibera
resursele detinute; atunci un alt proces va detine resursa cu numarul cel
mai mare, etc.; deci exista un scenariu in care toate procesele se
termina, deci nu poate aparea interblocarea;
- varianta a modalitatii anterioare: renuntam la cerinta ca resursele sa fie
obtinute intr-o secventa strict crescatoare si impunem doar ca nici un
proces sa nu ceara o resursa cu un numar mai mic decat ceea ce detine deja;
astfel, daca un proces cere initial 9 si 10 si apoi le elibereaza pe
ambele, este ca si cand ar incepe din nou, asa ca nu este nici un motiv ca
sa i se interzica de acum cererea resursei 1;
limitari: resursele pot fi atat de multe si diverse (intrari in tabela de
procese, spatiul de pe disc alocat pentru spooling, inregistrari din baze
de date, etc) ar putea fi imposibila alegerea unei ordini care sa satisfaca
pe toata lumea.
Sintetizam principalele abordari ale prevenirii interblocarii:
Conditie
Abordare
-----------------------------------------------------------Excludere mutuala
Spooling pentru toate resursele
Detine si asteapta
Cererea initiala a tuturor resurselor
Fara preemptie
Luarea fortata a resurselor
Asteptare circulara
Ordonarea numerica a resurselor
2.7 Alte probleme legate de interblocari:
----------------------------------------Blocarea in doua faze (Two-Phase Locking):
-----------------------------------------Evitarea sau prevenirea interblocarii nu sunt promitatoare in general, dar
pentru aplicatii specifice exista algoritmi buni.
Blocarea in doua faze: in prima faza procesul incearca sa blocheze pe rand
accesul la toate resursele de care are nevoie; daca reuseste, trece la faza
a doua, cand acceseaza resursele si apoi deblocheaza accesul; daca in
timpul primei faze intalneste o resursa deja blocata, deblocheaza toate
resursele si reia de la faza 1.
Abordarea seamana cu cererea in avans a tuturor resurselor necesare, sau
cel putin inainte de a se realiza ceva ireversibil.
Se aplica de ex. pentru actualizarea inregistrarilor din baze de date
(resursele sunt inregistrarile).
Limitari: strategia nu este aplicabila in general, de ex:
- in sistemele de timp real nu este acceptabila intreruperea si reluarea
doar pentru ca o resursa nu este disponibila;
- daca procesul a citit/scris mesaje in retea, a actalizat fisiere, in
general daca a facut ceva ce nu poate fi reluat in siguranta, atunci
nu este acceptabila reluarea.
Metoda se aplica doar cand programatorul are lucrurile aranjate atent, a.i.
programul sa poata fi oprit in orice punct al primei faze si reluat (nota
personala: sa nu fi facut operatii irepetabile intre punctele primei faze).
Interblocari care nu implica resurse:
------------------------------------Exemplu: doua procese sunt interblocate (de ex. prin semafoare), fiecare
asteptand ca celalalt sa faca o prelucrare - a se vedea problemele de
sincronizare din cursul 6.
Infometare (starvation, resource starvation):
--------------------------------------------Uneori politica ce stabileste cine sa ia o resursa si cand, desi este
rezonabila, poate conduce la ramanerea in asteptare pe termen nelimitat a
unor procese, care nu vor fi niciodata luate in considerare, desi nu se afla
in inteblocare.
Exemplu: algoritmul de alocare a imprimantei poate alege sa ca ea sa fie
data procesului cu fisierul cel mai mic de tiparit (presupunand ca
informatia este disponibila); atunci vor fi deserviti eficient clientii cu
fisiere mici; dar daca un proces are un fisier mare insa exista un flux
constant de procese cu fisiere mici, imprimanta nu ii va fi alocata
niciodata procesului cu fisierul mare (infometare).