8.1. MODELE STRUCTURALE
Toate modelele studiate în capitolele anterioare au fost modele globale care descriau programul din punct de vedere al relaţiilor dintre intrări si ieşiri, tară a utiliza informaţii legate de structura acestuia. Este de aşteptat ca, luând în considerare caracteristicile modulelor unui program, să se obţină un model predictiv înainte de a se ajunge în faza integrării şi testării globale. Un astfel de model obţinut mai devreme în procesul de elaborare şi dezvoltare a programului va putea fi specificat pe baza unei descrieri structurale, fără a face uz de volumul mare de rezultate experimentale care era necesar pentru estimarea parametrilor modelelor globale.
Modelul structural propus în [1] este adecvat unei analize a fiabilităţii foarte asemănătoare cu cea practicată asupra sistemelor hardware pe baza standardului Mii Hdbk 217, Programul este descompus în module (componente) printr-o analiză funcţională. Pentru fiecare modul, se evaluează funcţia de fiabilitate ţinând seama de caracteristicile inerente ale modulului şi de factorii externi care contribuie la asigurarea fiabilităţii sale. Funcţiile de fiabilitate individuale ale modulelor sunt apoi combinate într-o predicţie globală a fiabilităţii programului. Modul de combinare ţine seama de structura programului şi de profilul misiunii care impune anumite constrângeri asupra acestei structuri. Considerând un modul CP funcţia de fiabilitate asociată are forma:
În expresia (8.1), Ri reprezintă funcţia de fiabilitate intrinseca a modulului iar Ei un coeficient care depinde de metodele folosite în elaborarea programului astfel încât numărul de erori latente să fie cât mai mic. Fiabilitatea intrinsecă Ri este sinteza unor caracteristici interne ale modulului cum ar fi: complexitatea funcţională, interacţiunile, interfeţele, dimensiunea în linii de cod, experienţa grupului care a elaborat modulul. Ri se calculează cu relaţia:
unde I este nivelul primar al fiabilităţii, S este un factor care depinde de dimensiunea modulului iar DE un factor cuprins între 0 şi 1 care depinde de experienţa elaboratorului. Dacă M este dimensiunea modulului, factorul S are expresia S = exp (kM) unde k este un coeficient de scară. Pentru evaluarea nivelului primar intrinsec I, caracteristicile modulului sunt grupate în următoarele categorii: 1. tipul aplicaţiei;
2. complexitatea funcţională;
3. interacţiunile;
4. intetfata hardware.
5. interfaţa software:
6. interfaţa cu operatorul;
7. vanabiiilatea datelor de intrare.
Fiecărei categorii i se asociază un coeficient Xn (n = l, 2, . . ., 7), iar nivelul primar I al fiabilităţii se calculează conform relaţiei:
Metodele de elaborare a programului caută să asigure un conţinut cât mai mic de erori latente în modul, prin prevenirea apariţiei erorilor şi prin detectarea şi eliminarea lor prin testare. Prin urmare coeficientul corespunzător Ei, din relaţia (8.1) are expresia:
unde A ∈ [0,1]. este un coeficient care exprimă în ce măsură metodologia de elaborare asigură prevenirea erorilor iar D ∈ [0,1] exprimă capacitatea de detectare şi de eliminare a acestora. Astfel, dacă se folosesc limbaje avansate în proiectare, coeficientul A va avea o valoare apropiată de 1 iar dacă sunt prevăzute numeroase testări şi revizii, coeficientul D va avea o valoare ridicată.
O dată stabilite funcţiile de fiabilitate ale modulelor, acestea trebuie combinate într-o expresie globală a funcţiei dc fiabilitate a întregului program. în acest scop se consideră că structura programului poate fi modelată printr-un proces semi-Markov (2]. Aceasta înseamnă că la un moment dat se execută doar unul dintre modulele programului iar trecerea controlului de Ia un modul la altul (tranziţie) este aleatoare, astfel încât probabilitatea de a se apela la modulul j după executarea modulului i depinde numai de acestea două. nu şi de restul structurii programului în afara ordinii de executie, un alt element aleator este durata de execuţie a unui modul.
Dacă durata dc execuţie a modulului ar fi distribuită exponenţial, astfel încât probabilitatea de tranziţie să fie constantă, modelul programului ar fi un lan( Markov Faptul că se admite orice distribuţie pentru durata de executie a modulului, incluzându-se cazul când aceasta ar fi o constantă determini sta. face ca să se recurgă Ia modelul procesului semi-Markov. Distribuţiile generale admise de model depind de modulul i care se execută şi de modulul j la care se transferă controlul.
Procesul de manifestare a erorilor latente într-un modul este considerat de tip Poisson cu parametrul vi. Ca urmare, parametrul procesului Poisson poate fi calculat folosind functia de fiabilitate (8.1) a modulului:
Analiza individuală a fiabilităţii modulelor ne permite calculul valorilor vi,dar nu tine seama de faptul că interfeţele dintre module introduc noi potenţiale surse de defectare. Fie λ_ij probabilitatea de manifestare a unei erori atunci când modulul i apelează la modulul j. O analiză exactă a lanţului semi-Markov este mult prea complicată, astfel încât ne mulţumim cu următorul rezultat asimptotic. într-un program complex, în care ratele de. defectare sunt mici faţă de. ratele de tranziţie, fluxul erorilor detectate este de tip Poisson cu parametrul (rata de apariţie a erorilor) egal cu:
unde ai este (la limită) fracţiunea timpului petrecut în modulul i din timpul mediu total de execuţie a programului, iar bij este frecventa transferului de control de la i la j (numărul mediu de transferuri i->j in unitatea de timp). Dificultatea aplicării acestei relaţii simplificate este legată de cunoaşterea valorilor λ_ij . O primă aproximare ar consta din a considera că toate valorile \ sunt egale şi să se folosească o estimare a lor din proiecte similare testate in amănunţime. Estimările lut ai şi bij pot fi efectuate mai uşor în diferite faze de elaborare a programului. Elementele de modelare descrise mai sus intervin în analiza structurilor de programe insensibile la erori.
8.2. BLOCURI CU RESTABILIRE
Asigurarea fiabilităţii programelor include metode de evitare a introducerii erorilor în timpul elaborării programului şi metoda de identificare şi de eliminare a erorilor în timpul testării Iui. Cu toate acestea, nu este posibil ca toate erorile să fie eliminate printr-un efort rezonabil de proiectare şi testare. De aceea, alături de politica de prevenire a erorilor este util să se considere şi procedee de mascare a acestora, prin elaborarea unor structuri de programe insensibile la manifestarea erorilor.
Toate aceste structuri presupun elaborarea mai multor variante ale aceluiaşi program corespunzătoare aceloraşi specificaţii. Ele trebuie să fie cât mai diferite între ele, astfel încât prezenta unei aceleiaşi erori în mai multe variante să fie improbabilă. Structura care înglobează toate variantele maschează manifestarea erorilor prezente într-una din variante prin utilizarea rezultatelor produse de celelalte variante. Vom examina în cele ce urmează structura insensibilă Ia erori de tip bloc cu restabilire (BR block recovery). Această structură este inspirată din sistemele hardware cu redundanţă de comutaţie (stand by). în care un element de rezervă este conectat în cazul defectării elementului de bază.
Structura de bloc cu restabilire conţine o variantă primară a programului şi una sau mai multe variante secundare. De regulă, varianta primară este cea mai sofisticată din punct de vedere al algoritmilor utilizaţi, ceea ce implică o precizie ridicată a rezultatelor şi o mai mare detaliere a acestora. Variantele secundare sunt mai simple, oferă o prelucrare mai sumară a datelor, au însă o fiabilitate mai ndicată verificată pnntr-o utilizare anterioară mai îndelungată care a permis testarea lor amănunţită. De multe ori variantele secundare sunt versiuni mai vechi şi mai simpliste ale aceluiaşi program.
În cazul manifestării unei erori în varianta primara a programului, intră în acţiune prima variantă secundară, o nouă eroare activează a doua variantă secundară s.a.m.d. La limită, ultima variantă secundară poate fi atât de simplistă încât să se mărginească doar la a semnala prezenţa erorii. Ieşirea din varianta pnmară poate avea loc înaintea terminării ei, dacă eroarea de execuţie este evidentă (de exemplu de tip depăşire) sau are loc în final când rezultatele obţinute sunt examinate printr-un test de acceptare. Acelaşi test de acceptare este utilizat pentru verificarea corectitudinii rezultatelor tuturor variantelor. Cum aceste rezultate nu pot fi principial identice, chiar în absenţa eroriror, datorită diversităţii algoritmilor utilizaţi, proiectarea lestului de acceptare nu este banală. Amânând pentru § 8.3.2 descrierea testelor de acceptare, admitem acum că lestul de acceptare este capabil să decidă asupra corectitudinii rezultatelor furnizate de toate variantele programului.
Figura 8.1 sintetizează logica funcţionării blocului cu restabilire. Este important de menţionat că la intrarea în blocul cu restabilire se stabileşte un punct de reluare care permite restaurarea stării iniţiale. Prin această restaurare se reiau valorile iniţiale ale variabilelor programului, eliminădu-se efectele produse prin executarea modulului care conţin eroarea. O asemenea revenire nu este necesară în cazul în care rezultatele prelucrării trec testul de acceptare, deoarece sistemul se găseşte acum într-o stare de bună funcţionare şi controlul execuţiei programului poate trece la blocul următor. Astfel, în cazul manifestării unei erori nu se intervine în modulul care conţinea eroarea în vederea eliminării ei. Aceasta este mascată prin intervenţia variantelor secundare, iar restaurarea stării iniţiale a variantei primare va permite prelucrarea în bune condiţii a dalelor ulterioare, fiind puţin probabil ca acestea să activeze din nou manifestarea aceleiaşi erori.
ENSURE Test de acceptare
BY Varianta primara
ELSE B Prima alternativa
ELSE Y A doua alternativa
ELSE BY A n alternativa
ELSE ERROR
Dinamica funcţionării structurii de bloc cu restabilire este redată în fig. 8.2, preluată din [3], Etapa de stabilire a punctului de reluare impune să se păstreze o copie stării sistemului la intrarea în fiecare bloc cu restabilire, ceea ce este ineficient în practică.
Orice metodă de a păstra. în timpul execuţiei unui program, suficienţi informaţie pentru a putea executa programul în ordine inversă, instrucţiune cu instrucţiune, ar fi la fel de nepractică. Cum starea la care se revine este aceea dinaintea executării versiunii primare, singurele valori care trebuie restaurate sunt acelea ale variabilelor ne locale care sunt modificate în timpul execuţiei blocului cu restabilire. Aceste valon sunt păstrate într-o memorie rapidă numită "recursive cache"', care este împărţită în regiuni, câte una pentru fiecare bloc cu restabilire.
Regiunea "cache" păstrează valorile iniţiale ale variabilelor modificate în timpul executării blocului cu restabilire şi. în cazul manifestării erorilor, permite revenirea în punctul de reluare cel mai apropiat Regiunea respectivă este ştearsă după ce a fost utilizată pentru restaurarea stării anterioare, cu excepţia valorilor unor variabile care se referă la mediul înconjurător şi care vor fi consolidate. Evident, pentru selecţia variabilelor care trebuie memorate este necesară detectarea primei noi atribuiri a unei variabile nelocale în timpul executării blocului dc restabilire. Acest lucru se realizează parţial prin mijloace hardware, metodă rnai eficientă când programul prelucrează volume mici de dale. Din contra, dacă sc prelucrează man blocuri de date tablouri sau fişiere, restabilirea stării prin metode exclusiv software sc dovedeşte eficientă [4].
Structura dc tip bloc cu restabilire poate fi compusă, astfel încât fiecare variantă să fie ea însăşi un bloc cu restabilire, după cum se arată în figura 8.3. Testul de acceptare BT va fi executat după terminarea variantei primare BP. Dacă rezultatul este satisfăcător, blocul cu restabilire este părăsit în caz contrar, se readuce sistemul Ia starea dc dinaintea execuţiei lui BP şi se începe executarea variantei BQ. in momentul reuşitei, blocul cu restabilire esle părăsii lără a se restabili starea sistemului Dacă toate variantele BP. BQ şi BR eşuează, se cosideră că ansamblul variantei primare AP a eşuat, starea sistemului este restabilită la punctul fixat înainte de execuţia lui AP şi se trece la varianta AQ.
Se remarcă faptul că punctele de restabilire fixate la intrarea blocului A, respectiv B sau C sunt în general diferite, deoarece între ele poate avea loc executarea mai multor instrucţiuni (cele cuprinse în figură sub indicativul ). O analiză a fiabilităţii structurii descrise mai sus trebuie să luăm în considerare toate sursele posibile de erori sintetizate în figura 8.4, care conţine o variantă primară P şi o singură alternativă secundară S. Dacă specificaţiile generale ale blocului conţin o eroare, aceasta se poate regăsi în specificaţjilc comune ale variantelor (2). în specificatiile de acceptare (3) sau în ambele.
Fie q_PST probabilitatea de manifestare a unei erori care afectează doar specificaţiile variantelor primară şi secundară este qrs iar probabilităţile de manifestare ale erorilor independente care afectea/ă separat cele două variante şi testul de acceptare sunt respective qp , qr si qs.
Erorile menţionate pot fi clasificate conform tabelului 8.1
În continuare se admite că numai una din cele patru categorii de erori menţionate în tabelul 8.1 se poate manifesta în blocul cu restabilire şi că nu sunt posibile compensaţii intre erori. Deci, dacă oricare dintre variante (sau ambelej sunt surse de erori ma, infestate, acestea vor fi detectate cu siguranţă de testul dc accepure liste insă posibil ca testul de acceptare să nu admită în mod eronat corectitudinea rezultatelor furnizate dc P sau de S. Modelul fiabilităţii blocului cu restabilire, este. conform celor arătate în § 8. I. de tip semi-Markov (fig 8.5). în figura 8 5. starea I este starea initiala a blocului care este părăsită de îndată ce blocul este activat.
Starea P corespunde executării variantei primare, starea S corespunde executării variantei secundare (în cazul icului celei primare), iar starea T corespunde executării testului de acceptare. Starea C este starea de defectare catastrofică, în care toate versiunile au eşuat dintr-o eroare comună, iar testul de acceptare nu reuşeşte să dea seama de acest lucru Probabilitatea de a atinge această stare este qPST. Starea B corespunde unor rezultate eronate ale ambelor versiuni, dar detectate de testul de acceptare şi unor rezultate corecte evaluate greşit de test. Ea se atinge când ambele versiuni eşuează din cauza unei erori comune care se manifestă (cu robabilitatea qPS), sau din cauza unor erori independente având probabilităţile respective de activare qp qs. Eşecul versiunilor este sesizat de testul de acceptare, astfel încât sistemul este readus în starea iniţială şi excepţia este semnalată, pentru a fi eventual tratată în blocul cu restabilire de nivel superior.
În aceeaşi stare B se ajunge dacă testul de acceptare nu recunoaşte in mod eronat corectitudinea rezultatelor furnizate de varianta primară P sau de varianta secundară S. Conform ipotezei că un singur tip de eroare se manifestă în blocul cu restabilire (și că nu au loc compensaţii ale erorilor), rezultă că probabilitatea de a atinge una din stările de defectare este proporţională cu:
Pe de altă parte, un sistem software neredundant, care nu are posibilităţi de detecţie a erorilor, ar fi caracterizat de probabilitatea de defectare:
Punând condiţia ca F < Fnr adică structura bloc cu restabilire să aibă o funcţie de fiabilitate mai ridicată decât un software neredundant de aceeaşi dimensiune, rezultă:
Relaţia (8.9) impune o margine interioară pentru fiabilitatea testului de acceptare. Această condiţie poate fi uşor indeplinită în condiţiile in care complexitatea testului de acceptare este mult redusă faţă de complexitatea variantelor primară şi secundară, astfel încât qT « qPqS
8.3. IMPLEMENTAREA STRUCTURII DE TIP BLOC CU RESTABILIRE
În paragraful anterior am descris logica de funcţionare a structurii de tip bloc cu restabilire cu referiri minime la detaliile de implementare. Acestea includ realizarea intercomunicării dintre diferite blocuri cu restabilire, realizarea variantelor însăşi si a testelor de acceptare.
Prelucrarea automată a datelor presupune deseori interacţiuni între procese diferite care se desfăşoară in parallel. Dacă fiecare proces de prelucrare este structurat ca bloc cu restabilire, interacţiunea dintre procese (comunicarea de date, mesaje, etc.) introduce dificultăţi suplimentare. Astfel, dacă într-unul din procese se manifestă o eroare după primirea unei informaţii din partea altui proces, starea lui revine la cea de la initializarea blocului cu restabilire, iar informaţia va trebui furnizată din nou. De asemenea, dacă un proces a primit o informaţie eronata din partea altui proces afectat de erori el trebuie să întrerupă prelucrarea acestei informaţii şi să-şi restabilească starea Deci, procesele interactive trebuie sa-si restabilească stările în concordanţă unele cu altele, şi nu independent. Pentru a aprofunda această problemă, se consideră trei procese interactive conform fig. 8.6. Fiecare proces parcurge patru blocuri cu restabilire, stările de referinţă respective fiind marcate şi numerotate (de la 1 la 4)
Săgeţile arată schimburi de informaţii între procese. Presupunem că o eroare se manifestă la momentul t în primul proces (P1). In acest caz starea lui P1 este restabilită la punctul de restabilire 4 şi varianta secundară intră în acţiune. Deoarece între timp nu au existat schimburi de mesaje cu celelalte procese, desfăşurarea acestora nu va fi afectată. Presupunând că al 2-lea proces (P2) manifestă o eroare la t, starea lui revine la punctul de restabilire 4, iar schimbul de mesaje derulat între timp cu primul proces (P1) trebuie anulat, ceea ce înseamnă că starea lui P1 trebuie restaurată la punctul de restabilire 3. Presupunând acum că P3 manifestă o eroare la t, restabilirea lui în punctul 4 impune anularea comunicării cu P2, deci acesta din urmă trebuie să revină în starea 3, ceea ce obligă pe P3 să revină în starea 3 s a.m d. In final, toate cele trei procese trebuie reiniţializate în starea 1. Această restaurare în cascadă a stărilor de referinţă poartă numele de efect domino [6]. O imagine mai simplă a efectului domino între 2 procese paralele este dată in fig. 8 7. Restabilirea primului proces la momentul t nu afectează al doilea proces. Restabilirea celui de-al doilea va iniţializa o cascadă de restabiliri până când ambele procese revin în stările lor iniţiale.
O modalitate de a evita efectul domino este extinderea structurii de bloc cu restabilire pentru a include mai multe procese de interacţiune într-o structura globală numită "conversaţie". Conversaţia este o modalitate de limitare a efectelor produse de activarea unei erori. Pentru descrierea acestei structuri se adoptă convenţia de reprezentare a blocului cu restabilire din fig 8,8, a. Săgeata reprezintă direcţia desfăşurării procesului, linia superioară reprezintă starea de referinţă care se restaurează la activarea alternativei iar linia inferioară starea acceptabilă a blocului cu restabilire, validată de testul de acceptare. Liniile laterale arată, că procesul este izolat de orice alte activităţi, astfel încât starea sa de referinţă să poată fi în întregime restaurată la nevoie. In cadrul unui bloc cu restabilire, se pot desfăşura mai multe procese în paralel, iar unele dintre acestea pot avea la rândul lor o structură internă de bloc cu restabilire (fig.8 8, b). Sa presupunem acum că între procesele paralele X şi Y din blocul cu restabilire din figura 8.8. b, trebuie sâ aibă o interacţiune în punctele E şi F.
Dacă, în punctul C, testul de acceptare invalidează procesul Y, starea acestuia din punctul A va fi restaurată şi alternativa secundară va fi activată. Procesul X trebuie însă şi el să fie reluat pentru a se putea realiza interacţiunea din E, astfel încât acest proces trebuie readus în starea lui din K. Aceasta înseamnă că şi procesul Y trebuie readus la starea K de la intrarea blocului comun de restabilire. Astfel, comunicarea, fie că înseamnă transmitere explicită de mesaje, fie doar o referinţă la variabile comune, face ca blocul intern de restabilire practic să nu funcţioneze. Această situaţie este evitată prin încadrarea ambelor procese paralele într-un bloc cu restabilire după cum se arată în figura 8.8. c Procesele intrate în conversaţie în cadrul unui astfel de bloc cu restabilire pot schimba informaţii intre ele dar toate trebuie să satisfacă testele respective de acceptare la sfârşitul conversaţiei şi nici unul nu poate continua până când toate celelalte nu au fost validate de test.
Dacă într-unul din aceste procese se manifestă o eroare, toate procesele trebuie readuse în stările de referinţa respective de la începutul conversaţiei.
Aşa cum se arată în fig.8.8. c şi 8.9. a este posibil ca procesele să intre în conversaţie la momente diferite, ele părăsesc însă conversaţia în acelaşi timp. astfel încât nici un punct de restabilire să nu fie şters din memorie înainte ca toate celelalte procese interactive să treacă de testul de acceptare. Aşa cum structura de bloc cu restabilire poate include o altă structură de bloc cu restabilire, conversaţiile pot conţine alte conversaţii.
Conversaţiile care se intersectează ca in figura 8.9, c. trebuie evitate, ele conducând tot la dificultăţile examinate anterior în figura 8.8, a. Procedeul de sincronizare a blocurilor cu restabilire prin structura dc conversaţie poate încetini prelucrarea datelor deoarece procesele trebuie să aştepte unele după altele, dar acesta este preţul de plătit pentru asigurarea controlului asupra restabilirilor.
Testele de acceptare sunt concepute în conformitate cu două cerinţe: să detecteze deviaţii faţă de comportarea prevăzută a programului şi să prevină furnizarea unor rezultate potenţial periculoase. In primul caz au loc mai multe activări ale variantelor secundare dar, de obicei, întârzierile datorate reluării execuţiei prin alte variante nu sunt critice, în timp ce nedetectarea rezultatelor necorespunzătoare este mult mai gravă. Al doilea caz, care are în vedere doar situaţiile periculoase, este adecvat situaţiei când programul este utilizat de mult timp şi se doreşte un test de acceptare simplu care să evite reluări inutile. Deseori, se foloseşte un test de acceptare mai pretenţios pentru programe noi şi, ulterior, condiţiile de acceptare se relaxează după un anumit interval de maturizare.
Un prim tip de test de acceptare se referă la satisfacerea cerinţelor formulate în definirea problemei pe care programul trebuie să o rezolve De exemplu, într-un program de ordonare a unor elemente, un test de acceptare puternic ar consta în verificarea faptului că mulţimea de ieşire este o permutare a mulţimii de intrare. Cum un asemenea test ar fi prea complex, se preferă un test mai sumar, care verifică uniformitatea regulii de succesiune în mulţimea de ieşire şi faptul că mulţimile de intrare şi de ieşire au acelaşi număr de elemente [7].
Unele teste de acceptare constau din inversarea operaţiilor efectuate de program şi compararea rezultatelor obţinute cu datele de intrare. Aceste teste sunt practice când operaţia inversă este mai simplă decât cea directă. Astfel, corectitudinea extragerii rădăcinii pătrate se verifică foarte simplu prin ridicarea rezultatului la pătrat şi comparaţia cu valoarea iniţială, deoarece ridicarea la pătrat este mult mai simplă decât extragerea rădăcinii. Acest procedeu este limitat de faptul că multe funcţii realizate prin programe nu sunt inversabile. Testarea prin verificarea îndeplinirii cerinţelor este eficientă pentru segmente mici ale unui program de calcul, pentru care cerinţele pot fi simplu formulate. Pe de altă parte, structura de bloc cu restabilire este ea însăşi mai eficientă dacă testul de acceptare verifică un segment mai mare al programului. Testele bazate pe verificarea satisfacerii cerinţelor sunt utilizate cu succes în compilatoare şi programe de editare.
Un alt tip de teste de acceptare este bazat pe verificările contabile şi este util în programele care supervizează tranzacţii, cum ar fi rezervarea biletelor de avion sau serviciul de împrumut al unei biblioteci. Astfel, de fiecare dată când o serie de operării financiare este transmisă între diferite staţii de prelucrare se păstrează în memorie volumul tranzacţiilor. La recepţie se calculează noul total şi se compară cu cel vechi. Când se urmăreşte un volum foarte mare de tranzacţii, este aproape imposibil să se evite erorile datorate transcrierilor incorecte sau documentaţiei în mod greşit dirijate. Uneori, asemenea erori nu sunt inocente, si dând posibilitatea unor mari câştiguri materiale prin manipularea îndemânatică a informaţiei.
Contabilitatea dublă este o metodă de a detecta astfel de erori şi poate fi cu succes folosită ca principiu al testelor de acceptare. Procedeul este bazat pe ideea că totalul creditelor din toate conturile trebuie să fie egal cu totalul debitelor din toate conturile în orice interval de timp arbitrar, cu condiţia ca tranzacţiile dintre conturi să fi fost înregistrate. Un alt fel de verificare contabilă constă din confruntarea tranzacţiilor cu schimbările din inventarul fizic petrecute într-un anumit interval de timp Astfel, când se păstrează materialul nuclear, este posibil să se determine cantitatea existentă în inventar prin numărătoare de radiaţii care introduc datele direct în calculator. La intervale predeterminate de timp, schimbarea în nivelul radiaţiei poate fi comparată cu aceea calculată în mod independent pe baza îmbătrânirii materialelor şi a modificărilor de inventar datorate tranzacţiilor autorizate. In felul acesta se obţine o verificare globală care include şi erorile din sistemul de calcul. Verificările contabile sunt adecvate programelor cu aplicaţii comerciale care utilizează operaţii matematice simple.
O categorie mai largă de teste este bazată pe aprecierea caracterului rezonabil al rezultatelor furnizate de program. Aceste teste examinează dacă rezultatele se încadrează în gama de valori admisibilă, urmăresc deviaţiile variabilelor faţă de valoarea medie, corelaţiile între diverse variabile sau dintre creşterile, respectiv descreşterile, acestora.
Având în vedere că demarcaţia dintre un rezultat corect şi unul eronat nu este întotdeauna uşor de făcut, mulţimea rezultatelor eronate poate fi considerată o mulţime vagă. Testul de acceptare evaluează funcţia de apartenenţă a mărimii de ieşire la această mulţime şi ia decizia de invalidare dacă valoarea acestei funcţii depăşeşte un anumit prag. Funcţia de apartenenţă se trasează subiectiv pentru fiecare intrare posibilă şi se mediază pe mulţimea datelor de intrare in conformitate cu legea de distribuţie care descrie frecvenţa lor relativă de apariţie [8].
Un exemplu de test de rezonabilitate este oferit de calculul vitezei unui avion. în funcţie de caracteristicile structurale şi aerodinamice, viteza este cuprinsă între 140 şi 1 100 km/oră. O valoare calculată în afara acestei game indică o eroare grosolană a programului. Un test de acceptare în care limitele vitezei să fie mai apropiate poate fi construit dacă se ia în consideraţie configuraţia avionului. Un test de acceptare mai senzitiv examinează acceleraţia avionului, care trebuie să fie sub 6G în condiţii normale de zbor şi întotdeauna sub 6G, adică 213 km/h-s, care este acceleraţia maximă admisi- bilă pentru a se asigura integritatea structurală. Viteza este calculată de 10 on în fiecare secundă, iar creşterea între două valori succesive trebuie să fie sub 21.3 km/h.
Un exemplu similar de test de acceptare se referă la tranziţia stărilor unui sistem de comutaţie telefonică. După obţinerea legăturii nu se poate trece în starea de ..ocupat" sau "nu răspunde". Asemenea tranziţii inadecvate pot 6 folosite pentru detectarea erori- lor din program.
Testele de rezonabilitate sunt utile îndeosebi pentru programele care controlează variabile fizice în timp real. Este important ca varianta de rezervă a blocului cu restabilire să fie independentă de structura testului de acceptare şi de datele folosite de acesta.
Cele mai multe calculatoare oferă posibilităţi de testare continuă a stărilor anor- male ale sistemului, rezultate în urma împărţirii prin zero. a depăşirii valorilor limită (overflow şi underflow), a încercărilor de execuţie a unor operaţii nedefinite sau a scrierii în zone protejate ale memoriei etc Testarea se realizează prin mijloace hardware, utilizându-se un bit din registrul de stare, care semnalează necesitatea intervenţiei operatorului. Aceleaşi procedee pot fi adaptate pentru construcţia testelor de acceptare in structurile tolerante la defectări. Un exemplu este controlorul "walch dog" care asigură faptul că un rezultat acceptabil este obţinut într-un interval de timp specificat. Verificări în timpul execuţiei includ de asemenea structuri de date şi teste integrate în sistemul de operare. Verificarea indicilor tablourilor de variabile este în mod curent im- plementată. Autotestabilitatea şi rezistenţa la erori implică un număr de tehnici de mo- nitorizare speciale dintre care sc remarcă supervizorul de interacţiuni [9, 10].
Cea mai simplă, el cere declararea pentru flecare modul a apelurilor autorizate şi a surselor acestor apeluri. Supervizorul induce o decizie de respingere în testul de acceptare dacă accesul sau ieşirea dintr-un modul se referă la adrese neautorizate. Verificările in timp real controlează, de asemenea, încercările de scriere în zone protejate ale memoriei care au drept cauză posibilă un algoritm impropriu de inrJexare. Aceste verificări completează teslele de rezonabililate. testele contabile sau teste de satisfacere a cerinţelor şi sunt suficiente pentru segmentele necritice ale programelor.
Într-un bloc cu restabilire, toate modulele sunt disponibile la intrarea blocului, indiferent de erorile manifestate anterior, şi sunt executate într-o ordine strict definită. Intervenţia în modul la manifestarea unei erori nu este necesară deoarece este puţin probabil ca, într-o nouă execuţie să se repete condiţiile care au activat anterior eroarea. Variantele modulelor unui bloc cu restabilire trebuie să fie cât mai diferite între ele. Aceasta se poate realiza în următoarele trei strategii:
a) Variante independente neierarhizate
Fiecare modul este proiectat astfel incat să se asigure aceeaşi completă funcţionalitate, iar diversitatea este asigurată prin echipe diferite care elaborează modulele utilizând tehnici şi instrumente diferite. In acest caz, ordinea în care se execută modulele este arbitrară.
b) Variante ierarhizate
Fiecare modul asigură aceeaşi funcţionalitate, dar există o preferinţă privind ordinea execuţiei. Alternativele pot fi versiuni mai vechi, mai puţin sofisticate ale variantei primare şi, în consecinţă, mai puţin afectate de erori. Ele pot fi proiectate utilizând algoritmi mai puţin eficienţi, dar mai robuşti. Faptul că variantele secundare sunt rareori executate, compensează relativa lor ineficientă.
c) Variante funcţional degradate
Modulul primar asigură funcţionalitatea completă iar altenativele secundare au performanţe progresiv reduse Modulele secundare pot fi versiuni mai vechi, stângace dar robuste, ale variantei primare, sau pot fi deliberat proiectate astfel încât să aibă o complexitate redusă şi un timp de execuţie mic in dauna performanţelor. Ca urmare, contrar procedeului obişnuit, variantele secundare trebuie să fie validate de propriile lor teste de acceptare, diferit concepute. Alternativele funcţional degradate sunt în mod deosebit utile în sistemele în timp real deoarece, în acest caz, s-ar putea să nu existe suficient timp la dispoziţie pentru execuţia unei alternative complete, atunci când se manifesta o eroare în varianta primara. Un exemplu de bloc cu restabilire cu alternativă secundară degradată este dat în figura 8.10 în urmărirea prin radar a unui axion se utilizează drept parametri ultima poziţie măsurată in raport cu radarul, iar cu varianta primară se calculează noua poziţie şi viteză. Testul de acceptare verifică dacă rezultatele sunt rezonabile în raport cu parametrii constructivi ai avionului Dacă testul respinge rezultatele variantei primare, prima variantă secundară calculează doar noua poziţie şi preia valoarea anterioară a vitezei. In cazul unei noi respingeri, se activează a doua variantă secundară, care preia ca atare valorile anterioare ale poziţiei şi vitezei. Cazul limită al blocului cu variante degradate este cel cu o variantă primară şi o alternativă nulă în aceste condiţii, rolul blocului cu restabilire este doar de a detecta eroarea şi a ignora operaţia care a dus la manifestarea ei.
8.4. STRUCTURI N-VERSIONALE
O altă structură tolerantă la defectări utilizează un număr impar de versiuni concepute în mod independent conform aceluiaşi set de specificaţii şi oferind, fiecare, o completă funcţionalitate. Versiunile sunt activate de un modul supervizor numit driver care le furnizează acestora datele de intrare printr-o facilitate de citire (read only). Acelaşi driver colectează ieşirile variantelor şi le combină conform unei reguli care, în cel mai simplu caz, este de tipul votării majoritare. Rezultatul sintetic va corespunde deci majorităţii rezultatelor oferite de versiunile independente. In acest mod, erorile, care se presupune că afectează variantele minoritare, nu influenţează mărimea globală de ieşire.
Identificarea versiunilor afectate de erori este inerentă mecanismului de votare, prin care se constată disparitatea dintre rezultate şi se consideră eronate cele aflate în minoritate. Efectele acestor erori trebuie restrânse la versiunile în cauză pentru a nu afecta restul sistemului. Acest lucru poate fi realizat în mod ideal prin rularea fiecărei versiuni pe un suport hardware distinct sau, dacă se utilizează aceeaşi maşină de calcul pentru rularea tuturor versiunilor într-un regim de partajare (time-shanng). Atunci trebuie luate măsuri logice de protecţie între diferite zone. Faptul că manifestarea erorilor dintr-o versiune nu trebuie să afecteze operarea celorlalte versiuni este asigurat prin izolarea oferită de maşina virtuală pe care se execută programul şi nu se rezumă la eliminarea comunicărilor dintre versiuni.
Având în vedere că într-o structură N-versionalâ, toate versiunile sunt executate, ele reţin datele între apeluri şi, ca urmare, pot fi proiectate ca "obiecte" care-şi ascund structura internă. Acest lucru are avantajul de a mări independenţa dintre versiuni şi reduce volumul de date care trebuie transferat unei versiuni la apelarea ei. Este de remarcat faptul că, în cazul structurii de tip bloc cu restabilire, nu se execută toate modulele la apelarea blocului. Ca urmare, aceste module nu trebuie să reţină local date între două chemări succesive, deoarece altfel ar putea deveni reciproc inconsistente. Spre deosebire deci de modulele structurii N-versionale, versiunile blocului cu restabilire trebuie proiectate ca nişte componente fără memorie, şi nu ca "obiecte". Deoarece modulele structurii N-versionale reţin date, o versiune care a furnizat un rezultat eronat nu mai poate fi reutilizată. Având în vedere că starea ei internă a devenit incompatibilă cu a celorlalte Este deci necesar să se prevadă o posibilitate de restabilire a stării unei versiuni afectate de erori, o metodă simplă constând în revenirea în starea dinaintea ultimei operaţii.
Pentru a asigura consistenţa versiunilor, este necesar ca şi cele corecte să fie readuse la stările anterioare, pierzându-se astfel ceva din istoria sistemului. Dacă acest lucru nu este acceptabil, o strategie de restabilire mai elaborată va aduce versiunea eronată într-o stare care să corespundă stărilor actualizate ale versiunilor corecte. Procedeul este dificil de realizat, deoarece, versiunile fiind independente între ele, structurile lor interne de date sunt diferite. Un algoritm de translaţie este necesar pentru a face legătura între stările interne normale ale diferitelor versiuni.
Structura N-versională depinde de calitatea procesului de votare. Aceasta poate fi îmbunătăţită prin includerea în specificaţiile versiunilor a unor valori intermediare de control care vor fi furnizate driver-ului o dată cu rezultatele de ieşire. Confruntând aceste valori intermediare, driverul va detecta şi erori în stările interne ale versiunilor, nu numai în stările lor externe. Independenţa dintre versiuni va fi însă limitată de faptul că procesarea internă trebuie să conveargă în toate versiunile în punctele de control determinate de aceste valori intermediare. Vectorul trebuie să fie simplu pentru a nu fi el însuşi afectat de erori, dar proiectarea lui nu este banală. Dacă rezultatele prelucrării sunt numere reale, versiuni corecte dar diverse nu vor da ieşiri identice, astfel încât este necesară o votare inexactă. Pentru aceasta, se împarte domeniul valorilor de ieşire in clase de echivalenţă, inainte ca votarea să fie efectuată. Dacă cea mai mare clasă de echivalenţă contine mai mult dc N/2 rezultate neclare, dintre acestea poate fi considerat rezultatul global al sistemului, sau se adoptă drept rezultat global mediana clasei de echivalenţă celei mai mari. Dificultatea în definirea claselor dc echivalenţă nu este dc neglijat, deoarece variabilitatea rezultatelor între versiuni nu este constantă în timp.
Consideraţii practice pot complica, la rândul lor, mecanismul de votare. Modulul driver trebuie să ţină seama de duratele diferite de execuţie ale versiunilor, fie păstrând rezultatele unor versiuni în aşteptarea celorlalte, fie efectuând votarea în timp real. Pe măsură ce se obţin rezultatele, astfel încât un rezultat global poate fi obţinut înainte ca toate versiunile să-şi încheie execuţia în sistemele critice din punct de vedere al siguranţei, se preferă o decizie bazată pe unanimitate, nu pe majoritate, astfel încât, dacă rezultatele tuturor versiunilor nu sunt echivalente, sistemul este dus într-o stare de defectare nepericuloasă (fail-safe).
Structura N-versionala poate fi de tip compus, fiecare modul al unei structuri N-versionale fiind el însuşi conceput ca o structură N-versională. Limitarea compuneri structurilor este impusă de necesităţile de izolare a versiunilor care implică, în cazul cel mai de dorit, configuraţia multiprocesor. Astfel, fiecare versiune ar fi executată pe propriul său hardware, ceea ce, în cazul structurilor compuse, ar multiplica excesiv numărul de procesoare. Modelul semi-Markov al fiabilităţii structurii N-versionale va fi stabilit pentru N = =3 în două ipoteze:
a) versiunea afectată de erori nu este eliminată din structură, ci este reutilizată după revenirea într-o stare compatibilă cu a celorlalte;
b) versiunea afectată de erori este eliminată din structura N-versională.
Sursele de erori ale sistemului N-versional sunt prezentate în figura 8.11. O eroare în specificaţiile globale poate conduce la prezenta unei erori comune în cele trei versiuni şi în driver. Probabilitatea manifestării unei asemenea erori este qvy. Pot exista erori comune în oricare două versiuni sau în toate trei iar probabilităţile lor de manifestare sunt, respectiv, q2V şi q3V. Erorile individuale ale versiunilor se manifestă independent cu aceeaşi probabilitate q1V iar eroarea individuală a driverului se manifestă cu probabilitatea qD. Tabelul 8.2 prezintă categoriile de erori şi probabilităţile lor de manifestare.
Stările structurii 3-versionale sunt definite în tabelul 8.3 şi sunt reprezentate în fig. 8.12.
Dacă versiunile dai rezultate net distincte între ele, sau dacă driver-ul nu recunoaşte similaritatea lor, aiunge în starea de defectare B, recunoscută ca atare, iar starea iniţială a versiunilor este restabilită.
Starile Sistemului 3-versional
Tabelul 1.3
In condiţiile când versiunile dau două sau trei rezultate similare, dar eronate, driver-ul nu poate detecta incorectitudinea lor şi se ajunge în starea de defectare C, ignorată de sistem. Construcţia modelului semi-Markov din fig. 8.12 este bazată pe ipoteza că un singur tip de eroare din cele prezentate în tabelul 8.2 se poate manifesta în timpul execuţiei şi că nu există compensări ale erorilor.
Probabilitatea de tranziţie din starea V în starea D2 este egală cu 3q1v(l- q1v)2~ 3q1v, deoarece ea corespunde manifestării erorii doar într-una (oricare) din cele trei versiuni. Tranziţia din starea V în starea D3 se face cu probabilitatea ca oricare două versiuni, sau toate trei să manifeste erori independente, adică 3q21v(1-q1v)+q31v~3q21v- In sfârşit, tranziţia din f în D1 se face cu probabilitatea 3q2v + q3v + qvD de manifestare a erorilor comune în oricare două versiuni, în toate trei, sau în toate modurile.
Probabilitatea de defectare a structurii este proportional cu:
Pe de alta parte, o structura software fara protective la erori ar avea probabilitatea de defectare egala cu probabilitatea de manifestare a erorii intr-o versiune oarecare:
Conform relatiei (8.12) o versiune poate fi eronata in mod independent sau poate fi contaminate de erorile celorlalte versiuni ale voter-ului. Raportand expresiile (8.11) si (8.12) obtinem:
In general, raportul r este cuprins in intervalul (r_L,r_v). O valoarea cat mai mica a acestui raport, fapt care reflecta eficienta mascarii erorilor in structura 3-versionala, se obţine dacă elementul de decizie este mult mai fiabil decât oricare versiune (q_D« Fnr) şi dacă ponderea erorilor independente într-o versiune este cât mai mare (i -> 1).
Spre deosebire de structura bloc cu restabilire, în structura 3-versională se recurge uneori la eliminarea versiunii eronate după detectarea erorii latente pe care o conţine. Elementul de decizie identifică versiunea care nu este concordantă cu celelalte două şi o exclude de la prelucrările ulterioare de date. în continuare, driver-ul utilizează un test de rezonabilitate pentru a decide asupra corectitudinii rezultatelor furnizate de celelalte două versiuni rămase în sistem. Modelul semi-Markov al sistemului este reprezentat în figura 8,13. Se observă că secţiunea M, a structurii din figura 8.13 este similară cu cea din figura 8.12, cu deosebirea că, în cazul manifestării unei erori singulare, sistemul trece în noua stare iniţială I*, care corespunde la două versiuni aflate în aşteptarea datelor. La următorul apel, sistemul trece în starea V*, în care se execută în paralel cele două versiuni care nu au manifestat erori. La terminarea execuţiei se testează caracterul rezonabil al rezultatelor şi, în cazul acceptării lor, sistemul este readus în starea I*.
Daca se manifesta erori independente într-una sau în ambele versiuni, acestea sunt detectate şi sistemul ajunge în starea de detectare necatastrofică B*. cu probabilitatea 〖2q〗_1V+q_1V^2≈〖2q〗_1V . In aceeaşi stare se ajunge cu probabilitatea q_D dacă voter-ul nu recunoaşte corectitudinea rezultatelor furnizate de ambele versiuni, activând tranziţia D* -» B*. Sistemul ajunge în starea de defectare catastrofică C* când se manifestă erori comune ambelor versiuni şi nu sunt recunoscute ca atare de elementul de decizie, fapt ce se produce cu probabilitatea q_2V+q_VD.
Probabilitatea ca subsistemul M_1, (structura cu 3 versiuni) să ajungă într-o stare de defectare este proporţională cu:
Comparând expresiile (8.18) şi (8.19) rezultă că, dacă erorile independente sunt preponderente, adică q_1V≫q_2V,q_3V,q_VD atunci F_1F_2. De aici, se poate trage concluzia că utilizarea a trei versiuni în loc de două este avantajoasă numai dacă erorile independente depăşesc ca pondere erorile comune tuturor versiunilor.
Prin analizele efectuate asupra fiabilităţii sistemului s-a urmărit traiectoria acestuia până la atingerea oricărei stări de defectare. Dacă se urmăreşte în primul rând securitatea sistemului, trebuie avute în vedere numai stările de defectare critice C şi C* în care eroarea manifestată nu este detectată. Comparând probabilităţile de tranziţie în aceste stări, se constată că atingerea stării C în configuraţia M_1, este mai probabilă decât atingerea stării C* în configuraţia M_2. Prin urmare, reconfigurarea sistemului 3-versional prin eliminarea versiunii eronate îmbunătăţeşte întotdeauna securitatea sistemului.
Analizele cantitative anterioare permit şi o comparaţie între performanţele structurii bloc cu restabilire şi cele ale structurii 3-versionale. Pentru comparaţie, se va considera structura 3-versionalâ fără reconfigurare. iar în cazul structurii de tip bloc cu restabilire, se va considera că ambele versiuni - primară si secundară - pot fi afectate de erori independente cu aceeaşi probabilitate (q_P=q_S=q_(I,RB)). Ca urmare, relaţia (8.7), care exprima probabilitatea de atingere a stării de defectare în structura bloc cu restabilire, devine pentru q_T≪1
Pentru a compara expresiile (8.20) şi (8.21), se admite că probabilitatea manifestării unei erori independente într-o versiune este aceeaşi, indiferent de tipul structurii insensibile la erori (q_P=q_S=q_1V.deci q_(I,RB)=q_(I,NV)). De asemenea, se poate presupune că probabilitatea activării erorilor comune mai multor versiuni este aceeaşi în ambele structuri, adică q_PS=〖3q〗_2V+q_3V. Pe de altă parte, elementul de decizie din structura N-versională este mai simplu decât testul de acceptare din structura bloc cu restabilire, deoarece el este conceput conform principiului general al votării majoritare şi nu are o structură specifică dependentă de aplicaţie şi ca urmare q_D≪q_r. Din acelaşi motiv, este mai probabilă activarea unei erori comune atât versiunilor cât şi elementului de decizie în structura bloc cu restabilire decât în structura N-versională, adică q_PST≫q_VD.In concluzie, probabilitatea manifestării erorilor de mod comun este mai mare în structura bloc cu restabilire respectiv q_(C,RB)≫q_(C,NV). Erorile independente au un impact mai mare asupra structurii N-versionale (de trei ori mai mare conform relaţiei 8.21), în timp ce erorile dependente afectează în mai mare măsură structura bloc cu restabilire.
Decizia în privinţa tipului de structură adoptat se bazează pe evaluarea cât mai exactă a expresiilor (8.20) şi (8.21).
Alături de această comparaţie, trebuie avut in vedere faptul că blocul cu restabilire presupune întreruperea şi reluarea execuţiei. în timp ce structura N-versională funcţionează continuu. De asemenea, modalităţile de proiectare a versiunilor şi a elementelor de decizie sunt diferite pentru cele două structuri, fiecare cu avantajele şi dezavantajele sale. Din punct de vedere al securităţii (evitarea stării de defectare în care eroarea rămâne nedectată) structura bloc cu restabilire este superioară deoarece utilizează un test de acceptare mai sofisticat. Rezultatele similare, chiar eronate, dintr-o structură N-versională sunt considerate corecte de elementul de decizie al acesteia.
8.5. STRUCTURI N-AUTOTESTABILE
Structura N-autotestabiă este formată din două componente care cuprind fiecare, câte două versiuni distincte (fig. 8.14). Deşi toate versiunile sunt executate simultan, numai una din perechi este activă, adică furnizează rezultate la ieşire, cealaltă fiind uti lizată ca rezervă. Fiecare componentă conţine un comparator care acceptă buna functionare a componentei daca rezultatele furnizate de cele două versiuni sunt similare. Comparatoarele împreună cu comutatorul-de la ieşire constituie elementul de decizie privind furnizarea unui rezultat la ieşire şi selectarea acestuia dintre rezultatele oferite de cele două componente.
Datorită faptului că versiunile sunt executate simultan, precauţiile privind restabi- lirea stării după manifestarea erorii sunt aceleaşi ca în cazul structurii N-versionale. Sursele de erori în structura N-autotestabila rezultă din figura 8.15. Tipurile posibile de erori împreună cu probabilităţile lor de activare sunt date în tabelul 8.4.
Conform figurii 8.15, sursele de eroare sunt specificaţiile şt procesul de implemen- tare. O eroare latentă în specificaţiile tuturor versiunilor sau o aceeaşi eroare comisă în implementarea lor se manifestă cu probabilitatea q_4V. Erorile comune la 2 sau 3 versiuni sunt erori de implementare care se activează cu probabilităţile q_2V, respectiv q_3V, O eroare comună versiunilor şi comparatoarelor poate proveni din specificaţiile comune pe căile 1 -> 2 -> 3 sau 1 -> 3, sau poate fi o eroare comună de implementare. Ea se manifestă cu probabilitatea q_VD Se presupune că o eroare independentă într-o versiune este activata cu aceeaşi probabilitate q_1V.
Ea poate proveni din specificaţiile comune versiunilor prin implementarea lor separată, respectiv prin căile 2 -> 4, 2 -> 5, 2 -> 6 sau 2 -> 7. In sfârşit, erorile In comparatoare provin din specificaţiile elementului de decizie sau din implementarea lor pe calea 3 -> 8 şi au probabilitatea de manifestare q. Ca şi în analizele efectuate asupra structurilor precedente, se va presupune că n ornai un singur tip de eroare se poate manifesta în timpul execuţiei şi că nu au loc compensări între erori. In aceste condiţii, stările sistemului sunt cele din tabelul 8.5.
Sistemul trece din starea I în starea V cu probabilitatea 1, în momentul apelării sale. Stările D_1 şi D_2 sunt stări de bună funcţionare. In starea D_1, nu s-au manifestat erori de execuţie iar, în starea D_2 două versiuni ale aceleiaşi componente furnizează rezultate similare corecte. Probabilitatea manifestării unei erori independente în oricare versiune este 〖4q〗_1V (1-q_1V )^3≈〖4q〗_1V, iar probabilitatea manifestării erorilor independente in două versiuni ale aceleiaşi componente este 〖2q〗_1V^2 (1-q_1V )^2≈〖2q〗_1V^2. Ca urmare, probabilitatea de tranziţie din starea V în starea D_2 este 〖4q〗_1V+〖2q〗_1V^2+q_2V, ultimul termen corespunzând manifestării erorii comune versiunilor componentei de rezervă.
In starea D_3, ambele comparatoare au la intrare rezultate distincte, astfel încât nici un rezultat final nu este furnizat la ieşire ajungându-se în starea de defectare B, detectată ca atare de sistem. Probabilitatea de defectare independentă a două versiuni din componente diferite, respectiv a trei sau patru versiuni este 〖4q〗_1V^2 (1-q_1V )^2+〖4q〗_1V^3 (1-q_1V )+q_1V^4≈〖4q〗_1V^2+〖4q〗_1V^3+q_1V^4, iar probabilitatea mamfestarii unei erori comune în două versiuni din componente diferite este 〖4q〗_2V.Ca urmare, probabilitatea de tranziţie din V in D_3 este 4q_1V^2+〖4q〗_1V^3+q_1V^4+〖4q〗_2V.
În starea D_4, cel puţin una dintre componente furnizează comparatorului două rezultate similare, dar eronate, astfel încât sistemul este condus în starea de defectare catastrofică C, în care un rezultat eronat este transmis la ieşire.
Probabilitatea de tranziţie din starea V în starea D_4, este 〖4q〗_3V+q_4V+q_VD+q_2V ultimul termen corespunzând erorii comune versiunilor componentei active tinând seama de cele de mai sus. modelul semi-Markov al structurii N-autotestabile este ce din figura 8.16.
Se observă că. datorită ipotezei privind manifestarea unui singur tip de eroare, clementul de decizie funcţionează cu certitudine satisfăcător în toate stările cu excepţia lui D_1. Probabilitatea de a atinge o stare de defectare (B sau C) este:
Dimpotrivă, dacă domină erorile comune la doua versiuni, datorate implementării, avem: q_2V≫q_3V,q_4V,q_VD si raportul r devine:
Valoarea raportului r este cuprinsă în general între limitele r_L si r_U redate de (8.28). respectiv de (8,29). Pentru ca structura N-autotestabilâ să fie eficientă, r trebuie să fie cât mai mic, adică q_D≪F_nr si i→1. Aceasta înseamnă că elementul de decizie trebuie să fie mult mai fiabil decât o versiune oarecare şi că ponderea erorilor independente dintr-o versiune trebuie să fie ridicată. în cazul extreme i = 0, caz în care erorile comune domină hotărâtor, nu se obţine nici o îmbunătăţire prin recurgerea la structura autotestabilă. Pentru a compara structura N-autotestabilă cu structurile bloc cu restabilire şi N-versionala, reluăm expresiile probabilităţilor de defectare (8.20) şi (8.21) asociate acestora din urmă şi le comparăm cu probabilitatea (8.22), căruia îi adăugăm indicele AT semnificând "autotestabil". Rescriind cele trei expresii, obţinem:
unde: q_(C,AT)=q_D+〖5q〗_2V+〖4q〗_3V+q_4V+q_VD reprezintă probabilitatea defectării de mod comun în structura autotestabilă. iar q_(1,AT) este probabilitatea manifestării erorii independente într-o versiune din această structură.
Ca şi înainte. Ia comparaţia dintre structurile bloc cu restabilire şi N-versională. presupunem că probabilităţile de manifestare ale erorilor independente într-o versiune sunt aceleaşi în toate structurile (q_(1,RB)=q_(1,NV)=q_(1,AT)). Dacă, în plus. şi probabilităţile de manifestare a erorilor de mod comun ar fi aceleaşi, structura bloc cu restabilire ar fi cea mai avantajoasă, urmată, în ordine, de structura N-versională şi de cea autotestabilă. Această ierarhizare este însă discutabilă din mai multe motive. Pe de o parte, elemental de decizie din structura bloc cu restabilire este mai sensibil la erori decât cele din structurile N-versională şi N-autotestabila. Primul este un test absolut de acurateţe şi este gândit în funcţie de aplicaţie, în timp ce ultimele sunt mai robuste, fiind bazate pe principiile generale ale comparării şi votării. Ca urmare, atât probabilitatea de mani- festare a unei erori independentă în elementul de decizie, cât şi probabilitatea manifes- tării unei erori comune tuturor versiunilor şi elementului de decizie este mai mare în cazul structurii bloc cu restabilire:
Pe de altă parte, probabilitatea activării unei erori comune mai multor versiuni este cea mai mare în cazul structurii autotestabile, urmând apoi, în ordine, structura N-versională şi structura bloc cu restabilire:
Sensul inegalităţilor (8.32) şi (8.33) fiind reciproc contradictoriu, nu se poate trage o concluzie definitivă asupra avantajelor diferitelor structuri, fără o evaluare cât mai exactă a expresiilor (8.30). Totuşi, se poate trage concluzia generală că erorile independente ale versiunilor au impactul cel mai mare asupra structurii N-autotestabile, o influenţă ceva mai mică asupra structurii N-versionale şi una şi mai mică asupra struc- turii bloc cu restabilire. Modul diferit de concepere a elementului de decizie face ca acesta să fie mai robust în cazul structurilor N-versională şi N-autotestabilă decât în cazul structurii bloc cu restabilire.
Securitatea sistemului bloc cu restabilire este mai bună decât a celorlalte două structuri deoarece şansa de a ajunge într-o stare de defectare ignorată de sistem este mai mică în acest caz. Acest fapt se explică prin modul de construcţie al elementului de decizie, care examinează individual rezultatele versiunilor şi nu face doar simple comparaţii între ele. Astfel, nu există posibilitatea de a accepta drept corecte rezultate similare, dar eronate, furnizate de mai multe versiuni afectate de erori comune.
8.6. DIVERSITATEA ŞI INDEPENDENŢA VERSIUNILOR
Toate structurile examinate în acest capitol presupun existenta mai multor versiuni ale aceluiaşi program, elaborate în mod independent unele de altele.
Intuitiv, este de dorit ca versiunile elaborate în mod independent sa fie cât mai di- ferite între ele, bazate eventual pe metodologii distincte de proiectare ţi de implementare. Un rezultat important [11] arată însă o limitare conceptuală în ceea ce priveşte independenta versiunilor. Versiuni elaborate în mod independent se comportă în mod dependent sub impactul datelor de intrare, în sensul că manifestările erorilor în diferi- tele versiuni nu sunt independente unele de altele încercările de a elabora, versiuni independente folosind echipe diferite de programatori si metodologii diferite de reali- zare conduc la comportări dependente ale versiunilor astfel obţinute, iar probabilităţile de manifestare simultană a erorilor în mai multe versiuni sunt mai mari decât cele pre- văzute.
Pentru examinarea în detaliu a acestei chestiuni se consideră mulţimea {π_1,π_2,…..} a versiunilor posibile de realizat pornind de la acelaşi set de specificaţii şi folosind aceeaşi metodologie. Unele dintre aceste versiuni conţin erori, deci vor furniza, cel puţin pentru anumite dale de intrare, rezultate finale eronate. Elaborarea concretă a unui program de calcul poate fi modelată prin selecţia uneia din mulţimea versiunilor posibile. în conformitate cu o lege de distribuţie S(π_i) Acest lucru exprimă variabililatea produselor informatice realizate pe baza aceloraşi specificaţii într-un proces de fa- bricaţie afectat de factori perturbatori ca oricare alt proces tehnologic. Legea de distribuţie S(π) reflectă caracteristicile acestui proces, cunoştinţele şi mijloacele software auxiliare utilizate de către programatori.
Când programul se execută, se selectează din mulţimea posibilă {x_1,x_2,….} a datelor de intrare un set particulat x_j în conformitate cu legea de distribuţie Q(x_j), care modelează variabilitatea datelor de intrare. Performanţele versiunilor se exprimă cu ajutorul funcţiei binare v(π_i,x_j), care ia valoarea 1 dacă versiunea π_i, dă rezultate eronate pentru intrarea x_j şi valoarea zero în caz contrar. Astfel, se modelează atât incertitudinea privind versiunea elaborată cât şi cea legată de utilizare, adică de selecţia datelor de intrare. Cu ajutorul mărimilor definite mai sus se pot deduce preformanţele medii ale unei versiuni. Astfel, mediind funcţia v(π,x), pe mulţimea versiunilor posibile, se obţine probabilitatea ca o versiune oarecare să dea re- zultate eronate pentru o anumită intrare x_j:
Similar, mediind funcţia v(π,x) pe mulţimea datelor iniţiale posibile, se obţine probabilitatea ca o versiune anume π_i, să dea rezultate eronate pentru orice intrare:
Atât θ cât şi φ sunt variabile aleatoare din cauza caracterului aleator al intrării, respectiv al alegerii versiunii. Fie G(θ) şi H(φ) funcţiile de repartiţie asociate lui θ şi φ. Evi- dent, avem:
Mediind variabileleθ, respectivφ, pe mulţimea intrărilor, respectiv a versiunilor obţinem acelaşi rezultat, şi anume probabilitatea ca orice versiune să dea rezultate eronate pentru orice intrare
Media (8.37) reprezintă şansa eşecului unui program atunci când se iau în considerare atât incertitudinea privitoare la metodele de elaborare ale acestuia, cât şi incertitudinea privind datele iniţiale furnizate programului. Fie acum două versiuni π_1 şi π_2 realizate independent pe baza aceloraşi specificaţii Ipoteza privind independenţa elaborării versiunilor implică
Pentru intrarea fixată x_j probabilitatea ca ambele versiuni să dea ieşiri eronate este θ^2 (x_j) astfel încât se poate afirma că versiunile elaborate independent unele de altele manifestă erori în mod independent atunci când sunt confruntate cu aceleaşi date iniţiale bine precizate. Probabiltatea ca ambele versiuni π_1 şi π_2 să dea rezultate eronate la orice date iniţiale posibile se obţine mediind pe θ^2 (x) pe mulţimea datelor iniţiale
Expresia (8.39) este momentul de ordinul 2 al variabilei θ, egal cu varianta lui θ la care se adaugă media pătratului său. Dar. conform expresiilor (8,37), media lui θ este probabilitatea ca orice versiune să manifeste erori la orice intrare. Ca urmare, din relaţia (8.39) rezultă că. media pătratului fiind mai mare decât pătratul mediei, probabilitatea ca două versiuni oarecare să dea rezultate eronate pentru orice date iniţiale este mai mare decât produsul probabilităţilor asociate unei versiuni pasibile. Altfel spus, versiuni elaborate în mod independent se defectează (manifestă erori) în mod dependent .sub impactul unor date iniţiale aleatoare. Argumentul este şi mai pregnant când se consideră probabilitatea defectării versiunii π_2 condiţionată de defectarea versiunii π_1:
Calculul probabilităţilor de defectare a două versiuni prin produsul probabilităţilor de defectare ale versiunilor luate separat este deci neîngăduit de optimist, cu atât mai mult cu cât varianta V_θ este mai mare. respectiv cu cât variabilitatca probabilităţii de manifestare a erorilor pe mulţimea datelor de intrare este mai ridicată. Structurile tolerante la erori, care conţin mai multe versiuni vor fi deci cu atât mai eficiente cu cât probabilitatea de activare a erorilor unei versiuni oarecare se va modifica mai puţin atunci când se modifica datele de intrare.
Se consideră acum o versiune anumită π_1, care prelucrează două seturi de date iniţiale x_1 si x_2, selectate în mod independent. Probabilitatea ca versiunea să manifeste erori sub impactul ambelor seturi de date este φ^2 (π_1), ceea ce arată că versiunea se comportă independent atunci când prelucrează date independente. Dacă se mediază această probabilitate pe toată mulţimea versiunilor posibile, se obţine probabilitatea ca o versiune oarecare să se defecteze la ambele seturi de date initiate:
Relaţia (8.41) este analoagă cu relaţia (8.39) si arată că probabilitatea eronării unei versiuni oarecare la două intrări independente este mai mare decât produsul probabilităţilor de defectare evaluate pentru fiecare intrare în parte. Diferenţa este cu atât mai mare cu cât este mai ridicată variabilttatea probabilităţii de defectare a unei versiuni, pentru orice date iniţiale, pe mulţimea versiunilor posibile. Execuţiile succesive ale unei versiuni oarecare nu sunt independente, manifestarea erorii Ia o rulare măreşte probabilitatea de manifestare a erorii la rularea ulterioară:
În cele de mai sus s-au studiat dependenţa în comportarea versiunilor care sunt re- alizate în mod independent pe baza aceleiaşi metodologii. Considerăm acum două me- todologii A şi B, distincte în ceea ce priveşte mediile de programare, limbajele folosite, metodele de testare, tipul de pregătire al programatorilor etc. In principiu, ambele me- todologii pot conduce la elaborarea tuturor versiunilor posibile {π_1,π_2,…..} asociate unor specificaţii comune.
Distribuţiile de probabilităţi asociate versiunilor sunt însă diferite în cadrul celor două metodologii, astfel încât selecţia unei versiuni poate fi foarte probabilă într-o metodologie şi foarte puţin probabilă in alta. Fie S_A (π) şi S_B (π) distribuţiile asociate versiunilor în cele două metodologii. Fiecare distribuţie poate să asocieze valori nule ale probabilităţilor cu anumite versiuni, arătându-se astfel că aceste versiuni nu sunt realizabile în metodologia respectivă. La limită, se include şi cazul în care seturile de versiuni realizabile prin cele două metodologii sunt disjuncte. Dacă am propus anterior că versiunile bazate pe aceeaşi metodologie sunt elaborate în mod independent, cu atât mai firească este ipoteza independenţei între versiuni elaborate conform unor metodologii diferite Ca urmare, probabilitatea de selecţie a două versiuni conform metodologiilor distincte A şi B este:
Probabilităţile ca versiunile Π_A, respectiv Π_B, să manifeste erori atunci când prelucrează' datele initiale x_j sunt θ_A (x_j), respectiv θ_B (x_j), obţinute prin mediere asupra mulţimii versiunilor posibile în conformitate cu distribuţiile S_A (π), respectiv S_B (π),. Probabilitatea ca ambele versiuni să fie eronate este egală cu produsul θ_A (x_j)θ_B (x_j) deoarece versiunile se comportă în mod independent sub impactul unor intrări bine precizate. Dacă se calculează'însă probabilitatea totală ca ambele versiuni să manifeste erori pentru orice date impale, se obţine:
Rezultatul (8.45) este analog cu cel exprimat de relaţia (8.39), în contextul unei unice metodologii. Dar, dacă acolo rezultatul obţinut prin multiplicarea probabilităţilor de defectare era net optimist - subestima probabilitatea ca ambele versiuni să manifeste erori - aici este posibil ca probabilitatea intersecţiei să fie mai mică decât produsul probabilităţilor, cu condiţia ca funcţia de corelaţie să fie negativă. Probabilitatea de defectare a unei versiuni condiţionată de defectarea celorlalte este:
Se observă că manifestarea erorilor în versiunea π_A poate să micşoreze probabilitatea de manifestare a erorilor cu versiunea π_B dacă relaţia dintre metodologii este astfel încât C_(OV_(θ_A θ_B ) )<0. Se poate astfel realiza o situaţie mai favorabilă decât independenţa în defectarea diferitelor versiuni (care este imposibilă, aşa cum s-a văzut) prin alegerea judicioasă a metodologiilor de realizare a versiunilor unui program. Pentru a ilustra diferitele relaţii posibile între metodologii, se reprezintă în figura 8.17 densitatea de probabiiitate asociată perechilor (θ_A 〖,θ〗_B). Curbele reprezintă contururi de egală înălţime ale suprafeţei reprezentate de această densitate de probabilitate. Cazul reprezentat în figura (8.17, a) corespunde situaţiei în care probabilităţile de defectare ale unei versiuni oarecare sunt aceleaşi în ambele metodologii, pentru toate datele de intrare, in această situaţie, metodologiile nu sunt distincte (cel puţin din punct de vedere al fiabilităţii) astfel încât θ_A=θ_B, C_(OV_(θ_A θ_B ) )=V_θ>0, iar relaţia (8.45) se confundă cu (8.39). Dimpotrivă, varianta din figura (8.17, d) este cea mai favorabilă Densitatea de probabilitate este concentrată pe axele de coordonate, ceea ce înseamnă că nu se asociază probabilităţi diferite de zero decât combinaţiilor (θ_A, 0) şi (0, θ_B). Aceasta implică faptul că, pentru orice set de date iniţiale cel puţin una dintre metodologii furnizează o versiune corectă care poate fi executată cu succes. Funcţia de corelaţie este negativă în acest caz (C_(OV_(θ_A θ_B ) )=〖-M〗_(θ_A ) M_(θ_B )) şi probabilitatea eronăni ambelor versiuni este nulă.
Cazurile din figurile (8.17, b) şi (8.17, c) sunt intermediare faţă de situaţiile extreme prezentate mai sus. în figura (8.17, b) funcţia de corelaţie fiind pozitivă, iar în figura (8.17, c), negativă. în acest din urmă caz, este de dorit ca variabilitatea între versiunile elaborate prin aceeaşi metodologie să fie cât mai măre. într-adevăr, din relaţia (8.46) rezultă:
Dacă ρ_(θ_A,θ_B )<0 este de dorit ca ρ_(θ_A ) şi ρ_(θ_B ) să fie cât mai mari, astfel încât eronarea unei versiuni să micşoreze cât mai mult eronatea versiunii produsă prin altă metodologie. Astfel, dacă metodologiile sunt profund diferite, este bine ca fiecare să ofere o gamă cât mai largă de posibilităţi. Invers, dacă metodologiile sunt asemănătoare, este preferabil ca fiecare să sc restrângă la un număr de versiuni.
Metodologiile diversificate se aplică la proiectarea structurilor tolerante Ia erori. Se consideră structura bloc cu restabilire cu o versiune primară şi o versiune secundară şi două metodologii^ şi B disponibile pentru elaborarea lor Admitem că probabilitatea totală de defectare a sistemului este aceeaşi, atât în cazul când ambele versiuni sunt realizate în metodologia A cât şi în cazul când sunt realizate în metodologia B Aceasta implică relaţia:
O comparaţie detaliată între relaţiile (8.51) şi (8.52) arată că utilizarea metodologiilor diferite este uneori avantajoasă, alteori dezavantajoasă raţă de utilizarea unei singure metodologii [11]. Pe de altă parte, dacă s-ar considera un singur set de date iniţiale, un sistem N-versional omogen ar fi net preferabil. într-adevăr, se ştie din teoria fiabilităţii hardware că un sistem majoritar format din elementele identice este superior unui sistem format din elemente distincte din punct de vedere al fiabilităţii.
8.7. APLICAŢII
Primele aplicaţii ale toleranţei la erori au apărut la început sub forme mai puţin sofisticate decât structurile descrise în acest capitol. Acestea constau în detecţia erorii, evaluarea consecinţelor şi restabilirea funcţionării. Detecţia erorii se face în principiu prin metodele utilizate la realizarea testelor de acceptare descrise în § 8 3.2 şi folosesc atât mijloacele software cât şi verificări bazate pe maşina virtuală pe care se execută programul. O dată eroarea detectată, ea este tratată ca o excepţie, fie Ia nivelul componentei în care a apărut, fie la nivelul subsistemului care are componenta inclusă
Dacă există o întârziere între activarea şi detecţia erorii, este posibil ca o porţiune mai mică sau mai mare din sistem să fie afectată. O serie de teste determină extinderea consecinţelor erorii şi este o practică deja încetăţenită ca ele să fie incluse în sistem.
Reluarea execuţiei după manifestarea erorii se face prin două tehnici complementare, restabilirea stării anterioare (bockwards recovery) şi aducerea într-o stare standard (forward recovery). în primul caz, starea sistemului este înregistrată Ia intervale prestabilite, astfel încât se poate readuce sistemul într-o stare în care s-a aflat înainte de defectare. Problema complexă a restabilirii stării anterioare în cazul unei structuri redundante a fost tratată în § 8.3. Tehnica "forward recovery" este aplicată atunci când consecinţele erorilor pot fi prezise prin metode ca FMEA (failure modes and effects analysis). în asemenea cazuri sistemul este condus într-o stare nouă de funcţionare, aniuandu-se şi efectele interactive ale erorii detectate. Acest procedeu presupune o bună predicţie a erorilor posibile, de aceea este mai rar utilizat. O dată sistemul restabilit, el poate ignora operaţia care a generat eroarea sau poate furniza un răspuns prestabilit şi foarte sumar în raport cu aşteptările. Aceasta este comportarea sistemelor robuste, care sunt înzestrate cu forme incipiente de toleranţă la erori, capabile doar să evite defectările catastrofice.
Dezvoltarea aplicaţiilor critice din punct de vedere al fiabilităţii şi al securităţii au impus depăşirea fazei sistemelor robuste şi utilizarea structurilor software redundante.' Astfel, sistemul de control al traficului, al Căilor Ferate Suedeze, utilizează structuri de tip 2-versional. Neconcordanţa dintre ieşiri implică aducerea sistemului într-o stare sigură, cum ar fi aprinderea luminilor roşii. Aceeaşi structură este utilizată în sistemul de control al avionului Airbus 310, dar versiunile sunt executate pe sisteme de calcul distincte.
Un pas înainte 1-a constituit sistemul de control al mălţimu al avionului teleghidat A 320, care utilizează structuri de programe 4-versionale executate pe hardware cu rezervă activă. Pentru sistemul de protecţie al reactoarelor s-au elaborat versiuni diferite de către colective independente din Anglia, Norvegia şi Finlanda, iar aceste versiuni au fost înglobate într-o structură N-versionalâ. Blocurile cu restabilire au fost aplicate în Marea Bntanie la sistemul de comandă şi control al navelor, bazat pe maşina virtuală MASCOT. Experimentările au arătat că în acest fel au fost neutralizate 74% din defectele potenţiale ale sistemului. Aplicaţii similare au fost incluse în sistemul de control al traficului aerian din Londra.
BIBLIOGRAFIE
1. Leclerq, Ph. R.. A Software - Reliability Assessment Modei. Proceedings of the Annual R & Symposium, Las Vegas, Nevada, January 1992, pag. 294-298.
2. Little iv ood, B., Software reliability model for modular program structure. lEEETrana. Reliab., R-28, 1(1979), pag. 241-245.
3. C i t uneanu, V. M_, Bacivarof, A., Structuri electronice detnaltă fiabilitate. Toleranţa la defectări. Editura Militari, Bucureşti, 1989, pag. 181-190.
4. R a n d e 11, B. System structure for software fault tolerance Proceedings of the bit Conf. on Reliable Software, Los Angeles, 1973, pag. 437-449. î. Ari al, J., Kanoun, K-, Laprie, J. C, Dependability modeling and evaluation of Software fault tolerance. ESPRIT project PDCS, research raport, may 1990.
5. Moulding, M R., Designing/or High integrity: The software fault tolerance approach In: Sawed, C, High integrity Software, Pitman, London, 1989
6. THecht, H., Fault Tolerant Software. IEEE Trans. Reliab., R-28,3 (1979), pag. 227-232. 7. Mihalacbe, A., A fuzzy set approach to software reliability modeling. Proceeding! of the ESRC, Copenhigoi 1992, pag. 724-730.
8.Yan, S. S., Cheng, R. C., Design of self-checking software. Proc. 1975 tat. Conf Reliable Software, pag, 450-457.
9. Yan, S. S., Cheng, R. C, Cochr«oe, D. C., An approach to error-rtsistent software design. Proc, 1976 bn_ Conf Software Engnmg. pag. 429-436.
10. Lilt I ew ood, B., Miller, D. R_, Conceptual modeling of coincident failures in multiversion software. IEEE Trans. Software Engnmg. vol. SE - 1Î, 12 (1989), pag. 1596-1614.
11. Humphreys, P., Diversity by Design-Reliability aspects of systems with embedded software in Littlewood. B. (edX Software Reliability, BlackweU, London, 1987, pag. 96-112.