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.)
• Reactivitate – 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 exemplele folosite 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 posibile 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
• Semantica intercalarilor: se face presupunerea
ca toate comportamentele paralele pot fi
reprezentate de un set al tuturor intercalarilor
nedeterministe ale 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:
P2⊳2 (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 P1⊳i si P2⊳j, 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