Sunteți pe pagina 1din 9

8.

Ceasuri logice i ordonarea evenimentelor


8.1 Soluia lui Lamport
n vorbirea curent se afirm c un eveniment a s-a produs naintea altui eveniment b
dac momentul de timp la care s-a produs a precede momentul producerii lui b.
Extinderea acestei accepii la sistemele distribuite ntmpin dificulti, deoarece
reclam ca sistemele de calcul s conin ceasuri de timp real, iar ceasurile s msoare
cu precizie timpul. O soluie mai realist este aceea a introducerii unor ceasuri logice,
care s marcheze ordinea evenimentelor fr a da cu exactitate momentele producerii
lor. n acest scop, se definete relaia petrecut nainte pe mulimea evenimentelor
dintr-un sistem, notat cu ->, ca fiind cea mai slab relaie care satisface urmtoarele
trei condiii:
n situaia c a i b sunt evenimente din acelai proces i a l precede pe b, atunci
a->b;
cnd a reprezint transmiterea unui mesaj de ctre un proces, iar b recepia
aceluiai mesaj de ctre un altul, atunci a->b;
dac a->b i b->c atunci a->c.
S considerm n continuare o modalitate simpl de a introduce ceasuri logice ntr-un
program paralel. Pentru aceasta, n loc s se ataeze unui eveniment timpul real de
producere, i se asociaz un numr de ordine, care s precizeze poziia sa n raport cu
celelalte evenimente. Mai precis, pentru fiecare proces Pi, se definete ceasul logic ca
o funcie Ci care asociaz fiecrui eveniment a din Pi un numr unic Ci(a). ntregul
sistem de ceasuri poate fi privit ca o funcie C definit pe mulimea tuturor
evenimentelor cu valori n mulimea numerelor naturale, care asociaz oricrui
eveniment a un numr C(a)=Ci(a), dac a este un eveniment al procesului Pi. Un
astfel de sistem de ceasuri este corect dac, pentru orice evenimente a i b, a->b
implic C(a)<C(b).
Realizarea practic a unui sistem de ceasuri logice presupune folosirea pentru fiecare
proces A a unei variabile cl, a crei valoare se mrete la producerea evenimentelor i,
pentru fiecare mesaj, a unui cmp care s indice momentul transmiterii sale. Ceasurile
logice sunt incrementate conform urmtoarelor reguli:
(1) cnd A transmite un mesaj, el incrementeaz cl cu 1 i apoi actualizeaz timpul tt
asociat mesajului la valoarea lui cl;
(2) cnd A primete un mesaj avnd asociat timpul tt, el actualizeaz cl la valoarea
maxim dintre cl i tt + 1 i apoi incrementeaz cl cu 1.
112

Folosind ceasurile logice, putem asocia un moment de timp fiecrui eveniment.


Pentru send acesta este timpul nregistrat n mesaj. Pentru receive acesta este valoarea
lui cl din procesul receptor dup actualizarea la maximul dintre cl i tt+1 i
incrementarea ei. Aceasta asigur c, dac un eveniment a se produce naintea unui
eveniment b, timpul asociat lui a s fie mai mic dect timpul asociat lui b. Se induce
astfel o ordonare parial pe mulimea evenimentelor unui program.

Figura 8.1Trei procese i evenimentele corespunztoare


n figura 8.1 sunt reprezentate evenimentele interne i de comunicare ntre trei
procese cu respectarea momentelor de timp fizic la care s-au produs. Considernd c
ceasurile logice asociate proceselor au iniial valoarea 0, prin actualizarea lor dup
regulile prezentate mai nainte se obin valorile de timp logic prezentate n Figura 8.2.

Figura 8.2 Valorile de timp logic asociate evenimentelor din Figura 8.1
Deoarece dou evenimente din procese diferite pot avea acelai timp logic de
producere (de exemplu, evenimentele a i e din Figura 8.2), pentru a obine o
ordonare total se poate recurge la ordonarea proceselor i la dispunerea
evenimentelor cu acelai timp logic n ordinea proceselor corespunztoare.
113

Ca aplicaie, prezentm utilizarea ordonrii totale a evenimentelor n realizarea


excluderii mutuale ntr-un sistem cu transmitere asincron de mesaje, prin semafoare
distribuite. Soluia are la baza urmtorul mecanism: cnd un proces execut o operaie
P (sau V) el difuzeaz mesaje celorlalte procese, analiznd rspunsurile acestora
pentru a determina continuarea execuiei. Folosim forma:
broadcast ch(m)
pentru a desemna transmiterea mesajului m pe fiecare din canalele unui tablou
ch[1:n]. Toate cele n replici ale lui m transmise prin broadcast poart aceeai
amprent de timp, calculat la fel ca pentru o singur operaie send.
Implementarea semafoarelor se face prin dou colecii de procese. Procesele Utiliz(i)
iniiaz operaiile P sau V, prin difuzare de mesaje pe canalele opsem. Procesele
Ajutor(i) implementeaz operaiile P si V.
La o operaie P sau V, un proces Utiliz difuzeaz un mesaj tuturor proceselor
(inclusiv propriului) Ajutor. Mesajul conine identitatea propriului ajutor, un
indicator P sau V i un moment de timp, acelai n toate copiile mesajului.
+----------------+
+-------->
Utiliz[i]
--->-+

