Sunteți pe pagina 1din 43

Cursul 6:

Programe
concurente si
sincronizarea
acestora
Cursul 4: Recapitulare
Thread un singur flux secvential de
executie
Cursul 4: Recapitulare (Cont.)
Responsivitate ex: browser-web, word
processor, etc

Partajarea resurselor ex: optimizare IPC

Economie ex: in Solaris crearea unui thread


de 30 de ori mai rapida, schimbarea contextului
pentru un thread de 5 ori mai rapida

Scalabilitate ex: utilizarea arhitecturilor cu


procesoare multiple
Thread-uri Kernel si User in
Solaris
Cursul 6: Sincronizarea
proceselor
Executie concurenta a proceselor
Semantica intercalarilor
Problemele programarii concurente
Excluziunea mutuala si posibile solutii
pentru problema excluziunii mutuale
Executia concurenta a proceselor
Despre executia concurenta
Folosirea avantajul unitatilor de procesare
multiple (sau multi-nucleu)
Terminologie:
Multiprocesarea: folosirea mai multor unitati
de procesare intr-un sistem
Executie paralela: procesele se executa in
acelasi timp
Despre executia concurenta
Chiar si in cazul sistemelor care folosesc o singura unitate
de procesare, se poate crea iluzia rularii mai multor
programe in acelasi timp
SO comuta intre diferite task-uri
Terminologie:
Intercalarea: mai multe task-uri sunt active, doar unul ruleaza
Multitasking: SO ruleaza executii intercalate
Concurenta: multiprocessing, multitasking, sau orice alta
combinatie
Programe concurente
Un program este denumit concurent daca in
momentul rularii porneste un proces cu
thread-uri multiple
Programe concurente
Programe concurente
Conditii de cursa
Atunci cand procesele/thread-urile sunt
independente, concurenta este facila
De multe ori se intampla ca thread-urile sa
interfere. Ex: atunci cand se acceseaza sau se
modifica variabile sau obiecte comune
In situatia in care rezultatul unei executii
concurente este dependent de intercalarea
nedeterminista atunci avem de-a face cu o
conditie de cursa - race condition sau data race
Acest gen de erori/situatii pot fi ascunse pentru o
perioada mare de timp si sunt greu de depistat
prin testare
Instructiuni atomice
O instructiune este atomica, daca executia ei nu
poate fi intercalata cu alte instructiuni inainte de a
se finaliza
Putem alege nivele diferite de atomicitate. Spre
exemplu, urmatoarea instructiune
x := x + 1
pe o serie de sisteme este executata in felul urmator:
temp := x -- LOAD R0, x
temp := temp + 1 -- ADD R0, 1
x := temp -- STORE R0, x
Conventie: in notarea folosita mai departe, fiecare
linie numerotata poate fi executata atomic
Instructiuni atomice
Pentru a reflecta ultima interpretare data
atomicitatii, programul concurent este rescris
astfel:

Una dintre urmatoarele posivile secvente de executie:


