Documente Academic
Documente Profesional
Documente Cultură
Specificarea problemelor.
O problem se poate specifica la nivelul interfeei dintre algoritmul ce o rezolv i mediul extern.
O specificare de problem P este o mulime de evenimente de intrare in(P), o mulime de evenimente de ieire out(P) (cele dou mulimi constituind interfaa lui P) i o
mulime seq(P) de secvene admisibile de evenimente de intrare i evenimente de ieire (care precizeaz interleavingurile permise dintre intrri i ieiri).
Fiecare eveniment de intrare sau de ieire are un nume i poate avea asociate date ca parametri.
Exemplu. Problema excluderii mutuale pentru n procesoare:
|i cicleaz (Ti,Ci,Ei,Ri)
ori de cte ori Ci apare n , atunci j eveniment asociat lui j ce apare n naintea lui Ci nu este lj.
(Condiia 1 arat c utilizatorul i algoritmul interacionaz propriu; ea impune utilizatorului un mod corect de comportare. Condiia 2 afirm c nu doi utilizatori simultan n
seciunea critic).
Sisteme de comunicaie
n problemele de simulare vom fi interesai n implementarea unor anumite tipuri de sisteme de comunicaie ntre procesoare pe baza unor primitive.
Aceste sisteme de comunicaie vor fi descrise cu ajutorul unei specificaii de problem.
Exemple.
1. Transmiterea asincron de measej point-to-point
interfaa:
sendi (M): eveniment de intrare asociat procesorului pi care trimite o mulime M (eventual vid) de mesaje. Fiecare mesaj include o indicaie a trimitorului i a
destinatarului; exist cel mult un mesaj pentru fiecare destinatar i perechea transmitor-destinatar trebuie s fie compatibil cu topologia sistemului.
recvi(M): eveniment de ieire asociat procesorului pi n care o mulime M de mesaje este primit. Fiecare mesaj trebuie s-l aib pe p i ca destinatar.
mulimea secvenelor admisibile.
Fie o secven de evenimente de intrare i ieire.
Notm cu R mulimea tuturor mesajelor ce apar n toate evenimentele recv i(M) din i cu S mulimea tuturor mesajelor ce apar n toate evenimentele send i(M) din .
Exist o funcie K:RS care asociaz fiecrui mesaj din R un mesaj cu acelai coninut din S a..:
Integrity: K este bine definit. Orice mesaj primit a fost n prealabil trimis. Nu este permis corupia mesajelor.
No duplicates: K este injectiv. Nici un mesaj nu este primit mai mult de o dat.
Liveness: K este surjectiv. Orice mesaj trimis va fi primit.
Liveness: Pentru ficare procesor pi 0 i n-1, restricia lui K la evenimentele bc-recvi este surjectiv
(orice mesaj trimis este primit de fiecare procesor).
mediul extern
Nivelul 1
Nivelul 2
Nivelul 3
sistemul de comunicaie
i 1 dac i estte intrare pe un nod atunci n Ci-1 nu a fost avtivat nici un alt eveniment (diferit de un eveniment de intrare n nod).
4.
Observaie: Din 3. i 4. rezult c un nod este declanat de o intrare n nod (din exterior sau din sistemul de comunicaie) i aceast declanare cauzeaz un lan de evenimente pe acest
nod care apare atomic pn ce alet evenimente nu mai sunt declanate.
Planificarea unei execuii este irul evenimentelor din execuie.
Dac este o execuie atunci top() (respectivc bot()) este restricia planificrii lui la evenimentele din inerfaa top (respectiv bottom) a nivelului top (respectiv bottom).
O execuie este fair dac orice eveniment (diferit de o intrare ntr-un nod) care este activat va apare (odat i odat; execuia nu se oprete prematur, cnd mai exist pai de urmat).
O execuie are calitatea de a fi user-compliant pentru o specificaie de problem P, dac mediul extern satisface restriciile de intrare ale lui P: pentru orice prefix ' a lui unde
este o intrare din mediul extern, dac ' este prefix al unui element din seq(P), atunci aa este i '.
O execuie este corect pentru sistemul de comunicaie C dac bot() este un element al lui seq(C). (Sistemul de comunicaie este corect, n conformitate cu specificaiile de problem
a lui C).
O execuie este (P,C) admisibil dac estge fair, user compliant pentru specificaia de problem P i corect pentru sistemul de comunicaii C.
Atunci cnd P i C sunt clare din context execuia se va numi admisibil.
Simulare
Sistemul de comunicaii C, simuleaz (global) sistemul de comunicaii C2 dac exist o colecie de procese unul pentru fiecare nod numit Sim (procesul de simulare) care
satisface:
1.
2.
3.
(Executia simulrii n topul sistemului de comunicaie C1 produce aceleai apariii n mediul extern pe care le face sistemul de comunicaii C2).
C2 input
C2 input
C2 output
C2
C2 output
Sim
C1 input
C1 output
C1
O definiie mai slab a simulrii, este simularea local.
O execuie este local user compliant pentru o specificaie de problem P, dac ' un prefix al lui , unde este o intrare din mediul extern, dac 'seq(P) a.. '|i este
prefix al lui '|i pentru i , atunci seq(P) a.. '|i este un prefix al lui '|i pentru i (mediul extern satisface restriciile de intrare ale lui P pentru fiecare nod, dar nu neaprat
global).
O execuie este (P,C) local admisibil dac este fair, local user compliant i corect pentru sistemul de comunicaii C.
Definiia simulrii locale este aceeai cu a simulrii globale cu excepia condiiei 3 care devine acum:
3'.
Pentru orice execuie (C2, C1) local admisibil a lui Sim seq(C2) a.. |i=top()|i i 0 i n-1.
Convenii de pseudocod
Vom descrie un algoritm asincron de tip MP ca o list de evenimente de intrare i ieire.
Fiecare eveniment va avea un nume i se vor descrie schimbrile locale care vor fi cauzate de apariia acestui eveniment, ntr-un pseudocod secvenia uzual.
Pe lng schimbrile locale de stare, apariia unui eveniment poate cauza i activarea unor evenimante de ieire. Acestea vor fi indicate astfel: "enable input X". Dac
rezultatul unui eveniment de ieire este dezactivarea lui (nu se fac alte schimbri locale) nu va fi trecut n lista de evenimente.
Broadcast and multicast
Pentru a specifica calitatea unui serviciu de broadcast (proprieti ce vor fi descrise mai jos) interfaa descris mai anterior pentru un serviciu broadcast de baz se modific
astfel:
bc-sendi(m,qos): eveniment de intrare asociat procesorului p i, care trimite un mesaj m tuturor procesoarelor; qos este un parametru ce descrie calitatea serviciului
cerut.
bc-recvi(m,j,qos): eveniment de ieire n care procesorul pi primete mesajul m n prealabil difuzat de pj; qos este ca mai sus.
Observaie: Atunci cnd ne referim la un serviciu broadcast de baz vom considera qos=basic. Un mesaj difuzat este primit i de transmitor.
Operaiile bc send i bc recv nu sunt blocante: nu se ateapt ca un mesaj s fie primit de toate procesoarele iar operaia bc recv acioneaz n modul de lucru bazat pe ntreruperi.
Se pot discuta dou categorii de caliti prin adugarea de noi proprieti pentru secvenele admisibile (pe lng cele ale situaiei qos=basic: integrity, no duplicates, liveness).
Ordonare
Un sistem de broadcast single-source FIFO (qos=ssf) satisface proprietile lui basic i
a ,b
cauzal ordonat
dar nu-i t.o.
b, a
b, a
t.o
dar nu-i cauzal ordonat
b, a
b, a
ssf dar nu-i t.o.
i nici cauzal ordonat
a, b
Un sistem de broadcast este reliable (n prezena a f defecte) dac pentru orice secven de bc send i bc recv sunt satisfcute condiiile: Integrity, No duplicates iar Liveness se
modific astfel:
Nonfaulty Liveness: Dac se consider restrictia lui K la evenimentele asociate procesoarelor nedefecte atunci K este surjectiv (toate mesajele difuzate de un procesor nedefect sunt
primite odat i odat de procesoarele nedefecte).
Faulty Liveness: Dac un procesor nedefect are un eveniment bc recv cruia K i asociaz un eveniment bc send al unui procesor defect, atunci orice procesor nedefect are un
eveniment bc recv cruia K i asociaz acelai eveniment bc send (orice mesaj trimis de un procesor defect este sau primit de toate procesoarele nedefecte sau de niciunul).
Observaie: Condiiile nu depind de tipul de defeciune a procesoarelor; vom considera totui numai defeciuni de tip crash.
Anumite combinaii de proprietilor ale serviciilor de tip broadcast au nume specifice date de importana lor practic:
broadcast atomic = broadcast reliable cu t.o.
broadcast FIFO atomic = broadcast atomic cu ssf.
broadcast cauzal atomic = broadcast atomic cu c.o.
(ultimele dou sunt echivalente).
11:
12:
13:
14:
15:
16:
Explicaii:
Fiecare procesor menine un contor cresctor: timestamp-ul su, folosit pentru a tampila mesajele pe care vrea s le difuzeze. n plus, fiecare procesor are un vector n care
estimeaz timestamp-urile celorlalte procesoare. Intrarea j din acest vector semnific faptul c p i nu va primi (nc o dat) un mesaj de la p j cu un timestamp mai mic sau egal cu acea
valoare.
Aceste componente ale vectorului sunt actualizate cu ajutorul timestampe-urilor asociate mesajelor sau folosind un mesaj special de actualizare trimis de p j.
Timestamp-ul propriu al fiecrui procesor va fi mai mare sau egal cu estimarea sa a timestamp-urilor celorlalte procesoare. Atunci cnd procesorul trbuie s-i mareasc
timestamp-ul pentru a asigura condiia precedent va trimite un mesaj de actualizare a timestamp-urilor tuturor celorlalte procesoare.
Fiecare procesor menine o mulime de mesaje ce ateapt s fie primite (pentru sistemul cu t.o.). Un mesaj cu timestamp-ul T este primit t.o., atunci cnd orice intrare n
vector este mai mare sau egal dect T. Fie o execuie fair a algoritmului care este corect pentru sistemul de comunicaii ssf.
Lema 1: Pentru procesor pi i bc sendi(m,to) din , pi asigneaz lui m un timestamp unic i aceste timestamp-uri sunt asignate n ordine cresctoare n raport cu apariiile lor n .
Lema 2: Timestamp-urile asignate mesajelor din , mpreun cu id-urile procesoarelor formeaz o ordine total (aceast ordine este numit ordinea timestamp).
Teorem: Algoritmul precedent este algoritm de broadcast t.o.
Demonstraie:
Trebuie demonstrat c au loc condiiile:
Integrity, No Duplicates, Liveness i Total Ordering.
Primele dou sunt satisfcute deoarece sistemul ssf pe care se bazeaz algoritmul le satisface.
Liveness: Presupunem c exist un procesor pi care are o intrare n pending care atept la nesfrit. Fie <m,T,j> intrarea blocat n pending cu cel mai mic (T,j).
ntruct procesoarele asigneaz timestamp-urile n ordine cresctoare odat i odat <m,T,j> va fi cea mai mic intrare n mulimea pending a lui p i. Pentru a fi blocat
trbuie s existe k a.. T>ts[k] n p i la nesfrit. Deci la un moment dat p i nu mai crete ts[k]. Fie T' cea mai mare valoare pe care p i o d lui ts[k]. Clar, ki. Deci de la un loc ncolo p i nu
mai primete mesaje de la p k (n sistemul ssf). Deci p k nu va mai trimite mesaje cu timestamp-ul mai mare dect T'. Dar aceasta nseamn c p k nu va primi mesajul <m,T,j> de la p j
contrazicnd corectitudinea sistemului ssf.
Total Ordering: Presupunem c pi execut bc recvi(m1,j1,to) i apoi
bc recvi(m2,j2,to). Trebuie s artm c (T1,j1)< (T2,j2) unde Ti este timestamp-ul lui mi, (i=1,2).
Cazul I: <m2,T2,j2> este n pendingi atunci cnd bc recv i(m1,j1,to) apare. Atunci, clar, (T1,j1)< (T2,j2) ntruct, altfel, m2 ar fi fost acceptat naintea lui m1.
Cazul II: <m2,T2,j2> nu este n pendingi atunci cnd bc recv i(m1,j1,to) apare.
Avem T1 tsi[j2]. Deci pi a primit un mesaj m de la
p j2
(pe sistemul ssf) naintea acestui moment cu timestamp-ul T T1. Din proprietatea ssf,
p j2
i deci timestamp-ul T2 al lui m2 este mai mare dect T. Deci T2 > T1.
Cauzalitate
S observm c timestamp-ul asignat unui mesaj m difuzat de pi este strict mai mare dect timestamp-ul oricrui mesaj primit de pi dup primirea mesajului m. Deci:
Teorem: Algoritmul precedent este un algoritm de broadcast c.o.
Observaie: Cauzalitatea se poate obine i fr t.o., pornind de la un sistem de broadcast basic i folosind timestamp-urile vectoriale. O raiune pentru aceasta, este aceea c se poate
obine calitatea c.o. chiar n prezen defeciunilor n timp ce t.o. nu poate fi asigurat n prezena defeciunilor.
Reliabilitate
Vom implementa un serviciu de broasdcast reliabil n topul unui sistem cu MP point-to-point n prezena a f cderi. Interfaa sistemului MP point-to-point este fomat din
evenimente de intrare sendi(M), recvj(M) unde M este o mulime de mesaje, ficare mesaj incluznd o indicaie a trimitorului i a primitorului. Secvenele admisibile se definesc
avnd urmtoarea proprietate (procesoarele sunt partiionate n defecte i nedefecte primele fiind n numr de cel mult f).
Integrity: Orice mesaj primit de un procesor pi i-a fost n prealabil trimis de
un procesor.
No duplicates: Nici un mesaj trimis nu este primit mai mult de o singur
dat.
Nonfaulty Liveness: Orice mesaj trimis de un procesor nedefect la un
procesor nedefect va fi odat i odat primit.
Algoritmul de broadcast reliabil (codul pentru pi, 0 i n-1)
la apariia lui bc sendi(m,reliable):
1: enable bc sendi(<m,i>,basic)
la apariia lui bc recvi(<m,k>,j,basic):
2: if m nu a fost deja primit then
3:
enable bc sendi(<m,k>,basic)
4:
enable bc recvi(m,k,basic)
Teorem: Algoritmul precedent este un algoritm de broadcast reliabil.
Observaii:
1: Calitatea de ssf se obine exact ca n cazul lipsei cderilor.
2: Broadcast-ul t.o. reliabil nu se poate obine atunci cnd sistemul pe care se bazeaz este asincron (altfel s-ar putea rezolva problema consensului n sisteme asincrone)
3: Broadcast-ul c.o. se obine utiliznd algoritmul dat pe un sistem de broadcast reliabil.
4: Toate problemele de implementare precedente pot fi extinse pentru a considera aa numitul multicast n care un mesaj trebuie trimis la un grup de procesoare i nu la toate.
Implementarile sunt simple atunci cnd grupurile sunt statice. Atunci cnd grupurile se pot modifica, n fiecare execuie apar probleme la ntreinerea dinamic a lor.
Memoria Partajat Distribuit (Distributed Shared Memory), DSM, este o simulare a unui sistem de comunicaie bazat pe memorie partajat cu ajutorul unui sistem de tip
transmitere mesaje (MP).
SIM
Memorie Partajat
Sistem MP
Programul de simulare va fi numit MCS (memory consistency system) care este alctuit din procese locale n fiecare procesor p i. Schematic:
Pentru simplitate, vom considera c obiectele din memoria partajat sunt regitri read/write.De asemenea, nu vom considera defeciuni ale procesoarelor.
Fiecare obiect partajat are o specificare secvenial care indic comportarea dorit a obiectului n absena concurenei.
O specificare secvenial const dintr-o mulime de operaii i o mulime de secvene de operaii (mulimea secvenelor legale de operaii).
rspuns
Invoc.
Invoc.
MCS
n
p0
send
rspuns
rspuns
Invoc.
MCS
n
p1
receive
send
MCS
n
p n-1
receive
send
receive
REEAUA
DSM
Exemplu: Un obiect read/write X suport operaiile read i write.
Invocarea unui read este readi (X) i rspunsul returni (X, v), unde i indic nodul i v valoarea returnat.
Invocarea unui write este writei (X, v) i rspunsul acki (X)
O secven de operaii este legat dac fiecare read returneaz valoarea celui mai recent write precedent (valoarea iniial dac aceast nu exist).
Sistem de comunicatie Linearizable Shared Memory ( LSM)
Intrri:
Ieiri:
Secvenele admisibile:
pentru orice obiect O, O este legal (adic aparine specificarii secveniale a lui O)
2.
dac rspunsul la operaia o1, apare n nainte de invocarea operaiei o2, atunci o1 apare naintea lui o2 n .
2.
dac rspunsul pentru operaia o1 n nodul pi (oarecare) apare n naintea invocrii operaiei o2 n nodul pi, atunci o1 apare naintea lui o2 n .
1.
Se cere deci ca s se pstreze ordinea operaiilor din acelai nod care nu se suprapun i nu pentru toate operaiile.
2.
n exemplul precedent 2 este secven consistent, permutarea dorit este w0r0w1r1. Deci condiia de liniarizare este mai tare dect condiia de consisten secvenial.
Observaii:
Algoritmi
Vom presupune c sistemul MP de baz suport broadcast t.o. (am artat cum poate fi implementat). Pentru a evita confuzia vom folosi:
Toi algoritmii folosesc replicarea complet: exist o copie local a oricrui obiect partajat n starea procesului MCS din fiecare nod. (Aa cum se face, de exemplu n ORCA;
gestionarea copiilor n alt stil este posibil dar aceasta este o alt problem).
Algoritm pentru simularea unui DSM liniarizabil
Atunci cnd procesul MCS dintr-un nod primete o cerere s citeasc sau s scrie un obiect partajat:
MCS trimite un mesaj broadcast coninnd cererea i ateapt s-i primeasc mesajul su.
Dup primirea mesajului, execut rspunsul pentru operaia ce ateapt (returnnd valoarea copiei obiectului pe care o deine el pentru un read i executnd ack
pentru write).
Ori de cte ori un proces MCS primete un mesaj difuzat pentru un write, actualizeaz copia obiectului, n mod corespunztor.
Teorem: Dac sistemul de broadcast este total ordonat atunci algoritmul precedent simuleaz un DSM liniarizabil.
Demonstraie: Fie o execuie admisibil a algoritmului (fair, user compliant pentru sistemul cu memorie partajata si corecta pentru sistemul broadcast de comunicaie). Trebuie s
demonstrm c top() este liniarizabil. Fie = top(). Ordonm operatiile din dup ordinea total a broadcast-urilor asociate lor din i obinem o permutare .
respect semantica obiectelor. Fie x un obiect read/write. |x sete secvena operatiilor ce acceseaz x. Cum broadcast-urile sunt t.o., orice proces MCS primete mesajele pentru
operaiile asupra lui x n aceeai ordine, care este ordinea lui , i gestioneaz x corect.
Atunci broadcast-ul corespunztor lui o 1, a fost primit de iniiatorul su nainte ca broadcast-ul lui o 2 s fie trimis de iniiatorul su. Evident, boadcastul lui o 2 este ordonat dup cel al
lui o1. Deci operaia o1 apare n naintea lui o2.
Observaie: Cum un serviciu broadcast t.o. se poate implementa n topul unui sistem MP point-to-point, rezult c un DSM liniarizabil se poate implementa n topul unui sistem MP.
Nu este evident de ce trebuie difuzat un mesaj pentru operaia read, atta timp ct nu se modific nici o copie a obiectului ca rezultat al primirii mesajului de citire.
Considerm algoritmul n care read-ul returneaz imediat valoarea din copia procesului MCS respectiv i renun la broadcast.
Fie o execuie n care valoarea iniial a lui x este 0. Procesorul p i invoc o scriere a lui 1 n x i execut un tbc send pentru write. Mesajul difuzat ajunge la procesorul p j
care-i actualizeaz copia sa local a lui x pe 1, dup care, sa spunem, execut un read pe x ce returneaz valoarea nou 1. Considerm un al treilea procesor p k care nu a primit mesajul
de broadcast al lui pi i are nc valoarea copiei lui x pe 0. Presupunem c pk citete x (dup ce pj execut read, dar nainte de a primi broadcastul lui pi); clar va obine valoarea 0.
Nici o permutare a acestor trei operaii nu poate fi i conform cu specificaia lui read/write i s pstreze ordonarea dup timpul real de apariie a operaiilor n .
Totui acest algoritm ndeplinete condiia de consisten secvenial.
Algoritm de consisten secvenial cu read local
(codul pentru procesorul pi)
Iniial, copy[x] pstreaz valoarea iniial a obiectului partajat x pentru orice x.
1:
2:
3:
4:
5:
6:
copy[x]:=v
7:
Pentru orice procesor pi copiile locale ale lui pi sunt actualizate de operaiile write n aceeai ordine n fiecare procesor i aceast ordine psteraz ordinea operaiilor write
Pentru orice procesor pi i orice obiecte partajate x i y dac un read r al obiectului y urmeaz dup un write w asupra obiectului x n top()|i atunci readul r al copiei locale
a lui pi a lui y urmeaz dup write-ul w al lui pi asupra copiei locale a lui x.
Din cele dou leme rezult.
Teorem: Algoritmul precedent implementeaz un DMS secvenial consistent cu read local.
Demonstraie: Trebuie demonstrat c top() satisface condiia de consisten secvenial.
Construcia lui .
Ordonm write-urile din conform ordinii tbcast. Trebuie s mai inserm read-urile. Pentru fiecare read din parcurs de la stnga la dreapta: Read-ul r executat de pi asupra lui x este
plasat imediat dup ultima apariie din asociat (1) apariiei precedente din asupra lui pi (read sau write asupra oricrui obiect) i (2) write-ului care a cauzat ultima actualizare a
copiei locale a lui x deinut de pi, care precede punctul n care returul lui r a fost activat.
n caz de egalitate se folosete id-ul procesoarelor pentru stabilirea ordinii (de exemplu dac orice procesor citete un obiect inainte ca orice procesor s scrie un obiect atunci ncepe
cu read-ul lui p0, urmat de read-ul lui p1 .a.m.d).
Trebuie demonstrat c top()|i=|i. Din construce, pentru un procesor p i fixat ordinea relativa a dou read sau a dou write este aceeai n top( )|i ca i n |i. Ceea ce trebuie artat
este c r i w sunt n aceast ordine i aceasta rezult din codul algoritmului. n plus trebuie artat c este legal.
Se poate inversa rolul celor dou operaii:
Facem write-ul local i read-ul ncet (datorit tbc send-urilor)
Algoritmul de consisten secvenial cu write local
(codul pentru procesorul pi 0 i n-1)
Iniial, copy[x] pstreaz valoarea iniial a obiectului partajat x pentru x i num=0.
1:
2:
3:
4:
num:=num+1
5:
6:
enable acki(x)
7:
8:
9:
if j=i then
10:
num:=num-1
11:
12:
enable returni(x,copy[x])
Ideea algoritmului: Cnd apare un write(x) n p i se trimite un mesaj de broadcast ca i n algoritmul precedent; totui el este confirmat imediat. Cnd apare un read(x) n p i, dac pi nu
are actualizri care ateapt (pe obiect nu numai pe x) atunci returneaz valoarea curent a copiei sale a lui x. Altfel, ateapt pn primete mesajul de broadcast pentru toate writeurile pe care el le-a iniiat i abia atunci returneaz. Aceasta se realizeaz meninnd un contor al tuturor write broadcasturilor iniiate de el i ateapt pn acesta este zero.
n esen, algoritmul implementeaz un pipeline pentru actualizarea write-urilor generate de acelai procesor.
Teorem: Algoritmul precedent implementeaz un DMS secvenial consistent cu write local.
Observaie: Acest algoritm, ca i precedentul nu asigur linearitatea.
Margini inferioare
Vom presupune c DSM a fost implementat n topul unui sistem de tip MP, point-to-point.
Adaptm definiia unei execuii cu timpi (timed execution) pentru sistemul simulat, considernd c numai evenimentelor de intrare ntr-un nod li s-au asignat timpi,
celelalte evenimente din nod motenind timpii evenimentelor de intrare n nod, care le-au declanat.
n plus vom considera c:
Pentru un MCS fixat i o operaie op vom nota cu t op timpul, n cazul cel mai nefavorabil, peste toate execuiile admisibile, necesitat de operatia op (diferena dintre timpul real de
apariie a rspunsului i timpul real de apariie al invocarii).
Teorema 1: Pentru orice MCS secvenial consistent care asigur dou obiecte partajate read/write, t read + twrite d.
Demonstraie: Fie un MCS secvenial consistent i dou obiecte partajate x i y, iniial 0 amndou.
Exist o execuie admisibila 0 a lui MCS a..
top(0) = write0(x, 1) ack0(x) read0(y) return0(y,0)
i write ncepe la timpul 0 iar read rspunde inaintea timpului d.
Presupunem, n plus, c orice mesaj trimis in 0 are intirzierea d. Rezulta ca nici un mesaj n-a fost primit de nici un nod la momentul de timp cnd read primete rspunsul.
Similar, exist o execuie admisibil 1 a lui MCS a..
top(1) = write1(y, 1) ack1(y) read1(x) read1(x) return1(x,0)
write apare la timpul 0, rspunsul la read apare naintea timpului d. Deci nici un mesaj n-a fost primit n nici un nod la momentul de timp cnd read primete rspunsul.
Vom construi o nou execuie care combin comportarea lui p0 n 0 (n care p0 scrie x i citete y) cu comportamentul lui p 1 n 1 (scrie y i citete x). Cum amndoua
operaiile pe fiecare procesor se termin nainte de momentul d, p 0 nu tie despre opearaiile lui p1 i invers. Deci procesoarele returneaz aceeai valoare n pe care ele le fac n 0
(1). Dup timpul d n , se permite ca orice mesaj ce ateapt s fie livrat, dar este deja prea trziu pentru a mai afecta valorile returnate anterior. Clar, aceste valori sunt inconsistente
cu condiia de consisten secvenial.
Formal, fie i|i (i=0,1) i i prefixul cel mai lung al lui i|i ce se termin naintea timpului d, i '=merge(0, 1). ' este prefixul unei execuii admisibile . Dar top() este
exact secvena 3 din observaia de dup definiia condiiei de secvenial consisten, care s-a vzut c nu-i secvenial consistent.
Observaie: Marginea inferioar obinut este valabil n particular i pentru MCS liniarizabil. n acest caz se poate spune chiar mai mult.
Teorema 2: Pentru orice MCS liniarizabil care asigur un obiect partajat read/write scris de dou procesoare i citit de un al treilea
write
u
2
Demonstraie: Fie un MCS liniarizabil i un obiect partajat x iniial 0 care este citit de p0 i scris de p1 i p2. Presupunem prin reducere la absurd ca
Exist o execuie admisibil a lui MCS a..
write1(x,1) apare la timpul 0, write2(x,2) apare la timpul u/2 i read0(x) apare la timpul u.
ntrzierile mesajelor n sunt: d din p1 la p2; d-u din p2 la p1 i d-u/2 pentru orice alt pereche ordonat de procesoare.
write
u.
2
este nc admisibil, ntruct ntrzierea mesajelor din p1 sau n p2 devine d-u, ntrzierea mesajelor din p2 sau n p1 devine d i toate celelalte ntrzieri rmn neschimbate.
Dar top()=write2(x, 2) ack2(x) write1(x, 1) ack1(x) read0(x) return0(x,2). Dar aceasta ncalc liniarizabilitatea deoarece read-ul lui p0 ar trebui s returneze 1 i nu 2.
u/2
r(x,2)
p0
w(x,1)
p1
:
p2
w(x,2)
u/2
p0
r(x,2)
w(x,1)
: p1
w(x,2)
p2
Teorema 3: Pentru orice MCS care asigur un obiect partajat x citit de dou procesoare i scris de un al treilea
write
u
4
Demonstraie: Fie un MCS liniarizabil i x un obiect partajat, iniial 0 care este scris de p0 i citit de p1 i p2. Presupunem prin reducere la absurd c
write
u
4
Ideea demonstraiei este aceeai ca n teorema precedent, numai c este ceva mai elaborat.
Fie
K twrite/n
. Considerm o execuie admisibil a lui MCS n care toate ntrzierile mesajelor sunt d-u/2 cominnd urmatoarele evenimente:
La un moment intre
La momentul
La un moment ntre
La momentul
La un moment ntre
2i
2i
u
4
4k 1 n , p face ack (x). ( 4k 1 n n twrite i deci write-ul lui p se termin n acest interval).
0
n
, p1 face read1(x) 0 i 2k.
4
2i
n
4
2i
n
, p2 face read2(x) 0 i 2k.
4
2i+1
) 0 i 2k.
Deci n top(), read-ul lui p1 al lui V0 precede write-ul lui p 0, read-ul lui p2 al lui V4k+1 urmeaz dup write-ul lui p0, nu avem read-uri suprapuse i ordinea citirilor valorilor din x este
V0, V1, V2,...,V4k+1.
Din liniarizabilitatea v0=0 i V4k+1=1. j 0 j 4k a.. Vj=0 i Vj+1=1. Presupunem c j este par deci Vj este rezultatul unui read al lui p1.
Definim =shift(,<0,0,-n/4>) adic l dm napoi pe p 2 cu n/4. este admisibil, ntruct ntrzierea mesajelor n p2 devine d-n, ntrzierea mesajelor din p 2 devine d i
celelalte ntrzieri rmn neschimbate.
u/4
2u/4
r(x,v1)
0
p2
r(x,v0)
: p1
4ku/4
r(x,v3)
(4k+1)u/
4r(x,V4k+1)
r(x,V4k)
r(x,v2)
p0
w(x,1)
p2
: p1
r(x,v1)
r(x,v3)
r(x,v0)
r(x,V4k+1)
r(x,v2)
r(x,V4k)
w(x,1)
p0
single writer
single reader
binary
single writer
single reader
multi-valued
single writer
multi reader
multi valued
multi-writer
multi reader
multi-valued
1.
Binar Multivaluat
Un registru este single reader (s r) dac exist un singur procesor (cititorul) ce poate citi din el i single writer dac exist un singur procesor (scriitorul) ce
poate scrie n el, (s w).
Simularea unui registru cu K valori, de tip s r, s w cu ajutorul unor registre s r, s w cu valori binare.
Pentru simplitate vom considera un singur registru R cu K valori i dou procesoare bine definite scriiorul i cititorul. Pentru simularea lui R, vom considera un tablou de K
regitri binari B[0..K-1]. Valoarea i va fi reprezentat de un 1 n componenta B[i] i 0 n celelalte. Deci, valorile posibile ale lui R sunt {0,1,...,K-1}.
O operaie read(R) va fi simulat prin scanarea vectorului B ncepnd cu indicele 0 i returnnd prima component egal cu 1 (dac exist). O operaie
write(R,v) va fi simulat punnd 1 n B[v] i i tergnd componenta egal cu 1 ce corespunde valorii precedente a lui R.
Acest scenariu simplu funcioneaz n cazul operaiilor R i W care nu se suprapun.
Dac operaiile cititorului sunt n ordine read(R,2) read(R,1)iar ale scriitorului write(R,1) write(R,2) atunci, o liniarizare a acestor operaii va trebui s se
pstreze ordinea operaiilor fiecrui procesor. Pentru a fi ndeplinit semantica registrului R va trebui ca write(R ,1) s apar nainte de read(R,2) pe cnd write(R,1) trebuie
s apar nainte de read(R,1) i dup read(R,2). Deci, sau ordinea operaiilor read sau ordinea operaiilor write trebuie schimbat. Algoritmul urmtor rezolv aceast
problem a inversiunilor "nou vechi" ale valorilor.
Algoritmul de liniarizare registru multi-valuat cu registre binare
Iniial regitrii partajati B[0].....B[K-1] sunt 0 cu excepia lui B[i]=1, unde i este valoarea iniial a lui R
1:
2:
3:
4:
5:
6:
1:
2:
3:
Evident , algoritmul este wait-free; fiecare write execut cel mult K operaii write de nivel jos iar fiecare read execut cel mult 2K-1 operaii read de nivel jos.
Pentru a demonstra c algoritmul este corect trebuie s artm c orice execuie edmisibil este liniarizabil, admite o permutare a operaiilor de nivel nalt a.. s se
pstreze ordinea operaiilor care nu se suprapun i n care orice read returneaz valoarea ultimului write precedent.
Fixm o execuie admisibil a algoritmului. Cum este corect pentru sistemul de comunicaie cu registre binare, operaiile cu registre binare sunt liniarizabile. Deci
fiecare operaie de nivel jos admite un punct de liniarizabilitate.
Asociem fiecrei configuraii a execuiei o "valoare actual" a registrului multivaluat R: valoarea actual a lui R este
k min i | i 0,1, , K 1 , B i 1, B 0 B i 1 0
n aceast definiie valoarea lui B(i) este n raport cu punctele de liniarizabilitate ale operaiilor de nivel jos.
Construim o liniarizare a lui . Punctele de liniarizabilitate al operaiei write(R,k) este imediat dup prima configuraie din intervalul ei n care b[k]=1 i B[0]=...=B[k-1]=0. La
terminare alui write(R,k) (atunci cnd apare ack(R)) aceasta este situaia, dar punctul de liniarizabilitate poate fi mai nainte (dac, de exemplu valoarea precedent a lui R a fost mai
mare dect k, el este imediat dup execuia operaiei de nivel jos B[k]:=1).
Punctul de liniarizabilitate a lui read(R) care se termin cu return(R,k) este imediat dup prima configuraie din intervalul ei, n care k este asignat variabilei locale v, (linia 3 sau 5).
Lema 1: Valoarea actual a lui R rmne fix ntre dou puncte de liniarizabilitate ale operaiei write consecutive de nivel nalt.
Lema 2: Pentru fiecare operaie read r (de nivel nalt) din 2, r returneaz valoarea scris n R de operaia write (de nivel nalt) cu ultimul punct de liniarizabilitate naintea ultimului
punct de liniarizabilitate al lui r.
Din cele dou leme rezult urmtoarea
Teorem. Algoritmul precedent reprezint o simulare wait-free a unui registru K-valuat folosind K regitri binari s-r, s-w, n care fiecare operaie necesit O(K) operaii de nivel jos.
2.
Mai multe procesoare (n) citesc din acelai registru. Vom permite existena unui singur scriitor pentru fiecare registru. Registrului R i se va asocia o colecie de n registre s
w, s r Val[i] i=1,n , unul pentru fiecare cititor.
Un scenariu simplu de simulare:
write(R,v) va obliga cititorul s parcurg toate cele n registre Val[i] i s memoreze v n ele.
pw primete ack dup scrierea lui 1 n Val[1], scrie 1 n Val[2] i confirm (ack) scrierea sa (de nivel superior).
Citirea lui p1 trebuie ordonat dup scrierea lui p w i citirea lui p 2 naintea scrierii lui p w. Deci citirea lui p1 trebuie ordonat dup citirea lui p 2.Totusi, citirea lui p1 apare naintea citirii
lui p2.
Are loc urmtoarea teorem:
Teorem:
n orice simulare wait-free a unui registru s w, m r cu orice numr de registre s r, s w, cel puin un cititor trebuie s scrie.
Soluia pentru simulare va necesita ca cititorii s-i scrie unii altora creind o ordine ntre ei. nainte de a returna valoarea din read-ul su, un cititor i va anuna pe ceilali
aceasta valoare. Un cititor va citi valoarea scris de scriitor pentru el, dar i valorile anunate de ceilali cititori. Va alege cea mai recent valoare pe care el a citit-o. Vom presupune c
registrele pot lua un numr nemrginit de valori. n aceast ipotez, scriitorul poate asocia un numr ntreg drept timestamp (a cta oar a scris) pentru fiecare valoare scris. n
continuare vom referi o valoare ca fiind perechea ce conine o valoare real i numrul su de ordine.
Se vor folosi tablourile de registre s r :
Val[i]: valoarea scris de pw pentru cititorul pi 1 i n
Report[i,j]: Val returnat de cea mai recent operaie read
executat de pi; scris de pi i citit de pj 1 i,j n
Algoritm de simulare a unui registru m r R cu regitri s r
Iniial, Report[i,j]=Val[i]=(v0,0) 1 i,j n (unde v0 este valoarea iniial a
lui R)
cnd apare readr(R) :
1:
2:
3:
4:
5:
6:
7:
(v[0],s[0]):=Val(v) // cea
for i:=1 to n do
Ideea algoritmului de simulare. Fiecare scriitor anun valoarea pe care intenioneaz s o scrie, tuturor cititorilor (scriindu-le-o n registrul fiecruia, registru de tip s w, m
r). Fiecare cititor citete toate valorile scrise de scriitori i o alege pe cea mai recent dintre ele. Depistarea valorii cea mai recent se face cu ajutorul unui timestamp asociat fiecrei
valori. Spre deosebire de algoritmul precedent, timestamp-ul nu este generat de un singur procesor (unicul writer) ci de mai multe procesoare (toi scriitorii posibili).
Scriitorii sunt p0,...,pm-1 iar cititorii sunt toate procesoarele p0,p1,...,pn-1. Se vor folosi tablourile de registri s w, m r :
TS[i] timestamp-ul vectorial al scriitorului pi 0 i m-1. Este scris de pi i citit de toi scriitorii.
Val[i] Ultima valoare scris de scriitorul pi 0 i m-1, mpreun cu timestamp-ul vectorial asociat cu acea valoare. Scris de pi i citit de toi cititorii.
Algoritm de simulare a unui registru m w R cu regitri s w
Iniial, TS[i]=<0,...,0> i
Val[i] este valoarea iniial a lui R 0 i m-1
cnd apare readr(R):
// cititorul pr citete din registrul R, 0 r n
1: for i:=0 to m-1 do (v[i],t[i]):=Val[i]
//v,t sunt locale
2: fie j a.. t[j]=max{t[0],...,t[m-1]}
// maximul lexicografic
3: returnr(R,v[j])
cnd apare writew(R,v): //scriitorul pw scrie v n R, 0 w m-1
4: ts:=NewCTS()
//ts este local
5: val[w]:=(v,ts)
6: ackw(R)
procedure NewCTSw() //scriitorul pw obine un nou timestamp vectorial
1: for i:=1 to m do lts[i]:=TS[i].[i]
2: lts[w]:=lts[w]+1
3: TS[w]:=lts
4: return lts
Simularea regitrilor partajai n sisteme de tip MP
n cazul existenei defeciunilor, metoda descris pentru simularea memoriei partajate n topul unui sistem broadcast t.o., bazat pe ateptarea confirmrii din sistemul MP,
nu mai funcionaz. Atunci cnd exist defeciuni, un procesor nu poate fi sigur c va primi un mesaj trimis ctre el. Mai mult, nu poate atepta o confirmare de la destinatar, pentru c
acesta poate pica.Vom folosi toate procesoarele ca extra memorie pentru a implementa fiecare registru partajat (nu numai scriitorii i cititorii acelui registru). Desigur, valorile sunt
acompaniate de numare de ordine. Metoda pe care o vom descrie funcioneaz n ipoteza c numrul procesoarelor defecte f satisface f < n/2 (se poate demonstra c nu este posibil o
simulare a unui registru read/write n topul unui sistem asincron MP dac n2f).
Considerm un registru particular ce va fi simulat. Cnd scriitorul dorete s scrie o valoare n acest nou registru, incrementeaz un numr de ordine i trimite un mesaj
<newval> coninnd noua valoare i numrul de ordine, tuturor procesoarelor.
Fiecare primitor actualizeaz o variabil local cu aceast informaie, dac numrul de ordine asociat este mai mare dect valoarea curent a numrului de ordine din
variabila local; n orice eveniment receptorul trimite un mesaj de <ack>.
n
n
2 1 procesoare el termin de scris. Cum n>2f 2 1 n f
scris.Cnd cititorul dorete s citeasc un registru, el trimite un mesaj de tip <request> tuturor procesoarelor. Fiecare procesor trimite napoi un mesaj de tip <value> coninnd
informaia curent pe care o deine. Odat ce cititorul primete <value> de la cel puin
primite.
Comunicarea cu
n
2 1 procesoare, el returneaz valoarea cu cel mai mare numr de secven dintre cele
n
2 1 procesoare garanteaz un quorum pentru fiecare operaie read sau write. Cum n aceste quorum-uri avem majoritatea procesoarelor, va exista
un procesor n intersecia oricrui quorum al unui read cu orice quorum al unui write. Acesta garanteaz faptul c ultima valoare scris va fi obinut.
Pentru a evita problemele poteniale legate de asincronie, i scriitorul i cititorul menin o variabil local status [0..n-1] pentru a guverna comunicarea; status[j] conine una
din valorile:
not-sent: mesajul pentru cea mai recent operaie n-a fost nc trimis lui pj (pentru c pj n-a confirmat un mesaj anterior)
not-acked: mesajul pentru cea mai recent operaie a fost trimis lui pj dar n-a fost confirmat de pj
n plus, fiecare procesor are un numrtor num-acks cu care-i numr rspunsurile primite n timpul operaiei curente.
Algoritm pentru simularea unui registru read/write cu MP
(codul pentru unicul scriitor)
Iniial status[j]=acked pentru j, seq=0 i pendinng=false
Cnd apare writew(v): // procesorul pw scrie n registru
pendinng:=true
1:
seq:=seq+1
2:
num-acks:=0
3:
for j do
4:
if status[j]=ackd then //are rspuns dat pentru operaia precedent
5:
enable sendw<newval, (v,seq)> to pj
6:
status[j]:=not-acked
7:
else status:=not-sent
8:
Cnd apare <ack> de la pj:
if not pending then status[j]:=acked //nici o operaie n execuie
9:
else if status[j]=not-sent then
//rspuns la un mesaj precedent
10:
enable sendw(<newval>, (v,seq)> to pj
11:
status[j]:=not-acked
12:
else
//rspuns la operaia curent
13:
status[j]:=acked
14:
num-acks:= num-acks+1
15:
16:
17:
18:
if
n
1 then
2
num - acks
pending:=false
enable ackw
//confirmare de la majoritatea
if
n
1 then
2
num - acks
pending:=false
enable returni(val)
Algoritm pentru simularea unui registru read/write cu MP
17:
18: