Capitolul 1
ALGORITMI ŞI PROGRAME
Calculatorul poate constitui o prelungire utilă a inteligenţei umane în măsura în care el este programat astfel încât să permită rezolvarea eficientă a unor probleme concrete. Programul conţine informaţia necesară soluţionării unei probleme sub forma succesiunilor de instrucţiuni care descriu operaţii de prelucrare pe care un calculator real sau virtual le poate executa. Dacă programul descrie procesul de soluţionare automată a unei anumite probleme, sistemul de programe, produs informatic de o complexitate mai ridicată, conţine virtual soluţiile mai multor probleme distincte, dar legate
între ele. Astfel compilatorul reprezintă un program, în timp ce sistemul de operare al unui calculator sau sistemul de rezervare a biletelor de avion sunt sisteme de programe.
Din punct de vedere static, programul poate fi privit ca o funcţie f definită pe mulţimea datelor iniţiale X cu valori în mulţimea rezultatelor finale Y. Funcţia f: X->Y, care reprezintă în mod static programul, poate fi o funcţie parţială, dacă pentru orice x e X există cel mult o valoare y e Y astfel încât y = f(x), sau poate fi o funcţie totală dacă pentru orice xe X există o valoare y e Y astfel încât y = f(x). Astfel, funcţia totala corespunde unui program care permite soluţionarea unei probleme pentru orice date iniţiale posibile, în timp ce funcţia partiala corespunde unui program, care furnizează soluţii numai pentru anumite seturi de date iniţiale.
Noţiunea de funcţie nu poate modela complet un program deoarece eludează modul constructiv de soluţionare a problemei prin calculul efectiv al rezultatului pe baza unei succesiuni de operării simple. Acest aspect dinamic al programului poate fi modelat prin noţiunea de algoritm. Algoritmul este o procedură de evaluare a unei funcţii prin care se determină, pentru fiecare element din domeniul de definiţie al funcţiei, valoarea corespunzătoare [1]. Algoritmul este descris prin precizarea atât a domeniului datelor iniţiale, cât şi a instrucţiunilor formate din operaţii elementare, care pot fi executate de către un agent uman, mecanic sau electronic, în speţă de către un calculator. Algoritmul exprimat printr-o succesiune de instrucţiuni inteligibile de către calculator constituie însuşi programul.
O problemă rezolvabilă cu ajutorul calculatorului este reprezentată de o funcţie calculâbilă, adică algoritmică. Una şi aceeaşi funcţie poate fi evaluată de mai mulţi algoritmi. Există însă şi funcţii care nu pot fi evaluate de nici un algoritm. Cercetările matematice au stabilit care sunt clasele de funcţii calculable (algoritmice) [1]. Astfel, familia funcţiilor primitiv recursive constituie clasa de funcţii cel mai uşor de calculat.
Pentru a defini această clasă se consideră funcţiile de bază S(x) = x + 1 (funcţia succe sor) iar [x] este partea întreagă a lui x. Funcţia E(x) reprezintă abaterea faţă de cel mai apropiat pătrat perfect mai mic
decât x.Familia funcţiilor primitiv recursive este cea mai mică familie de funcţii care contine funcţiile S şi E si este închisă faţă de operabile de adunare, compunere şi iteraţie. Se observă că orice astfel de funcţie poate fi construită pornind de la funcţiile de bază si aplicând de un număr finit de ori cele trei operaţii, în orice ordine. Astfel funcţia f(x) = x + 4 este primitiv recursivă deoarece se obţine .prin aplicarea de patru ori a compunerii asupra funcţiei succesor f(x) = S(S(S(S(x)))).
Se demonstrează [1] că orice funcţie primitiv recursivă este totală. într-adevăr, funcţiile de bază S şi E sunt totale, iar operaţiile de sumă. compunere şi iteraţie păstrează această proprietate.
In cazul funcţiilor de mai multe variabile, rolul iteraţiei este jucat de recurenţa primitivă. Fie g şi h două funcţii totale de n, respectiv n + 2 variabile. Cu ajutorul lor se defineşte o funcţie unică f de n+l variabile astfel încât f( x1,x2,x3, .. .xn 0) = g( x1,x2,... xn) şi f( x1,x2,, y+ 1)-A(x„ x2,. . x„ y,fixv x2, x3, ...,x„ y)).
Funcţia f a fost definită prin recurenţă primitivă cu ajutorul funcţiilor g şi h. Variabila y este variabilă de recurenţă, iar variabilele x1,x2,x3, .. .xn sunt parametri.
Se poate acum defini familia functiilor primitiv recursive de n variabile ca fiind cea mai mică familie de funcţii care conţine funcţiile constante C (x1,x2,x3, .. .xn) = m, proiecţii P(x1,x2,x3, .. .xn)= x; {1<=i<=, n), succesor S(x) = x + 1 şi este închisă faţă de operaţiile de compunere funcţională, f(x1,x2,x3, .. .xn) = h(x1,x2,x3, .. .xn), . . ., gx1,x2,x3, .. .xn) şi de recurenţă primitivă.
Multe funcţii uzuale ca funcţia exponenţială, factorial, predecesor, funcţiile semn şi de comparaţie sunt primitiv recursive. Există funcţii calculabile care nu sunt primitiv recursive. Asemenea funcţii sunt funcţiile parţiale care sunt calculabile pentru orice valoare a argumentului în domeniul de definiţie şi anumite funcţii care cresc mai repede decât orice funcţie primitiv recursivă. Pentru a extinde clasa recursivitătii primitive astfel încât să includă şi alte funcţii calculabile, se defineşte operaţia de minimizare. O funcţie f(x), se obţine prin minimizarea unei funcpi totale g(x, y) în felul următor: dacă există y astfel încât g(x, y) = 0, sumă fx) este cel mai mic ycare îndeplineşte condiţia respectivă; dacă, pentru orice y, g(x. y)!= 0 atunci f(x) nu este definită. O funcţie obţinută prin minimizare nu este neapărat totală, deci nu face parte în mod necesar din clasa funcţiilor primitiv recursive.
O clasă care include numai funcţii calculabile fără să fie toate primitiv recursive este clasa funcţiilor parţial recursive, care este cea mai mică familie de funcţii care conţine funcţiile succesor, constante şi proiecţii şi care este închisă faţă de operaţiile de minimizare aplicate unei funcţii totale, compunere funcţională şi recurenţă primitivă. Se observă că orice funcţie primitiv recursivă este parţial recursivă dar reciproca nu este adevărată. Operaţiile de compunere funcţională şi de recurenţă primitivă pot fi aplicate unor funcţii parţiale, dar operaţia de minimizare acţionează numai asupra funcţiilor totale. Familia funcţiilor parţial recursive conţine numai funcţii calculabile, deoarece funcţiile de bază sunt calculabile iar operaţiile de compunere funcţională, recurenţă primitivă şi minimizare conservă această proprietate.
O categorie intermediară între familia funcţiilor parţial recursive şi familia funcţiilor primitiv recursive este aceea a funcţiilor recursive, care include funcţiile care sunt în acelaşi timp totale şi parţial recursive. Astfel, o funcţie primitiv recursivă este şi recursivă, o funcţie recursivă este şi parţial recursivă, dar afirmaţiile reciproce nu sunt adevărate.
Funcţiile parţial recursive par să acopere întreaga mulţime a funcţiilor calculabile prin algoritmi, oricât de complicaţi. Teza Church-Turing afirmă că orice funcţie calculabilă este parţial recursivă, iar orice funcţie totală şi calculabilă este recursivă. Această teză nu poate fi demonstrată matematic, ci doar justificată pe baza unor argumente pre matematice. [1].
Admiţând valabilitatea tezei Church-Turing, rezultă o descriere matematic exactă a funcţiilor calculabile prin algoritmi, respectiv a problemelor care pot fi rezolvate cu ajutorul calculatorului Dacă aceste probleme pot fi descrise riguros din punct de vedere static cu ajutorul conceptului matematic de funcţie, descrierea lor dinamică, prin intermediul noţiunii de algoritm, este mai puţin riguroasă. Este uşor să se dea exemple de algoritmi sau de proceduri care nu sunt algoritmice, dar este dificil să se construiască un model matematic general pentru noţiunea de algoritm. Este important insă de relevat aptul că o funcţie care poate fi evaluată printr-un algoritm de un anumit tip. de exemplu de o maşină Turing, poate fi evaluată şi printr-un algoritm de alt tip, de exemplu un algoritm Markov.
Rezultă o invariantă a familiei funcţiilor calculabile în raport cu definiţia algoritmului, în concluzie, pentru o anumită problemă reprezentată de o funcţie parţial recursivă, există cel puţin un algoritm cu ajutorul căruia ea poate fi rezolvată, adică o procedură sistematică de calcul al rezultatelor printr-o succesiune controlată de operaţii elementare.
Abordarea programului la nivel global este o abordare statică prin care programul este văzut ca o funcţie calculabilă (parţial recursivă) care transformă datele de intrare în rezultate la ieşire. într-o abordare dinamică a modului de construcţie sistematică a rezultatelor, programul trebuie privit din unghi de vedere structural luând în consideraţie componentele sale şi relaţiile dintre ele.
La nivelul elementar, programul este compus din instrucţiuni, fiecare instrucţiune descriind o operaţie pe care o maşină reală sau virtuală o poate executa. Astfel de operaţii sunt operaţiile aritmetice (reductibile la adunare, în cod binar) şi comparaţia între două numere. Ordinea de execuţie la timp a instrucţiunilor constituie structura programului. Pentru descrierea structurilor fundamentale se pot folosi grafuri orientate (organigrame), pseudocodun şi diagrame arborescente. O organigramă este un graf orientat în care nodurile reprezintă procese de calcul, iar arcele reprezintă transferul de control
(ordinea în care procesele de calcul sunt executate). Pseudocodul este o notaţie care permite exprimarea logicii programelor într-un mod oarecum formalizat, fără a fi necesare reguli de sintaxă ca în limbajele de programare. Diagrama arborescentă este un mod de notare asemănător cu pseudocodul dar dispus sub o formă grafică sugestivă pentru etapele de rezolvare ale problemei.
Fig.1.1. Noduri: i) proces; b) predicat; c) colector,
Nodurile utilizate într-o organigramă sunt de trei feluri: noduri proces, noduri predicat şi noduri colector (fig. 1.1). Un nod proces este asociat unei funcţii calculabile f: X ->Y care transformă datele de intrarea în rezultatele parţiale Y la ieşirea nodului. Nodul predicat este asociat unei funcţii binare de comparaţie de tipul: funcţii care sunt primitiv recursive Acest nod transferă controlul pe una din cele două
ieşiri, realizând o ramificare a programului, după cum condiţia c este sau nu îndeplinită.
Nodul colector este asociat funcţiei identitate şi are rolul de dirijare a controlului într-un singur punct.
Un program propriu sau bine format este caracterizat printr-un singur arc de in trare şi un singur arc de ieşire, iar pentru orice nod, există cel puţin un drum de la arcul de intrare la arcul de ieşire care trece prin acel nod. Două programe sunt echivalente dacă definesc aceeaşi funcţie fără a avea structuri de control neapărat identice.
O structură de bază a unui program este structura secvenţială, în care ordinea execuţiei coincide cu ordinea sintactică, adică instrucţiunile sunt executate în ordinea în care au fost scrise. In reprezentarea cu pseudocoduri şi cu diagrame arborescente, structura secvenţială se notează (BLOCK, S1,S2 ) (fig. 1.2).
Structura alternativă (de selecţie) caracterizează acele părţi din program care conţin secvenţe de instrucţiuni care se execută numai în anumite condiţii (fig. 1.3). în reprezentarea prin organigramă, nodul predicativ indică succesiunea de execuţie StS2dacă este îndeplinită condiţia c şi succesiunea StS} în caz contrar. în celelalte două reprezentări, structura alternativă se notează (IF THEN ELSE, c, S2,S3).
Structura alternativă cu ramură vidă este un caz particular al celei precedente, caz în care într-una din variante nu se execută nici o instrucţiune. Notaţia utilizată este (IF THEN, c, S2,) (fig. 1.4).
a b c
fig. 1.2. Structura alternativa reprezentata prin a)organigrama; b)pseudocod; c)diagaramana arborescenta.
fig. 1.3. Structura alternativa reprezentata prin a)organigrama; b)pseudocod; c)diagaramana arborescenta.
fig. 1.4. Structura alternativa reprezentata prin a)organigrama; b)pseudocod; c)diagaramana arborescenta.
Structura alternativă generalizată permite .alegerea între mai mult de două posibilităţi, în funcţie de valorile C1,C2,...,Cn pe care le poate lua condiţia c. Pseudocodul corespunzător este (CASE OF, c, S1,S2,...,Sn ) (fig. 1.5).
Există procese de prelucrare care trebuie repetate identic de mai multe ori. Numărul de repetări depinde de o condiţie c care trebuie evaluată fie anterior, fie posterior fiecărei execuţii a secvenţei repetate. O astfel de structură repetitivă este simbolizată prin WHILE DO, c, S) dacă este condiţionată anterior şi prin (DO UNTIL, c, S) dacă este condiţionată posterior (fig. 1.6).
La nivel global programul este format dintr-un singur bloc complex cu o intrare şi o ieşire. Acest bloc poate fi descompus succesiv în trei moduri;
a) ca o secvenţă de două sau mai multe blocuri cu o intrare şi o ieşire;
b) ca o selecţie între două sau mai multe posibilităţi;
c) ca o repetare a unei secvenţe de operaţii. Această descompunere în paşi succesivi (stepwise refinement) porneşte de la nivelul global şi continuă până când fiecare bloc corespunde unei operaţii executabile pe calculatorul real sau virtual (abordare TOP-DOWN) Faptul că orice program poate fi descompus utilizând numai structurile elementare descrise este garantat de teorema de structură Bohm-Jacopini [2J. Modalitatea inversă, de sinteză a unui program pornind de la structurile fundamentale este numită abordare BOTTOM-UP. Este firesc ca proiectarea programului să urmeze o abor-
dare de tip TOP-DOWN, pornind de la obiectivul urmărit şi ajungând la structura detaliată a programului decât procedeul invers BOTTOM-UP, de a încerca o combinaţie de structuri elementare pentru a realiza funcţia globală [3].
Descompunerea succesivă (stepwise refinement) a programului este echivalentă cu raţionamentul din aproape în aproape de rezolvare a unei probleme. Fie f: X ->Y funcţia care caracterizează ansamblul programului. Descompunerea acestei funcţii într-o structură secvenţială înseamnă să se determine două funcţii g şi h astfel încât pentru orice x e X si y e Y să avem y = h(g(x)). Se observă că există un grad mare de libertate în alegerea funcţiilor g şi h.
Descompunerea funcţie f într-o structură alternativă cu două variante implică de terminarea unei funcţii binare de comparaţie c(x) şi a două funcţii g(x) şi h(x) astfel încât dacă c(x) = 1 ,y = g{x) şi dacă c(x) =0, y = h(x). în acest caz alegerea lui c(x) este arbitrară, cu condiţia ca domeniul lui de definiţie să coincidă cu cel a funcţiei f dar funcţiile g şi h sunt complet determinate de partiţia definită de c pef
Descompunerea funcţiei f într-o structură repetitivă presupune determinarea unei funcţii binare de comparaţie c(x) şi a unei funcţii g(x) a cărei iteraţie (compunere cu ea însăşi) de un număr de ori dictat de condiţia c(x) să conducă la valorile funcţiei f Astfel, dacă c(x) =1, .rezultă y = f(g(x)), iar dacă c(x) = 0, rezultă y = x. în aceste caz poate fialeasă orice funcţie g prin a cărei compunere repetată să rezulte / iar funcţia c{x) este în mod unic determinată de f şi g.
Atenţia concentrată la descompunerea succesivă a unei probleme în structuri elementare de raţionamente pare a garanta corectitudinea soluţionării acesteia. Teorema fundamentală a ingineriei programării [2] arată posibilitatea rezolvării problemelor complexe prin reducerea lor la un număr de probleme mai simple, dificultatea asociată rezolvării reuniunii de probleme mai simple fiind mai mică decât aceea asociată proble mei iniţiale mai complexe. Punctul de vedere implicit al filozofiei programării este cel cartezian, stăpân asupra metodei, "prin care se pot rezolva in general toate chestiunile ce ar fi propuse asupra oricărei cantitati, continue şi discontinue " |4],
Susţinând capacitatea mintii omeneşti de a forma lanţuri lungi de raţionamente din aproape în aproape, Descartes afirmă [4]: "Aceste lungi şiruri de judecaţi cu lotulA ample şi uşoare, de care geometrii au obiceiul să se folosească pentru a parveni la demonstraţiile lor cele mai dificile, mi-au dat ocazia să-mi imaginez că toate lucrurile care pot cădea In sfera de cunoaştere a oamenilor se tnlănpdesc reciproc fn acelaşi mod, şi rtu-i nevoie decât [. . .] să păstrăm totdeauna ordinea necesară pentru a le deduce unele din altele, şi atunci nu pot exista nici unele atât de depărtate încât] să nu
parvenim în cele din urmă la ele, nici atât de ascunse încât sâ nu le descoperim ".
In realitate, capacitatea omului de a na greşi în condiţiile unei înlănţuiri de raţionamente este redusă. De aceea, orice program care descrie soluţionarea unei problemen conţine erori, cu atât mai numeroase cu cât complexitatea problemei esu mai mare.Aceste erori rămân latente până când anumite circumstanţe determină manifestarea lot sub formă de defectări ale sistemului informatic.Imprevizibilitatea manifestării erorilor este sursa lipsei de fiabilitate a programelor. Examinarea fiabilităţii programelor utilizează conceptele şi metodele dezvoltate In vederea caracterizării fiabilităţii sistemelor hardware, teoria fiabilităţii având tn prezent amploarea necesară abordării într-o viziune unitară a oricărui tip de sistem.
BIBLIOGRAFIE
1. Ca lude, Ci - Complexitatea calculului Aiptcte calitativa Editura Ştiinţifici ţi Etatctopedit*, BncutcaU,
1982.IViduva, 1. j,a_,- Ingtntria programSrti, voi 1-2.EdituraAc*demiei.Bucureşti, 1985.
3,MaaoIeicu, O.,-AbordareaierarhicinucMralSfiinformatica.EdituraAcademia,Bucurefu 1983.
4. Descartes, R. -Oeuvrts. Citat din lucrarea Iui Dumtlrtu Anton. Ernti EdituraEmnAcu,Bucunatî,
1986.
Capitolul 2
CONCEPTUL DE FIABILITATE ÎN DOMENIUL SOFTWARE
2 1 MODELUL GENERAL AL FIABILITĂŢII SISTEMELOR
Teoria fiabilităţii s-a dezvoltat în strânsă legătură cu previziunea evoluţiei temporale a sistemelor tehnice (hardware), dar a acumulat concepte ţi metode care-i permit abordarea oricărui tip de sistem, inclusiv a sistemelor de programe. La baza mode lului global al fiabilitătii unui sistem stă noţiunea de timp de funcţionare până la defectare, interpretat ca variabilă aleatoare continuă. Caracteristicile numerice ale acestei variabile aleatoare sunt componente ale modelului statistic global. în cazul sistemelor fără reînnoire, modelul permite previziunea primei (si ultimei) defectări a sistemului. Această previziune este în mod probabilistic definită de funcţia de fiabilitate R (x) = P(T> x) care este probabilitatea bunei funcţionări a sistemului în intervalul (0, x). în acest caz momentul predictiei coincide cu momentul iniţial al punerii sistemului în funcţiune Dacă predicţia se face la un moment arbitrar /, este implicit cunoscut faptul că sistemul nu s-a defectat în intervalul (0, 0. Funcţia de fiabilitate în interval, R(x/t) este probabilitatea condiţionată ca sistemul să nu se defecteze în intervalul (r, r>x), ştiind că nu s-a defectat până Ia momentul t. Conform definiţiei probabilităţilor condiţionate, se poate scrie:
R(xft) = P (T >= t+x/T >=t) = R(t+x)/R(t)
Uneori, în locul funcţiei de fiabilitate asociate unei durate precizate, se preferă utilizarea cuantilei timpului de funcţionare, adică a intervalului de bună funcţionare corespunzător unui nivel prescris de fiabilitate. Astfel, inversând funcţia R (x) sau R (x/i) se poate calcula, la orice moment t, durata xK în care sistemul continuă să func ţioneze în bune condiţii cu probabilitatea R. Comportarea locală a sistemului este dată de legea de distribuţie a timpului de funcţionale, j (x) = - R' (x). Indicator cu valoare teoretică, numit şi frecvenţa defectărilor, J (x)
x reprezintă probabilitatea totală a defectării sistemului în intervalul (x, x +Ax). O caracterizare mai utilă a pericolului instantaneu de defectare este dată de probabilitatea de defectare în (x, x
(2. 5)
Prognoza dată de relaţia (2.5) este efectuată de un observator situat la momentul iniţial al punerii sistemului in funcţiune. Pentru un observator situat la momentul arbitrar r, prognoza defectării este dată de media duratei reziduale de viaţă (MRL), condiţionată de buna funcţionare a sistemului până la momentul 1;
(2. 6)
O măsură a diversităţii sistemelor este dată de dispersia timpului de funcţionare:
+x), condiţionată de buna funcţionare a sistemului în (0, x). Conform definiţiei probabilităţii condiţionate, rezultă:
Raportând probabilitatea (2.2) x a intervalului, rezulta rata de dela lungimea de defectare:
Z(x) = f(x)/R(x) = - (R'(x)/R(x))
Prin integrarea ecuaţiei diferenţiale (2. 3) cu condita iniţială R (0) = 1, rezultă:
Funcţia de fiabilitate este astfel complet determinată de rata de defectare a sistemului.
Rata de defectare permite o clasificare a sistemelor după tipul de uzură. Un sistem fără uzură (CFR) are rata de defectare constantă z(t) = k, un sistem cu uzură pozitivă (IFR) are rata di defectare crescătoare iar un sistem cu uzură negativă (DFR) are rata de defectare descrescătoare în timp. Funcţia de fiabilitate are proprietăţi specifice pentru fiecare tip de uzură [1, 2].
O prognoză medie a defectării sistemului nereparabi) este dată de media timpului de funcţionare (MTTF).
(2.7)
Deseori se utilizează, în locul dispersiei, abaterea medie pătraticaiar o măsură normată a variabilităţii este dată de coeficientul de asimetrie o Im.Modelul global considerai până acum nu ţine seama de posibilitatea restabilirii funcţionării sistemului după fiecare defectare. în cazul cel mai.general, repunerea sistemului în stare de funcţiune modifică esenţial caracteristicile sale de fiabilitate, astfel încât, după reparare, acesta devine un cu totul alt sistem. în aceste conditii, el nu poate fi caracterizat decât separat, pe fiecare interval între defectări succesive, cu ajutorul componentelor modelului statistic global definite mai sus.
De multe ori, totuşi, ceva din identitatea sistemului se păstrează, astfel încât este posibil să se definească indicatori globali care să descrie în ansamblu evoluţia sistemului cu restabilire. O astfel de situaţie este aceea în care repunerea în funcţiune a sistemului nu alterează deloc caracteristicile lui de fiabilitate, respectiv uzura sa, astfel încât sistemul se află, după reparare, în aceeaşi stare în care se afla înainte de a se defecta (reparare minimală sau "bad as old"). O altă situaţie este aceea în care repararea contribuie într-un mod relativ controlabil la modificarea caracteristicilor de fiabilitate ale sistemului. Aceasta se întâmplă dacă, prin reparare, sistemul este adus în starea iniţială sau într-o stare de referinţă diferită de cea iniţială prin eu minarea uzurii acumulate (reînnoire propriu-zisă sau "good as new"). De asemenea, o situaţie similară se întâlneşte atunci când este posibilă o ordonare a funcţiilor de fiabilitate corespunzătoare intervalelor între defectări succesive, ceea ce înseamnă că alterarea caracteristicilor de fiabilitate prin reparare urmează o anumită lege.
În toate aceste cazuri interesează descrierea procesului de reînnoire al sistemului definit prin probabilitatea ca în intervalul (0,t) să se efectueze un anumit număr r de restabiliri .În cazul în care duratele de restabilire nu pot fi neglijate, interesează studiul
separat al fluxului defectărilor şi al fluxului punerilor în funcţiune a sistemului într-un interval de timp dat. Dacă se doreşte o prognoză medie a defectărilor si restabilirilor sistemului într-un interval de timp, se utilizează funcţiile de reînnoire H(t) definite ca medii ale numărului de defectări, respectiv de puneri în funcţiune în (0, 1). Pentru un interval oarecare (f, t+x) avem;
H(t,t+x) = H(t+x)-H(t). (2.8)
Când sunt posibile confuzii, se ataşează funcţiei de reînnoire (2. 8) indicele t, dacă se referă la fluxul defectărilor şi indicele 2, dacă se referă la fluxul restabilirilor. Derivata funcţiei de reînnoire h(t) = H(t) este densitatea de reînnoire şi reprezintă probabilitatea defectării sistemului (respectiv a punerii lui în funcţiune) în intervalul (r, r+df), raportată la mărimea Ar a intervalului. Trebuie sublimat faptul că densitatea de reînnoire se referă la un eveniment (defectare sau punere în funcţiune) care poate
surveni de un număr nedefinit de ori, spre deosebire de densitatea de probabilitate (legea de distribuţie) f(x), care se referă la primul eveniment de acest tip care apare în evoluţia sistemului.
Prognoza proximei defectări se efectuează cu ajutorul funcţiei de fiabilitate, respectiv al cuantilei timpului de funcţionare. Dacă prognoza se efectuează la momentul unei puneri în funcţiune, R(x) sau x„ indică probabilitatea ca în intervalul (o, x) să nu se producă defectarea, respectiv durata de funcţionare fără defectare asociată probabilităţii R. In cazul unei prognoze medii efectuate la momentul unei puneri în funcţiune, media timpului de funcţionare m (2. 5) indică durata aşteptată până la următoarea defectare, dar calculul acestei durate medii trebuie reluat la fiecare punere în funcţiune, cu excepţia cazului reînnoirilor "good as new", când valoarea lui m nu depinde de interval şi poate fi interpretată ca medie a intervalului între defectări succesive (MTBF).
în cazul când observatorul se situează Ia un moment arbitrar f, prognoza proximei defectări se efectuează cu ajutorul funcţiei de fiabilitate în interval R(t, t+x), diferită, în general, atât de R(x) cât şi de R{x/t) sau cu ajutorul cuantilei xKI a acestei funcţii. O
prognoză medie este dată de durata medie reziduală de viaţă:
(2. 9)
Durata de restabilire depinde de caracteristicile de mentenabilitate ale sistemului, respectiv de capacitatea acestuia şi a mijloacelor de întreţinere de a asigura revenirea cât mai rapidă la starea de funcţionare.
Menlenabilitatea este modelată prin caracteristicile numerice ale timpului de reparate, care suni matematic similare cu cele ale timpului de funcţionare. Astfel, probabilitatea G(v), ca repararea să se termine în intervalul (O,y), este analogi cu complementara funcţiei de Habilitate. Distribuţia duratei de reparare g(y) - G '(y) este similară cu distribuţia timpului de funcţionare/x) iar rata de reparare p(y) = g(v)/(l- G(y)) este similară cu rata de defectare z(x). Media timpului de reparare (p. sau MTTR) se calculează direct pornind de la distribuţia g(y).
O apreciere globală a eficienţei sistemului ţinând seama atât de fiabilitatea ţi de mentenabilitatea acestuia este posibilă cu ajutorul disponibilităţii A(t), care reprezintă probabilitatea ca la un moment arbitrar i, sistemul să se afle în stare de funcţionare.
Disponibilitatea A(t) permite calculul fracţiunii medii active dintr-un interval calendaristic (t. t+x), numită disponibilitate medie pe interval:
(2.10)
O relaţie importantă între disponibilitate si funcţiile de reînnoire este.
(2 11)
Relaţia (2.11) afirmă că probabilitatea ca sistemul să fie defect la momentul t este diferenţa dintre numărul mediu de defectări şi numărul mediu de puneri în funcţiune ale sistemului în (0, 0. Justificarea acestei relaţii este imediată.în teoria fiabilităţii se studiază modelul descris mai sus în diferite ipoteze care, dacă sunt adecvate studiului sistemelor hardware, sunt rareori aplicabile sistemelor de programe. Pentru exemplificarea modelului, vom considera clasa sistemelor fără uzură (CFR) deoarece, pe de o parte, se constituie un termen de referinţă în teoria fiabilităţii iar, pe de altă parte, ea include, în mod evident, sistemele de programe.
Sistemul fără uzură este caracterizat de o rată de defectare constantă- z(x) - k, astfel încât pericolul de defectare nu este influenţat de vârsta sistemului. Conform relaţiilor (2.4) şi (2.1), rezultă că funcţia de fiabilitate a unui sistem fără uzură este de tip
exponenţial şi depinde numai de intervalul de funcţionare, nu şi de vârsta sistemului:
(2 12)
Inversând relaţia (2.12) se obţine cuantila timpului de funcţionare, adică durata de funcţionare asociată probabilităţii R de succes.Densitatea de probabilitate a timpului de funcţionare are forma,cunoscuta lege de distribuţie exponenţială. Media timpului de funcţionare este egală cu durata medie reziduală de viaţă, iar ambele sum egale cu inversul ratei de defectare:s
(2.13)
Calculul dispersiei pe baza relaţiei (2.7) conduce la o abatere medie pătratică a = IM,, adică la un coeficient de asimetrie egal cu unitatea. Aceasta înseamnă că absenţa uzurii implică o mare diversitate între sistemele de acelaşi tip, unele defectându-se foarte devreme, altele foarte târziu.
Elementele calculate până acum sunt suficiente pentru prognoza primei defectări a sistemului. Dacă se ţine seama şi de posibilităţile de reparare ale sistemului fără uzură, sunt necesare ipoteze suplimentare asupra modului în care funcţionarea sistemului poate fi restabilită după defectare. Considerăm repararea minimală care, în cazul sistemelor iară uzură, este echivalentă cu reînnoirea propriu-zisă, sistemul rămânând în starea iniţială atâta vreme cât funcţionează. Admiţând, pentru moment, că durata de reparare este neglijabilă, se poate arăta [1] că procesul de reînnoire este de tip Poisson, adică probabilitatea producerii a rdefectări în (0, t) este:
(2.14)
Funcţia de reînnoire este B(l) = kt iar densitatea de reînnoire este constantă şi coincide cu rata de defectare h(t) = k. Astfel, procesul de defectare este staţionar şi numărul mediu de defectări se poate calcula împărţind intervalul de timp la media timpului de funcţionare, care, în cazul analizat, coincide cu media timpului între defectări succesive (MTTF = MTBF). Funcţia de fiabilitate în interval şi durată de viaţă reziduală nu sunt afectate de reparările efectuate, astfel încât R{i, t+x) = R(x) = e"**şi m{t) = IA.. Deoarece duratele de reparare au fost neglijate, disponibilitatea este mereu egală cu unitatea.
în cazul în care nu se neglijează duratele de reparare, trebuie făcute ipoteze suplimentare asupra legii de distribuţie a acestora. Presupunem că şi această lege este de tip
exponenţial, adică g(y) = pe~w, unde p este rata constantă de reparare, iar inversul ei este u>, media timpului de reparare. Această ipoteză este adecvată situaţiilor când repararea nu urmează o procedură sistematică astfel încât ea poate fi încheiată oricând, independent de durata efortului de diagnoză şi remediere. în acesta situaţie disponibilitatea poate fi calculată utilizând metodele din [1], care conduc la expresia:
(2.15)
Procesele de defectare, respectiv de punere în funcţiune sunt caracterizate de densităţile de reînnoire respective:
(2.16)
Integrarea expresiilor (2. 16) într-un interval oarecare conduce la stabilirea numărului mediu de defectări, respectiv de puneri în funcţiune care se produc în acel interval.
Funcţia de fiabilitate în interval şi durata medie de viaţă reziduală depind, de data aceasta, de caracteristicile procesului de reparare. Avem:
(2. 17)
Trecând la limită, pentru f -* , în relaţiile (2.15) - (2.17), se remarcă staţionarizarea asimptotică a proceselor de defectare ţi de punere în funcţiune. Disponibilitatea devine constantă în regim staţionar ţi egală cu raportul dintre media timpului între defectări succesive si media duratei unui ciclu funcţionare-reparare. Densităţile de reînnoire devin constante şi egale cu inversul duratei unui ciclu repetitiv. Funcţia de fiabilitate în interval şi durata medie reziduală de viaţă sunt fracţiuni constante (determinate de disponibilitate) din funcţia de fiabilitate iniţială, respectiv din media timpului de funcţionare.
Este, desigur, de dorit ca modelul global al fiabilităţii, descris şi exemplificat în acest capitol, să poată fi aplicat cu minime modificări ta analiza fiabilităţii sistemelor de programe. In acest scop vor fi studiate cauzele care dau un caracter aleator comportării în timp a programelor.
2.2. FIABILITATEA PROGRAMELOR
O viziune naivă asupra fiabilităţii programelor exclude orice preocupare privind comportarea lor în timp. Dacă un program este bun, in sensul că nu conţine erori, el rămâne bun un timp nelimitat, până la eventualele intervenţii in vederea modificării şi perfecţionării sale. într-adevăr, dacă etapele elementare ale rezolvării unei probleme sunt bine stabilite, este teoretic imposibil ca, în timp, ele să se dovedească incapabile să conducă la rezultate corecte. O examinare mai atentă arată că la elaborarea programuluinu putem avea în vedere întreaga mulţime A' a datelor iniţiale posibile. Programul este gândit şi testat iniţial pentru o submulţime ,frcl a datelor de intrare. Acest fapt nu garantează că pentru'orice x e X programul' va conduce în timp finit la rezultate corecte Vom admite că este totdeauna posibil să sesizăm comportarea incorectă a unui program Aceasta înseamnă că în mulţimea rezultatelor finale ¥ se poate delimita o submulţime Yf cr )' astfel încât dacă rezultatul concret y aparţine lui Yp putem trage concluzia că programul este incorect Un program este parţial corect dacă orice rezultat y obţinut prin prelucrarea unei date iniţiale iei aparţine domeniului complementar lui Yf, adică v e YF= Y-Yr Programul este corect dacă rezultatul yeYr este efectiv obţinut în timp finit, adică nu se execută de o infinitate de ori instrucţiunile unei structuri repetitive iar execuţia nu se întrerupe printr-un eventual mesaj de eroare.
Un program conţine erori dacă există o submulţime XF inclusă în mulţimea datelor iniţiale posibile astfel încât, pentru orice x e X rezultatul y = F(x), fie nu se poate obţine in timp finit, fie aparţine submulţimii y,(fig. 2.1).
Defectarea reprezintă manifestarea prezenţei unei erori prin mesaje de eroare de execuţie, printr-o durată infinită de execuţie a programului sau prin obţinerea unui rezultat aparţinând domeniului Yr .Dacă domeniul XF ar fi cunoscut şi dacă datele de intrare s-ar succeda după o anumită lege, s-ar putea prevedea în mod determinist intervalul de timp după care eroarea programului s-ar manifesta prin defectare.
In realitate, admiţând că domeniul Xf este cunoscut, datele de intrare apar în mod aleator, astfel încât nu se poate prevedea decât probabilistic durata de funcţionare până ta defectare, adică până când apare Ia intrare o valoare x e XF. O sursă de aleatorism in comportarea în timp a programelor este deci apariţia datelor din submultimea XF
O altă sursă de incertitudine provine din caracterul aleator al frontierei domeniului Xf [3], într-adevăr, fie două programe care corespund unei aceleiaşi funcţii j : X -»Y.
Cerinţele uulizatorului impun o aceeaşi partiție Yr YF a domeniului de valori pentru ambele programe. Modul diferit de reprezentare algoritmică a funcţiei de către cele două programe va determina însă partiţii diferite ale domeniului intrărilor A' (fig, 2.2) Astfel, dacă x e A>, r\Xp2, rezultatul obţinut conform programului I esie greşit, iar cel obţinut ai ajutorul programului II este corect Lucrurile se petrec invers dacă x e_ A>, f^i A>2. O a doua sursă de imprevizibilitate a comportării programelor este deci modul aleator în care un program delimitează în begin ' ~
spaţiul inirărilor domeniul X, corespunzător unor rezultate incorecte.
^0 X
END IF
end
Fif. 23. Programe pentru calculul in-
versului unui număr real.
Un program este cu atât mai fiabil cu cât dimensiunea Y = 1 / X siunea domeniului Xr este mai redusă. Prognoza defectării unui program este afectată de două surse de WRITE Y
incertitudine. Pe de o parte, variabilitatea datelor ne enrJ împiedică să prevedem dacă următoarele date vor aparţine domeniului XF sau nu. Pe de altă parte, variabilitatea programelor care pol implementa o aceeaşi funcţie ne împiedică să ştim cu siguranţă dacă o anumită valoare particulară x se află sau nu în domeniul XF al programului. Pentru exemplificarea consideratiilor de mai sus, se consideră două programe foarte simple care calculează inversul unui număr real (fig. 2.3). Primul program va da rezultate eronate (eroare de execuţie) de fiecare dată când variabila de intrare se întâmplă să fie mai mică decât EPS, adică decât cel mai mic număr real reprezentam! de către calculator. Astfel Xf, = {xeX\ x < EPS}. Al doilea program este mai fiabil deoarece Xf-, - {EPSJ, adică nu s-a prevăzut că în situaţia când variabila de intrare este egală cu cel mai mic număr posibil, inversul acestuia poate fi totuşi calculat. Deşi programele implementează aceeaşi funcţie, primul va conduce Ia defectare ori de câte ori la intrare apare o valoare x < EPS iar al doilea numai când la intrare apare x = EPS. Se observă atât aleatorismul apariţiei datelor cât şi cel generat de modul de construcţie al programului.
Variabilitatea dalelor de intrare şi a structurilor raţionamentului de rezolvare a problemei constituie sursele lipsei de fiabilitate a programelor. O exprimare cantitativă a acestei variabilităţi poate fi efectuată cu ajutorul noţiunii de entropie [4], Se ştie că, pentru o variabilă aleatoare Z, distribuită după legea 9(2), o măsură a împrâştierii este dată de entropia
(2,18)
Entropia (2.18) exprimă cantitatea de informaţie furnizată de un experiment în urma căruia se obţine rezultatul particular z.Pentru a exprima variabilitatea datelor de intrare cu ajutorul entropiei se admite că mulţimea X a acestor date este discretă, având cardinalul N*. Presupunem, pentru simplitate, că programul utilizează la fiecare executare, un unic element din X ca dată ini ţiala. Fie a* volumul de date procesate în intervalul (0, /). Un caz extrem de uniformitate este acela în care programul utilizează de a' ori aceeaşi dată iniţială xq ea". O astfel de situaţie se întâlneşte de exemplu la scăderea din inventar a unui aceluiaşi articol la fie care operaţie. Cazul opus este acela în care programul se execută mereu cu altă dată ini-
ţială, respectiv cu xu x2, . . ., xy.Daca N<=N*, valorile iniţiale xp xt, . , ., xH sunt dis tincte şi fiecare apare o singură dată. Dacă N > N*, este obligatoriu ca măcar unele din valorile domeniului de intrare X să se repete. într-un caz oarecare, diferit de cele extreme discutate anterior, datele de intrare se vor repeta de un număr oarecare de ori, astfel încât se poate considera că mărimea de intrare a programului în (O,t) este o variabilă aleatoare discretă distribuită după legea:
In expresia (2.19), n,n1,n2,n3,...,nn reprezintă numărul de apariţii repetate a datelor posibile x1,x2,x3,...,xn, astfel încât unii n1 pot fi nuli si n1+n2+n3+...+nn = N. Particula rizând formula entropiei pentru acest caz, se obţine o măsură a variabilităţii datelor.
(2.20)
Cazul variabilitaţii minime este reprezentat de valorile particulare nk = N şi {nk = 0: j = I. 2, . , N* j !=K}, ceea ce înseamnă ci valoarea se repetă de -V ori Ia intrarea programului în (0. t). Din expresiile (2.19) şi (2.20) rezulta Hmin = 0.Cazul extrem de variabilitate maximă se obţine pentru n = {0, 1}. i = = 1.2,..., N*, ceea ce înseamnă că fiecare valoare din.Y poate apărea cel mult o dală la intrarea programului Evident, acest lucru implică A' < A'". Entropia datelor este în acest caz maximă şi, conform relaţiei (2,20), este egală cu log /V. Variabilitatea datelor creşte cu volumul de procesare, respectiv cu N, dar este limitată de numărul maxim posibil de date de intrare N* într-adevăr, dacă N > A*, unele din valorile r,. x2, trebuie să se repete Entropia este maximă când distribuţia p(x) este uniformă. Dacă A' = A-A'*, (K = 2, 3, .), avem nl~nl = ...nfr = K, adică fiecare valoare de intrare se repetă exact de A' ori iar entropia maximă rezultată este HXm = logA" în cazul în. care A' nu este divizibil cu A"*, entropia este maximă când valorile de intrare se repetă in mod cât mai egal. ceea ce înseamnă că entropia maximă este Hx** = log A"". Se observă deci că variabjlitatea datelor creşte de la zero până la log A1 şi că valoarea maximă a variabilităţii nu poate depăşi log N*.
Pentru a defini variabilitatea la nivelul programului se grupează inu-o anumită categorie toate datele din .V care sunt procesate pe o anumită cale din graful orientat care reprezintă programul. Fie numărul acestor căi şi g„g,, categoriile dedate care apar în (O. (), corespunzătoare respectiv fiecărei căi de prelucrare. Categoria căreia îi aparţine o anumită valoare iniţială este o variabilă aleatoare distribuită după legea:
(2.21)
în expresia (2.21), m„ m,.. . ., reprezintă numărul de date din categoriile Si. gi- ■ ■ > &w- astfel încâtm, P01 fl nuniar mi + mi+ -+mw = Entropia esteîn acest caz:
h,=-s n (e)iog n ig) = -1 n, iog n,
(2.22)
Cazul variabilităţii minime este acela în care mK = H iar {m, = 0;i = 1,2, . A/*,î * A'), adică toate datele apărute în (0. /) sunt procesate pe aceeaşi cale gc în această situaţie, formula (2.22). dă valoarea minimă a entropiei H/nB = 0 La cealaltă extremă avem m, = (0. 1}, / = 1, 2.. . ,M* adică fiecare dală initială este procesată pe altă cale a programului, aceasta implicând evident, N s M*. în această situaţie entropia (2.22) este maximă şi egală cu log N. în cazul când volumul de procesare este mare, adică N > A/*, cel puţin unele dintre căi vor fi parcurse de mai multe ori Entropia este maximă când distribuţia 11(g) este uniformă în cazul în tare N = KAf*(A" = 2. 3, . . .) avem mt = m2 = = mhf. = K, adică fiecare cale a programului este parcursă exact de K ori iar entropia maximă rezultată este tf/_ = log Ar*. în cazul în care A7 nu este divizibil cu -V/*, entropia este maximă când distribuţia U(g) este pe cât posibil mai uniformă, ceea