Semantica intercalarii
Concurenta reala vs. semantica
intercalarii
Pentru a descrie comportamentul
concurent, avem nevoie de un model:
Semantica concurentei reale: se face
presupunerea ca exista comportamente
paralele concrete
Semantica intercalarilor: se face presupunerea
ca toate comportamentele paralele pot fi
reprezentate de un set al tuturor intercalarilor
nedeterministe a structurilor atomice
Semantica intercalarii
Semantica intercalarilor ofera un model
pentru programele concurente si poate
descrie in particular:
Multitasking: Intercalarea este realizata de
planificator
Multiprocessing: Intercalarea este realizata de
catre hardware
Luand in calcul toate intercalarile posibile,
putem fi siguri ca un program ruleaza
corect in toate scenariile existente
Dezavantaje: Numarul de intercalari
posibile creste exponential cu numarul de
procese concurente
Exemple: Sisteme cu tranzitie
de stari
Sisteme cu tranzitie de stari
Se numeste sistem cu tranzitie de stari, un
model formal care permite reprezentarea
calculelor concurente
Consta in stari si tranzitiile dintre ele
O stare este etichetata cu propozitii
atomice:
P22 (contorul program al programului P2 refera
la instructiunea 2)
x = 6 (valoarea variabilei x este 6)
Exista o tranzitie intre doua stari, daca o
stare poate comuta catre o alta stare prin
intermediul unei instructiuni atomice
Problemele programelor concurente
Sincronizarea
Pentru a rezolva problema generata de data
races procesele trebuie sa se sincronizeze
Sincronizarea presupune ca procesele
comunica intre ele pentru a decide o serie de
actiuni
In exemplul de mai devreme, putem cadea de
acord ca doar un proces poate sa foloseasca
resursele la un moment dat (folosire
exclusiva).
Cum pot comunica procesele?
Memorie partajata: procesele comunica citind si
scriind pe portiunile partajate ale memoriei
Schimb de mesaje: procesele comunica trimitand
mesaje intre ele
Problema blocajului (deadlock)
Retinerea resurselor in mod exclusiv este
necesara pentru a permite sincronizarea
proceselor in accesul la resurse
Din pacate, de aici se nasc alte probleme
Un blocaj este situatia in care un grup de
procese se blocheaza pentru ca fiecare
proces asteapta resursele care sunt retinute
de un alt proces din grupul de procese
Un exeplu sugestiv pentru blocaj este
problema filozofilor la cina.
Problema filozofilor la cina
n filozofi sunt asezati in jurul
unei mese iar intre 2 filozofi
exista o singura furculita.
Un filozof poate sa intreprinda
doua actiuni: sa manance si sa
gandeasca.
Pentru a manca, un filozof va
ridica ambele furculite din jurul
sau si astfel cei 2 filozofi vecini
nu voi putea manca in acelasi
timp.
Problema trebuie rezolvata cu
un algoritm care poate sa
asigure urmatoarele proprietati:
Fiecare furculita este tinuta de
catre un singur filozof la un
moment dat
Filozofii nu intra intr-un blocaj
Problema filozofilor: incercarea de
solutionare 1
Fiecare filozof ridica intai furculita din stanga,
apoi pe cea din dreapta, apoi fiecare incepe sa
manance; dupa ce termina de mancat, filozofii
pun jos furculita din mana stanga, apoi pe cea
din mana dreapta
Filozofii pot intra intr-un blocaj
Conditiile Coffman
Exista un numar de conditii necesare pentru ca
un blocaj sa apara
1. Excluziunea mutuala: procesele detin cotrol
exclusiv asupra resurselor pe care le cer
2. Blocare resurse si asteptare (hold & wait):
procese care deja detin resurse, pot solicita resurse
noi
3. Lipsa preemptie: resursele nu pot fi eliberate
fortat de la un proces care detine acele resurse la
un moment dat
4. Asteptare circulara: doua sau mai multe procese
formeaza un lant circular in care fiecare procese
asteapta o resursa detinuta de un alt proces din
acel lant
Pentru a evita un blocaj de obicei se incearca
evitarea unuia dintre punctele de mai sus
Problema filozofilor: incercarea de
solutionare 2
Fiecare filozof ridica in acelasi timp si furculita
stanga si pe cea dreapta apoi mananca; dupa
ce termina de mancat, filozoful pune inapoi
ambele furculite
Unii filozofi ar putea sa fie infometati
Infometarea
Chiar daca nu apare un blocaj, se poate ca
unele procese sa nu fie tratate corect
Situatia in care proceselor li se interzice sa
aiba acces la resurse pentru o perioada
indelungata (sau infinita) se numeste
infometare
Excluziunea mutuala si posibile solutii
Excluziunea mutuala
Conditiile de cursa pot sa corupa rezultatele
unor calcule concurente daca procesele nu sunt
sincronizate corect
Este necesara definirea unor tehnici care sa
permita excluziunea mutuala
Excluziunea mutuala: o modalitate de
sincronizare potrivita pentru a partaja simultan
aceleasi resurse intre mai multe procese
Pentru a identifica partile care necesita atentie,
s-a introdus notiunea de sectiune critica
Sectiune critica: parte dintr-un program care
acceseaza/foloseste resurse partajate
Excluziunea mutuala
Presupunem ca avem n procese de felul urmator:

