Algoritmi Paraleli si Distribuiti - Lucru cu semafoare PDF

Summary

This document presents an overview of parallel and distributed algorithms, focusing on the use of semaphores. It covers fundamental concepts like synchronization, mutexes, and critical sections, along with illustrative examples of classic problems like the producer-consumer problem, the philosophers' problem, readers-writers problem, and the barber's shop problem.

Full Transcript

Algoritmi Paraleli È™i DistribuiÈ›i Lucru cu semafoare Prof. Ciprian Dobre [email protected] Sincronizare: Notiuni introductive Dezvoltarea algoritmilor folosind variabile partajate (MIMD) â–ª Sincronizarea: excluderea mutuală ÅŸ...

Algoritmi Paraleli È™i DistribuiÈ›i Lucru cu semafoare Prof. Ciprian Dobre [email protected] Sincronizare: Notiuni introductive Dezvoltarea algoritmilor folosind variabile partajate (MIMD) â–ª Sincronizarea: excluderea mutuală ÅŸi sincronizarea condiÅ£ionată. â–ª Câteva rezultate notabile: ‒ mutex ‒ semafoare o regiuni critice ‒ bariere â–ª Câteva dintre problemele clasice: ‒ producători-consumatori ‒ problema filozofilor ‒ cititori-scriitori ‒ problema bărbierului Sectiuni critice â–ªProblema: fiecare proces P(i) al unei colectii de procese P(i:1..n) executa ciclic o sectiune critica, in care are acces exclusiv la anumite resurse partajate, urmata de o sectiune necritica in care foloseste doar resurse locale. â–ªSemafor = tip special de variabile partajate manipulate prin 2 operaÈ›ii atomice: P È™i V (Dijkstra, 1965) ‒ Asigura excluderea mutuala intre procesele care acceseaza sectiunea critica. SecÈ›iuni critice sem mutex= 1; process P[i=1 to n] { while (true) { P(mutex); SecÈ›iune critică; V(mutex); SecÈ›iune necritică } } Exemplu executie… Sectiune critica time Zonă Critică P() sau Proberen 1 V() sau Verhogen - Dijsktra Doar un thread poate fi în zona critică la un moment dat Zonă Critică P() sau Proberen 1 V() sau Verhogen - Dijsktra Doar un thread poate fi în zona critică la un moment dat Zonă Critică P() sau Proberen 1 V() sau Verhogen - Dijsktra Doar un thread poate fi în zona critică la un moment dat Zonă Critică P() sau Proberen 0 V() sau Verhogen - Dijsktra Doar un thread poate fi în zona critică la un moment dat Zonă Critică P() sau Proberen 0 V() sau Verhogen - Dijsktra Doar un thread poate fi în zona critică la un moment dat Zonă Critică P() sau Proberen 1 V() sau Verhogen - Dijsktra Doar un thread poate fi în zona critică la un moment dat Zonă Critică P() sau Proberen 0 V() sau Verhogen - Dijsktra Doar un thread poate fi în zona critică la un moment dat Zonă Critică P() sau Proberen 0 V() sau Verhogen - Dijsktra Doar un thread poate fi în zona critică la un moment dat Zonă Critică P() sau Proberen 0 V() sau Verhogen - Dijsktra Doar un thread poate fi în zona critică la un moment dat Zonă Critică P() sau Proberen 0 V() sau Verhogen - Dijsktra Doar un thread poate fi în zona critică la un moment dat Zonă Critică P() sau Proberen 0 V() sau Verhogen - Dijsktra Doar un thread poate fi în zona critică la un moment dat Zonă Critică P() sau Proberen 0 V() sau Verhogen - Dijsktra Doar un thread poate fi în zona critică la un moment dat Zonă Critică P() sau Proberen 0 V() sau Verhogen - Dijsktra Doar un thread poate fi în zona critică la un moment dat Zonă Critică P() sau Proberen 0 V() sau Verhogen - Dijsktra Doar un thread poate fi în zona critică la un moment dat Zonă Critică P() sau Proberen 1 V() sau Verhogen - Dijsktra Doar un thread poate fi în zona critică la un moment dat Zonă Critică P() sau Proberen 1 V() sau Verhogen - Dijsktra Doar un thread poate fi în zona critică la un moment dat Zonă Critică P() sau Proberen 0 V() sau Verhogen - Dijsktra Doar un thread poate fi în zona critică la un moment dat Producator-consumator Producer - Consumer Producători È™i consumatori â–ª Problema ‒ Se consideră M producători È™i N consumatori care comunică printr-un singur buffer partajat. T Am loc? Am ce prelua? T T Producători È™i consumatori typeT buf; sem gol= 1, plin= 0; process Producător[i=1 to M]{ process Consumator[i=1 to N]{ typeT v; typeT w; while(true) { while(true) { v = produce(); P(plin); P(gol); w = buf; buf = v; V(gol); semnalizare V(plin); consumă(w); } } } } Comunicarea producător È™i consumator prin tampon limitat typeT buf[1:k]; sem gol = k, plin = 0; process Producător { typeT v; int ultim= 1; while (true) { v = produce(); P(gol); buf[ultim] = v; ultim = ultim mod k + 1; V(plin); } } process Consumator { typeT w; int prim= 1; while (true) { P(plin); w = buf[prim]; prim = prim mod k + 1; V(gol); consumă(w); } } Comunicarea producător È™i consumator prin tampon limitat kxT Am loc? Am ce prelua? T T Mai mulÈ›i producători È™i mai mulÈ›i consumatori typeT buf[1:k]; int prim = 1, ultim = 1; sem gol = k, plin = 0; sem mutexP = 1, mutexC = 1; process Producător[i=1 to M]{ process Consumator[i=1 to N]{ typeT v; typeT w; while (true) { while (true) { v = produce(); P(plin); sectiune critica P(gol); P(mutexC); P(mutexP); w = buf[prim]; buf[ultim] = v; prim = prim mod k + 1; ultim = ultim mod k + 1; V(mutexC); V(mutexP); V(gol); V(plin); consumă(w); } } } } Problema filozofilor Problema filozofilor Socrate process Filozof[i=1 to 5]{ while (true) { ia beÈ›iÈ™oare; Descartes 4 Confucius mănâncă; 4 eliberează beÈ›iÈ™oare; 5 gândeÈ™te; 5 3 } 1 3 } Platon Eliade 2 1 DEADLOCK 2 Fiecare mai are nevoie de un beÈ›iÈ™or Problema filozofilor (2) sem f[1:5] = (1); Socrate process Filozof[i=1 to 4]{ while (true) { P(f[i]); P(f[i+1]); mănâncă; 4 Descartes Confucius V(f[i]); V(f[i+1]); gândeÈ™te; 4 5 } } process Filozof[i=5]{ 5 3 while (true) { 1 3 P(f); P(f); Platon Eliade mănâncă; V(f); V(f); 2 gândeÈ™te; } } 1 2 Problema cititori-scriitori Problema cititorilor È™i scriitorilor Excludere mutuală zona de memorie (resursa critica) 1) Un singur scriitor are dreptul sa scrie la un moment dat, 1) Un cititor poate citi din 2) Doar daca nu exista un memorie, indiferent daca cititor curent care citeste deja exista alti cititori ce deja citesc 2) Doar daca nu exista un scriitor care scrie Problema cititorilor È™i scriitorilor Excludere mutuală sem rw = 1; process Cititor[i=1 to m]{ while (true){ P(rw); citeÈ™te din resursa comună; V(rw); } } Excludere mutuala strica ! process Scriitor[j=1 to n]{ Un singur proces are voie sa execute while (true){ opeartii pe resursa critica… P(rw); scrie în resursa comună; V(rw); } } zona de memorie (resursa critica) Problema cititorilor si scriitorilor Excludere mutuală (2) int nr = 0; sem mutexR = 1, rw = 1; process Cititor[i=1 to m]{ while (true){ P(mutexR); nr = nr + 1; sectiune critica if (nr == 1) P(rw); V(mutexR); citeÈ™te din resursa comună; P(mutexR); nr = nr - 1; if (nr == 0) V(rw); V(mutexR); } } process Scriitor[j=1 to n]{ while (true){ P(rw); scrie în resursa comună; V(rw); } } zona de memorie (resursa critica) nr = 0 nr = 1 nr = 2 Problema cititorilor È™i scriitorilor Sincronizare condiÈ›ionată â–ªInvariant global: RW: ( nr == 0 || nw == 0 ) && nw 0 sau dw>0 */ sem w = 0; int dr = 0; int dw = 0; Problema cititorilor È™i scriitorilor Sincronizare condiÈ›ionată (4) Split binary semaphore â–ª Folosit pentru a implementa atât excluderea mutuală cât È™i sincronizarea condiÈ›ionată. â–ª Semafoarele e, r È™i w formează împreună un semafor splitat (split binary semaphore): ‒ cel mult un semafor este 1 la un moment dat 0 ≤ e + r + w ≤ 1 ‒ fiecare cale de execuÈ›ie începe cu un P È™i se termină cu un singur V ‒ instrucÈ›iunile între P È™i V se execută în excludere mutuală. â–ª Tehnica se numeÈ™te pasarea È™tafetei: ‒ IniÈ›ial un semafor este 1 È™i un proces poate prelua È™tafeta printr-o operaÈ›ie P asupra semaforului ‒ când un proces deÈ›ine È™tafeta (se execută într-o secÈ›iune critică È™i toate semafoarele sunt 0), el poate pasa È™tafeta altui proces printr-o operaÈ›ie V asupra unuia din cele trei semafoare. Problema cititorilor È™i scriitorilor Sincronizare condiÈ›ionată (5) process Cititor[i=1 to m]{ while (true){ P(e); if (nw > 0 or dw > 0){ dr = dr + 1; V(e); P(r); } nr = nr + 1; if (dr > 0) { dr = dr - 1; V(r); } else if (dr == 0) V(e); citeÈ™te din resursa comună; P(e); nr = nr - 1; if (nr == 0 and dw > 0) { dw = dw - 1; V(w); } else if (nr > 0 or dw == 0) V(e); } } Problema cititorilor È™i scriitorilor Sincronizare condiÈ›ionată (6) process Scriitor[j=1 to n]{ while (true){ P(e); if (nr > 0 or nw > 0) { dw = dw + 1; V(e); P(w) } nw = nw + 1; V(e); scrie în resursa comună; P(e); nw = nw - 1; if (dr > 0 and dw == 0) { dr = dr - 1; V(r); } else if (dw > 0) { dw = dw-1; V(w); } else if (dr == 0 and dw == 0) V(e); } } Problema barbierului Problema bărbierului â–ªProblema: ‒O frizerie cu un bărbier, un scaun de bărbier, n scaune de aÈ™teptare. ‒Când nu sunt clienÈ›i, bărbierul doarme. ‒Când soseÈ™te un client fie trezeÈ™te bărbierul, fie aÈ™teaptă dacă acesta e ocupat. ‒Dacă toate scaunele sunt ocupate, clientul pleacă. Pas 1 clienti BarbierGata Pas 2 clienti BarbierGata Pas 3 clienti BarbierGata Pas 4 clienti BarbierGata Problema bărbierului (1) int NumărScauneLibere = n; sem ClienÈ›i = 0; sem BărbierGata = 0; sem Scaune = 1; sincronizare cu Client process Bărbier{ while (true){ P(ClienÈ›i); P(Scaune); NumărScauneLibere++; V(BărbierGata); V(Scaune); } } Problema bărbierului (2) process Client[i=1 to m]{ while (true) { sincronizare cu Barbier P(Scaune); if (NumărScauneLibere > 0){ NumărScauneLibere--; V(ClienÈ›i); atomicitate V(Scaune); P(BărbierGata); } else { V(Scaune); } } } Problema bărbierului (var. mutex) emptyChairs = N Bărbier Clients = 0 Client BarberReady = 0 Chairs = 1 Chairs.lock(); while(true) { if(emptyChairs>0) { Clients.lock(); emptyChairs--; Chairs.lock(); Clients.unlock(); emptyChairs++; Chairs.unlock(); BarberReady.unlock(); BarberReady.lock(); Chairs.unlock(); getHairCut(); } else { cutHair(); Chairs.unlock(); } } Sumar â–ªDezvoltarea algoritmilor folosind variabile partajate (MIMD) â–ªSemafoare â–ªSecÈ›iuni critice â–ªProbleme: ‒ Producători È™i consumatori ‒ Problema filozofilor ‒ Problema cititorilor È™i scriitorilor ‒ Problema bărbierului