+----------------+
+----<-- Utiliz[j]

Ajutor[j]
+---+
+---+
+---+ start[i]
+---+ opsem[i]
+---+
+---+

+----------------+

+----<----
Ajutor[i]
<----+
+----------------+

Figura 8.3
Fiecare proces Ajutor are o coad local de mesaje qm i un ceas logic cl. Cnd un
proces Ajutor primete un mesaj P sau V, el l memoreaz n qm, care este ordonat
dup momentele de timp coninute de mesaje (cu amendamentul suplimentar asupra
ordonrii proceselor). Mesajele unor procese diferite nu sunt recepionate n aceeai
ordine de toate procesele Ajutor. Mai mult, un mesaj cu un timp mai redus poate fi
recepionat dup un altul cu un timp mai mare. Dar, mesajele trimise de un acelai
proces vor fi recepionate de celelalte procese n ordinea generrii i vor avea
momente de timp cresctoare. Ca urmare, dac qm conine un mesaj m cu timpul ts i
procesul recepioneaz mesaje cu un timp mai mare de la toate celelalte procese, este
114

sigur c nu va mai apare ulterior un mesaj cu un timp mai mic. n acest moment m
este complet confirmat i, odat cu el, toate celelalte mesaje aflate n faa lui n qm.
Acestea constituie un prefix stabil, nici un alt mesaj neputnd fi inserat ntre cele din
prefix.
Totodat, cnd un proces Ajutor primete un mesaj P sau V, acesta difuzeaz o
confirmare ack. Mesajele ack au asociai timpi de producere, dar ele nu sunt
memorate la recepie n qm i nu sunt confirmate la rndul lor. Ele folosesc doar la a
determina cnd un mesaj P sau V devine complet confirmat.
Fiecare proces Ajutor simuleaz operaiile cu semafoare. El folosete o variabil
local sem, pentru a pstra valoarea semaforului. Cnd procesul primete un ack, el
actualizeaz prefixul stabil din qm. Pentru fiecare mesaj V din prefix, procesul
incrementeaz sem i terge mesajul. Procesul examineaz apoi mesajele P. Dac
sem>0, procesul decrementeaz sem i terge mesajul P. Mesajele P sunt tratate de
toate procesele n aceeai ordine.
Algoritmul este urmtorul:
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;
...
cl := cl+1;
broadcast opsem(i, V, cl);
{operatia V}
...
cl := cl+1;
broadcast opsem(i, P, cl);
{operatia P}
receive start[i](ts);
cl := max(cl, ts+1); cl := cl+1;
...
Ajutor(i: 1..n)::
var qm: queue of (int, fel, int);
var cl: int := 0;
var sem: int := valoare_initiala;
var transm: int, k: fel, ts: int;
do true ->
receive opsem[i](transm, k, ts);

115

cl := max{cl, ts+1); cl := cl+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 tansm=i -> cl := cl+1; send start[i](cl) fi
af
fi
od

Tema. Alctuii algoritmul distribuit de excludere mutual care funcioneaz n


modul descris n continuare.
Un proces care dorete s intre n seciunea critic trimite mesaje de cerere request
tuturor celorlalte procese. Pentru a putea intra efectiv n seciunea critic, este necesar
s primeasc de la fiecare cte un mesaj de rspuns reply. La recepia unui mesaj
request, un proces poate determina dac el sau procesul care a facut cererea ar trebui
s intre n seciunea critic. Cnd el are prioritate, mesajul reply este ntrziat; altfel,
el este transmis imediat procesului ce a generat cererea.
8.2 Ceasuri logice vectoriale
Cu soluia ceasurilor logice dat de Lamport, avem urmtoarea relaie:
e precede f => amprenta_logic (e) < amprenta_logic (f)
deci, dac e precede f atunci timpul logic asociat lui e este mai mic dect cel al lui f.
Pe de alt parte,
amprenta_logic (e) < amprenta_logic (f) !=> e precede f
adic, faptul c timpul logic al lui e este mai mic dect cel al lui f nu nseamn
neaprat c e precede f. De exemplu, n Figura 8.2, evenimentul e are timpul logic 1
iar c are timpul logic 3, dar nu se poate spune ca e precede c.

116

Prin utilizarea ceasurilor logice vectoriale, o astfel de implicaie este garantat.


Ceasurile logice vectoriale sunt definite n modul descris n continuare. Fiecare proces
Pi are asociat un vector V(i)[1..n], reprezentnd ceasul su logic vectorial, n care:
V(i)[i] este numrul de evenimente produse n procesul Pi;
V(i)[j] este numrul de evenimente despre care Pi tie (a aflat) c au avut loc
la Pj.
Obs. V nu este o matrice, ci o colecie de vectori, fiecare V(i) din aceast colecie fiind
pstrat de procesul Pi n memoria sa local.
Procesul Pi actualizeaz V(i) la fiecare eveniment din Pi (trimitere / recepie de mesaj
sau alt eveniment). 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 primete mesajul m mpreun cu vt(m) (eveniment "receive m"):
Pj ajusteaz vectorul: V(j) [k] = max{V(j)[k],vt(m)[k]} pentru fiecare k
Pj incrementeaz V(j)[j] cu 1
Figura 8.4 arat rezultatul aplicrii acestor reguli pe exemplul din Figura 8.2.

