Documente Academic
Documente Profesional
Documente Cultură
C1 – Curs introductiv
Sistemele de timp real cunosc o dezvoltare rapidă, atât sub aspectul complexităţii şi al
performanţelor, dar mai ales în ceea ce priveşte aria lor de răspândire. Aceasta este o consecinţă a
perfecţionării continue a structurilor integrate de tip embedded şi a creşterii siguranţei lor în
funcţionare.
Sistemele de timp real sunt în general sisteme on-line, conectate nemijlocit cu alte sisteme fizice
pe care le monitorizează şi le conduc. Prin urmare, datele de intrare sunt preluate direct din procesul
monitorizat, prin intermediul terminalelor, senzorilor, camerelor video etc., iar informaţia de
răspuns este transmisă direct în sistemului condus. Dacă sistemul de calcul preia datele de intrare
şi generează informaţia de răspuns într-un timp suficient de scurt pentru a putea controla
corespunzător desfăşurarea procesului, se spune că lucrează în timp real. Aşadar, caracteristica
principală a unui sistem de timp real este timpul de răspuns, care reflectă perioada necesară
sistemului pentru a genera un răspuns adecvat la un eveniment extern. Altfel spus, timpul de
răspuns este perioada dintre momentul producerii unei schimbări de stare în sistemul condus şi
momentul în care echipamentul de conducere generează un răspuns adecvat la această schimbare.
Dintre cerinţele de performanţă impuse sistemelor de timp real se disting două elemente, şi
anume:
• O viteză de reacţie corespunzătoare la schimbările de stare din proces – Sistemul trebuie să
asigure timpi de răspuns care să se încadreze în limite prestabilite, de cele mai multe ori deosebit
de severe.
• Siguranţă în funcţionare – Sistemele de timp real trebuie să aibă o fiabilitate ridicată şi o
securitate deosebită. De asemenea, trebuie să aibă capacitatea de a evita situaţiile critice şi de a
limita consecinţele unor defecţiuni grave. După o întrerupere accidentală sistemul trebuie să
permită o repunere cât mai repidă în funcţiune.
Se pot evidenţia două clase de sisteme de timp real cu caracteristici specifice, şi anume:
• Sisteme de monitorizare şi conducere a unor procese cu evoluție continuă și/sau discretă
(procese tehnologice sau alte procese similare);
• Sisteme tranzacţionale din sfera serviciilor.
1
Fig. 1 - Schema bloc a unui sistem de conducere a unui proces
2
1.2 Sisteme tranzacţionale
Un sistem tranzacţional implică utilizarea unui număr mare de terminale de la care utilizatorii
introduc comenzi predefinite ca semnificaţie şi formate de introducere, numite tranzacţii, solicitând
efectuarea unor prelucrări şi afişarea rezultatelor într-un timp cât mai scurt. Sistemele
tranzacţionale se întâlnesc în sfera serviciilor. Ca exemple relevante pot fi menţionate: sistemele de
telefonie mobilă, sistemele ce deservesc reţele de bancomate sau cele care permit plata cu cardul,
sistemele pentru comerţul online etc. Structura funcţională a unui sistem tranzacţional este
prezentată în Fig. 2.
T1 Analizor
sintactic
Tn
Comenzile de la terminale sunt lansate în mod aleatoriu, iar performanţele de timp de răspuns
trebuie asigurate şi în condiţiile cele mai nefavorabile, când fluxul intrărilor este mare. Problemele
sunt legate de asigurarea unei capacităţi ridicate de prelucrare şi de gestiune a firelor de aşteptare.
Siguranţa datelor memorate pe arii de discuri este de asemenea esenţială.
Oganizarea corespunzătoare a aşteptării la nivelul monitorului de tranzacţii, fructificarea
paralelismului la nivelul unităţilor de prelucrare sau organizarea bazei de date astfel încât să se
reducă timpii de căutare au o importanţă deosebită pentru creşterea performanţelor de timp de
răspuns.
3
Paralelismul în executarea proceselor concurente semnifică faptul că la un moment dat pot fi
active (începute şi neterminate) mai multe taskuri care concurează pentru obţinerea resurselor
necesare executării lor. Concurenţa ridică probleme de alocare a resurselor comune (unitate
centrală, memorie, variabile comune, fişiere partajate etc.) şi de evitare a situaţiilor de interblocaj
ce ar putea apărea.
În aplicaţiile de timp real trebuie identificate toate situaţiile critice din punct de vedere al
timpului de răspuns, pentru fiecare eveniment important. Referitor la restricţiile de timp de răspuns,
pentru unele evenimente limita se impune asupra valorii medii (o restricţie mai puţin severă), dar
pentru alte evenimente, orice valoare a timpului de răspuns nu trebuie să depăşească o valoare
limită impusă.
Un ansamblu de programe pentru o aplicaţie de timp real complexă are următoarele
caracteristici generale:
• Este compus dintr-un număr mare de procese de sine stătătoare. Interacţiunea între programele
concurente este foarte intensă, aceastea fiind părţi ale aceleiaşi aplicaţii;
• Trebuie să facă faţă unor cerinţe severe de timp de răspuns;
• Trebuie să asigure o mare siguranţă în funcţionare deoarece o eroare în realizarea funcţiilor
specifice poate conduce la efecte grave, uneori inacceptabile;
• Trebuie să asigure interfaţa cu o gamă largă de dispozitive externe;
• Trebuie să aibă capacitatea de evitare a situaţiilor de avarie la apariţia unei erori şi să asigure o
reluare facilă a procesului după remediere;
• Trebuie să aibă fiabilitate şi disponibilitate ridicată;
• Trebuie să fie flexibil pentru adaptarea la posibile modificări în proces.
Asigurarea unei fiabilităţi ridicate impune aplicarea unor tehnici de lucru în spiritul programării
defensive (engl. defensive programming), de preîntâmpinare a apariţiei erorilor. De asemenea,
pentru aplicaţii deosebite trebuie implementate tehnici de toleranţă la erori. Grija pentru reducerea
timpului de răspuns trebuie să fie permanentă. De remarcat că implementarea toleranţei la erori
poate afecta semnificativ performanţele de timp de răspuns, ceea ce impune găsirea unor soluţii de
compromis care să aibă în vedere siguranţa în funcţionare, pe de o parte, şi restricţiile de timp de
răspuns, pe de altă parte.
Cursul este structurat în două părţi: prima partea tratează problematica fiabilităţii şi siguranţei
în funcţionare, iar partea a doua este dedicată programării concurente specifice aplicaţiilor de timp
real.
4
3. Fiabilitatea şi siguranţa în funcţionare
Termenul de fiabilitate se referă la capacitatea unui sistem de a-şi conserva în timp proprietăţile
iniţiale, de a nu se defecta, în condiţii de exploatare corespunzătoare. Din punct de vedere cantitativ,
fiabilitatea reprezintă probabilitatea ca sistemul să-şi conserve starea de bună funcţionare de la
început într-un interval de timp specificat. Fiabilitatea este o cerinţă importantă pentru orice sistem
tehnic, dar pentru unele sisteme de mare importanţă funcţională o fiabilitate înaltă este o cerinţă
esenţială.
În general, sunt două posibilităţi complementare de creştere a fiabilităţii unui sistem complex.
O primă cale este aceea a simplificării structurii şi a folosirii unor componente de calitate superioară.
Practica a arătat însă că numai pe această cale fiabilitatea unui sistem complex nu poate fi crescută
oricât de mult, nici măcar pe intervale scurte de timp. Oricât de fiabile ar fi componentele, defecte
tot pot apărea ca urmare a unor perturbaţii mai severe pentru regimul normal de funcţionare.
Aceasta a condus la o nouă abordare a problematicii fiabilităţii, bazată pe ideea că într-o anumită
măsură apariţia defectelor trebuie acceptată iar sistemul trebuie să fie capabil să tolereze prezenţa
lor. Ca urmare, cea de a doua cale de creştere a fiabilităţii este implementarea toleranţei la defecte
(engl. fault tolerance).
Toleranţa la defecte defineşte capacitatea unui sistem de a-şi menţine funcţionarea corectă la
apariţia anumitor defecte, fără o intervenţie din exterior. Toleranţa la defecte se obţine întotdeauna
printr-o suplimentare a părţii hardware şi/sau software. Pe lângă redundanţa hardware sau
software mai apare şi o redundanţă de date sau o redundanţă de timp (de exemplu, o structură de
discuri magnetice într-o configuraţie RAID).
Odată cu scăderea spectaculoasă a preţului circuitelor integrate, toleranţa la defecte este tot
mai mult implementată în sistemele digitale, ceea ce permite realizarea unor sisteme de înaltă
fiabilitate.
O altă cerinţă importantă pentru un sistem tehnic este mentenabilitatea. O mentenabilitate
ridicată presupune asigurarea prin proiectare a unei structuri modulare şi a unei testabilităţi facile
(engl. design for testability), existenţa unor instrumente de diagnosticare performante şi a unei
documentaţii de service adecvate, piese de schimb, personal de întreţinere calificat etc.
Conceptul de disponibilitate reuneşte aspectele legate de fiabilitate şi de mentenabilitate şi
exprimă probabilitatea ca un sistem să funcţioneze corect la un moment dat, indiferent dacă
anterior au avut loc defectări şi reparări. Astfel, pentru creşterea disponibilităţii unui echipament se
poate acţiona pentru reducerea defectărilor, pe de o parte, şi scăderea perioadei de remediere în
caz de defectare, pe de altă parte. Dacă se acceptă ipoteza staţionarităţii, disponibilitatea exprimă
procentul perioadelor de bună funcţionare. O disponibilitate mare se impune din considerente
economice.
La sistemele complexe, de mare răspundere funcţională, cele trei concepte sunt încă insuficiente
pentru a caracteriza capacitatea sistemului de a-şi îndeplini funcţiile sale specifice.
5
Pentru aceste sisteme este importantă şi securitatea (engl. safety) care exprimă capacitatea unui
sistem de a furniza numai rezultate corecte sau, altfel spus, de a evita o funcţionare defectuoasă.
Din punct de vedere cantitativ, securitatea este probabilitatea ca într-un interval de timp dat
sistemul să nu furnizeze rezultate greşite şi să nu genereze comenzi eronate. Pentru orice
echipament complex, a cărui defectare nu poate fi exclusă, o securitate înaltă nu poate fi atinsă
decât printr-o autotestare realizată în timpul funcţionării normale (engl. on-line testing).
Autotestarea poate fi implementată la nivelul sistemului în ansamblu sau la nivelul modulelor critice
din sistem. Ca o remarcă, unele elemente de autotestare se regăsesc la toate sistemele de calcul.
Două exemple sunt tipice: folosirea bitului de paritate la transmisiile seriale şi a codurilor de control
la memorarea datelor pe discul magnetic.
Siguranţa în funcţionare este un concept mai larg care reflectă fiabilitatea şi securitatea unui
echipament de mare importanţă, dar şi capacitatea acestuia de a evita situaţiile de avarie care ar
putea apărea în timpul funcţionării, sau de a limita consecinţele unei defectări grave. În cazul
apariţiei unui defect acesta trebuie detectat în mod automat şi suficient de repede pentru ca
procesul condus să fie dirijat într-o stare nepericuloasă. Ca exemplu, într-un sistem de dirijare a
traficului, în cazul unei defecţiuni la sistemul de control lămpile de semnalizare trebuie să arate
culoarea roşie pentru a se evita producerea de accidente în trafic. Siguranţa în funcţionare implică
şi o capacitate mare de refacere după eroare.
Mărimile legate de calitatea dinamică a unui sistem sunt reunite în conceptul de eficienţă globală
(engl. dependability). Pentru a exprima mai riguros aceste mărimi să specificăm mai întăi stările în
care în care poate evolua sistemul în perioada de exploatare.
• 𝑆𝑓𝑛 − Starea de funcţionare normală care cuprinde şi situaţiile în care deşi au apărut defecte
sistemul continuă să furnizeze rezultate corecte, în sensul că sistemul tolerează defectele
apărute.
• 𝑆𝑓𝑒 − Starea de funcţionare eronată în care sistemul furnizează rezultate greşite, deşi se crede
că funcţionează corect; este o stare periculoasă care trebuie evitată, pe cât posibil.
• 𝑆𝑚𝑝 − Stare de mentenanţă preventivă. Sistemul este oprit pentru o verificare amplă, când se
urmăreşte detectarea eventualelor defecte latente care ar putea să se manifeste într-un regim
de funcţionare mai sever. Se verifică atât partea de hardware cât şi cea de software, de obicei
în cadrul unor programe de verificare şi întreţinere periodică.
• 𝑆𝑚ℎ − Stare de mentenanţă corectivă a părţii hardware. Remedierea se poate face prin
intervenţia echipei de service sau prin reconfigurare automată.
• 𝑆𝑚𝑠 − Stare de mentenanţă a părţii de software. Se verifică consecinţele defectelor hardware
asupra software-ului. Are loc reconstituirea tuturor programelor şi aducerea lor la punctul de
întrerupere care să permită reluarea funcţionării procesului condus. Reconstituirea se poate
face manual sau automat.
Fie 𝑆𝑡(𝑡) starea sistemului la momentul 𝑡. Pe baza acestui model se definesc următoarele funcţii.
6
• Fiabilitatea 𝑅(𝑡) este probabilitatea ca sistemul să rămână în stare de bună funcţionare în
intervalul [0, 𝑡). Sau altfel, 𝑅(𝑡) este probabilitatea ca sistemul funcţional la momentul 0 să nu se
defecteze până la momentul t .
Consideraţii finale: Importanţa fiecărei mărimi din sfera eficienţei globale depinde de tipul
sistemului şi de condiţiile specifice de exploatare. Astfel, pentru calculatoarele de uz general, de
exemplu, indicatorii mai folosiţi sunt fiabilitatea şi mentenabilitatea. Pentru reţelele de calculatoare
complexe, disponibilitatea exprimă cel mai bine cerinţele utilizatorilor. În cazul unor sisteme de
mare răspundere funcţională însă, cum ar fi sistemele informatice bancare sau sistemele de dirijare
a traficului, se impune înainte de toate o securitate deosebită.
7
Sisteme de timp real
C2 - Fiabilitatea şi siguranţa în funcţionare – continuare
Între mărimile din sfera fiabilităţii şi siguranţei în funcţionare definite anterior există o strânsă
interdependenţă. Următoarele două exemple evidenţiază acest lucru.
1
1
Pentru sistemul neredundant, 𝑡𝑓𝑚 = 𝜆 iar 𝑡𝑟𝑚 = 𝜏2 . În cazul sistemului redundant, cu facilităţi
1
de diagnosticare automată, 𝑡𝑓𝑚 = 𝛼𝜆, iar 𝑡𝑟𝑚 = 𝑐𝜏1 + (1 − 𝑐)𝜏2 . Aşadar, pentru sistemul
neredundant, disponibilitatea este
𝑡𝑓𝑚 1/𝜆 1
𝐷𝑛𝑟 = 𝑡 = 1/𝜆+𝜏 = 1+𝜆𝜏 , (2)
𝑓𝑚 +𝑡𝑟𝑚 2 2
din care se deduce condiţia cu privire la coeficientul de multiplicare 𝛼 pentru ca soluţia de creştere
a disponibilităţii să fie viabilă, şi anume:
𝜏2
𝛼< . (4)
𝑐𝜏1 +(1−𝑐)𝜏2
72
Cu valorile date, rezultă 𝛼 < 0,9⋅24+0,1⋅72 < 2,50. Ceea ce înseamnă că atât timp cât structura de
autodiagnosticare nu depăşeşte în complexitate sistemul neredundant cu mai mult de 50%, soluţia
propusă pentru creşterea disponibilităţii este viabilă. Se remarcă faptul că rata de defectare 𝜆 nu
intervine în relaţia finală.
În continuare, sunt evidenţiate anumite aspecte legate de sistemele cu structură suplimentară
de control pentru creşterea securităţii.
Intrãri •
Unitate • Iesiri
de bazã functionale
Unitate Semnal
de control de control
2
Tabelul 1 − Stările sistemului autocontrolabil.
Semnal de Stare 𝑈𝐶
Stare 𝑈𝐵
control 𝐵𝐹 𝐷
𝐵𝐹 𝑆1 𝑆2
Funcţionare 𝐷𝐷 − 𝑆3
𝐷𝑁 𝑆4 𝑆5
𝐵𝐹 − 𝑆6
Oprire 𝐷𝐷 𝑆7 𝑆8
𝐷𝑁 − 𝑆9
Aşa cum rezultă din acest tabel, stările 𝑆3 , 𝑆4 şi 𝑆5 pot fi apreciate ca “periculoase”, starea 𝑆2 ca
“norocoasă”, iar 𝑆6 ca stare de “oprire abuzivă”.
Pentru sistemul redundant, starea de funcţionare normală în raport cu care se defineşte funcţia
de fiabilitate este 𝑆𝑓𝑛 = {𝑆1 , 𝑆2 }, iar starea de funcţionare eronată în raport cu care se defineşte
funcţia de securitate este 𝑆𝑓𝑒 = {𝑆3 , 𝑆4 , 𝑆5 }.
Fie 𝑝𝑖 (𝑡) probabilitatea ca sistemul să se afle în starea 𝑆𝑖 la momentul 𝑡:
𝑝𝑖 (𝑡) = prob(𝑆𝑡(𝑡) = 𝑆𝑖 ), 𝑖 = 1, 2, … , 9.
Să presupunem că pentru cele două module componente, 𝑈𝐵 şi 𝑈𝐶 , se cunosc funcţiile de
fiabilitate, 𝑅𝐵 (𝑡) şi respectiv, 𝑅𝐶 (𝑡). Pe baza lor se pot scrie următoarele relaţii cu privire la
probabilităţile de stare. Pentru simplificarea scrierii se renunţă la parametrul 𝑡 (fiind subînţeles).
𝑝1 = 𝑅𝐵 𝑅𝐶
𝑝4 = (1 − 𝑐)(1 − 𝑅𝐵 )𝑅𝐶
𝑝7 = 𝑐(1 − 𝑅𝐵 )𝑅𝐶
𝑝2 + 𝑝6 = 𝑅𝐵 (1 − 𝑅𝐶 ) (5)
𝑝3 + 𝑝8 = 𝑐(1 − 𝑅𝐵 )(1 − 𝑅𝐶 )
𝑝5 + 𝑝9 = (1 − 𝑐)(1 − 𝑅𝐵 )(1 − 𝑅𝐶 )
Se remarcă faptul că probabilităţile 𝑝2 , 𝑝3 şi 𝑝5 nu se pot disocia de probabilităţile 𝑝6 , 𝑝8 şi respectiv,
𝑝9 . Aşadar, în lipsa oricărei informaţii privind principiul de funcţionare şi structura unităţii de control,
modelul din Fig. 1 este prea general şi nu permite exprimarea funcţiei de fiabilitate 𝑅(𝑡), şi de
securitate 𝑆(𝑡), pe baza fiabilităţii elementelor componente, 𝑅𝐵 (𝑡) şi 𝑅𝐶 (𝑡). Modelul permite însă
o mai bună înţelegere a celor doi indicatori. Când unitatea de control are o securitate ridicată se
spune despre sistem că este autotestabil.
Dacă un sistem nu dispune de structuri suplimentare de control, atunci nivelul de securitate al
sistemului este dat de nivelul de fiabilitate. Când se urmăreşte un nivel de securitate peste nivelul
fiabilităţii, se impun structuri de autotestare care afectează însă fiabilitatea. Pentru a ilustra acest
aspect se consideră un circuit logic autotestabil realizat cu două circuite identice care funcţionează
în duplex, aşa cum se prezintă în figura următoare.
3
Circuit 1 • Iesire functionala
Intrãri •
(de baza)
Semnal de
control
Circuit 2
(de control)
Unitate de control
2. Indicatori de fiabilitate
Din punct de vedere calitativ fiabilitatea defineşte capacitatea unui sistem de a funcţiona fără
eroare o perioadă de timp specificată, în condiţii de exploatare corespunzătoare. Evenimentul care
marchează încetarea capacităţii sistemului de a-şi îndeplini funcţiile sale specifice se numeşte
defectare. Să considerăm, aşadar, variabila aleatoare 𝑋 ce exprimă timpul de bună funcţionare până
la prima defectare. Pe baza acestei variabile aleatoare se definesc următorii indicatori de fiabilitate,
care reflectă într-o anumită formă fiabilitatea sistemului.
• Funcţia de fiabilitate 𝑅(𝑡) sau probabilitatea de bună funcţionare,
𝑅(𝑡) = prob(𝑋 > 𝑡). (6)
Se presupune că la momentul 0 sistemul era în stare de bună funcţionare. Pentru estimarea
experimentală a valorii funcţiei de fiabilitate 𝑅(𝑇), pentru o durată 𝑇 dată (𝑇 se mai numeşte durata
misiunii), se poate organiza următorul experiment. O populaţie statistică (suficient de mare)
formată din 𝑁0 sisteme identice este urmărită în intervalul de timp [0, 𝑇]. Să presupunem că din
cele 𝑁0 sisteme, 𝑁 au rămas în funcţiune şi 𝑛 s-au defectat. 𝑅(𝑇) se estimează cu relaţia
𝑁
𝑅̂ (𝑇) = 𝑁 . (7)
0
4
De remarcat că performanţele de fiabilitate ale unui sistem depind de durata misiunii 𝑇. Pentru
a evidenţia acest lucru, în Fig. 3 se prezintă funcţiile de fiabilitate pentru două sisteme, din care
rezultă că pentru durata 𝑇1 sistemul 1 este mai fiabil decât sistemul 2, iar pentru durata 𝑇2 , invers.
R(t)
1 R1(t)
R2(t)
t
T1 T2
f (t)
(3) (2)
(1)
Δ𝑛𝑇 1 𝑁0 Δ𝑛𝑇 1
𝑧̂ (𝑇) = ⋅𝑁 ⋅ = ⋅ 𝑁 ℎ−1 . (13)
Δ𝑇 0 𝑁 Δ𝑇
Pentru foarte multe situaţii întâlnite în practică, forma grafică a funcţiei z(t), cunoscută şi sub
numele de „cadă de baie”, arată ca în Fig. 5. În această figură, zona I reflectă perioada de rodaj,
zona II corespunde perioadei de exploatare normală, iar zona III indică perioada în care se face
simţită uzura fizică.
5
z(t)
I II III
t
t1 t2
6
Sisteme de timp real
C3 – Modele de evaluare a fiabilităţii
Modelul de fiabilitate serie este cel mai simplu şi, totodată, cel mai des întâlnit în practică
întrucât corespunde sistemelor neredundante, indiferent de structura lor. Caracteristic pentru un
sistem neredundant este faptul că defectarea oricărui element duce la căderea sistemului.
Modelul de fiabilitate serie este reprezentat în figura următoare. În această reprezentare, un
sistem se consideră în stare de bună funcţionare dacă un semnal ipotetic poate străbate structura
de la intrare (𝑖) la ieşire (𝑜).
R1 R2 Ri Rn
i • • o
Fie 𝑋𝑖 variabila aleatoare ce exprimă timpul de bună funcţionare până la prima defectare a
elementului 𝑖 (𝑖 = 1, 2, … , 𝑛) şi 𝑋 variabila aleatoare compusă ce reprezintă timpul de bună
funcţionare a sistemului în ansamblu. Întrucât defectarea oricărui element duce la căderea
sistemului,
𝑋 = 𝑚𝑖𝑛{ 𝑋1 , 𝑋2 , … , 𝑋𝑛 }. (18)
Fie 𝑅𝑖 (𝑡) funcţia de fiabilitate a elementului 𝑖 (𝑖 = 1, 2, … , 𝑛). Întrucât buna funcţionare a
sistemului implică buna funcţionare a tuturor elementelor componente, funcţia de fiabilitate a
sistemului cu structură serie 𝑅𝑆 (𝑡) este dată de relaţia
1
𝑅𝑆 (𝑡) = ∏𝑛𝑖=1 𝑅𝑖 (𝑡) ≤ 𝑚𝑖𝑛{𝑅𝑖 (𝑡)}. (19)
𝑖
Rn
Ri
i • • • • o
R1
Aşa cum se prezintă în figură, caracteristic pentru un sistem cu structură fiabilistică de tip paralel
(indiferent de structura sa funcţională) este faptul că pentru buna funcţionare a sistemului este
suficientă funcţionarea doar a uneia dintre componente. Dacă 𝑋𝑖 exprimă timpul de bună
funcţionare până la prima defectare pentru componenta 𝑖 (𝑖 = 1, 2, … , 𝑛), iar 𝑋 este timpul de
bună funcţionare a sistemului în ansamblu, se poate scrie relaţia
𝑋 = max {𝑋1 , 𝑋2 , … , 𝑋𝑛 }. (21)
Prin urmare, fiabilitatea sistemului cu structură paralel este mai mare decât fiabilitatea oricăreia
dintre elementele sale. Pentru determinarea fiabilităţii sistemului este mai uşor să se opereze cu
probabilităţi de defectare. Astfel, funcţia de nonfiabilitate a sistemului redundant 𝐹𝑃 (𝑡) este
𝐹𝑝 (𝑡) = ∏𝑛𝑖=1 𝐹𝑖 (𝑡) (22)
Dacă componentele sunt identice atunci 𝑅1 (𝑡) = 𝑅2 (𝑡) = 𝑅(𝑡) și relația se simplifică:
Aşa cum este ilustrat în Fig. 8, folosirea unei rezerve active asigură o creştere semnificativă a
fiabilităţii, dar cu un cost deosebit.
R(t)
1
Sistem redundant cu rezerva activa
Pentru determinarea timpului mediu de bună funcţionare a unui sistem cu model de fiabilitate
paralel, compus din 𝑛 elemente identice cu rata medie de defectare 𝜆, se pleacă de la observaţia că
până la căderea sistemului sunt 𝑛 perioade distincte, notate 𝑌1 , 𝑌2 , … , 𝑌𝑛 , în care sistemul
funcţionează cu 𝑛 elemente, cu 𝑛 − 1 elemente, ş.a.m.d., în ultima perioadă, cu un singur element.
Variabila aleatoare 𝑋 este dată de relaţia
𝑋 = ∑𝑛𝑖=1 𝑌𝑖 . (27)
Să admitem că variabile aleatoare 𝑌1 , 𝑌2 , … , 𝑌𝑛 au repartiţii exponenţial-negative. Parametrii lor
sunt 𝑛𝜆, (𝑛 − 1)𝜆, … , 𝜆. Aplicând proprietatea de linearitate la calculul mediei, rezultă
1 1 1 𝐻𝑛
𝑀𝑇𝐵𝐹 = 𝑀[𝑋] = 𝑀[∑𝑛𝑖=1 𝑌𝑖 ] = ∑𝑛𝑖=1 𝑀[𝑌𝑖 ] = ∑𝑛𝑖=1 𝑖𝜆 = 𝜆 ∑𝑛𝑖=1 𝑖 = . (28)
𝜆
De exemplu, pentru 𝑛 = 2,
1 1 1.5
𝑀𝑇𝐵𝐹(𝑛=2) = (1 + 2) 𝜆 = , ceea ce înseamnă o creştere de 50% faţă de varianta
𝜆
neredundantă.
Dacă 𝑛 = 3,
1 1 1
𝑀𝑇𝐵𝐹(𝑛=3) = (1 + 2 + 3) 𝜆, ceea ce înseamnă că a doua rezervă aduce o creştere de 33,3%.
În concluzie, prima rezervă conduce la o creştere a 𝑀𝑇𝐵𝐹 cu 50% faţă de varianta neredundantă, a
doua rezervă, la o creştere cu 33,3%, a treia, la o creştere cu 25% ş.a.m.d.
3
3.3 Model de fiabilitate pentru sisteme cu rezerve pasive
Se consideră un sistem care funcţionează cu un modul de bază şi care mai are alte (𝑛 − 1)
module de rezervă identice, menţinute în stare pasivă. Rata medie de defectare a modulului în
funcţiune este 𝜆. Fiind pasive (nesolicitate), modulele de rezervă nu se pot defecta. Să presupunem
şi că înlocuirea unui modul defect cu altul de rezervă se face fără incident.
Dacă 𝑋𝑖 este timpul de bună funcţionare pentru modulul 𝑖, atunci timpul de bună funcţionare a
sistemului cu rezerve pasive este
𝑋 = ∑𝑛𝑖=1 𝑋𝑖 . (29)
𝑋1 𝑋2 𝑋3 ⋯ 𝑋𝑛−1 𝑋𝑛
𝑡
defectare
Fig. 9 – Evoluţia sistemului cu rezerve pasive până la defectare.
(𝜆𝑡)𝑖
𝑅𝑃 (𝑡) = ∑𝑛−1
𝑖=0 𝑒 −𝜆𝑡 . (31)
𝑖!
De remarcat că expresia (30) cuprinde primii 𝑛 termeni ai repartiţiei Poisson de parametru 𝜆𝑡.
Explicaţia este simplă. Ţinând cont de dualismul dintre o variabilă aleatoare continuă cu repartiţie
exponenţial-negativă şi o variabilă aleatoare discretă cu repartiţie Poisson, rezultă că fluxul
defectărilor produse în sistemul redundant este un flux poissonian de parametru 𝜆. Fie 𝑁(𝜆, 𝑡)
variabila aleatoare discretă care exprimă numărul defectărilor produse în sistem în intervalul de
timp [0, 𝑡). Astfel, probabilitatea ca în intervalul specificat numărul defectărilor să fie 𝑖 este dat de
relaţia:
(𝜆𝑡)𝑖
𝑃𝑟𝑜𝑏 (𝑁(𝜆, 𝑡) = 𝑖) = 𝑒 −𝜆𝑡 , 𝑖 = 0, 1, … , 𝑛 − 1, 𝑛. (32)
𝑖!
Sistemul redundant are 𝑛 variante de succes: când nu se produce nicio defectare în intervalul de
timp [0, 𝑡), sau când numărul de defectări este mai mic decât 𝑛 (doar cu ultima defectare se produce
şi căderea sistemului). Prin urmare, sumând primii 𝑛 termeni ai repartiţiei Poisson de parametru 𝜆𝑡
se obţine expresia (30).
Pentru un sistem cu o singură rezervă (𝑛 = 2), funcţia de fiabilitate este
4
Creşterea fiabilităţii este ilustrată în figura următoare.
R(t)
În ceea ce priveşte media timpului de bună funcţionare (𝑀𝑇𝐵𝐹) aceasta este de 𝑛 ori mai mare faţă
de varianta neredundantă. Într-adevăr,
𝑛
𝑀𝑇𝐵𝐹 = 𝑀[𝑋] = 𝑀 [∑𝑛𝑖=1 𝑋𝑖 ] = ∑𝑛𝑖=1 𝑀[𝑋𝑖 ] = 𝜆 . (35)
Redundanţa globală este adesea costisitoare şi de aceea în multe cazuri se asigură elemente de
rezervă doar pentru componentele cu fiabilitate mai mică, sau cu poziţie cheie în sistem. Pentru
aceste sisteme modelul de fiabilitate are o structură serieparalel, iar funcţia de fiabilitate se obţine
aplicând succesiv regulile anterioare.
În figura următoare (Fig. 10) sunt date câteva exemple. Pentru simplificarea scrierii funcţiei de
fiabilitate se renunţă la argumentul 𝑡, ca fiind implicit.
R2
R1 𝑅𝑆𝑃 = 𝑅1 (1 − (1 − 𝑅2 )(1 − 𝑅3 ))
• • •
= 𝑅1 (𝑅2 + 𝑅3 − 𝑅2 𝑅3 )
R3 = 𝑅1 𝑅2 + 𝑅1 𝑅3 (1 − 𝑅2 ) .
a)
R1 R3
• • • • • 𝑅𝑆𝑃 = (1 − (1 − 𝑅1 )(1 − 𝑅2 )) × (1 − (1 − 𝑅3 ) (1 − 𝑅4 ))
= (𝑅1 + 𝑅2 (1 − 𝑅1 )) × (𝑅3 + 𝑅4 (1 − 𝑅3 ))
R2 R4
b)
5
R1 R3
• • • • 𝑅𝑃𝑆 = 1 − (1 − 𝑅1 𝑅3 )(1 − 𝑅2 𝑅4 )
= 𝑅1 𝑅3 + 𝑅2 𝑅4 (1 − 𝑅1 𝑅3 ).
R2 R4
c)
R2
R1 R3
• • • •
𝑅𝑆𝑃 = 𝑅1 (1 − (1 − 𝑅2 )(1 − 𝑅3 )(1 − 𝑅4 ))
R4
d)
În toate cazurile considerate rezervele sunt menţinute în stare activă, fiind solicitate în aceeaşi
măsură cu modulul de bază. Aceasta permite ca la nevoie comutarea pe rezervă să se facă imediat
sau într-un timp foarte scurt. Se admite că operaţia de comutare pe rezervă se face fără incident şi
de aceea comutatorul nu se reflectă în modelul de fiabilitate. Cazul cu rezervă pasivă sau cu
comutator imperfect va fi studiat ulterior, modelul serie-paralel nefiind adecvat.
6
Sisteme de timp real
Pentru sistemele de mare răspundere funcţională, cu durata misiunii limitată, o tehnică des
folosită pentru asigurarea unei fiabilităţi înalte constă în implementarea unei structuri cu
redundanţă statică triplu modulară (𝑇𝑀𝑅 – engl. Triple Modular Redundancy). Cum arată şi numele,
trei module compatibile 𝑀1 , 𝑀2 , 𝑀3 funcţionează în paralel, iar valoarea de ieşire este stabilită de
un bloc de decizie, numit 𝑣𝑜𝑡𝑒𝑟, care lucrează pe principiul logicii majoritare 2 din 3. Această
structură este prezentată în figura următoare (Fig. 11).
y1
M1
x y2 z
M2 V
y3
M3
Pentru circuite logice cu o singură ieşire, structura blocului de decizie este analizată în
continuare. Tabelul de adevăr pentru funcţia logică de ieşire 𝑧 şi diagrama V-K pentru sinteza acestei
funcţii sunt următoarele:
𝑦1 y1
𝑦2
𝑧 y2 z
𝑦3 y3
a) b)
Fig. 13 – Structură de voter pentru circuite cu o singură ieşire.
1
Se verifică uşor că dacă la intrările logice sunt cel puţin două valori de 1, la ieşirea voterului se
obţine 1, iar dacă sunt cel puţin două valori de 0, la ieşire se obţine 0.
Cel mai adesea modulele sunt identice. Fie 𝑅(𝑡) funcţia de fiabilitate a unui modul. Pentru
calculul fiabilităţii acestei structuri să presupunem mai întâi că voterul este ideal. Având în vedere
că structura 𝑇𝑀𝑅 poate tolera defectarea unui modul din cele trei, oricare ar fi acesta, funcţia de
fiabilitate poate fi exprimată cu relaţia:
Impunând ca 𝑅𝑇𝑀𝑅 (𝑡) ≥ 𝑅(𝑡), rezultă condiţia 3𝑅(𝑡) − 2𝑅 2 (𝑡) ≥ 1. Cum pentru ecuaţia de
gradul al II-lea care rezultă (−2𝑅 2 + 3𝑅 − 1 = 0), rădăcinile sunt 𝑅1 = 0.5 şi 𝑅2 = 1, pentru
îndeplinirea condiţiei impuse este necesar ca 𝑅(𝑡) ≥ 0,5. Aşa cum se arată şi în Fig. 14, structura
𝑇𝑀𝑅 asigură o creştere a fiabilităţii numai pentru o perioadă limitată de timp [0, 𝑡0 ).
𝑙𝑛 2 0,7
Dacă 𝑅(𝑡) = 𝑒 −𝜆𝑡 , impunând condiţia ca 𝑅(𝑡0 ) = 0.5 rezultă că 𝑡0 = ≈ .
𝜆 𝜆
R(t)
TMR
1
Sistem neredundant
0,5
t
t0
Să analizăm timpul mediu de bună funcţionare pentru o structură 𝑇𝑀𝑅. Dacă voterul este ideal
iar pentru cele trei module 𝑅(𝑡) = 𝑒 −𝜆𝑡 , rezultă relaţia:
∞ ∞ 3 2 5 1
𝑀𝑇𝐵𝐹𝑇𝑀𝑅 = ∫0 3𝑒 −2𝜆𝑡 𝑑𝑡 − ∫0 2𝑒 −3𝜆𝑡 𝑑𝑡 = 2𝜆 − 3𝜆 = 6𝜆 < 𝜆. (34)
∞ 1 ∞ 1 1
𝑃𝑟𝑒𝑐𝑖𝑧𝑎𝑟𝑒: S-a aplicat relaţia de calcul: ∫0 𝑒 −𝑘𝜆𝑡 𝑑𝑡 = − 𝑘𝜆 𝑒 −𝑘𝜆𝑡 | = 0 − (− 𝑘𝜆) = 𝑘𝜆.
0
Pentru verificare, să analizăm evoluţia structurii 𝑇𝑀𝑅 până la defectare, aşa cum se prezintă în
figura următoare (Fig. 15).
𝑆1 𝑆2 𝑆3
3𝜆 2𝜆
3M 2M M
2
Stările de bună funcţionare sunt 𝑆1 şi 𝑆2 . Plecând de la timpul mediu de menţinere a sistemului în
fiecare stare de bună funcţionare, rezultă relaţia:
1 1 5
𝑀𝑇𝐵𝐹𝑇𝑀𝑅 = 3𝜆 + = 6𝜆 .
2𝜆
Relaţia (34) arată faptul că la structura 𝑇𝑀𝑅 timpul mediu de bună funcţionare se reduce cu
aproximativ 16% faţă de varianta neredundantă. Reducerea este şi mai importantă în cazul realist
cu voter imperfect. Ca urmare, tehnica 𝑇𝑀𝑅 trebuie aplicată numai pentru sisteme cu durata
misiunii limitată, nu şi pentru sisteme de folosinţă îndelungată.
Tehnica 𝑇𝑀𝑅 este folosită şi pentru creşterea fiabilităţii programelor. Astfel, trei echipe de
programatori realizează în mod independent variante diferite de program plecând de la specificaţii
comune. Pentru stabilirea rezultatelor sunt rulate toate cele trei variante de program. Pe lângă
costul ridicat al implementării, trebuie remarcată şi redundanţa de timp care intervine la aplicarea
acestei tehnici de creştere a siguranţei în funcţionare.
Reamintim faptul că o structură cu redundantă triplu modulară (TMR) are două neajunsuri
importante, şi anume:
- fiabilitatea structurii este mai mare decât a sistemului neredundant doar pe o durată limitată;
- media timpului de bună funcţionare este mai scăzută decât în cazul sistemului neredundant
cu cel puţin 16,6%.
Dacă la această structură se adaugă însă şi facilităţi de control atunci performanţele sistemului
redundant se îmbunătăţesc considerabil. Schema bloc a unei astfel de structuri redundante este
prezentată în figura următoare.
Activarea unui semnal de eroare 𝑒𝑖 , 𝑖 = 1,2, 3, marchează prima defectare produsă în sistem,
mai precis a modulului 𝑀𝑖 . La defectarea unui modul, sistemul îşi continuă funcţionarea normală ca
urmare a redundanţei, dar îşi pierde toleranţa la defectări. De aceea, se recomandă ca în timpul cel
mai scurt (la prima oprire sau, dacă nu este posibil, la prima revizie) să se înlocuiască modulul defect
pentru revenirea la starea de teleranţă de la început. Astfel, pentru structura 𝑇𝑀𝑅 se asigură o
fiabilitate şi o siguranţă în funcţionare deosebite. Să analizăm în continuare structura logicii de
3
control. La prima defectare ieşirea voter-ului nu este afectată. Ca urmare, aşa cum se arată în Fig.
16, pentru identificarea modulului defect se pot compara mărimile 𝑦1 , 𝑦2 , 𝑦3 cu ieşirea voterului,
luată ca referinţă. Să analizăm în continuare şi o altă variantă de implementare.
Sinteza logicii de control pe baza tabelei de adevăr
Să considerăm tabela de adevăr pentru logica adiţională de control, aşa cum este prezentată în
continuare.
Tabelul 1 – Tabela de adevăr pentru logica de control
𝑦1 𝑦2 𝑦3 𝑒1 𝑒2 𝑒3
0 0 0 0 0 0
0 0 1 0 0 1
0 1 0 0 1 0
0 1 1 1 0 0
1 0 0 1 0 0
1 0 1 0 1 0
1 1 0 0 0 1
1 1 1 0 0 0
Pe baza tabelului de adevăr se pot scrie următoarele expresii logice pentru mărimile de ieşire:
𝑒1 = ̅̅̅
𝑦1 𝑦2 𝑦3 + 𝑦1 ̅̅̅
𝑦2 ̅̅̅ 𝑦1 𝑦2 𝑦3 + 𝑦1 ̅̅̅
̅̅̅ 𝑦2 𝑦3 = ̅̅̅̅̅̅̅̅̅̅̅̅̅̅̅̅̅̅̅̅̅
𝑦3 = ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿ ̅̅̅̅̅̅̅̅̅̅
𝑦1 𝑦2 𝑦3 ∙ ̅̅̅̅̅̅̅̅̅̅
̅̅̅ 𝑦1 ̅̅̅
𝑦2 𝑦3
𝑒2 = 𝑦1 ̅̅̅𝑦
𝑦2 3 + ̅̅̅ 𝑦3 = ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿
𝑦1 𝑦2 ̅̅̅ 𝑦1 ̅̅̅𝑦
𝑦2 3 + ̅̅̅
𝑦1 𝑦2 ̅̅̅ ̅̅̅̅̅̅̅̅̅̅̅̅̅̅̅̅̅̅̅̅̅̅
𝑦3 = ̅̅̅̅̅̅̅̅̅̅
𝑦 𝑦2 3 ∙ ̅̅̅̅̅̅̅̅̅̅
1 ̅̅̅𝑦 𝑦1 𝑦2 ̅̅̅
̅̅̅ 𝑦3 (35)
𝑒3 = 𝑦1 𝑦2 ̅̅̅
𝑦3 + ̅̅̅
𝑦1 ̅̅̅𝑦 𝑦1 𝑦2 ̅̅̅
𝑦3 + ̅̅̅ 𝑦2 3 = ̅̅̅̅̅̅̅̅̅̅̅̅̅̅̅̅̅̅̅̅̅
𝑦2 3 = ̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿̿
𝑦1 ̅̅̅𝑦 ̅̅̅̅̅̅̅̅̅̅
𝑦3 ∙ ̅̅̅̅̅̅̅̅̅̅
𝑦1 𝑦2 ̅̅̅ 𝑦1 ̅̅̅𝑦
̅̅̅ 𝑦2 3
Rezultă o structură logică care depinde doar de mărimile 𝑦1 , 𝑦2 , 𝑦3 aşa cum se prezintă în figura
următoare.
𝑦3
𝑀3
𝑥 𝑦2 𝑧
𝑀2 V
𝑦1
𝑀1
𝑒3 𝑒2 𝑒1
Fig. 16 – Logică de generare a semnalelor de control pentru structura 𝑇𝑀𝑅 (varianta II).
De precizat că această logică funcţionează corect numai până la momentul producerii primei
defectări. După acest moment logica de control trebuie dezactivată până la refacerea stării de
toleranţă de la început.
4
Temă pentru acasă:
1) Să se compare complexitatea celor două variante de implementare pentru a vedea care este
de preferat.
2) Care este deosebirea de fond între cele două variante de implementare?
Fie o structură redundantă care funcţionează cu trei module identice într-un aranjament iniţial
de tip 𝑇𝑀𝑅. La defectarea unui modul, în funcţie de obiectivul urmărit, o mai mare fiabilitate sau o
siguranţă în funcţionare mai ridicată, se poate alege continuarea funcţionării în una din următoarele
două variante:
1) Continuarea funcţionării în mod clasic, cu un singur modul fără autotestare – variantă
numită 𝑇𝑀𝑅/𝑆𝑖𝑚𝑝𝑙𝑒𝑥;
2) Continuarea funcţionării cu ambele module rămase funcţionale într-o structură
autotestabilă de mare siguranţă – variantă numită 𝑇𝑀𝑅/𝐷𝑢𝑝𝑙𝑒𝑥.
Să analizăm în continuare cele două structuri 𝑇𝑀𝑅 cu facilităţi de reconfigurare automată.
1) Structura 𝑇𝑀𝑅/𝑆𝑖𝑚𝑝𝑙𝑒𝑥
La o structură 𝑇𝑀𝑅, după defectarea unui modul, buna funcţionare a celorlalte două module
este strict necesară pentru buna funcţionare a sistemului. În consecinţă, în această perioadă cele
două module funcţionale trebuie privite ca elemente ale unui model de fiabilitate serie. De aceea,
este mai avantajos ca sistemul să continue operarea cu un singur modul funcţional, şi nu cu
amândouă. Acest argument privind îmbunătăţirea performanţelor de fiabilitate justifică realizarea
structurii reconfigurabile 𝑇𝑀𝑅/𝑆𝑖𝑚𝑝𝑙𝑒𝑥. Vom arăta în cele ce urmează că fiabilitatea acestei
structuri este într-adevăr superioară structurii 𝑇𝑀𝑅.
Într-o primă analiză facem abstracţie de fiabilitatea structurii adiţionale de decizie, control şi
reconfigurare, concentrându-ne astfel doar asupra celor 3 module componente.
Fie 𝑋1 , 𝑋2 , 𝑋3 variabilele aleatoare ce exprimă timpii de bună funcţionare pentru cele trei
module componente 𝑀1 , 𝑀2 , 𝑀3 . Pentru modulul ales să asigure continuarea funcţionării
sistemului, după defectarea altui modul, fie 𝑊 restul de timp până la defectare. Cu 𝑋 se notează
timpul până la defectare pentru sistemul redundant în ansamblu. Trebuie menţionat că pentru
proiectarea structurii de reconfigurare, modulul ales să continue funcţionarea la defectarea altui
modul se stabileşte de la început. Să considerăm că la defectarea unuia din cele trei module
componente continuarea se va realiza după cum se prezintă în tabelul următor.
5
Timpul de bună funcţionare a sistemului cu structură 𝑇𝑀𝑅/𝑆𝑖𝑚𝑝𝑙𝑒𝑥 se exprimă sub forma:
𝑋 = 𝑚𝑖𝑛{ 𝑋1 , 𝑋2 , 𝑋3 } + 𝑊.
Figura următoarea ilustrează mai bine semnificaţia variabilelor aleatoare introduse.
𝑊
𝑋1
𝑋2 reconfigurare
𝑋3
𝑚𝑖𝑛{ 𝑋1 , 𝑋2 , 𝑋3 }
defectare
X
𝑋 𝑀 asigură continuarea funcţionării
a) 𝑀2 se defectează şi 1
𝑋1
𝑋2
𝑊
𝑋3
reconfigurare defectare
𝑚𝑖𝑛{ 𝑋1 , 𝑋2 , 𝑋3 }
X
𝑋
b) 𝑀1 se defectează şi 𝑀3 asigură continuarea funcţionării
Prin urmare, funcţia de repartiţie pentru variabila aleatoare compusă 𝑋 ∈ 𝐻𝑖𝑝𝑜(3𝜆, 𝜆) are expresia,
3𝜆 𝜆 3 1
𝐹(𝜆, 𝑡) = 1 − 2𝜆 𝑒 −𝜆𝑡 + 2𝜆 𝑒 −3𝜆𝑡 = 1 − 2 𝑒 −𝜆𝑡 + 2 𝑒 −3𝜆𝑡 , 𝑡 ≥ 0. (37)
Este uşor de arătat că 𝑅𝑇𝑀𝑅/𝑆 (𝑡) ≥ 𝑅𝑇𝑀𝑅 (𝑡) şi 𝑅𝑇𝑀𝑅/𝑆 (𝑡) ≥ 𝑅(𝑡). Într-adevăr, renunţând la
parametrul 𝑡 pentru simplificarea scrierii, rezultă relaţiile:
𝑅𝑇𝑀𝑅/𝑆 − 𝑅𝑇𝑀𝑅 = 1.5𝑅 − 0.5𝑅 3 − (3𝑅 2 − 2𝑅 3 ) = 1.5𝑅 − 3𝑅 2 + 1.5𝑅 3
În figura următoare se prezintă comparativ funcţiile de fiabilitate pentru structurile 𝑆𝑖𝑚𝑝𝑙𝑒𝑥, 𝑇𝑀𝑅
şi 𝑇𝑀𝑅/𝑆𝑖𝑚𝑝𝑙𝑒𝑥.
R(t)
TMR
1
Simplex
0,5 TMR/simplex
Rezultă că 𝑀𝑇𝐵𝐹 pentru structura 𝑇𝑀𝑅/𝑆𝑖𝑚𝑝𝑙𝑒𝑥 este cu aproximativ 33,3% mai mare faţă de
varianta neredundantă şi cu 60% mai mare faţă de structura 𝑇𝑀𝑅. Într-adevăr,
Logica adiţională de decizie, control şi reconfigurare are o poziţie cheie în cazul acestui sistem
redundant, buna funcţionare a sa fiind strict necesară. Ca urmare, această logică trebuie considerată
în serie cu structura redundantă formată din cele trei module. Astfel, dacă considerăm şi funcţia de
fiabilitate a logicii de decizie, control şi reconfigurare notată cu 𝑅𝑑𝑐𝑟 (𝑡), putem scrie în final relaţia:
În ceea ce priveşte funcţia de securitate, notată 𝒮𝑇𝑀𝑅⁄𝑆 (𝑡), trebuie remarcat faptul că structura
𝑇𝑀𝑅/𝑆𝑖𝑚𝑝𝑙𝑒𝑥 nu generează semnal suplimentar de control. Ca urmare, nivelul de siguranţă în
funcţionare este dat de nivelul fiabilităţii. Astfel,
𝒮𝑇𝑀𝑅⁄𝑆 (𝑡) = 𝑅𝑇𝑀𝑅⁄𝑆 (𝑡). (42)
2) Structura 𝑇𝑀𝑅/𝐷𝑢𝑝𝑙𝑒𝑥
La defectarea unuia dintre cele trei module componente din structura 𝑇𝑀𝑅, modulul defect este
dezactivat iar sistemul se reconfigurează automat așa încât cele două module rămase să funcţioneze
în duplex, în regim de mare siguranţă. Mai precis, cele două module funcţionale operează în paralel
iar ieşirile lor sunt comparate continuu. La apariţia unei diferenţe între cele două răspunsuri se
generează un semnal de eroare pentru oprirea controlată a sistemului.
7
În ceea ce priveşte partea redundantă, cu cele trei module componente, se remarcă faptul că
structura 𝑇𝑀𝑅/𝐷𝑢𝑝𝑙𝑒𝑥 tolerează tot un modul defect, oricare ar fi acesta, la fel ca la structura 𝑇𝑀𝑅
clasică. Logica de decizie, control şi reconfigurare trebuie să fie neapărat funcţională. Astfel,
𝑅𝑇𝑀𝑅⁄𝐷 (𝑡) = 𝑅𝑇𝑀𝑅 (𝑡)𝑅𝑑𝑐𝑟 (𝑡) = (3𝑅 2 (𝑡) − 2𝑅 3 (𝑡))𝑅𝑑𝑐𝑟 (𝑡). (43)
Pentru exemplificarea sintezei logicii de decizie, control şi reconfigurare, se consideră cazul mai
simplu în care sistemul studiat generează o singură ieşire logică. Această structură trebuie să
realizeze următoarele funcţii:
- să genereze un răspuns la ieşirea 𝑧 în funcţie de valorile furnizate de module funcţionale şi de
configuraţia impusă;
- să detecteze automat producerea primei defectări în structura 𝑇𝑀𝑅 şi să izoleze modulul defect;
- să reconfigureze structura redundantă pentru continuarea cu un singur modul sau în duplex,
după caz;
- pentru un regim de funcţionare în duplex, să semnaleze ca eroare atunci când cele două module
care operează în paralel nu mai generează răspunsuri identice.
În ceea ce priveşte detectarea automată a producerii unei defectări în structura 𝑇𝑀𝑅 şi
identificarea modului defect, se foloseşte o structură logică de control (𝑆𝐿𝐶) de tipul cei prezentate
anterior. Starea modulelor componente este reflectată de trei bistabile cu semnificaţia: 1 – bună
funcţionare, 0 – defectare. Bistabilele sunt la început în starea 1 logic iar activarea unui semnal de
eroare duce la resetarea bistabilului corespunzător. O dată cu prima defectare, starea bistabilelor
rămâne “îngheţată” până la remediere (cu un singur bistabil pe 0), pentru că structura nu poate
identifica corect o nouă defectare.
8
Pentru izolarea modulului defect, ieşirile modulelor (𝑦1 , 𝑦2 , 𝑦3 ) sunt validate de valorile
bistabilelor de stare. Se foloseşte în acest scop un nivel de porţi logice de validare de tip AND. Atunci
când un modul este defect, valoarea bistabilului de stare corespunzător este 0 logic şi semnalul
generat de modul nu se mai poate propaga şi nu mai poate influenţa ieşirea 𝑧.
În figurile următoare se prezintă logicile de decizie, control şi reconfigurare pentru cele două
structuri, 𝑇𝑀𝑅/𝑆𝑖𝑚𝑝𝑙𝑒𝑥 şi 𝑇𝑀𝑅/𝐷𝑢𝑝𝑙𝑒𝑥, considerând module/circuite cu o singură ieşire.
Cele două figuri evidenţiază faptul că astfel de structuri reconfigurabile pot fi implementate în
multe aplicaţii, logica adiţională nefiind atât de complicată.
9
Sisteme de timp real
În aplicaţiile critice, cerinţele privind fiabilitatea şi securitatea părții de memorie sunt severe şi
nu pot fi satisfăcute fără asigurarea într-o anumită măsură a toleranţei la defecte sau la erori. Sunt
două tehnici principial diferite de implementare a toleranţei la defecte / erori, şi anume:
a) Detectarea şi corectarea automată a erorilor de memorie folosind coduri suplimentare de
control (redundanţă pasivă);
b) Testarea 𝑜𝑛𝑙𝑖𝑛𝑒 a memoriei pentru detectarea cât mai rapidă a defectării unui modul şi
înlocuirea acestuia cu unul de rezervă (redundanţă activă sau de comutaţie).
Cele două tehnici nu se exclud, ci sunt complementare. Dacă nivelul de siguranţă în funcţionare
o impune, cele două tehnici de creştere a fiabilităţii şi securităţii memoriei RAM pot fi implementate
simultan: redundanţa pasivă la nivelul de bază şi redundanţa activă la un nivel superior.
Cea mai folosită metodă de creştere a fiabilităţii şi securităţii memoriei RAM se bazează pe coduri
suplimentare de control ce permit detectarea şi corectarea într-o anumită măsură a erorilor de
memorie. În cazul memoriilor RAM cele mai eficiente s-au dovedit a fi codurile 𝐻𝑎𝑚𝑚𝑖𝑛𝑔. Acestea
s-au impus deoarece logica combinaţională de formare a codurilor la scriere şi cea pentru controlul
şi corecţia erorilor la citire sunt mai simple. În implementările uzuale se folosesc două tipuri de
circuite de control, şi anume:
• SEC_SED (𝑆𝑖𝑛𝑔𝑙𝑒 𝐸𝑟𝑟𝑜𝑟 𝐶𝑜𝑟𝑟𝑒𝑐𝑡𝑖𝑛𝑔 – 𝑆𝑖𝑛𝑔𝑙𝑒 𝐸𝑟𝑟𝑜𝑟 𝐷𝑒𝑡𝑒𝑐𝑡𝑖𝑛𝑔);
• SEC_DED (𝑆𝑖𝑛𝑔𝑙𝑒 𝐸𝑟𝑟𝑜𝑟 𝐶𝑜𝑟𝑟𝑒𝑐𝑡𝑖𝑛𝑔 – 𝐷𝑜𝑢𝑏𝑙𝑒 𝐸𝑟𝑟𝑜𝑟 𝐷𝑒𝑡𝑒𝑐𝑡𝑖𝑛𝑔).
În cazul codurilor Hamming, pentru o memorie cu lungimea cuvântului de date 𝑚 = 2𝑥 biţi, sunt
necesari 𝑘 = 𝑥 + 1 biţi de control pentru SEC_SED şi 𝑘 = 𝑥 + 2 biţi pentru SEC_DED. În Tab. 1 se
prezintă numărul biţilor de control în funcţie de lungimea cuvântului de date. Memoria conţine
cuvinte extinse de lungime 𝑛, formate din 𝑚 biţi de date şi 𝑘 biţi de control (𝑛 = 𝑚 + 𝑘).
Tab. 1 – Structura cuvântului extins format din biţi de date şi biţi de control
Numărul biţilor Numărul biţilor de control (𝑘) Lungimea cuvântului extins (𝑛)
de date (𝑚) SEC_SED SEC_DED SEC_SED SEC_DED
4 3 4 7 8
8 4 5 12 13
16 5 6 21 22
32 6 7 38 39
64 7 8 71 72
1
Din Tab. 1 rezultă că ponderea biţilor de control în cuvântul extins scade pe măsură ce numărul
biţilor de date creşte. Structura sistemului de memorie RAM cu circuite de control pentru detecţia
şi corecţia automată a erorilor este prezentată în Fig. 1.
Notaţii folosite:
𝑎, 𝑏, 𝑐, 𝑑 – biţii de date furnizaţi de procesor la scrierea într-o locaţie de memorie;
𝑝, 𝑞, 𝑟, (𝑠) – biţii de control asociaţi biţilor de date 𝑎, 𝑏, 𝑐, 𝑑;
𝑎̃, 𝑏̃, 𝑐̃ , 𝑑̃, 𝑝̃, 𝑞̃, 𝑟̃ , (𝑠̃ ) – biţii citiţi din memorie din locaţia extinsă.
I. Logica de codare
Biţii de control asociaţi biţilor de date se pot genera după după cum urmează:
𝑝 = 𝑏 𝑐 𝑑, 𝑞 =𝑎𝑐, 𝑟 =𝑎𝑏𝑑
a p
p = bcd
b
Cuvânt depus pe q Biţi de
magistrala de µP c q = acd
control
d
r
r = abd
Corespondenţa dintre biţii de date şi cei de control este prezentată în tabelul următor.
2
Tab. 2 – Mulţimea cuvintelor valide la codarea SEC_SED.
𝑎 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
𝑏 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
𝑐 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
𝑑 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
𝑝 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1
𝑞 0 1 1 0 0 1 1 0 1 0 0 1 1 0 0 1
𝑟 0 1 0 1 1 0 1 0 1 0 1 0 0 1 0 1
𝐶𝑜𝑑 𝑑𝑒 𝑐𝑜𝑛𝑡𝑟𝑜𝑙 0 7 6 1 5 2 3 4 3 4 5 2 6 1 0 7
Să analizăm distanţa de cod în acest caz. Reamintim că distanţa de cod în sens 𝐻𝑎𝑚𝑚𝑖𝑛𝑔
reprezintă numărul minim de biţi prin care două cuvinte valide diferă între ele. Plecând de la această
definiţie, o verificare completă presupune compararea celor 120 de perechi posibile de cuvinte
2
valide (𝐶16 ). Ne vom limita deocamdată la o verificare intuitivă a faptului că la această codare
distanţa 𝐻𝑎𝑚𝑚𝑖𝑛𝑔 este 3. Cum primul cuvânt conţine numai biţi de 0, celelalte cuvinte ar trebui
să aibă cel puţin 3 biţi de 1. Similar, cum ultimul cuvânt conţine numai biţi de 1, celelalte cuvinte ar
trebui să conţină cel puţin 3 biţi de 0. Prin urmare, cu excepţia primei şi ultimei coloane, toate
celelalte combinaţii trebuie să aibă 3 biţi de 0 şi 4 biţi de 1, sau invers. Acest lucru se verifică uşor în
Tab. 2. Vom reveni asupra importanţei acestui concept.
𝑢2 = 𝑏̃ 𝑐̃ 𝑑̃ 𝑝̃ = 𝑏 𝑐 𝑑 𝑝 = 𝑏 𝑐 𝑑 (𝑏 𝑐 𝑑 ) = 0.
𝑢1 = 𝑎̃ 𝑐̃ 𝑑̃ 𝑞̃ = (𝑎 1) 𝑐 𝑑 𝑞 = (𝑎 1) 𝑐 𝑑 (𝑎 𝑐 𝑑 ) = 1.
𝑢0 = 𝑎̃ 𝑏̃ 𝑑̃ 𝑟̃ = (𝑎 1) 𝑏 𝑑 𝑟 = (𝑎 1) 𝑏 𝑑 (𝑎 𝑏 𝑑 ) = 1.
3
Se observă că bitul de 1 folosit la modelarea erorii singulare se reflectă în bitul de eroare rezultat.
În tabelul următor se prezintă valoarea 𝑠𝑦𝑛𝑑𝑟𝑜𝑚𝑒-ului pentru toate erorile singulare.
Bit eronat 𝑝̃ 𝑞̃ 𝑟̃ 𝑎̃ 𝑏̃ 𝑐̃ 𝑑̃
𝑢2 1 0 0 0 1 1 1
𝑢1 0 1 0 1 0 1 1
𝑢0 0 0 1 1 1 0 1
Cod în zecimal 4 2 1 3 5 6 7
Aşa cum rezultă din tabel, pentru toate erorile singulare codurile rezultate sunt distincte. Prin
urmare, bitul eronat poate fi identificat pe baza acestui cod şi apoi corectat prin inversare. Logica
combinaţională de decodare, control şi corecţie se prezintă în figura următoare.
~
d
~ ~
p u2 7 ~
a c
D
~ 6 ~ Date
E
b ~ b către
q u1 C 5 μP
O
~ 4 ~
c D a
O 3
~
r u0
R 2
~ 1
d No error
Syndrome 0
Concluzionând, dacă la citire se regăsesc toţi biţii de date şi de control salvaţi anterior la scriere,
codul de eroare va cuprinde numai biţi de zero. Când cuvântul are unul sau doi biţi schimbaţi codul
de eroare este diferit de zero. În cazul unei erori singulare, pe baza codului generat, bitul schimbat
este identificat şi apoi corectat prin inversare. Se poate însă remarca, de exemplu, că o combinaţie
1,1,1 în 𝑠𝑦𝑛𝑑𝑟𝑜𝑚𝑒 (codul 7) apare atunci când bitul 𝑑̃ este schimbat, dar şi când biţii 𝑎̃ şi 𝑝̃ sunt
schimbaţi. Ca urmare, dacă în cuvântul extins apar două erori circuitul de corecţie nu mai
funcţionează bine. Când probabilitatea de apariţie a două erori nu poate fi neglijată, se poate
renunţa la facilitatea de corectare a erorilor şi structura de codare poate fi folosită pentru
detectarea uneia sau a două erori în cuvântul extins (structura de tip DED : 𝑑𝑜𝑢𝑏𝑙𝑒 −
𝑒𝑟𝑟𝑜𝑟 𝑑𝑒𝑡𝑒𝑐𝑡𝑖𝑛𝑔). La o valoare diferită de zero a 𝑠𝑦𝑛𝑑𝑟𝑜𝑚𝑒-ului se generează un semnal de eroare
(mai precis, o întrerupere) privind cuvântul citit din memorie. Această tehnică de codare are însă
mai mult o importanţă teoretică.
4
Codarea SEC_DED este o extensie a codării SEC_SED prin adăugarea unui bit de paritate (𝑠). Într-
adevăr, pentru bitul suplimentar de control este valabilă relaţia
𝑠 = 𝑎 𝑏 𝑐 𝑑 𝑝 𝑞 𝑟 = 𝑎 𝑏 𝑐 𝑑 (𝑏 𝑐 𝑑) (𝑎 𝑐 𝑑) (𝑎 𝑏 𝑑)
=𝑎𝑏𝑐.
Evident, bitul de control 𝑠 se generează cum este mai uşor. Cum nu toţi biţii din cuvântul extins sunt
independenţi a rezultat o relaţie de calcul mai simplă. Logica combinaţională de codare pentru
structura SEC_DED se prezintă în figura următoare.
a p = bcd
b
Cuvânt de date
depus pe q = acd
magistrală de µP
c
r = abd
d
s = abc
În Tab. 4 se prezintă mulţimea cuvintelor extinse care se formează. Se observă că între biţii de
date 𝑎, 𝑏, 𝑐, 𝑑 şi biţii de control 𝑝, 𝑞, 𝑟, 𝑠 astfel formaţi există o corespondenţă biunivocă.
𝑎 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
𝑏 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
𝑐 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
𝑑 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
𝑝 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1
𝑞 0 1 1 0 0 1 1 0 1 0 0 1 1 0 0 1
𝑟 0 1 0 1 1 0 1 0 1 0 1 0 0 1 0 1
𝑠 0 0 1 1 1 1 0 0 1 1 0 0 0 0 1 1
𝐶𝑜𝑑 𝑑𝑒 𝑐𝑜𝑛𝑡𝑟𝑜𝑙 0 E D 3 B 5 6 8 7 9 A 4 C 2 1 F
La varianta SEC_DED distanţa de cod în sens Hamming este 4. Să facem o verificare intuitivă
aplicând acelaşi raţionament ca la SEC_SED. Cum primul cuvânt conţine numai biţi de 0, celelalte
cuvinte trebuie să aibă cel puţin 4 biţi de 1. Similar, cum ultimul cuvânt conţine numai biţi de 1,
celelalte cuvinte trebuie să conţină cel puţin 4 biţi de 0. Prin urmare, cu excepţia primei şi ultimei
coloane, toate celelalte combinaţii trebuie să aibă 4 biţi de 0 şi 4 biţi de 1, ceea ce se verifică uşor.
5
II. Logica de decodare
𝑎̃ = 𝑎̅ = 𝑎 1, 𝑏̃ = 𝑏̅ = 𝑏 1, 𝑐̃ = 𝑐, . . . , 𝑟̃ = 𝑟, 𝑠̃ = 𝑠.
Rezultă următorii biţi de control:
𝑢3 = 𝑎̃ 𝑏̃ 𝑐̃ 𝑠̃ = 𝑎 1 𝑏 1 𝑐 𝑠 = 𝑎 1 𝑏 1 𝑐 (𝑎 𝑏 𝑐 ) = 0
𝑢2 = 𝑏̃ 𝑐̃ 𝑑̃ 𝑝̃ = 𝑏 1 𝑐 𝑑 𝑝 = 𝑏 1 𝑐 𝑑 (𝑏 𝑐 𝑑 ) = 1.
𝑢1 = 𝑎̃ 𝑐̃ 𝑑̃ 𝑞̃ = 𝑎 1 𝑐 𝑑 𝑞 = 𝑎 1 𝑐 𝑑 (𝑎 𝑐 𝑑 ) = 1.
𝑢0 = 𝑎̃ 𝑏̃ 𝑑̃ 𝑟̃ = 𝑎 1 𝑏 1 𝑑 𝑟 = 𝑎 1 𝑏 1 𝑑 (𝑎 𝑏 𝑑) = 0.
Se poate observa faptul că în orice relaţie de calcul a unui bit de control, toate variabilele logice
apar în pereche şi se anulează reciproc. Prin urmare, valoarea finală va fi dată de biţii de 1 folosiţi la
modelarea erorii. În consecinţă, la un defect multiplu, valoarea 𝑠𝑦𝑛𝑑𝑟𝑜𝑚𝑒-ului se obţine aplicând
operatorul XOR asupra codurilor de la erorile singulare ce compun eroarea multiplă. Aşadar, codul
de eroare poate fi determinat mai uşor, fără să se evalueze explicit relaţiile care intervin. În Tab. 5
se prezintă valoarea 𝑠𝑦𝑛𝑑𝑟𝑜𝑚𝑒-ului atunci când în cuvântul citit unul sau doi biţi sunt schimbaţi.
Tab. 5 – Valoarea 𝑠𝑦𝑛𝑑𝑟𝑜𝑚𝑒-ului la codarea SEC_DED pentru unul sau doi biţi eronaţi
Se evidenţiază în tabel că pe baza parităţii codului de eroare se pot disocia erorile singulare de
cele duble (în acest scop s-a introdus bitul de control suplimentar 𝑠). Logica de decodare, control şi
corecţie este prezentată în Fig. 5.
Semnificaţia semnalelor de control 𝑆𝐶1 şi 𝑆𝐶2 este următoarea:
• 𝑆𝐶2 = 0, (𝑆𝐶1 = 0) – Nu există erori în cuvântul extins;
• 𝑆𝐶2 = 1, 𝑆𝐶1 = 1 – O eroare singulară a fost corectată, datele sunt valide;
• 𝑆𝐶2 = 1, 𝑆𝐶1 = 0 – Data citită din memorie este eronată.
6
𝑃𝑟𝑒𝑐𝑖𝑧𝑎𝑟𝑒: O eroare singulară la biţii de date poate fi identificată ca şi la SEC_SED doar pe baza
biţilor de control 𝑢2 , 𝑢1 , 𝑢0 . Aşadar, logica de corecţie este simplificată fiind aceeaşi ca şi la SEC_SED.
Temă pentru acasă: Să se verifice că dacă în cuvântul citit sunt 3 biţi schimbaţi atunci circuitul de
control şi corecţie nu mai funcţionează bine.
Completare la Cursul 5
Să verificăm în continuare că un cod de eroare diferit de zero se obţine şi în cazul oricărei erori triple.
8 ∙7∙ 6
Numărul lor este 𝐶83 = = 56.
2∙ 3
7
➢ Doi biți de control și un bit de date eronați
De la cei doi biți de control eronați rezultă întotdeauna un cod de eroare cu doi biți de 1 și doi
biți de 0, în timp ce codul de eroare pentru bitul de date modificat cuprinde trei biți de 1. Ca
urmare, la generarea 𝑠𝑦𝑛𝑑𝑟𝑜𝑚𝑒-ului, biții de 1 care modelează eroarea se pot masca parțial dar
nu în întregime.
În concluzie, pentru orice eroare triplă rezultă un 𝑠𝑦𝑛𝑑𝑟𝑜𝑚𝑒 diferit de zero, ceea ce înseamnă
că eroarea este detectabilă. Pot rezulta însă cuvinte de eroare cu un număr impar de biţi de 1 ceea
ce face ca circuitul de corecţie să considere că ar fi o eroare singulară şi să inverseze în mod greşit
un bit corect. Ca urmare, pentru unele erori triple circuitul de coreţie funcţionează greşit. De
exemplu, dacă biţii 𝑎̃, 𝑠̃ şi 𝑝̃ ar fi modificaţi atunci ar rezulta codul 7 şi circuitul de corecţie ar inversa
în mod greşit bitul 𝑑̃.
Ca o concluzie, codurile SEC_DED şi TED ( 𝑡𝑟𝑖𝑝𝑙𝑒 − 𝑒𝑟𝑟𝑜𝑟 𝑑𝑒𝑡𝑒𝑐𝑡𝑖𝑛𝑔 ) sunt identice doar că
valoarea syndrome-ului este interpretată diferit în cele două cazuri.
De remarcat că la această codare o eroare multiplă cu 4 biţi eronaţi ar putea să nu fie detectată.
De exemplu, atunci când biţii 𝑎̃, 𝑏̃, 𝑝̃ şi 𝑞̃ sunt eronaţi codul de eroare rezultat este zero.
8
Sisteme de timp real
𝑑=2
1
Cuvântul 𝑤1 cu un bit eronat
eereronateronat
𝑤1 𝑤2
𝑑=3
Cuvântul 𝑤1 cu C erori
𝑤1 𝑤2
C 𝐶 + 1
𝑑 = 2𝐶 + 1
𝐽𝑢𝑠𝑡𝑖𝑓𝑖𝑐𝑎𝑟𝑒 : Întrucât 𝐷 ≥ 𝐶 rezultă că sunt îndeplinite condiţiile (1) şi (2) menţionate anterior.
Cele mai folosite coduri sunt:
• Codul de paritate: 𝑑 = 2 , 𝐶 = 0, 𝐷 = 1;
• Codul SEC_SED: 𝑑 =3, 𝐶 = 1, 𝐷 = 1;
• Codul DED : 𝑑 =3, 𝐶 = 0, 𝐷 = 2;
• Codul SEC_DED: 𝑑 =4, 𝐶 = 1, 𝐷 = 2;
• Codul TED: 𝑑 =4, 𝐶 = 0, 𝐷 = 3.
Relaţiile (1) – (3) evidenţiază importanţa conceptului de distanţă de cod. Pentru a înţelege mai
bine acest concept şi proprietăţile asociate să analizăm în continuare codul de paritate pentru
cuvinte cu 2 biţi de date.
Fie un cuvânt format din doi biți de date 𝑎 și 𝑏 și un bit de paritate 𝑝 = 𝑎 𝑏. Să analizăm mai
întâi combinațiile valide pentru acest cuvânt extins. Bitul 𝑎 se consideră cel mai semnificativ.
𝑎 0 0 1 1
𝑏 0 1 0 1
𝑝 0 1 1 0
(în octal) 0 3 5 6
Figura următoare (Fig. 9) evidenţiază efectul erorilor singulare asupra acestor cuvinte valide. Din
figură rezultă faptul că orice cuvânt afectat de o eroare singulară nu unul nevalid. Codul de paritate
permite așadar detectarea tuturor erorilor singulare. Totodată, figura arată că orice cuvânt nevalid
poate proveni de la 3 cuvinte valide și prin urmare cauza erorii nu poate fi identificată. Așadar,
erorile detectate nu pot fi și corectate.
2
cuvinte valide cuvinte nevalide
0 1
3 2
5
4
6 7
Următoarea figură evidențiază distanța Hamming dintre cuvinte. Se verifică uşor că distanţă de
cod în acest caz este 2.
3
Dar, conform unui rezultat remarcabil de algebră lineară, 𝑉 este o mulţime închisă în raport cu
operatorul sau-exclusiv (). Asta înseamnă că pentru oricare două cuvinte 𝑢, 𝑣 ∈ 𝑉, 𝑢 ≠ 𝑣 , şi
cuvântul rezultat 𝑢 𝑣 ∈ 𝑉. Pe baza acestor elemente, distanţa de cod se exprimă cu relaţia:
𝑑 = 𝑚𝑖𝑛 {𝑝(𝑣), 𝑣 ∈ 𝑉 − 𝑧𝑒𝑟𝑜} (5)
Astfel, se verifică uşor pe mulţimea 𝑉 că la codarea SEC_SED 𝑑 = 3, iar la codarea SEC_DED 𝑑 = 4.
Să analizăm mai în detaliu această proprietate deosebită a mulţimii cuvintelor valide. O ilustrare
grafică a acestei preoprietăţi se prezintă în figura următoare.
𝑢 𝑣 𝑥
Cuvânt
de ⨁
date
⨁
Cuvânt
de ⨁
control
Cuvintele de date acoperă toate combinaţiile posibile, de la cea cu cea cu toţi biţii de 0 la cea
cu toţi biţii de 1. Prin urmare, aplicând operatorul asupra a două cuvinte de date rezultă tot un
cuvânt valid. Problema se reduce la verificarea codului de control. Să considerăm două cuvinte
valide oarecare 𝑢 şi 𝑣 şi cuvântul rezultat prin aplicarea operatorului , 𝑥 = 𝑢 𝑣. Partea de date
a cuvântului nu poate fi decât o combinaţie validă. Aşa cum este ilustrat în figură, trebuie să
verificăm că partea de control a cuvântului 𝑥, rezultată din aplicarea operatorul asupra biţilor de
control de pe aceeaşi poziţie din cuvintele iniţiale 𝑢 şi 𝑣, se obţine şi atunci când se aplică regula de
codare asupra biţilor de date din cuvântul 𝑥. Ca urmare, cuvântul extins 𝑥 este tot un cuvânt valid.
Să exemplificăm acest lucru pentru primul bit de control de la o codare de tip SEC_SED
considerând cuvinte de date de 4 biţi. Cele două cuvinte iniţiale, 𝑢 şi 𝑣, sunt de următoarea formă:
𝑢 = (𝑑1𝑢 , 𝑑2𝑢 , 𝑑3𝑢 , 𝑑4𝑢 , 𝑐1𝑢 , 𝑐2𝑢 , 𝑐3𝑢 ) şi 𝑣 = (𝑑1𝑣 , 𝑑2𝑣 , 𝑑3𝑣 , 𝑑4𝑣 , 𝑐1𝑣 , 𝑐2𝑣 , 𝑐3𝑣 )
Cuvântul rezultat aplicând operatorul este
𝑥 = (𝑑1𝑥 , 𝑑2𝑥 , 𝑑3𝑥 , 𝑑4𝑥 , 𝑐1𝑥 , 𝑐2𝑥 , 𝑐3𝑥 ), în care 𝑑1𝑥 = 𝑑1𝑢 𝑑1𝑣 , 𝑑2𝑥 = 𝑑2𝑢 𝑑2𝑣 , … , 𝑐1𝑥 = 𝑐1𝑢 𝑐1𝑣 , …
Cum 𝑐1𝑢 = 𝑑2𝑢 𝑑3𝑢 𝑑4𝑢 şi 𝑐1𝑣 = 𝑑2𝑣 𝑑3𝑣 𝑑4𝑣 rezultă că
𝑐1𝑥 = 𝑐1𝑢 𝑐1𝑣 = 𝑑2𝑢 𝑑3𝑢 𝑑4𝑢 𝑑2𝑣 𝑑3𝑣 𝑑4𝑣 .
Să verificăm că aceeaşi valoare se obţine pentru 𝑐1𝑥 dacă se aplică regula de codare pe biţii de date.
𝑐1𝑥 = 𝑑2𝑥 𝑑3𝑥 𝑑4𝑥 = (𝑑2𝑢 𝑑2𝑣 ) (𝑑3𝑢 𝑑3𝑣 ) (𝑑4𝑢 𝑑4𝑣 ).
Cum nu contează ordinea în care se aplică operatorul logic, rezultă aceeaşi expresie
𝑐1𝑥 = 𝑑2𝑢 𝑑3𝑢 𝑑4𝑢 𝑑2𝑣 𝑑3𝑣 𝑑4𝑣 .
4
Specificarea unui cod
Modelul matematic cel mai avantajos în specificarea şi studiul codurilor lineare este cel
matriceal. Astfel, reprezentarea unui cod linear se face sub forma unei matrice de generare 𝐺 care
conţine toţi vectorii linear independenţi ai codului, cu excepţia codului nul (baza spaţiului vectorial).
Matricea 𝐺 are 𝑚 linii şi 𝑛 = 𝑚 + 𝑘 coloane şi este de forma
𝐺𝑚×𝑛 = [𝐼𝑚 𝑄𝑚×𝑘 ],
în care 𝐼𝑚 este matricea unitate, ca bază pentru toate cuvintele de date, iar 𝑄𝑚×𝑘 este matricea
codurilor suplimentare de control.
Prin combinaţii lineare realizate între liniile acestei matrice se obţin toate cuvintele valide pentru
codul respectiv, mai puţin codul nul. De exemplu, pentru codurile analizate, matricea 𝑄 este de
următoare forma :
a) SEC_SED, 𝑚 = 4, 𝑘 = 3
0 1 1
1 0 1
𝑄4×3 =[ ]
1 1 0
1 1 1
b) SEC_DED, 𝑚 = 4, 𝑘 = 4
0 1 1 1
1 0 1 1
𝑄4×4 =[ ]
1 1 0 1
1 1 1 0
Submatricea 𝑄 din matricea de generare descrie structura logicii de codare. Structura logicii de
decodare este descrisă printr-o matrice de control a parităţii (engl. 𝑝𝑎𝑟𝑖𝑡𝑦 − 𝑐ℎ𝑒𝑐𝑘 𝑚𝑎𝑡𝑟𝑖𝑥) de
𝑇
forma 𝐻 = [𝐼𝑘 𝑄𝑚×𝑘 ] , care evidenţiază biţii din cuvântul extins care intervin la formarea
𝑠𝑦𝑛𝑑𝑟𝑜𝑚𝑒-ului. Pentru codurile analizate, matricea 𝐻 de generare a 𝑠𝑦𝑛𝑑𝑟𝑜𝑚𝑒-ului este :
a) SEC_SED, 𝑚 = 4, 𝑘 = 3
1 0 0 0 1 1 1
𝐻 = [0 1 0 1 0 1 1]
0 0 1 1 1 0 1
b) SEC_DED, 𝑚 = 4, 𝑘 = 4
1 0 0 0 0 1 1 1
0 1 0 0 1 0 1 1
𝐻=[ ]
0 0 1 0 1 1 0 1
0 0 0 1 1 1 1 0
Dacă cuvântul citit din memorie este [𝑐1 𝑐2 … 𝑐𝑘 𝑑1 𝑑2 … 𝑑𝑚 ] atunci codul de eroare sau
𝑠𝑦𝑛𝑑𝑟𝑜𝑚𝑒-ul (𝑆) de lungime 𝑘 se obţine cu relaţia :
5
Pentru o soluţie optimală, la codarea SEC_DED, matricea 𝐻 de generare a 𝑠𝑦𝑛𝑑𝑟𝑜𝑚𝑒 -ului
trebuie să îndeplinească următoarele condiţii :
• Numărul de biţi de 1 de pe fiecare coloană trebuie să fie impar – condiţie care derivă din
principiul codării;
• Numărul total de biţi de 1 din matrice trebuie să fie minim – condiţie ce urmăreşte reducerea
complexităţii logicii de control;
• Numărul de biţi de 1 de pe oricare două linii trebuie să fie acelaşi sau, dacă nu este posibil, să
fie cât mai apropiat de o valoare medie (valoare dată de raportul dintre numărul biţilor de 1 din
matrice şi numărul de linii) – condiţie ce urmăreşte ca timpul de propagare prin logica de
control să fie cât mai mic.
De exemplu, pentru o memorie cu lungimea cuvântului de date de 16 biţi, o matrice optimală de
control a parităţii la codarea SEC_DED este următoarea :
1 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 1 1 1 1 0 0
0 1 0 0 0 0 0 0 1 1 1 1 1 0 1 0 0 0 1 0 1 0
0 0 1 0 0 0 1 1 1 0 1 1 1 0 0 1 1 0 0 0 0 0
H =
0 0 0 1 0 0 1 1 1 0 0 0 0 1 1 1 0 1 0 0 0 1
0 0 0 0 1 0 0 0 0 1 0 0 1 1 1 1 0 0 0 1 1 1
0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 1 1 1 1 1 1
Observaţii finale
➢ Implementarea codurilor de control asigură o creştere semnificativă a fiabilităţii şi securităţii
părţii de memorie RAM. Această creştere este cu atât mai ridicată cu cât fiabilitatea circuitelor
componente este mai mare.
6
➢ Varianta SEC_SED conduce la o creştere mai mare a fiabilităţii faţă de varianta SEC_DED. Şi în
ceea ce priveşte complexitatea sau timpul de acces la memorie varianta SEC_SED este de
preferat.
➢ Varianta SEC_DED asigură în schimb o securitate mult mai ridicată. Aşadar, această variantă se
adoptă atunci când condiţia privind securitatea sistemului este dominantă.
➢ Cu privire la erorile ce pot apărea la nivelul logicii de codare, se remarcă faptul că dacă biţii de
control se generează în mod independent, atunci o eroare singulară în logica de codare
afectează un singur bit din cuvântul extins şi, ca urmare, acesta este mascat de logica de
control şi corecţie.
➢ O eroare în cuvântul citit din memorie poate avea mai multe cauze, şi anume:
• Defectarea unui circuit de memorie sau activarea unui defect de memorie greu de detectat
care a trecut de testele aplicate; dacă structura de memorie este formată din circuite
orientate pe bit atunci aceste defecte conduc la erori singulare şi sunt corectate automat în
cazul memoriei cu coduri de control.
• Apariţia unor erori tranzitorii ca urmare a unor perturbaţii severe cum ar fi impactul cu
particule grele. Structura redundantă cu coduri de control constituie o soluţie foarte
eficientă de protejare împotriva acestor tipuri de erori.
7
Sisteme de timp real
În acest curs vom analiza o structură de memorie RAM redundantă, reconfigurabilă care să
permită testarea cvasipermanentă a circuitelor de memorie şi, în caz de defectare a unui circuit,
înlocuirea circuitului defect cu altul de rezervă. Aşadar, vom analiza o structură de memorie RAM
cu redundanţă activă sau de comutaţie.
Testarea memoriei RAM poate fi realizată prin programe de test, care să fie executate de
procesor în perioadele de pauză, sau de relaxare în funcţionarea sistemului. În engleză, această
tehnică este numită 𝑛𝑜𝑛 − 𝑐𝑜𝑛𝑐𝑢𝑟𝑟𝑒𝑛𝑡 𝑜𝑛𝑙𝑖𝑛𝑒 𝑡𝑒𝑠𝑡𝑖𝑛𝑔 şi urmăreşte detectarea cât mai rapidă a
defectelor permanente de memorie. În aplicaţiile critice, această verificare este încă insuficientă,
impunându-se o testare cvasipermanentă a memoriei, în timpul funcţionării normale – tehnică
numită 𝑐𝑜𝑛𝑐𝑢𝑟𝑟𝑒𝑛𝑡 𝑜𝑛𝑙𝑖𝑛𝑒 𝑡𝑒𝑠𝑡𝑖𝑛𝑔. O problemă a testării 𝑜𝑛𝑙𝑖𝑛𝑒 a memoriei RAM este aceea că
prin testare conţinutul memoriei se pierde. De aceea, testarea 𝑜𝑛𝑙𝑖𝑛𝑒 necesită circuite suplimentare
pentru salvarea datelor pe durata procesului de testare.
1
modul defect modul în curs de testare modul disponibil
registru de
stare (SR) 0 1 ∙∙∙ 1 ∙∙∙ 0 0 ∙∙∙ 0
adrese logice
Structură combinaţională de selecţie şi reconfigurare
A1 ÷ Am S1 S2 Sj Sm Sm+1 Sm+s
date
adrese
Fiecare circuit este verificat de două ori într-un ciclu de testare, aria circuitelor de memorie fiind
parcursă mai întâi în ordine descrescătoare, de la dreapta la stânga (+), şi apoi în ordine crescătoare,
de la stânga la dreapta (–). Pentru testarea unui modul 𝑀𝑗 sunt necesare următoarele operaţii :
• Modulul 𝑀𝑗±1 este adus în regim de funcţionare normală (𝑆𝑅𝑗±1 = 0) ;
• Datele din modulul 𝑀𝑗 sunt salvate în modulul 𝑀𝑗±1 ;
• Este lansat procesul de testare pentru modulul 𝑀𝑗 (𝑆𝑅𝑗 = 1).
În Fig. 2 este ilustrat un ciclu de testare a ariei de memorie cu 𝑚 circuite de bază şi unul
suplimentar care asigură posibilitatea testării 𝑜𝑛𝑙𝑖𝑛𝑒. Modulele logice (partiţiile) sunt numerotate
de la 1 la 𝑚. Circuitul în curs de testare este marcat cu *. Funcţionarea normală a sistemului este
întreruptă doar pe durata transferului de date, înaintea testării unui modul. Transferul de date este
însă rapid, mai ales dacă se realizează cu circuite de acces direct la memorie, şi se presupune că
poate fi tolerat în aplicaţia considerată.
Faţă de procedura de testare a circuitelor prin rotaţie, în acest caz, prin alternarea sensului de
parcurgere a ariei de memorie, numărul operaţiilor de transfer pentru salvarea datelor înaintea
testării se reduce la jumătate. Trebuie însă menţionat ca dezavantaj faptul că circuitele de memorie
nu sunt testate la intervale egale de timp. Acest aspect este evidenţiat în Fig. 3, în care se consideră
o arie de memorie cu patru circuite de bază şi unul suplimentar pentru testarea 𝑜𝑛𝑙𝑖𝑛𝑒. Circuitele
de memorie sunt numerotate de la 1 la 5. Pentru fiecare din cele cinci circuite de memorie se indică
perioada dintre două testări consecutive.
2
1 2 3 . 𝑗− 1 𝑗 j+1 . m−1 m *
1 2 3 . j−1 j j+1 . m−1 * m
1 2 3 . j−1 j j+1 . * m−1 m
. . . . . . . . . . .
1 2 3 . j−1 j * . m−2 m−1 m
1 2 3 . j−1 * j . m−2 m−1 m
1 2 3 . * j−1 j . m−2 m−1 m
. . . . . . . . . . .
1 2 * . j−2 j−1 j . m−2 m−1 m
1 * 2 . j−2 j−1 j . m−2 m−1 m
3
Aşa cum rezultă din figură, pentru un sistem de memorie cu 𝑚 module de bază şi unul
suplimentar, intervalele de timp dintre două testări consecutive sunt :
4
Fig. 4 – Structura celulară a logicii de selecţie şi reconfigurare.
1 2
𝑃𝑟𝑒𝑐𝑖𝑧𝑎𝑟𝑒: Variabilele logice 𝑥𝑚+2 şi 𝑥𝑚+2 pot fi folosite pentru testarea funcţionării corecte a
structurii combinaţionale de selecţie şi reconfigurare de către procesor. Valorile acestor variabile
trebuie să fie în concordanţă cu numărul biţilor de 1 din registrul de stare 𝑆𝑅. De asemenea, când
ambele valori sunt 1 se poate genera o întrerupere pentru a semnala faptul că nivelul de redundanţă
a fost depăşit.
Sinteza logicii de selecţie şi reconfigurae se reduce aşadar la sinteza celulelor:
𝐵𝑆1 , 𝐵𝑆2 , 𝐵𝑆𝑗 ( 𝑗 = 3 ÷ 𝑚), 𝐵𝑆𝑚+1 şi 𝐵𝑆𝑚+2 .
𝑆1 = 𝑆𝑅1 𝐴1 . (2)
2 1 2 1 2 1
𝑆𝑗 = 𝑆𝑅𝑗 (𝐴𝑗 𝑥𝑗−1 𝑥𝑗−1 + 𝐴𝑗−1 𝑥𝑗−1 𝑥𝑗−1 + 𝐴𝑗−2 𝑥𝑗−1 𝑥𝑗−1 ) , ( 𝑗 = 3, 4, . . . , 𝑚) (4)
5
2 1 2 𝑥 1 ).
𝑆𝑚+1 = 𝑆𝑅𝑚+1 (𝐴𝑚 𝑥𝑚 𝑥𝑚 + 𝐴𝑚−1 𝑥𝑚 𝑚 (5)
1 2
𝑆𝑚+2 = 𝑆𝑅𝑚+2 𝐴𝑚 𝑥𝑚+1 𝑥𝑚+1 . (6)
1 ̅̅̅̅̅ 2 ̅̅̅̅̅
𝑥𝑗1 = 𝑥𝑗−1
2 1
𝑥𝑗−1 2
𝑆𝑅𝑗 + 𝑥𝑗−1 𝑥𝑗−1 𝑆𝑅𝑗 + 𝑥𝑗−1 1
𝑥𝑗−1 2
𝑆𝑅𝑗 + 𝑥𝑗−1 1
𝑥𝑗−1 =
1 2 1 ̅̅̅̅̅ 2 1 1 1 2 2 ̅̅̅̅̅
= 𝑥𝑗−1 𝑆𝑅𝑗 + 𝑥𝑗−1 𝑥𝑗−1 𝑆𝑅𝑗 + 𝑥𝑗−1 𝑥𝑗−1 = 𝑥𝑗−1 𝑆𝑅𝑗 + 𝑥𝑗−1 (𝑥𝑗−1 + 𝑥𝑗−1 𝑆𝑅𝑗 ) =
1
= 𝑥𝑗−1 1
𝑆𝑅𝑗 + 𝑥𝑗−1 2
(𝑥𝑗−1 + ̅̅̅̅̅
𝑆𝑅𝑗 ). (9)
𝑥𝑗2 = 𝑥𝑗−1
2 1
+ 𝑥𝑗−1 2
𝑥𝑗−1 2
𝑆𝑅 = 𝑥𝑗−1 1
+ 𝑥𝑗−1 𝑆𝑅. (10)
Temă de casă:
Pentru o structură de memorie redundantă cu 4 circuite de bază şi un circuit suplimentar (𝑚 = 4
şi 𝑠 = 1), să se deseneze logica de selecţie şi reconfigurare şi să se evalueze creşterea timpului de
acces la memorie. Se ia ca referinţă timpul de propagare printr-o poartă logică cu 2 intrări (∆).
4. Eficienţa redundanţei
Fie 𝑅 = 𝑒 −𝜆𝑡 funcţia de fiabilitate a unui singur circuit, adică probabilitatea de funcţionare
corectă a acestuia în intervalul [0, 𝑡]. Probabilitea de defectare este 𝐹 = 1 − 𝑅 = 1 − 𝑒 −𝜆𝑡 . Cu 𝜆
s-a notat rata medie de defectare a unui circuit de memorie.
Relativ la sistemul neredundant, probabilitatea de funcţionare corectă a celor 𝑚 module
componente este 𝑅𝑚 , iar probabilitatea ca unul dintre module să se defecteze este
𝑃1 = 𝑚𝑅 𝑚−1 𝐹. (11)
În ceea ce priveşte sistemul redundant, probabilitatea ca din cele 𝑚 + 𝑠 module 𝑠 + 1 să se
defecteze este
𝑠+1
𝑃𝑠+1 = 𝐶𝑚+𝑠 (1 − 𝑅)𝑠+1 𝑅 𝑚−1. (12)
6
Creşterea fiabilităţii sau scăderea probabilităţii de defectare este dată de elaţia
𝑃 𝑚𝑅 𝑚−1 (1−𝑅) 𝑚
𝑟 = 𝑃 1 = 𝐶 𝑠+1 𝑅𝑚−1 (1−𝑅)𝑠+1 = 𝐶 𝑠+1 (1−𝑅)𝑠 . (13)
𝑠+1 𝑚+𝑠 𝑚+𝑠
Rezultatele numerice evidenţiază faptul că eficienţa redundanţei este cu atât mai mare cu cât
fiabiliatea circuitelor componente (𝑅 în acest caz) este mai ridicată.
7
Sisteme de timp real
Cursul 8
Pentru a depăşi neajunsurilor arhitecturii disk-mirroring s-au realizat arii de discuri tolerante la
defecte care se bazează pe coduri suplimentare de control. Un astfel de sistem este format din mai
multe discuri identice, dispuse ca într-un vector, fiecare disc fiind prevăzut cu canal propriu de acces
la memorie. Discurile folosite nu sunt deosebite din punct de vedere al fiabilităţii, deci mai
rezonabile ca preţ şi eventual cu performanţe dinamice mai bune. Au fost propuse mai multe
arhitecturi de arii de discuri numite RAID (engl. Redundant Array of Independent Disks), dintre care
cea mai folosită este arhitectura RAID 5. Aceasta va fi analizată în detaliu în cele ce urmează.
Arhitectura RAID 5
Fie un sistem cu arhitectură RAID 5 compus din 𝑁 + 1 discuri identice. Datele dintr-un fişier sunt
dispuse de-a lungul ariei de discuri. Blocurile de date (clusterele) cu acelaşi număr de ordine de pe
cele 𝑁 + 1 discuri formează un grup de paritate şi acesta constituie unitatea elementară de alocare
pentru un fişier. Dintre cele 𝑁 + 1 blocuri de date, 𝑁 conţin date propriu-zise iar unul conţine
informaţie de control (numită de paritate deoarece se obţine aplicând operatorul sau-exclusiv).
Blocurile de paritate sunt dispuse în spirală aşa cum este ilustrat în Fig. 2. Semnificaţia notaţiilor din
figură este următoarea:
𝑗
𝐷𝑖 – blocul de date de pe discul 𝑗 care aparţine grupului de paritate 𝑖.
𝑃𝑖 – blocul de paritate pentru grupul cu numărul de ordine 𝑖.
2
1 2 3 4
Blocul de paritate se construieşte aplicând operatorul XOR asupra datelor utile, astfel că
𝑗
𝑃𝑖 = XOR 𝐷𝑖 , 𝑖 = 1, 2, 3, … ; 𝑗 = 1, 2, ⋯ , 𝑁 + 1. (1)
𝑗≠1+(𝑖−1)%(𝑁+1)
Depunerea datelor în fâşii, de-a lungul ariei de discuri, urmăreşte două obiective, şi anume:
• Transferul datelor în paralel pentru satisfacerea mai rapidă a unei cereri.
• Echilibrarea încărcării discurilor pentru ca frecvenţa neuniformă cu care sunt accesate fişierele
să nu mai afecteze timpul de acces la disc (o soluţie foarte bună din acest punct de vedere).
Legat de transferul datelor în paralel, trebuie însă observat faptul că în acest caz intervin mai
mulţi timpi de poziţionare a braţului şi timpi de rotaţie pentru localizarea începutului de bloc. Acest
efect de întârziere poate domina câştigul de timp de la transferul propriu-zis, aşa se arată în Fig. 3.
1 1 1
tp tr tt
disc 1
2 2 2
tp tr tt
disc 2
timp de transfer ( Ta )
1 1 1 2
tp tr tt + tt
disc 1
timp de transfer ( Tb )
3
Notaţiile din figură au următoarea semnificaţie:
𝑡𝑝 − timpul de poziţionare a braţului de citire-scriere pe cilindrul solicitat (engl. seek time);
𝑡𝑟 − timpul de rotaţie pentru localizarea începutului de bloc (engl. latency time);
𝑡𝑡 − timpul de transfer propriu-zis.
Mărimrea blocurilor de date implicate în transfer influenţează în mare măsură performanţele
arhitecturii RAID 5, acestea fiind mai bune când blocurile de date sunt mai mari.
Analizele efectuate pe sisteme reale arată că în multe sisteme tranzacţionale predomină cererile
de transfer a unor blocuri de date de dimensiuni reduse, de regulă mai mici de 10KB. De exemplu,
în cazul sistemelor tranzacţionale bancare. În astfel de sisteme, la care blocurile de date implicate
în transfer sunt de mici dimensiuni, lucrul în paralel cu mai multe discuri nu conduce la o
îmbunătăţire a performanţelor de timp de acces. De aceea, în multe implementări se renunţă la
memorarea unui fişier de-a lungul ariei de discuri. Se păstrează însă ideea blocurilor de paritate
pentru recuperarea datelor în caz de eroare. Organizarea datelor în această variantă este prezentată
în Fig. 4. Fiecare disc este împărţit în 𝑁 + 1 partiţii, dintre care una este rezervată pentru informaţii
de paritate. 𝑁 blocuri de date provenind de la 𝑁 discuri formează un grup de paritate, iar informaţia
de control este memorată în partiţia de paritate a discului rămas. Blocul de paritate se construieşte
cu relaţia
𝑗
𝑃𝑖 = XOR 𝐷𝑖 , 𝑖 = 1, 2, 3, … ; 𝑗 ia 𝑁 valori distincte din mulțimea {1, 2, …, 𝑁 + 1}. (2)
𝑗
1 2 3 4
În Fig. 4 s-a considerat că pentru paritate s-a rezervat ultima partiţie. Unele studii de evaluare a
performanţelor pentru arhitectura RAID 5 arată însă că este mai avantajos ca partiţia de paritate să
ocupe o poziţie mediană.
4
Actualizarea blocului de paritate
Actualizarea blocului de paritate se face la orice scriere a unor date în grupul de paritate. Sunt
trei situaţii distincte, ilustrate în Fig. 5, şi anume:
a) Sunt rescrise toate datele din grupul de paritate. Blocul de paritate este construit prin aplicarea
operatorului XOR asupra noilor blocuri de date.
b) Sunt actualizate mai puţin de jumătate din blocurile de date ce compun grupul de paritate. Să
presupunem că trebuie rescris blocul de date de pe discul 3. Noua valoare a blocului de paritate
𝑃𝑛 se obţine din vechea paritate 𝑃𝑣 , vechea şi noua dată de pe discul 3, 𝐷𝑣 şi 𝐷𝑛 , astfel că
𝑃𝑛 = 𝑃𝑣 ⊕ 𝐷𝑣 ⊕ 𝐷𝑛 . (3)
Astfel, în loc de 3 operaţii pentru citirea valorilor nemodificate de pe discurile 1, 2 şi 4 se fac doar
două operaţii de citire. Reducerea este şi mai mare când aria cuprinde mai multe discuri. În
relaţia (3), 𝑃𝑣 ⊕ 𝐷𝑣 reprezintă informaţia de control corespunzătoare datelor nemodificate.
c) Sunt actualizate jumătate sau mai mult de jumătate din blocurile de date ce compun grupul de
paritate (de exemplu, blocurile de date de pe discurile 2, 3, 4). Ca şi la punctul a) se face XOR
asupra tuturor datelor din grupul de paritate, cu diferenţa că pentru datele care nu sunt afectate
de scriere se citesc valorile curente.
5
Trebuie remarcat faptul că actualizarea blocului de paritate implică un număr mare de operaţii
ceea ce afectează performanţele de timp de răspuns în sistemele de timp real tranzacţionale. Se
evidenţiază încă o dată legătura strânsă dintre cele trei elemente: timpul de răspuns, fiabilitatea şi
siguranţa în funcţionare.
Dacă un bloc de date nu poate fi citit, datele respective pot fi reconstituite prin citirea celorlalte
𝑁 blocuri din grupul de paritate şi aplicarea asupra lor a operatorului sau-exclusiv. În Fig. 6 este
ilustrat modul de reconstituire a datelor pierdute de pe discul 3.
Aşa cum se arată în figură, pentru reconstituirea blocului 𝐷3 afectat de eroare se aplică relaţia:
𝐷3𝑟 = 𝐷1 𝐷2 𝑃1234 𝐷4 = 𝐷1 𝐷2 (𝐷1 𝐷2 𝐷3 𝐷4 ) 𝐷4 = 𝐷3 .
întrucât la cererile adresate direct discului 𝑘 se adaugă cele redirectate de la discul defect. Aşadar
se poate spune că sistemul îşi continuă funcţionarea dar într-un regim de avarie.
6
Dacă aria de discuri este prevăzută cu un disc de rezervă, sistemul are capacitatea de
autoreparare, în paralel cu funcţionarea normală, fără o intervenţie din exterior. Discul defect este
înlocuit cu discul de rezervă (înlocuire “la cald”), datele fiind reconstituite în maniera prezentată.
Dacă în perioada de refacere a datelor pe noul disc apare o nouă eroare atunci există riscul ca
reconstituirea datelor pierdute să nu mai fie posibilă. Aşadar, această perioadă în care configuraţia
RAID5 nu mai are toleranţă la erori este o perioadă de vulnerabilitate. Dacă riscul de apariţie a unei
erori în perioada de vulnerabilitate rezultă din calcul că este prea mare, atunci trebuie adoptată
arhitectura RAID6, noul standard în prezent.
7
Evaluarea performanţelor privind
ariile de discuri magnetice
Aşa cum am s-a arătat anterior, menţinerea informaţiilor de control în vederea reconstituirii
datelor în caz de eroare conduce la o creştere semnificativă a numărului de operaţii cu discurile
magnetice şi, în consecinţă, a timpului mediu de acces în scriere. Să considerăm, ca exemplu, o arie
formată din 7+1 discuri magnetice în configuraţie RAID5, la care este implementată varianta I de
organizare a datelor (fişierele sunt distribuite de-a lungul ariei de discuri). Să presupunem că la o
operaţie de scriere trebuie actualizate 4 blocuri de date din cadrul unui grup de paritate. Pentru
actualizarea informaţiei de control se procedează aşa cum este ilustrat în Fig. 5 - c. Astfel, sunt
necesare în plus 3 operaţii de citire de pe discurile cu date nemodificate pentru determinarea noii
parităţi şi încă una de scriere pentru salvarea pe disc a acestei informaţii. În total, trebuie să se
realizeze 8 operaţii de lucru cu discul magnetic, 4 comandate de la nivelul aplicaţiei în derulare şi
altele 4 generate intern.
Pentru evaluarea performanţelor de timp de acces la aria de discuri magnetice, ansamblul de
discuri trebuie privit (modelat) ca un sistem de servire cu 𝑁 + 1 staţii care funcţionează în paralel.
Evaluarea performanţelor de timp de acces se face prin experimente de simulare. Discurile
magnetice sunt privite aşadar ca staţii de servire pentru cererile de transfer lansate de la nivelul
aplicaţiei. La construirea algoritmului de simulare trebuie să se ţină cont de următoarele aspecte:
1) O cerere de citire a unui bloc de date din fişier este descompusă în cereri simple, adresate
discurilor care memorează acel bloc. Operaţia se încheie când toate discurile implicate în
transfer au terminat. Evident, monitorizarea cererilor se realizează la nivelul driver-ului pentru
aria de discuri.
2) La scrierea unui bloc de date pe disc se impune şi actualizarea informaţiilor de control. Asta
presupune şi efectuarea unor operaţii suplimentare de scriere, dar și de citire. Prin urmare, o
parte din operaţiile de lucru cu discul sunt transmise din exterior, de la nivelul aplicaţiei, în timp
ce altele sunt generate intern.
3) Cererile de scriere în cadrul aceluiaşi grup de paritate sunt serializate întrucât blocul de paritate
este o resursă comună ce trebuie folosită prin excludere mutuală.
Ţinând cont de toate aceste aspecte, rezultă că organizarea aşteptării pentru lucrul cu discurile
magnetice implică formarea mai multor cozi de aşteptare, organizate pe niveluri, aşa cum este
ilustrat în Figura 9. Studiile privind performanţele de timp de acces la o structură RAID au evidenţiat
că este de preferat ca operaţiile ce privesc informaţia de control să se trateze cu prioritate. În
consecinţă, la nivelul discurilor magnetice se formează câte două cozi de aşteptare care să permită
tratarea operaţiilor după priorităţi.
8
1 𝑖 𝑁+1
+1
Discuri
𝑝 𝑑 𝑝 𝑑 𝑝 𝑑
Cozi
locale
Cozi dinamice, pe
grupuri de paritate
Legendă:
Cereri de scriere Coadă de aşteptare primară
Cereri de citire
𝜆 Cereri de transfer
Pentru determinarea timpului necesar unei operaţii de transfer simple, la nivelul unui disc
magnetic trebuie să se cunoască în permanenţă poziţia curentă a ansamblului de capete. Evident,
trebuie să se cunoască parametrii dinamici ai discului, care să permită calcularea timpului pentru
deplasarea ansamblului de capete de pe un cilindru pe altul şi a timpului de tranfer propriu-zis în
funcţie de mărimea blocului transferat. Pentru timpul de sincronizare cu începutul de bloc se poate
considera de fiecare dată jumătate din timpul necesar pentru o rotaţie completă.
Coada de aşteptare primară este reprezentată printr-un vector de structuri, în care pentru fiecare
cerere se reține momentul sosirii şi informaţiile de stare privind stadiul în care se află cererile simple,
rezultate din descompunerea cererii primare transmisă de la nivelul aplicaţiei.
Fie un server care are în componenţa sa 𝑁 discuri magnetice identice. Pentru un disc, 𝑀𝑇𝐵𝐹 =
1
500.000 h (≈ 57 ani), iar rata de defectare este 𝜆 = 𝑀𝑇𝐵𝐹 = 210−6 ℎ−1 . Dacă intervalul de analiză
este [0, 𝑇], funcţia de fiabilitate este aşadar 𝑅 = 𝑒 −𝜆𝑇 . Pentru întregul ansamblu de discuri
9
magnetice în această formă neredundantă, funcţia de fiabilitate şi media timpului de bună
funcţionare sunt date de relaţiile:
𝑅𝑠𝑛 (𝑁, 𝜆, 𝑇) = 𝑅 𝑁 = 𝑒 −𝑁𝜆𝑇 , (6)
1
𝑀𝑇𝐵𝐹𝑠𝑛 = 𝑁𝜆 . (7)
Aşadar, media timpului de bună funcţionare scade proporţional cu numărul de discuri. De exemplu,
dacă 𝑁 = 10, 𝑀𝑇𝐵𝐹𝑠𝑛 = 5.7 ani (!).
Să facem un calcul numeric pentru 𝑇 = 1, 2 , 5 ani şi 𝑁 = 5, 10, 15 discuri.
Valorile scăzute din tabel evidenţiază că pentru sisteme de mare răspundere funcţională
implementarea unei tehnici de toleranţă de defecte, pentru creşterea fiabilităţii ariei de discuri, este
o necesitate absolută. De menţionat că această evaluare nu cuprinde şi erorile izolate ce pot apărea
în funcţionarea discurilor magnetice.
Fie o arie formată din 𝑁 + 1 discuri magnetice în configuraţie RAID5. Să analizăm fiabilitatea acestei
structuri redundante fără a considera deocamdată facilitatea de reparare automată după înlocuirea
discului defect. Structura redundantă tolerează un disc defect din cele 𝑁 + 1, indiferent care. Prin
urmare, funcţia de fiabilitate a acestei structuri redundante poate fi exprimată cu relaţia:
(5)
𝑅𝑠𝑟 (𝑁 + 1, 𝜆, 𝑇) = 𝑅 𝑁+1 + (𝑁 + 1)𝑅 𝑁 (1 − 𝑅). (8)
𝑇 (ani) 𝑁=5 𝑁 = 10 𝑁 = 15
1 0.9957 0.9850 0.9692
2 0.9838 0.9469 0.9866
5 0.9159 0.7657 0.6068
10
magnetice sunt solicitate de două ori mai mult, iar timpul de răspuns este afectat semnificativ.
Structura redundantă de tip RAID a fost concepută ca la defectarea unui disc acesta să fie înlocuit,
pentru ca sistemul să revină cât mai repede la starea de toleranţă şi la performanţele de timp de
răspuns de la început. Acesta este cazul ce trebuie analizat pentru că numai aşa se poate asigura o
fiabilitate ridicată şi o siguranţă deosebită privind datele memorate pe disc.
𝑁=5 𝑁 = 10 𝑁 = 15
𝑃𝑛𝑑 1.6 × 10−4 3.2 × 10−4 4.8 × 10−4
11
Să considerăm o arie formată din 𝑁 + 1 discuri magnetice de 1TB. Capacitatea unui disc este de
1012
1TB = 1012 octeţi, ceea ce înseamnă că un disc are ≈ 2 × 109 sectoare.
512
Prin urmare, reconstituirea cu succes a noului disc implică citirea fără eroare a unui număr de
𝑁 2 109 sectoare. Probabilitatea unei erori la citirea acestor date se poate exprima cu relaţia
9
512 8 𝑁 210 512 8
𝑃𝑒𝑟𝑐𝑑 = 1 − (1 − ) ≈ 𝑁 2 109 . (10)
𝑋 𝑋
𝑁=5 𝑁 = 10 𝑁 = 15
𝑋 = 1015 0.0401 0,0787 0.1156
𝑋 = 1016 0.0041 0.0082 0.0122
Valorile din tabel evidenţiază faptul că apariţia acestor erori, deseori neglijate, are o probabilitate
mult mai mare. Este însă adevărat că la defectarea unui disc consecinţele sunt mult, mult mai grave.
La varianta I de organizare a datelor, când fişierele sunt distribuite de-a lungul ariei de discuri, cu
defectarea şi a celui de-al doilea disc pot fi pierdute toate datele memorate pe aria de discuri. De
aceea, trebuie realizate periodic versiuni de back-up.
De asemenea, valorile numerice din Tabelul 4 evidenţiază faptul că o rată a erorilor de 1 bit la 𝑋 =
1015 biţi citiţi este prea mare şi trebuie exclusă. Aşadar, în continuare vom considera numai discuri
pentru care 𝑋 = 1016 .
Cu aceste două evaluări, putem determina probabilitatea reconstituirii cu succes a datelor pe noul
disc (𝑃𝑟𝑠 ) cu relaţia:
Cu aceste elemente, putem determina cu acurateţe fiabilitatea unei arii de discuri magnetice în
configuraţie RAID5, pe un interval de timp [0, 𝑇] specificat. Pierderea de date poate apărea atunci
când se defectează un disc şi procesul de reconstituire a datelor pierdute nu se încheie cu succes.
Pe baza acestui raţionament, putem scrie relaţia finală:
(5)
𝑅𝑠𝑟 (𝑁 + 1, 𝑇) = 1 − (1 − 𝑅(𝑇)𝑁+1 )(1 − 𝑃𝑟𝑠 ) (12)
(5)
Tabelul 5 – Fiabilitatea ariei de discuri (𝑅𝑠𝑟 (𝑁 + 1, 𝑇))
𝑇 = 5 ani 𝑁=5 𝑁 = 10 𝑁 = 15
𝑋 = 1016 0.9953 0.9915 0.9873
12
Pe baza acestor rezultate numerice se pot trage câteva concluzii:
• Siguranţa datelor memorate pe disc pare să fie încă insuficientă. Aşa se explică de ce în prezent,
când capacitatea discurilor este mare, noul standard pentru aplicaţii de mare răspundere
funcţională este RAID 6, care tolerează două discuri defecte din aria formată din 𝑁 + 2 discuri.
• Odată cu creşterea lui 𝑁 nivelul de redundanţă este mai redus şi prin urmare şi fiabilitatea este
mai mică. De aceea, aria de discuri trebuie dimensionată corespunzător. Cu datele numerice
considerate în această analiză, rezultă că 15 discuri la o singură arie în configuraţie RAID5 sunt
prea multe. Când necesarul de memorie este mare, trebuie să se formeze mai multe arii de
discuri independente, dimensionate corespunzător.
13
STR - Partea a II-a
Programarea aplicaţiilor de timp real
1
Sisteme de timp real
În execuţie
Gata de Inactiv
execuţie
Blocat
2
Sisteme de timp real
Informaţia Informaţia
Canal S. O. Canal
originală copiată
Proces 1 Proces 2
• Prin variabile comune (sau partajate) – partajarea se poate face între oricâte procese.
scriere citire
Variabile
Proces 1 citire scriere Proces 2
comune
Proces m
3
Sisteme de timp real
Sincronizarea trebuie să permită activarea sau stoparea desfăşurării unor procese, atât
prin cereri iniţiate de procese în execuţie, cât şi din exterior, de exemplu de la terminal.
Întreruperea continuării trebuie să fie posibilă şi din interiorul procesului, urmând ca
reactivarea să se facă, evident, din exterior.
Sincronizarea este de două feluri:
• implicită: mai multe procese partajează o resursă şi trebuie să respecte disciplina
accesului;
• explicită: un proces trebuie să aştepte până când un alt proces termină o anumită
activitate (continuarea executării lui depinde de starea altui proces); durata aşteptării
este de regulă impredictibilă – se mai numeşte şi sincronizare pe condiţie.
Din cele prezentate anterior rezultă o legătură organică între comunicare şi sincronizare.
Pentru consistenţa comunicării, sincronizarea este indispensabilă, cel puţin în sensul că
emiterea unei date precede recepţia ei. Şi reciproc, sincronizarea impune cel puţin
comunicarea faptului că un eveniment s-a produs (în mod natural două entităţi „se întâlnesc”
pentru că au să-şi comunice ceva).
Aşa cum s-a arătat anterior, comunicarea prin variabile comune presupune ca mai multe
procese să aibă acces la aceleaşi variabile, în vederea utilizării sau modificării lor. Să
considerăm o aplicaţie de timp real formată din mai multe procese concurente, la care se
doreşte contorizarea comenzilor externe emise de întreaga aplicaţie în sistemul condus. În
acest scop se foloseşte o variabilă comună contor ce trebuie incrementată după fiecare
comandă în cadrul fiecărui proces. Incrementarea contorului (contor = contor + 1) se
traduce în limbaj maşină prin trei instrucţiuni:
încarcă contor
adună 1
memorează contor
4
Sisteme de timp real
Definim excluderea mutuală (sau reciprocă) ca fiind acea formă de sincronizare impusă
proceselor concurente care permite ca numai un proces să se afle în interiorul unei regiuni
critice la un moment dat. O soluţie corectă a problemei excluderii mutualte trebuie să
îndeplinească următoarele condiţii:
C1 – O resursă critică poate fi utilizată la un moment dat de către un singur proces (un
singur proces se poate afla în interiorul regiunii critice corespunzătoare resursei la un
moment dat) – consecinţă directă a celor trei definiţii anterioare.
C2 – Procesele care sunt pe punctul de a trece la executarea secţiunilor lor critice nu
trebuie să se blocheze reciproc la infinit. Cu alte cuvinte, alegerea unuia dintre procesele
care solicită simultan să intre într-o regiune critică trebuie să se facă într-un timp finit.
C3 – Un proces care se găseşte în afara regiunii sale critice nu poate opri un alt proces să
intre într-o regiune critică.
C4 – Condiţiile C1-C3 trebuie asigurate fără să se facă vreo ipoteză cu privire la viteza
relativă de executare a proceselor.
Ca o remarcă, regiunile critice trebuie să fie cât mai scurte deoarece pot să întârzie în
execuţie alte procese.
5
Sisteme de timp real
V (s ) : if ( f (s ) )
# relansează un proces din şirul de aşteptare 𝑓(𝑠);
else 𝑠 + +; // marchează eliberarea resursei
// proces 𝑖 // proces 𝑗
---------- ----------
𝑃(𝑠); 𝑃(𝑠);
# secţiune critică (𝑆𝐶𝑖 ) # secţiune critică (𝑆𝐶𝑗 )
𝑉(𝑠); 𝑉(𝑠);
---------- ----------
6
Sisteme de timp real
proces 𝑖 proces 𝑗
s
𝑃(𝑠) 𝑃(𝑠)
𝑆𝐶𝑖 𝑆𝐶𝑗
𝑉(𝑠) 𝑉(𝑠)
var 𝑠: semaphore: = 0;
----------
// proces 𝑖
----------
𝑃(𝑠);
----------
// proces 𝑗
----------
if 𝑐𝑜𝑛𝑑 = 𝑇𝑟𝑢𝑒 then 𝑉(𝑠);
----------
s
P(s) V(s)
(cond = T) (cond = F)
7
Sisteme de timp real
3. Exemple
n-1 1 0
l o
8
Sisteme de timp real
Mecanismul de sincronizare între procese este ilustrat prin următoarea reţeaua Petri.
producători consumatori
np nc
L
n
P(L) P(O)
P(a) P(a)
a
“depune” “extrage”
V(a) V(a)
O
V(O) V(L)
Secvenţa de program care cuprinde operaţiile celor două procese pentru lucrul cu buffer-
ul este următoarea:
mesaj 𝑏𝑢𝑓𝑓𝑒𝑟 [𝑛] ;
int 𝑙 = 0, 𝑜 = 0;
semafor 𝑎 = 1, 𝐿 = 𝑛, 𝑂 = 𝑜;
cobegin
----------
// (* producător *) //(* consumator *)
mesaj 𝑚; mesaj 𝑚;
---------- ----------
produce (&𝑚);
𝑃(𝐿); 𝑃(𝑂);
𝑃(𝑎); 𝑃(𝑎);
𝑏𝑢𝑓𝑓𝑒𝑟 [𝑙] = 𝑚; 𝑚 = 𝑏𝑢𝑓𝑓𝑒𝑟 [𝑜];
𝑙 = (𝑙 + 1) % 𝑛; 𝑜 = (𝑜 + 1) % 𝑛;
𝑉(𝑎); 𝑉(𝑎);
𝑉(𝑂); 𝑉(𝐿);
---------- ----------
coend;
9
Sisteme de timp real
Soluţia anterioară este corectă dar sincronizarea între procese este prea strânsă. O soluţie
mai eficientă se obţine plecând de la faptul că o operaţie de depunere şi una de extragere se
pot executa în paralel dacă se lucrează cu locaţii diferite.
Analizând variabilele cursor 𝑙 şi 𝑜 rezultă faptul că acestea sunt egale numai atunci când
buffer-ul este plin sau când buffer-ul este gol. Dar, în aceste două situaţii, producătorii sau
consumatorii, după caz, sunt împiedicaţi să acceseze buffer-ul. Prin urmare, excluderea
mutuală trebuie să se limiteze la procese de acelaşi tip. Pentru serializarea accesului la buffer
a producătorilor se introduce semaforul 𝑤, iar a consumatorilor, semaforul 𝑟. Mecanismul
de sincronizare între procese este descris de următoarea reţea Petri.
np L nc
n
P(L) P(O)
P(w) P(r)
w r
O
V(w) V(r)
V(O) V(L)
10
Sisteme de timp real
A
sau
u
11
Sisteme de timp real
w
ca = 0
A
ca > 0
ca
12
Sisteme de timp real
d) Procesele cititor sunt reactivate în grup iar procesul scriitor trebuie să aştepte.
13
Sisteme de timp real
la fişier conform acestei disciplinei de tip FIFO este prezentat sub formă de reţea Petri în
figura următoare.
14
Sisteme de timp real
Pseudocod 1 - Sincronizarea între procese pentru accesul la fişier după o disciplină FIFO
15
STR Cursul 12
1
Fig. 1 − Executarea regiunilor critice condiţionale.
2
Pentru varianta de control în care accesul la buffer este permis unui singur proces, se
impune ca buffer-ul T şi variabilele asociate l, o şi nm să fie incluse într-o singură structură,
partajată de către toate procesele. Secvenţa de program care descrie acest mecanism de
transfer este următoarea:
shared struct {
mesaj T [n];
int 𝑙 = 0;
int 𝑜 = 0;
int 𝑛𝑚 = 0;
} v;
cobegin
|| /* proces producător */ || /* proces consumator */
-------------- --------------
mesaj 𝑚; mesaj 𝑚;
-------------- --------------
#generează mesaj m ; region v when v.nm>0 do
region v when v.nm<n do m = v.T [v.o] ;
v.T [v.l] = m; v.o = (v.o+1) % n;
v.l = (v.l+1) % n; v.nm−−;
v.nm++; end;
end; #prelucrează mesaj m;
-------------- --------------
coend.
Se remarcă simplitatea şi claritatea secvenţei de program în acest caz.
3
mesaj 𝑚; mesaj 𝑚;
-------------- --------------
#generează mesaj 𝑚; region 𝑛𝑚 when 𝑛𝑚 > 0 do ;
region 𝑛𝑚 when 𝑛𝑚 < 𝑛 do ; region 𝑜 do
region l do m = T [o] ;
𝑇 [𝑙] = 𝑚; 𝑜 = (𝑜 + 1) % 𝑛;
𝑙 = (𝑙 + 1) % 𝑛; end;
end; ⊳
⊳ region 𝑛𝑚 do 𝑛𝑚 − −;
region 𝑛𝑚 do 𝑛𝑚 + +; #prelucrează mesajul m;
-------------- --------------
coend.
Regiunile critice „region l” şi „region o” realizează în mod corect serializarea pentru accesul
la buffer a proceselor producător, pe de o parte, şi a celor consumator, pe de altă parte. De
asemenea, se creează posibilitatea ca o operaţie de depunere şi una de extragere să se poată
face în paralel.
Sincronizarea pe condiţie, care să impiedice un proces producător să depună în buffer când
acesta este plin, sau ca un proces consumator să acceseze buffer-ul când acesta este gol, nu
mai este însă una corectă. Într-adevăr, să presupunem că 𝑛𝑚 = 𝑛 − 1 şi un proces producător
solicită accesul la buffer pentru depunerea unui nou mesaj. Accesul este permis şi operaţia
poate avea loc în mod corect. Dacă însă procesul este întrerupt (simbolul ⊳) înainte ca
actualizarea variabilei 𝑛𝑚 să aibă loc, atunci accesul la buffer va fi permis şi altui proces
producător, ceea ce nu mai este corect până când nu se creează o nouă locaţie liberă. Un
raţionament similar evidenţiază faptul că şi la procesele consumator poate apărea o eroare de
sincronizare pe condiţie de acest tip (de verificat!).
Eroarea semnalată a apărut datorită faptului că verificarea condiţiei de acces la buffer şi
actualizarea variabilei de stare 𝑛𝑚 se fac în structuri region nm diferite.
Pentru a depăşi acest neajuns, se încearcă o nouă variantă de sincronizare în care verificarea
condiţiei de acces la buffer şi actualizarea variabilei de stare 𝑛𝑚 să se facă în cadrul aceleiaşi
instrucţiuni region. Secvenţa de program ar fi următoarea:
4
Din păcate, nici această soluţie nu este corectă. De exemplu, să presupunem că 𝑛𝑚 = 0 şi un
proces producător solicită accesul la buffer pentru depunerea unui nou mesaj. Accesul este
permis în mod firesc. Dacă însă procesul este întrerupt înainte ca operaţia de depunere să se
fi încheiat, iar un proces consumator solicită accesul la buffer pentru preluarea mesajului,
accesul va fi permis în mod greşit pe baza variabilei de stare 𝑛𝑚 care este 1. O eroare de
sincronizare pe condiţie poate apărea şi atunci când un proces consumator este întrerupt
înainte ca operaţia de extragere să se fi încheiat (de verificat!). Această încercare a eşuat
pentru că variabila de stare 𝑛𝑚 este actualizată în avans, înainte ca operaţia să aibă loc.
Cele două încercări eşuate demonstrază faptul că o soluţie de sincronizare pe condiţie bazată
pe o singură variabilă de stare (𝑛𝑚 în acest caz) nu este posibilă.
Să revenim aşadar la soluţia implementată cu semafoare, unde starea buffer-ului este
descrisă redundant prin numărul de locaţii libere (𝐿) şi prin numărul de locaţii ocupate cu
mesaje nepreluate (𝑂), şi să imităm rezolvarea de acolo. Mecanismul de sincronizare care
rezolvă corect accesul la buffer în varianta îmbunătăţită este prezentat în continuare.
mesaj 𝑇 [𝑛];
shared int 𝑙 = 0; // variabilă partajată de procesele producător
shared int 𝑜 = 0; // variabilă partajată de procesele consumator
shared int 𝐿 = 𝑛;
shared int 𝑂 = 0; // variabile partajate de toate procesele
cobegin
|| /* producător */ || /* consumator */
mesaj 𝑚; mesaj 𝑚;
-------------- --------------
#generează mesaj 𝑚; region 𝑂 when 𝑂 > 0 do 𝑂 − −;
// verificarea accesului cu rezervarea unui mesaj
region 𝐿 when 𝐿 > 0 do 𝐿 − − ;
// verificarea accesului cu rezervarea unei locaţii region 𝑜 do
m = T [o] ;
region l do
𝑜 = (𝑜 + 1) % 𝑛;
𝑇 [𝑙] = 𝑚;
end;
𝑙 = (𝑙 + 1)% 𝑛;
end; region 𝐿 do 𝐿 + +;
// relansarea unui eventual proces producător
region 𝑂 do 𝑂 + +; care aşteaptă o locaţie liberă
// relansarea unui eventual proces consumator
care aşteaptă un nou mesaj #prelucrează mesaj m;
-------------- --------------
coend.
Notă: Ca o comparaţie, putem să ne gândim cum funcţionează un hotel, care este tot o
structură partajată cu mai multe locaţii de acelaşi tip. Verificarea accesului cu rezervare din
secvenţa noastră este identică cu solicitarea de rezervare a unei camere. Dacă solicitarea poate
fi îndeplinită se rezervă o cameră, pe care nu o ocupăm însă atunci. Apoi camera se
disponibilizează după ce este eliberată efectiv.
5
Pentru sincronizarea pe condiţie se foloseşte şi o altă formă de regiune critică condiţională
în care verificarea condiţiei de continuare a executării se face după efectuarea secvenţei de
instrucţiuni din corpul construcţiei region.
region v do instr. 1; instr. 2; …; instr. n await b end;
Pentru a evidenţia utilitatea acestei noi forme de sincronizare pe condiţie se propune
următoarea problemă.
ss w
ca = 0
ca > 0
R
ss = 0
ca
ss > 0
6
Variabila de stare 𝑠𝑠 este actualizată de procesele care solicită accesul la fişier în scriere şi
trebuie verificată de procesele care solicită accesul în citire. Similar, variabila de stare 𝑐𝑎 este
actualizată de procesele care au obţinut accesul la fişier în citire şi trebuie verificată de
procesele care solicită accesul în scriere. Pentru a putea fi folosite în cadrul aceleiaşi
instrucţiuni region cele două variabile trebuie reunite într-o singură structură partajată.
shared struct {
int 𝑠𝑠 = 0;
int 𝑐𝑎 = 0;
} v;
shared int w;
cobegin
|| /* Proces 1 - acces în scriere */ || /* Proces 2 - acces în citire */
-------------- --------------
region 𝑣 do 𝑣. 𝑠𝑠 + +; await 𝑣. 𝑐𝑎 == 0 end; region 𝑣 when 𝑣. 𝑠𝑠 == 0 do 𝑣. 𝑐𝑎 + + end;
region w do # deschide fişier în citire
# deschide fişier cu opţiune de scriere # citeşte fişier
# actualizează fişier # închide fişier
# închide fişier
region 𝑣 do 𝑣. 𝑐𝑎 − −;
end;
--------------
region 𝑣 do 𝑣. 𝑠𝑠 − −;
--------------
coend.
7
STR Cursul 13 – partea I
𝑓 = −1
A A
sau
𝑓 >0
=1
➢ Rezolvare
Pe baza elementelor menţionate anterior, se încearcă realizarea un mecanism de control
privind accesul la fişier conform următoarei secvenţe de program. De remarcat că la scriere,
pentru asigurarea accesului exclusiv la fișier, operațiile de lucru cu fișierul sunt incluse în
corpul instrucțiunii 𝑟𝑒𝑔𝑖𝑜𝑛 𝑓, în timp ce operațiile de lucru cu fișierul în citire sunt în mod
necesar în afara oricărei instrucțiuni 𝑟𝑒𝑔𝑖𝑜𝑛.
1
cobegin
|| /* Proces 1 - acces în scriere */ || /* Proces 2 - acces în citire */
--------------------- ---------------------
region 𝐴 when 𝐴 == deschis do A = închis; end; region 𝐴 when 𝐴 == deschis do ; end;
⊳
region f when 𝑓 == 0 do
𝑓 = −1; region f when 𝑓 ≥ 0 do 𝑓 + +;
# deschide fişier cu opţiune de scriere # deschide fişier în citire
# actualizează fişier # citeşte fişier
# închide fişier # închide fişier
𝑓 =0;
region f do 𝑓 − −;
end;
---------------------
region 𝐴 do 𝐴 = deschis ; end;
---------------------
coend.
La această primă variantă, există însă un neajuns. Să considerăm situația în care fișierul
este liber (𝑓 = 0) și un proces care solicită accesul în citire este întrerupt între cele două
instrucțiuni 𝑟𝑒𝑔𝑖𝑜𝑛 , așa cum este ilustrat în figură prin simbolul ⊳ . Dacă următoarea
solicitare este pentru scrierea în fișier, aceasta va fi acceptată înaintea cererii anterioare de
acces în citire, încălcându-se astfel regula accesului în ordinea solicitărilor. Mecanismul de
control privind accesul la fișier în citire descris în următoarea secvență de program rezolvă
acest neajuns.
2
2. Concluzii privind regiunile critice
Faţă de semafoare, regiunile critice au marcat un salt deosebit în ceea ce priveşte creşterea
simplităţii şi clarităţii programelor. Variabilele partajate sunt specificate explicit, iar
excluderea mutuală între procese se realizează în mod automat. Încercarea de accesare a unei
variabile partajate în afara regiunii critice corespunzătoare este semnalată ca eroare de către
compilator. De asemenea, sincronizarea pe condiţie este clar evidenţiată în program.
Cu toate acestea, regiunile critice au un mare neajuns, acela că sincronizarea pe condiţie se
realizează prin aşteptare semiactivă. Aşa cum este evidenţiat şi în reţeaua Petri, procesele sunt
reactivate în mod repetat pentru a-şi verifica condiţia necesară continuării execuţiei.
În ceea ce priveşte structura programului, regiunile critice sunt dispersate în interiorul
proceselor, ceea ce face ca pentru verificarea corectitudinii codul sursă să fie parcurs în
întregime.
3
STR Cursul 13 – partea a II-a
Monitor M;
var
condition 𝑥;
boolean 𝑐 ;
procedure 𝑝1; procedure 𝑝2 ;
begin begin
……… ………
if not 𝑐 then 𝑤𝑎𝑖𝑡(𝑥); if 𝑐 then 𝑠𝑖𝑔𝑛𝑎𝑙(𝑥);
……… ………
end; end;
begin
𝑐 ∶= 𝑓𝑎𝑙𝑠𝑒;
end. // monitor M
1
Sincronizarea pe condiţie între două procese este ilustrată în figura următoare.
2
- Dacă, însă, în coada de aşteptare sunt procese blocate, atunci procesul curent se
auto-suspendă temporar şi este blocat în coada de aşteptare dedicată proceselor care
execută 𝑠𝑖𝑔𝑛𝑎𝑙.
- Unul din procesele blocate în coada de aşteptare dedicată variabile 𝑥 este reactivat
pentru a-şi continua procedura de monitor întreruptă cu următoarea instrucţiune de
după 𝑤𝑎𝑖𝑡(𝑥).
Prin urmare, sincronizarea pe condiţie în cadrul structurii de monitor implică formarea
mai multor cozi de aşteptare, şi anume:
- O coadă de aşteptare dedicată proceselor care solicită accesul la monitor; procesele
sunt reactivate în ordinea solicitărilor pe măsură ce monitorul este eliberat.
- Câte o coadă de aşteptare pentru fiecare variabilă 𝑥 de tip condition – în aceste cozi
sunt blocate procesele pentru care nu sunt îndeplinite condiţiile de continuare a
executării lor.
- O coadă de aşteptare dedicată proceselor care se autosuspendă temporat prin
intermediul operaţiei signal; aceste procese au prioritate la reactivare faţă de alte
procese care nu au primit încă acceptul de acces la monitor.
În continuare se exemplifică sincronizarea între procese prin intermediul acestui
mecanism.
Aşa cum se arată în figură, se foloseşte o variabilă de stare 𝑛𝑚 care reflectă numărul de
mesaje nepreluate. Prin urmare, se poate impune ca producătorii să aibă acces la buffer
când 𝑛𝑚 < 𝑛, iar consumatorii, când 𝑛𝑚 > 0. Variabilele cursor l şi o au semnificaţia
cunoscută.
cobegin
|| /* proces producător */ || /* proces consumator */
---------------- ----------------
mesaj 𝑚; mesaj 𝑚;
#generează mesaj m; M.extrage(&𝑚);
M.depune(𝑚); #prelucrează mesaj m;
---------------- ----------------
coend.
3
Monitor M;
mesaj 𝐵[𝑛];
int 𝑙, 𝑜, 𝑛𝑚;
condition 𝑃, 𝐶;
procedure 𝑑𝑒𝑝𝑢𝑛𝑒 (mesaj 𝑚); procedure 𝑒𝑥𝑡𝑟𝑎𝑔𝑒 (mesaj ∗ 𝑝𝑚);
begin begin
if 𝑛𝑚 == 𝑛 then 𝑤𝑎𝑖𝑡(𝑃); if 𝑛𝑚 == 0 then 𝑤𝑎𝑖𝑡(𝐶);
𝐵 [𝑙] = 𝑚; ∗ 𝑝𝑚 = 𝐵 [𝑜] ;
𝑙 = (𝑙 + 1) % 𝑛; 𝑜 = (𝑜 + 1) % 𝑛;
𝑛𝑚 + +; 𝑛𝑚 − −;
𝑠𝑖𝑔𝑛𝑎𝑙(𝐶); 𝑠𝑖𝑔𝑛𝑎𝑙(𝑃);
end end
begin
𝑛𝑚 = 0;
𝑙 = 0;
𝑜 = 0;
end. // Monitor M
Să reluăm problema controlului privind accesul la un fişier partajat de către mai multe
procese concurente, în care operaţiile de scriere în fişier au prioritate faţă de cele de citire.
Reamintim că scrierea în fişier se face prin excludere mutuală între procese, iar citirea
simultană din fişier este permisă pentru mai multe procese.
Pentru a impune ca solicitările de acces în scriere să se facă cu prioritate, procesele care
trebuie să aştepte accesul la fişier sunt dispuse la coadă în funcţie de tipul accesului.
4
𝑠𝑠 S
𝑐𝑎 = 0
𝑐𝑎 > 0
C
𝑠𝑠 = 0
ca
𝑠𝑠 > 0
cobegin
|| /* proces 1 */ || /* proces 2 */
Monitor M;
int 𝑠𝑠, 𝑐𝑎;
condition 𝑆, 𝑅;
5
procedure 𝑠𝑓𝑎𝑟𝑠𝑖𝑡𝑆𝑐𝑟𝑖𝑒𝑟𝑒(); procedure 𝑠𝑓𝑎𝑟𝑠𝑖𝑡𝐶𝑖𝑡𝑖𝑟𝑒();
begin begin
𝑠𝑠 − −; 𝑐𝑎 − −;
if 𝑠𝑠 > 0 then 𝑠𝑖𝑔𝑛𝑎𝑙(𝑆); if 𝑐𝑎 == 0 then 𝑠𝑖𝑔𝑛𝑎𝑙(𝑆);
else 𝑠𝑖𝑔𝑛𝑎𝑙𝐴𝑙𝑙(𝐶); end
end
begin
𝑠𝑠 = 0;
𝑐𝑎 = 0;
end. // Monitor M
6
STR Cursul 14
Entry queue
1 3
Monitor
Wait
queue Variabile partajate
2
Procedura 𝑝1
6
Procedura 𝑝2 4
7 5
1
Evenimentele evidenţiate în figură prin săgeţi numerotate au următoarea semnificaţie:
1 – Primul proces accesează monitorul şi începe executarea procedurii 𝑝1 ;
2 – Procesul se autosuspendă executând operaţia 𝑤𝑎𝑖𝑡 şi eliberează monitorul;
3 – Al doilea proces accesează monitorul şi începe executarea procedurii 𝑝2 ;
4 – Procesul execută operaţia 𝑛𝑜𝑡𝑖𝑓𝑦 dând astfel un semnal de îndeplinire a condiţiei
proceselor blocate în acest scop.
5 – Procesul termină procedura 𝑝2 şi eliberează monitorul;
6 – Procesul blocat este reactivat pentru continuarea procedurii 𝑝1 din punctul
întrerupt;
7 – Procesul termină procedura 𝑝1 şi eliberează monitorul.
Să reluăm problema controlului privind accesul la un fişier partajat de către mai multe
procese concurente. Specificaţiile privind accesul la fişier sunt următoarele:
• Scrierea în fişier se face prin excludere mutuală între procese;
• Citirea simultană din fişier este permisă pentru oricâte procese;
• De regulă, procesele care solicită accesul la fişier în scriere sunt acceptate cu prioritate,
dar atunci când numărul proceselor blocate pentru accesul la fişier în citire este mare
(de exemplu, ≥ 4) se acordă prioritate acestora.
2
Aşa cum am procedat şi la 𝑅𝑒𝑔𝑖𝑢𝑛𝑖 𝑐𝑟𝑖𝑡𝑖𝑐𝑒, pentru reflectarea la nivelul aplicaţiei a stării
fişierului la un moment dat, se foloseşte o variabilă f cu următoarea semnificaţie:
ss 𝑆
𝑓 = −1
sau
sc 𝐶
𝑓 >0
=1
Monitor M1;
var
int 𝑓, 𝑠𝑠, 𝑠𝑐; % variabile partajate
condition 𝑆, 𝐶;
3
procedure 𝑎𝑐𝑐𝑒𝑠𝑆𝑐𝑟𝑖𝑒𝑟𝑒(); procedure 𝑎𝑐𝑐𝑒𝑠𝐶𝑖𝑡𝑖𝑟𝑒();
{ {
𝑠𝑠 + +; 𝑠𝑐 + +;
if (𝑓 ! = 0) 𝑤𝑎𝑖𝑡(𝑆); if (𝑓 == −1 ∥ 𝑠𝑠 >0) 𝑤𝑎𝑖𝑡(𝐶);
𝑠𝑠 − −; 𝑠𝑐 − −;
𝑓 = −1; 𝑓 + +;
} }
Observaţie:
În 𝑎𝑐𝑐𝑒𝑠𝐶𝑖𝑡𝑖𝑟𝑒 varianta cu while este greşită! % while (𝑓 == −1 ∥ 𝑠𝑠 >0) 𝑤𝑎𝑖𝑡(𝐶);
Monitor M2;
var
int 𝑓, 𝑠𝑠, 𝑠𝑐; % variabile partajate
condition 𝑆, 𝐶;
procedure 𝑎𝑐𝑐𝑒𝑠𝑆𝑐𝑟𝑖𝑒𝑟𝑒(); procedure 𝑎𝑐𝑐𝑒𝑠𝐶𝑖𝑡𝑖𝑟𝑒();
{ {
𝑠𝑠 + +; 𝑠𝑐 + +;
if (𝑓 ! = 0) 𝑤𝑎𝑖𝑡(𝑆); if (𝑓 == −1 ∥ 𝑠𝑠 >0) 𝑤𝑎𝑖𝑡(𝐶);
𝑠𝑠 − −; 𝑠𝑐 − −;
𝑓 = −1; 𝑓 + +;
} }
4
procedure 𝑠𝑓𝑎𝑟𝑠𝑖𝑡𝑆𝑐𝑟𝑖𝑒𝑟𝑒(); procedure 𝑠𝑓𝑎𝑟𝑠𝑖𝑡𝐶𝑖𝑡𝑖𝑟𝑒();
{ {
int 𝑖, 𝑛𝑟; % variabile locale int 𝑖, 𝑛𝑟; % variabile locale
𝑓 = 0; 𝑓 − −;
if (! 𝑠𝑠 && 𝑠𝑐 > 0) 𝑠𝑖𝑔𝑛𝑎𝑙𝐴𝑙𝑙(𝐶); if (! 𝑓 && 𝑠𝑠 > 0 && 𝑠𝑐 < 4) 𝑠𝑖𝑔𝑛𝑎𝑙(𝑆);
else if (𝑠𝑠 > 0 && 𝑠𝑐 < 4) 𝑠𝑖𝑔𝑛𝑎𝑙(𝑆); else if (𝑠𝑐 ≥ 4) {
else if (𝑠𝑠 > 0 && 𝑠𝑐 ≥ 4) { 𝑛𝑟 = 𝑠𝑐 − 3;
/* variantă greşită (!) for(𝑖 = 1; 𝑖 ≤ 𝑛𝑟; 𝑖 + +) {
for(𝑖 = 1; 𝑖 ≤ 𝑠𝑐 − 3; 𝑖 + +) { 𝑠𝑖𝑔𝑛𝑎𝑙(𝐶);
𝑠𝑖𝑔𝑛𝑎𝑙(𝐶); }
} /* sau, tot bine
procesele relansate decrementează
while (𝑠𝑐 ≥ 4) 𝑠𝑖𝑔𝑛𝑎𝑙(𝐶); */
variabila 𝑠𝑐, modificându-se astfel
numărul de procese relansate */ /* la varianta cu 𝑛𝑜𝑡𝑖𝑓𝑦 soluţia ar fi
profund greşită ->buclă infinită */
𝑛𝑟 = 𝑠𝑐 − 3;
for(𝑖 = 1; 𝑖 ≤ 𝑛𝑟; 𝑖 + +) { } % 𝑒𝑛𝑑 − 𝑖𝑓
𝑠𝑖𝑔𝑛𝑎𝑙(𝐶); } % 𝑒𝑛𝑑 − 𝑠𝑓𝑎𝑟𝑠𝑖𝑡𝐶𝑖𝑡𝑖𝑟𝑒
}
} % 𝑒𝑛𝑑 − 𝑖𝑓
} % 𝑒𝑛𝑑 − 𝑠𝑓𝑎𝑟𝑠𝑖𝑡𝑆𝑐𝑟𝑖𝑒𝑟𝑒
5
în scriere, şi unul sau mai multe procese consecutive (relansare în grup) dacă acestea solicită
accesul în citire. Dar, cu privire la o coadă de aşteptare asociată unei variabile 𝑥 de tip
condition nu cunoaştem decât dacă aceasta conţine sau nu procese blocate. În acest scop se
poate apela o funcţie de tip 𝑞𝑢𝑒𝑢𝑒(𝑥) sau 𝑒𝑚𝑝𝑡𝑦(𝑥) a căror semnificaţie este evidentă.
Pe de altă parte, la soluţia bazată pe semafoare sau pe regiuni critice, s-a arătat că pentru
accesul la fişier este necesară o decizie în două trepte. Vom adopta şi aici acest model,
impunând două trepte de decizie, 𝐴1 şi 𝐴2 , aşa cum este ilustrat în figura următoare.
𝑓 = −1
𝐴1 𝐴2
sau
𝑓 >0
=1
În acest mod, la eliberarea fişierului, este deblocat un singur proces, cel care aşteaptă la
poarta de acces 𝐴2 , urmând ca acesta să relanseze la rândul său un proces din coada de
aşteptare primară (din spatele porţii de acces 𝐴1 ) . Când în coada primară sunt cereri
consecutive care solicită accesul în citire, acestea sunt deblocate unul câte unul, fiind practic
relansate în grup. După acestea, procesul care solicită accesul la fişier în scriere va rămâne
blocat la poarta de acces 𝐴2 .
Secvenţa de program care priveşte lucrul cu fişierul şi structura de monitor (numit 𝑀𝐶𝐹)
pentru controlul accesului la fişier sunt prezentate în continuare.
cobegin
|| /* proces 1 */ || /* proces 2 */
6
Monitor 𝑀𝐶𝐹;
int 𝑓;
condition 𝐴1 , 𝐴2 ;
procedure 𝑎𝑐𝑐𝑒𝑠𝑆𝑐𝑟𝑖𝑒𝑟𝑒(); procedure 𝑎𝑐𝑐𝑒𝑠𝐶𝑖𝑡𝑖𝑟𝑒();
begin begin
while (𝑞𝑢𝑒𝑢𝑒(𝐴2 )) 𝑤𝑎𝑖𝑡(𝐴1 ); while (𝑞𝑢𝑒𝑢𝑒(𝐴2 )) 𝑤𝑎𝑖𝑡(𝐴1 );
while (𝑓 ! = 0) 𝑤𝑎𝑖𝑡(𝐴2 ); while (𝑓 == −1) 𝑤𝑎𝑖𝑡(𝐴2 );
𝑓 = −1; 𝑓 + +;
𝑛𝑜𝑡𝑖𝑓𝑦(𝐴1 ); 𝑛𝑜𝑡𝑖𝑓𝑦(𝐴1 );
end end