Documente Academic
Documente Profesional
Documente Cultură
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
+----------------+
+----<-- 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
116
118
120