Documente Academic
Documente Profesional
Documente Cultură
i Calculatoare
12/3/13
12/3/13
Reguli:
! la producere eveniment intern ! cl este incrementat ! valoarea sa este asociata evenimentului ca amprenta de timp ! la transmitere mesaj ! incrementeaz! cl cu 1 ! actualizeaz! tt := cl; ! la primire mesaj cu amprenta de timp tt ! actualizeaz! cl := maxim (cl, tt) + 1
12/3/13
! apoi analizeaza r!spunsurile pentru a decide continuarea execu#iei. ! Implementarea semafoarelor distribuite
! procesele Utiliz(i) ini#iaz" opera#iile P sau V ! procesele Ajutor(i) implementeaz" opera#iile P si V.
12/3/13
+----------------+ +-------->! Utiliz[i] !--->-+ ! +----------------+ !+-<- Utiliz[j] ! !! Ajutor[j] +---+ +-vv+ +---+ start[i] +---+ opsem[i] + ^ + +---+ ! +----------------+ ! +----<----! Ajutor[i] !<----+ +----------------+
Algoritmi Paraleli si distribuiti
type fel = enum(V, P, ack); chan opsem[1:n](transm: int, op: fel, timp: int); chan start[1:n](timp: int); Utiliz(i: 1..n):: var cl: int :=0; {ceas logic} var ts: int; {timestamp mesaj} ... cl := cl+1; broadcast opsem(i, P, cl); {operatia P} receive start[i](ts); cl := max(cl, ts) + 1; ... cl := cl+1; broadcast opsem(i, V, cl); {operatia V} ... Ajutor(i: 1..n):: var qm: queue of (transm: int, k: fel, ts: int); var cl: int := 0;
12/3/13
var sem: int := valoare_initiala; var transm: int, k: fel, ts: int; do true -> receive opsem[i](transm, k, ts); cl := max(cl, ts) + 1; if k=P or k=V -> insereaza (transm, k, ts) in locul corespunzator in qm; cl := cl+1; broadcast opsem(i, ack, cl); [] k=ack -> inregistreaza transmiterea unui ack; fa mesajele V complet confirmate -> scoate mesaj din qm; sem := sem+1; af; fa mesajele P complet confirmate st sem>0 -> scoate mesaj (transm, k, ts) din qm; sem := sem-1; if transm=i -> cl := cl+1; send start[i](cl) fi af fi od
12/3/13
timp producere
12/3/13
12/3/13
Fiecare Pi are asociat un vector V(i)[1..n] n care: V(i)[i] este num!rul de evenimente produse n procesul Pi; V(i)[j] este num!rul de evenimente despre care Pi "tie (a aflat din amprentele mesajelor primite) c! au avut loc la Pj. Procesul Pi actualizeaz! V(i) la fiecare eveniment din Pi La un eveniment intern Pi incrementeaza V(i)[i]
12/3/13
Cnd Pi transmite mesajul m (eveniment send m): Pi incrementeaz! V(i)[i] Pi adaug! V(i) la m ca vector de amprente de timp curent vt(m) Cnd Pj prime!te m si vt(m) (eveniment receive m): Pj ajusteaz!: V(j) [k] = max{V(j)[k],vt(m)[k]} pentru fiecare k Pj incrementeaz! V(j)[j] cu 1
12/3/13
12/3/13
12
12/3/13
12/3/13
Cnd procesul sursa Ps transmite mesajul m: Ps incrementeaz" V(s)[s] Ps adaug" V(s) la m ca vector de amprente de timp curent vt(m) ! Obs. Pentru ordonare cauzala, incrementarea lui V(s)[s] se face doar la transmitere de mesaje de catre s vt(m) spune receptorului cte evenimente (din alte procese) au precedat m "i ar putea influen#a cauzal pe m. Cnd destinatia Pd prime!te mesajul m mpreun! cu vt(m), mesajul este p!strat ntr-o coad! de ntrziere "i este livrat doar dac!: vt(m) [s] = V(d)[s] + 1 vt(m) [k] =< V(d)[k] pentru k <> s Cnd mesajul este livrat, V(d) este actualizat conform regulilor vectorilor de timp: V(d) [k] = max{V(d)[k], vt(m)[k]} pentru fiecare k = 1,n.
12/3/13