Figura 8.4 Aplicarea regulilor ceasurilor logice vectoriale


Pe multimea vectorilor de amprente de timp, VT pot fi stabilite cteva relaii. Fie VT1
i VT2 doi vectori VT cu cte N elemente. Atunci,
VT1 = VT2 VT1[i] = VT2[i], pentru i = 1, ..., N
VT1 <= VT2 VT1[i] <= VT2[i], pentru i = 1, ..., N
VT1 < VT2 VT1 <= VT2 i VT1 <> VT2
117

Relaiile anterioare ne permit definirea ordonrii cauzale a evenimentelor. Fie vt(a) i


vt(b) vectorii de amprente de timp asociai evenimentelor a i b. Atunci:
vt(a) < vt(b) => evenimentul a precede cauzal evenimentul b
vt(a) !< vt(b) and vt(b) !< vt(a) and vt(a) != vt(b) evenimentele a i b sunt
concurente
Aplicaie: Ordonare Cauzal Multicast
Presupunem c procesele unei colecii P comunic ntre ele doar prin mesaje cu
difuzare (orice mesaj este trimis tuturor proceselor din colecie). Se cere ca oricare
dou mesaje m i m' transmise n cadrul coleciei s respecte dependena cauzal,
ceeace nseamn c dac mesajul m a fost trimis naintea mesajului m' atunci, la orice
proces p din colecie, livrarea lui m s aib loc naintea livrrii lui m':
vt(m) < vt(m') => livrarep (m) -> livrarep (m').
Pentru asta, fiecare proces folosete un protocol care ntrzie eventual livrarea
mesajelor astfel nct aceasta s aib loc n ordinea cauzal. Protocolul se bazeaz pe
o variant uor modificat a ceasurilor logice vectoriale, pe care o numim vectori de
timp pentru a face diferenierea fa de varianta de baz. n noua variant, ceasurile
sunt avansate doar la operaiile de transmitere de mesaje.
Ca i n varianta iniial, fiecare proces Pi (i = 1..n) are asociat un vector V(i)[1..n], cu
toate elementele avnd iniial valoarea 0, reprezentnd vectorul su de timp, n care:
V(i)[i] este numrul de evenimente de transmitere de mesaje produse n
procesul Pi;
V(i)[j] este numrul de evenimente de transmitere de mesaje despre care Pi
tie (a aflat) c au avut loc la Pj.
Procesul Pi actualizeaz V(i) la fiecare eveniment de trimitere sau recepie de mesaj
din Pi.
Cnd un proces surs Ps transmite mesajul m (eveniment "send m"):
Ps incrementeaz V(s)[s]
Ps adaug V(s) la m ca vector de amprente de timp curent vt(m)
Amprenta vt(m) spune receptorului cte evenimente (din alte procese) au precedat m
i ar putea influena cauzal pe m.

118

Cnd procesul de destinaie Pd primete mesajul m mpreun cu vt(m) (eveniment


"receive m"), mesajul este livrat (fcut disponibil procesului pentru prelucrare) doar
dac nu se violeaza constrangerile de cauzalitate. Mai precis, mesajul este pstrat ntro coad de ntrziere pn cnd sunt ndeplinite urmtoarele dou condiii:
vt(m) [s] = V(d)[s] + 1
(m este urmtorul mesaj pe care d l atepta de la s)
vt(m) [k] =< V(d)[k] pentru k <> s
(toate mesajele primite deja de Ps cnd a trimis m au fost primite i de Pd cnd acesta
a primit m).
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.
Un exemplu de ntrziere a mesajelor este prezentat n figura 8.5. Mesajul cu vectorul
de timp (1,1,0) este livrat dup mesajul (1,0,0) dei este primit naintea acestuia de
procesul P3.

Figura 8.5 ntrzierea unui mesaj (Birman 1991)


Livrarea mesajului m poate determina livrarea altor mesaje, primite anterior, care
acum ndeplinesc condiia de cauzalitate.
Aciunile protocolului la livrarea mesajelor pot fi rezumate astfel:
dac vt(m)[k] > V(d)[k] pentru un oarecare k atunci se ntrzie m
Motivul este c Ps a primit mesaje de care mesajul curent poate fi cauzal
dependent, dar pe care Pd nc nu le-a primit;
119

dac vt(m)[s] > V(d)[s]+1 atunci se ntrzie m


Motivul este c mai sunt mesaje de la Ps pe care Pd nu le-a primit; aceasta
asigura ordinea FIFO pentru canale care sunt nonFIFO
dac vt(m)[s] < V(d)[s] atunci rejecteaz m
Motivul: m este un duplicat al unui mesaj primit anterior.

120

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