Este necesara crearea protocoalelor de intrare-iesire


pentru a asigura:
Excluziunea mutuala: In orice moment, cel mult un
proces poate fi in sectiunea critica
Lipsa blocajelor: Daca doua sau mai multe procese
incearca sa intre in sectiunea critica, cel putin unul
dintre ele va reusi
Lipsa infometarii: Daca un proces incearca sa intre in
sectiunea critica, intr-un final va reusi
Excluziunea mutuala
Alte conditii importante:
Procesele pot comunica intre ele doar prin
intermediul unor operatii atomice de citire si scriere
Daca un proces intra in sectiunea critica, va reusi intr-
un final sa iasa din aceasta sectiune
Un proces poate sa intre intr-o bucla infinita sau sa se
termine in timp ce este in sectiunea non-critica
Locatiile de memorie accesate prin aceste protocoale nu
pot fi accesate in afara acestora
Lacate
Mecanisme de sincronizare bazate pe idea de protocoale de intrare
si iesire
In mod normal ele pot fi implementate ca o pereche de functii:
Asteptarea activa (busy waiting)
Vom folosi urmatoarea expresie in pseudocod
await b --care este echivalent cu
while not b loop end
Aceasta modalitate de asteptare este numita asteptare activa
sau busy waiting/"spinning"
Asteptarea activa este ineficienta pe sistemele multitasking
Asteptarea activa are sens doar daca timpul de asteptare este
de obicei atat de mic incat o comutare de context ar fi mai
costisitore
Spinlocks (lacate care utilizeaza asteptarea activa) sunt de
obicei folosite in nucleele sistemelor de operare
Exemplul Prea mult lapte
Posibila solutie1
Prima idee: se folosesc doua variabile enter1 si enter2;
daca enter este true, inseamna ca procesul Pi vrea sa
intre in sectiunea critica
Posibila solutie1
Posibila solutie nu reuseste sa satisfaca conditia
excluziunii mutuale
Cele doua procese pot ajunge in sectiunea critica in
acelasi timp, asa cum arata demonstratia de mai jos
Posibila solutie 2
Din solutia 1, observam ca am setat variabila enter abia
dupa comanda await care protejeaza sectiunea critica
A 2-a idee: comutarea celor doua instructiuni
Posibila solutie 2
Solutia ofera excluziune mutuala
Cu toate aceastea, procesul poate ajunge intr-un blocaj:
Posibila solutie nr.3
A 3-a idee: adaugam o variabila unica turn care va
preciza cine poate sa intre in sectiunea critica.
Posibila solutie nr.3
Desenam sistemul de tranzitie de stari; starile sunt
etichetate cu (i, j, k): valoarea pointerilor P1i si P2j, si
valoarea variabilei turn = k.
Posibila solutie nr.3
Posibila solutie nr.3
Solutia 3 satisface excluziunea mutuala: nu
exista stari de forma (2, 2, k)
Solutia 3 nu are blocaje - trebuie sa examinam
starile (1, 1, 1) si (1, 1, 2) -> in ambele cazuri un
proces este capabil sa intre in sectiunea critica
Infometarea: Un caz problematic este (1, 4, 2):
turn = 2, P1 incearca sa intre in sectiunea critica
(desi nu este randul sau), P2 in sectiunea non-
critica. Daca P2 se termina, nu se va mai seta in
1 -> P1 va fi infometat
Sfarsitul Cursului 6

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