1                                            Proiectarea şi analiza sistemelor de operare
1. Introducere
Scopul lucrării este expunerea bazelor contemporane ale metodelor şi mijloacelor de elaborare a resurselor program de sistem (inclusiv, operaţii asincrone, tratarea întreruperilor, interfeţele sistemelor de operare, compromisele dintre dispozitivele tehnice şi resursele program) şi pregătirea cititorului pentru proiectarea şi analiza sistemelor de operare (S.O.).
Resursele fizice ale sistemelor de calcul contemporane posedă caracteristici tehnice extraordinare şi pot fi utilizate în cele mai diverse scopuri. Însă aceste resurse fără compartimentul logic de sistem (software de sistem) întâmpină dificultăţi majore în relaţiile cu mediul în care trebuie să funcţioneze. Acesta este motivul principal al creării sistemelor de operare, destinaţia cărora este administrarea (gestiunea, controlul) resurselor tehnice principale şi asigurarea unei interfeţe comode (plăcute, prieteneşti) între utilizator şi calculator (fig.1.1) [1].


Fig.1.1. Relaţia dintre un sistem de operare şi componentele unui calculator
Există mai multe motivaţii ale necesităţii studierii sistemelor de operare, cele mai importante fiind următoarele:
•    pentru utilizarea resurselor hardware în scopuri speciale poate fi necesar să se creeze un sistem de operare propriu sau să se introducă modificări în sistemul existent;
•    de alegerea corectă a sistemului de operare şi a versiunii concrete poate depinde viabilitatea şi eficacitatea sistemului de calcul;
•    este ideal ca utilizatorul să interacţioneze cu sistemul de operare cunoscând toate subtilităţile ultimului, deoarece sistemul de operare este un intermediar între calculator şi utilizator;
•    multe metode şi concepte, utilizate în domeniul sistemelor de operare, pot fi implementate cu succes şi în alte domenii (ultima motivaţie conform ordinii de expunere, dar nu şi ultima ca importanţă).
Prin noţiunea sistem de operare înţelegem modulele program ale unui sistem de calcul, care administrează resursele tehnice (procesoare, memoria operativă şi secundară, dispozitive de intrare/ieşire, fişiere). Modulele în cauză soluţionează situaţiile de conflict, optimizează productivitatea sistemului, sporesc eficienţa utilizării lui. Ele sunt un fel de intermediar (interfaţă) între programele utilizatorului şi componentele tehnice ale calculatorului. Alte denumiri istorice: program de administrare, monitor, supervizor.
Modulele destinate unor domenii anume, cum ar fi translatoarele, depanatoarele, bibliotecile, mediile integrate (Visual) etc. nu sunt incluse în definiţia unui sistem de operare, fiind considerate şi ele utilizatori ai sistemului de operare.
Noţiuni de bază şi clasificări
Un calculator constă dintr-un ansamblu de componente funcţionale fizice şi logice, care cooperează în satisfacerea cerinţelor utilizatorilor privind introducerea, stocarea, prelucrarea, transmisia şi regăsirea informaţiilor. Aceste componente funcţionale sunt structurate pe niveluri, care interacţionează prin interfeţe bine definite. Suportul fizic (resurse tehnice, hardware) constituie nivelul inferior al sistemului de calcul construit pe baza unor componente electronice, magnetice, optice, mecanice etc., mai mult sau mai puţin sofisticate în funcţie de stadiul de dezvoltare a tehnologiilor respective.
Noţiuni şi termeni din domeniul resurselor tehnice
Pentru a trece la noţiunile principale, legate de hardware, vom face cunoştinţă mai întâi cu funcţiile de bază ale unui calculator. Pot fi evidenţiate cinci funcţii esenţiale [2]: iniţializarea (bootup), introducerea datelor, procesarea datelor, stocarea datelor şi extragerea rezultatelor:
•    Iniţializarea implică testarea părţilor importante ale calculatorului, rularea fişierelor de pornire şi încărcarea altor fişiere necesare, cum ar fi driverele de dispozitive;
•    Introducerea reprezintă transferul datelor dintr-o sursă externă în calculator. Surse externe pot fi dischetele, tastatura, mouse-ul etc.;
•    Procesarea se referă la manipularea datelor introduse, în scopul producerii unui rezultat (ieşirea);
•    Stocarea constituie procesul salvării informaţiilor (date sau programe) într-un dispozitiv de păstrare, de exemplu discul fix, pentru recuperarea ulterioară.
Prin structura unui calculator vom subînţelege componentele (dispozitivele) care formează calculatorul şi legăturile dintre ele. Componentele principale sunt: procesorul, memoria, unităţile de stocare pe termen lung, dispozitivele de intrare-ieşire (tastatura, display-ul, mouse-ul etc.). Relaţiile (legăturile) dintre aceste componente pot fi foarte variate, dar, istoric prima şi, devenită mai apoi clasică, este structura John von Neumann, prezentată în fig.1.2.


Fig.1.2. Structura unui calculator
Componentele principale se conectează la placa de bază (motherboard) direct sau prin conectoare speciale, numite plăci de extensie (daughterboards). Unitatea centrală de procesare – procesorul (CPU) se găseşte într-un singur circuit integrat (cip) incorporând unitatea de comandă (Control Unit, CU) şi  unitatea logico-aritmetică (Arithmetic Logical Unit, ALU). Unitatea de comandă controlează funcţionarea unităţii logico-aritmetice. Memoria este o zonă de lucru de mare viteză, unde CPU stochează datele şi programele pentru a le consulta în mod rapid. Memoria poate fi organizată în mod ierarhic, caz în care există cel puţin două nivele de ierarhie – memoria centrală (operativă) şi memoria secundară (externă, de lungă durată). Memoria operativă este electronică sub formă de cipuri, de obicei cu acces aleator (RAM – Random Access Memory) şi trebuie să fie alimentată cu tensiune pentru a păstra datele. Pentru salvarea datelor atunci când se întrerupe alimentarea sau pentru păstrare de lungă durată, datele sunt stocate în memoria secundară, care le reţine oricât de mult timp. Dispozitivele cele mai obişnuite de introducere a datelor sunt tastatura şi mouse-ul, iar dispozitivul de ieşire cel mai utilizat este monitorul. Procesorul şi memoria operativă formează nucleul calculatorului, toate celelalte dispozitive fiind cunoscute sub denumirea de periferie (dispozitive periferice).
Instrucţiunile care vor fi îndeplinite de calculator sunt stocate în memorie sub formă de programe. Unitatea de comandă ţine evidenţa şi interpretează instrucţiunile dintr-un program, fiind responsabilă cu transmiterea de sarcini specifice diferitelor elemente ale calculatorului. CU controlează în principal funcţiile I/O, de memorie şi stocare, colaborează cu ALU, care răspunde de efectuarea operaţiilor de calcul. Mai menţionăm noţiunile: mărimea magistralelor interne şi externe de date, mărimea adresei de memorie, frecvenţa ceasului.
Mărimea magistralei interne de date - procesoarele păstrează datele în locaţii temporare, numite registre. Datele sunt transferate оntre registre, CU, ALU şi alte componente ale procesorului prin intermediul unei magistrale realizate în circuitele procesorului. Numărul de linii în această magistrală oferă o măsură a cantităţii de date pe care procesorul o poate transfera într-o singură operaţie. Valoarea ei poate varia între 8 şi 32 de biţi (în scopuri speciale 64 sau 128).
Mărimea magistralei externe de date măsoară câte date pot fi transferate între procesor şi dispozitivele periferice într-o singură operaţie. Magistrala este un sistem de conectări şi cablări ce distribuie datele prin calculator. Cu cât magistrala de date e mai mare, cu atât performanţele calculatorului se îmbunătăţesc. Numărul de linii şi aici variază între 8 şi 32 de biţi.
Mărimea adresei de memorie determină volumul de memorie care poate fi gestionat de către calculator fără eforturi speciale.
Un ceas electronic asigură coordonarea corespunzătoare a numeroaselor elemente ale calculatorului. Componentele calculatoarelor cu performanţe superioare pot opera la frecvenţe de ceas mai mari. Frecvenţa ceasului indică viteza de operare a CPU. Ea se măsoară în milioane de impulsuri de ceas pe secundă, adică în megahertzi (MHz).
Noţiuni şi termeni din domeniul sistemelor de operare
Un sistem de operare este un ansamblu de programe de control şi de serviciu care ghidează un calculator în executarea sarcinilor sale şi asistă programele de aplicaţie şi utilizatorul prin intermediul anumitor funcţiuni. Natura funcţiilor şi modul în care acestea sunt realizate determină atributele care caracterizează un sistem de operare: timpul de răspuns, simultaneitatea utilizării, eficienţa, partajarea şi protecţia, generalitatea, flexibilitatea, extensibilitatea, fiabilitatea şi disponibilitatea, transparenţa şi vizibilitatea [3].
Timpul de răspuns exprimă durata intervalului delimitat de lansarea unei cereri de serviciu şi achitarea acesteia de către sistem. Are două componente: timpul de aşteptare pentru ca cererea respectivă să fie luată în consideraţie şi timpul de execuţie a acestei cereri.
Simultaneitatea utilizării măsoară gradul în care un sistem poate să execute în acelaşi timp mai multe lucrări.
Eficienţa măsoară proprietatea unui sistem de a folosi оn mod optim resursele de care dispune.
Partajarea şi protecţia caracterizează nivelul la care utilizatorii au posibilitatea să utilizeze în comun informaţia prezentă în sistem şi nivelul la care pot să comunice între ei, în deplină siguranţă (în sensul evitării accesului neautorizat şi/sau alterării intenţionate sau accidentale a informaţiei).


Fig.1.3. Relaţia dintre utilizator, sarcină, pas de task, proces şi spaţiu de adrese

Generalitatea, flexibilitatea, extensibilitatea măsoară gradul în care un sistem poate fi folositor şi adaptabil unui context specific (exprimat prin nivelul de limitare impus programelor utilizatorului), precum şi gradul în care se pot include în sistem noi componente hardware şi software fără eforturi de proiectare şi programare suplimentare.
Fiabilitatea şi disponibilitatea exprimă proprietatea unui sistem de a cădea foarte rar în pană şi de a evita goluri în funcţionare din cauza defectării uneia sau mai multor componente ale sale.
Transparenţa şi vizibilitatea exprimă pe de o parte proprietatea unui sistem de a face invizibil utilizatorului ceea ce se află sub interfaţa de utilizare care i se oferă şi, pe de altă parte, capacitatea de a permite utilizatorilor săi să obţină anumite informaţii despre modul cum el lucrează, informaţii de care în mod teoretic ei nu au nevoie pentru a beneficia de o utilizare completă, însă care ar putea să-i ajute la obţinerea unei utilizări mai eficiente [3].
Resursele program reprezintă seturi de programe şi date utilizate pentru soluţionarea anumitor probleme. Programul este transcrierea оntr-un limbaj de programare a unui algoritm, altfel – programul este o secvenţă de instrucţiuni sau simplu cod. Utilizatorul (user) este oricare doritor să îndeplinească anumite lucrări la calculator. Prin lucrare (sarcină, task) vom subînţelege un set de acţiuni, necesare pentru îndeplinirea unui lucru anume. Sarcina poate conţine mai mulţi paşi. Paşi de task sunt unităţi de lucru, care vor fi îndeplinite consecutiv, de exemplu trei paşi – compilare, încărcare şi executare. Primind un task de la utilizator, sistemul de operare poate crea câteva procese. Până la tehnologia Win32 prin proces se considerau calculele care puteau fi efectuate paralel cu alte calcule. Relaţia dintre un user, task, proces şi spaţiu de adrese este prezentată în fig.1.3.
Procesul mai poate fi definit drept traiectoria procesorului, atunci când ultimul îndeplineşte un set oarecare de programe. Ansamblul programelor şi datelor accesate în timpul procesului, formează spaţiul de adrese. În fig.1.3 sunt aduse două exemple de spaţii de adrese – unul pentru procesul de intrare/ieşire (input/output, I/O) şi altul pentru procesul unităţii centrale.
Una din destinaţiile sistemului de operare este de a asigura proiectarea spaţiului de adrese a unui proces în memoria fizică. Pentru rezolvarea acestei probleme sunt utilizate atât resurse tehnice (sisteme cu organizarea memoriei pe segmente sau pe pagini), cât şi resurse program speciale.
Multiprogramarea este un termen utilizat în cazul unui sistem în care pot exista simultan câteva procese în stare de execuţie. Un proces se consideră în stare de execuţie, dacă calculele au început, dar la momentul considerat nu au fost terminate sau întrerupte (terminare din cauza unei erori sau din alte motive). Nu este obligatoriu ca un proces care se află оn starea de execuţie să fie şi executat de procesor la un moment dat.
Resursele hardware de protecţie sunt utilizate cel mai des pentru controlul accesării memoriei. Resursele hardware de оntrerupere permit sistemului de operare să coordoneze operaţiile care au loc în acelaşi timp; pot fi utilizate şi pentru a schimba ordinea de execuţie a programelor. Оntreruperea este un mecanism care impune procesorul să observe anumite evenimente. Pot exista mecanisme care permit să nu se acorde atenţie unei anume întreruperi – întrerupere mascată.
Tipuri de sisteme de operare, obiective şi funcţii
Valorile concrete ale atributelor sistemelor de operare şi combinaţii ale acestora determină diverse tipuri de sisteme şi restricţiile de implementare. Conform acestor atribute pot fi evidenţiate sisteme de operare [3]:
•    secvenţiale
•    cu multiprogramare
•    cu prelucrare multiplă
•    în timp real, etc.
Majoritatea sistemelor de operare recunosc programul ca cea mai mică unitate de prelucrare, căreia i se atribuie o identitate şi pe care un utilizator o poate prezenta spre execuţie. Unele sisteme permit ca un program să fie considerat ca un ansamblu de sarcini ale căror execuţii (inclusiv în paralel) contribuie la atingerea obiectivului urmărit de acest program.
Un sistem secvenţial (tratare pe loturi, batch processing, traitement par lots) execută la un moment dat un singur program, care trebuie terminat înainte de a lua un alt program în consideraţie.
Sistemele cu multiprogramare acceptă la un moment dat mai multe programe în memoria centrală, acestea aflându-se în diverse stadii de execuţie.
Un sistem de calcul cu prelucrare multiplă dispune de mai multe procesoare, care pot să execute simultan unul sau mai multe programe. Utilizarea efectivă a prelucrării multiple necesită atributul de multiprogramare. Execuţia simultană a unui singur program de către mai multe unităţi presupune existenţa posibilităţii de a descompune acest program în mai multe sarcini (multitasking) sau mai multe procese.
Sistemele оn timp real sunt dedicate, de obicei, funcţionării în cadrul unor sisteme de comandă şi este necesar ca valorile anumitor atribute să se încadreze în limite destul de restrictive, dictate de dinamica proceselor comandate.
Tipurile de sisteme de operare enumerate mai sus nu sunt nici disjuncte şi nici exhaustive. Majoritatea sistemelor existente pot fi încadrate în mai multe clase, atunci când se face o analiză prin prisma obiectivelor pe care le urmăresc. La capitolul obiective vom aminti оn primul rвnd maximizarea eficienţei sistemului de calcul şi a satisfacţiei utilizatorilor. Tot la obiective poate fi trecută şi cererea de minimizare a posibilităţii de apariţie a unor erori şi de maximizare a transparenţei sistemului de operare, garantarea securităţii datelor, optimizarea controlului comunicaţiilor în cazul unei reţele de calculatoare. Un obiectiv foarte important este necesitatea de minimizare a efortului concepţie-realizare a sistemului, ultim оn enumerare, dar poate cel mai important pentru specialişti.
Toate aceste obiective sunt consecinţe ale dezideratului principal: un sistem de operare este destinat să administreze resursele sistemului de calcul şi anume memoria, procesorul (procesoarele), dispozitivele şi informaţia.
Un sistem de operare este obligat:
•    să păstreze informaţia despre starea fiecărei resurse
•    să ia decizia cărui proces să i se aloce resursa, în ce cantitate şi când
•    să aloce resursa şi
•    la momentul respectiv să o retragă.
Exemple de sisteme de operare
Exemplele care urmează [6] vor ilustra diversitatea funcţiilor îndeplinite de către un sistem de operare, fără pretenţii de exhaustivitate. Pentru fiecare exemplu vom indica funcţiile puse în şarja sistemului de operare şi caracteristicile principale ale acestuia.
Cazul calculatoarelor personale
Configuraţia cea mai simplă a unui calculator personal (PC) include o unitate centrală, o memorie principală, un display, o tastatură şi un mouse. Această configuraţie de obicei este completată de o memorie secundară şi o imprimantă (fig.1.4).

Utilizatorul unui atare sistem va cere minimum următoarele două tipuri de servicii:
•    identificarea şi crearea unor fişiere sau mulţimi structurate de informaţii; stocarea acestor fişiere în memoria secundară; transferarea informaţiilor între fişiere şi dispozitivele de intrare/ieşire;
•    executarea unor programe existente în PC sau introduse sub formă de fişiere; introducerea datelor necesare executării programului (de la tastatură, din fişier sau de la alte surse); listarea rezultatelor la display, imprimantă sau copierea lor într-un fişier.
Sistemul de operare va acorda aceste servicii prin intermediul unui limbaj special, numit limbaj de comandă, introducându-se de la tastatură instrucţiuni de forma <acţiune> <parametri>, sau utilizând mouse-ul şi o interfaţă grafică a utilizatorului (GUI - graphical user interface), acţionările mouse-lui fiind imediat interpretate de sistem.
Iată două exemple de secvenţe tipice de activităţi în cazul unui PC:
•    elaborarea unui program;
•    introducerea programului cu ajutorul tastaturii şi a unui editor de texte;
•    executarea programului introducându-se datele necesare de la tastatură şi extrăgând rezultatele la display sau imprimantă;
•    modificarea programului, dacă rezultatele nu sunt satisfăcătoare şi repetarea execuţiei;
•    perfectarea versiunii finale a programului, inclusiv documentarea la necesitate a acestuia;
•    exploatarea unui program;
•    cererea de executare a unui program deja existent. Vor fi pregătite în prealabil date de intrare sau vor fi introduse in mod interactiv aceste date la cerere cu ajutorul tastaturii;
•    afişarea rezultatelor pe ecran, listarea la imprimantă sau copierea lor într-un fişier pentru o utilizare ulterioară.
Într-un atare sistem funcţia partajare a resurselor este lipsă, or PC este folosit de un singur utilizator care are controlul total asupra acestuia. Alocarea resurselor este legată de gestionarea memoriei şi administrarea fişierelor. Funcţiile principale vizibile ale sistemului de operare constau în administrarea fişierelor, realizarea operaţiilor de intrare/ieşire şi interpretarea comenzilor provenite de la interfaţa utilizator-sistem de operare.
Pentru acest tip de sisteme cele mai importante caracteristice sunt:
•    fiabilitatea;
•    eficacitatea;
•    simplitatea utilizării;
•    facilitatea extensibilităţii prin adăugarea unor utilite noi sau adaptarea la periferice noi.
Ultimele două aspecte pun în evidenţă importanţa interfeţelor oferite de sistem (limbajul de comandă sau GUI).
Comanda unor procese industriale
La o uzină chimică sunt utilizate doua produse iniţiale A şi B pentru sinteza produsului C conform fig.1.5.
Procesul de fabricaţie este comandat de un calculator care îndeplineşte următoarele funcţii:
•    Reglare.     Pentru o derulare bună a procesului de fabricaţie parametrii de funcţionare (temperatura, presiunea, concentraţia, etc.) trebuie să se afle într-o plajă de valori predefinite. Pentru aceasta va fi acţionat debitul de intrare a materiilor prime A sau B. Parametrii de funcţionare sunt măsuraţi cu ajutorul unor captoare. Calculatorul preia aceste măsurări şi, în dependenţă de algoritmul de comandă, acţionează robinetele de intrare.
•    Înregistrare. Rezultatele măsurărilor sunt periodic înregistrate; valorile lor sunt afişate pe un tablou de bord şi recopiate într-un fişier ("jurnal de bord") în scopul unor prelucrări ulterioare (date statistice).
•    Securitate. În cazul în care unul dintre parametrii măsuraţi depăşeşte o valoare critică predefinită reactorul trebuie oprit imediat.

Acest mod de funcţionare introduce unele restricţii, descrise mai jos.
Măsurările sunt făcute periodic; fie T valoarea intervalului de timp dintre două măsurări consecutive (perioada de eşantionare), iar t - timpul total de prelucrare a datelor de către calculator (măsurarea propriu-zisă a semnalelor observate, înregistrarea, calcularea semnalelor de comandă şi comanda robinetelor). Sistemul va funcţiona doar în cazul respectării relaţiei de restricţionare t  T.
Securitatea sistemului are prioritate maximă. Depăşirea unor valori critice trebuie să fie detectată în orice moment şi tratarea acestor accidente va întrerupe toate operaţiile în curs de execuţie.
Funcţiile principale ale sistemului de operare sunt:
•    acţionarea organelor externe (citirea semnalelor captoarelor, comanda robinetelor);
•    evidenţa timpului real (declanşarea periodică a ciclului de calculare a semnalelor de comandă);
•    reacţia la evenimentele exterioare (oprire de urgenţă);
•    gestiunea informaţiilor (păstrarea şi întreţinerea fişierului jurnalului de bord).
Existenţa unor restricţii stricte a duratei de prelucrare a informaţiilor, noţiunea de tratare prioritară, conectarea la nişte dispozitive exterioare de măsurare şi acţionare, sunt caracteristice aplicaţiilor informatice "оn timp real". Pot fi menţionate şi alte domenii cu comandă în timp real: centralele telefonice, comanda aparatelor de zbor, robotica, monitoringul medical, etc.
Оn cazul acestor sisteme caracteristica principală este fiabilitatea, or rezultatele unei funcţionări neadecvate pot fi catastrofale. Sistemul trebuie să garanteze un serviciu minim în cazul unor căderi în pană a dispozitivelor tehnice, unor evenimente accidentale sau erori umane.
Sisteme tranzacţionale
Caracteristicile principale ale sistemelor cu tranzacţii sau tranzacţionale sunt următoarele:
•    sistemul gestionează un set de informaţii sau baze de date, care pot atinge volume importante;
•    asupra acestor informaţii pot fi executate un anumit număr de operaţii predefinite, sau tranzacţii, adesea interactive;
•    sistemul este dotat cu un mare număr de puncte de acces şi un mare număr de tranzacţii se pot derula simultan.
Ca exemplu pot fi menţionate sistemele de rezervare a biletelor de tren sau avion, de gestionare a conturilor bancare, de arhivare şi consultare a documentelor.
Restricţiile sunt în primul rând legate de integritatea şi coerenţa internă a informaţiilor, care formează bazele de date. Aceste restricţii depind, evident de aplicaţie. De exemplu, numărul de locuri rezervate într-un avion nu poate depăşi numărul locurilor disponibile, un loc distinct poate fi atribuit unei singure persoane, etc.
Calităţile obligatorii ale unui sistem tranzacţional sunt disponibilitatea şi fiabilitatea; pentru unele sisteme poate fi importantă şi toleranţa la defecţiuni. O caracteristică importantă ale sistemelor tranzacţionale este multitudinea activităţilor paralele, iar în multe cazuri şi repartizarea geografică a componentelor.
Sisteme оn timp partajat
Destinaţia principală a unor astfel de sisteme este furnizarea serviciilor necesare unei mulţimi de utilizatori, fiecare dintre ei beneficiind:
•    de servicii echivalente serviciilor unui calculator individual;
•    de servicii legate de existenţa unei comunităţi de utilizatori: partajarea informaţiilor, comunicaţii între utilizatori.
Problemele care apar datorită conceptului de partajare a timpului sunt o combinaţie a problemelor existente în cazul unui calculator individual cu cele din sistemele tranzacţionale şi pot fi clasificate după cum urmează:
•    definirea maşinii virtuale oferite fiecărui utilizator;
•    partajarea şi alocarea resurselor fizice comune: procesoare, memorii, organe de comunicaţie;
•    gestionarea informaţiilor partajate şi a comunicaţiilor.
Caracteristicile obligatorii unui atare sistem combină în egală măsură calităţile unui sistem de operare al unui calculator individual şi al unui sistem tranzacţional: disponibilitatea, fiabilitatea, securitatea, exploatarea optimă a caracteristicilor resurselor fizice, calitatea interfeţei şi serviciilor utilizatorului, facilitatea adaptării şi extensibilităţii.
Sistemul de operare şi procesele
Noţiunea de proces, introdusă mai sus, este asociată conceptului de lucrare (pentru a lua în considerare aspectele dinamice) şi poate fi definită altfel ca o suită temporală de execuţii de instrucţiuni, fiind o entitate de bază în descrierea sau analiza funcţionării unui sistem. Evoluţia în timp a unui proces presupune un consum de resurse, dictat de natura şi complexitatea instrucţiunilor de executat. Orice utilizare a unei resurse este asociată, la un moment dat, unui proces şi procesul respectiv îşi asumă răspunderea utilizării acestei resurse. În particular, rezultă că ori de câte ori se execută procedurile de sistem, resursele pe care le utilizează acesta intră în administrarea procesului (fie el şi al utilizatorului), care a cerut serviciul. Resursele (procesorul, memoria centrală, informaţia, dispozitivele) alocate unui proces variază în timp (dinamica procesului).
Anterior un sistem de operare a fost definit ca un set de programe destinat să administreze resursele. Care sunt relaţiile dintre programele sistemului de operare? Atunci când un proces este creat, care este ordinea de utilizare a unui program anume? Pentru a răspunde la aceste întrebări (şi la altele) vom face cunoştinţă cu ciclul de viaţă a unui proces. În fig.1.6 sunt prezentate trei procese (trei sarcini ale utilizatorilor) existente оntr-un sistem cu multiprogramare.

Fig.1.6. Trei procese оntr-un sistem cu multiprogramare
Ciclul de viaţă a unui proces poate fi reprezentat printr-un set de stări ale procesului şi trecerea de la o stare la alta. Vom evidenţia trei stări elementare ale unui proces: proces ales (sau exe) – procesului i s-a alocat un procesor, este în curs de execuţie, proces blocat – procesul aşteaptă să se producă un anumit eveniment, a cărui apariţie este indispensabilă, proces eligibil – procesul are la dispoziţie toate resursele necesare lipsă fiind doar procesorul, adică este pregătit să se execute din momentul alocării unităţii centrale (fig.1.7).


Fig.1.7. Ciclul de viaţă a unui proces
Ciclul de viaţă a unui proces, prezentat în fig.1.7 sugerează existenţa “veşnică” a proceselor. Mai aproape de realitate un proces este reprezentat în fig.1.8. Aici norii semnifică componentele sistemului de operare, care tratează evenimentele respective, iar pentru modelarea procesului real au fost adăugate trei stări suplimentare:
•    prezentare –    utilizatorul prezintă sistemului sarcina, sistemul trebuie să reacţioneze la cererea utilizatorului,
•    păstrare –        sarcina este reprezentată în formă internă, dar resursele nu sunt încă alocate,
•    terminare –    calculele corespunzătoare procesului au luat sfârşit, toate resursele alocate procesului pot fi eliberate şi întoarse sistemului.
    Sistemul de operare este acea componentă, care va ghida procesul prin toate aceste stări. În fig.1.8 este prezentată una din variantele posibile ale ciclului de viaţă a procesului. Pot exista abateri de la acest model atât în sensul complexităţii, cât şi în direcţie opusă. Oricum, acest model este foarte util pentru rezolvarea problemei proiectării sistemelor de operare.
    Maşină ierarhică şi maşină extinsă
    Astăzi este greu de închipuit că doar cu câteva decenii în urmă un utilizator era nevoit să programeze în zerouri şi unităţi, utilizând un calculator fără “hainele program” (maşina goală). Chiar şi specialiştii nu prea iubesc să scrie programe într-un limbaj de asamblare sau (şi mai evident) utilizând doar instrucţiuni din setul, garantat de hardware. Un program elaborat de un specialist poate fi de forma [1]:
    1 Transferă C, B    Stabileşte C=B
    2 Găseşte zona 80, X    Să se găsească 80 de octeţi de memorie liberi
        şi să se plaseze adresa zonei în X
    3 Introdu date оn X    Să se citească datele indicate în zona X
    4 Compară X(2), ‘/*’    Coincide conţinutul primilor 2 octeţi ai zonei
        X cu ‘/*’?
    5 Dacă da, stop    Dacă coincid, salt la STOP
       
    
    Fig.1.8. Schimbarea stărilor unui proces şi componentele SO responsabile de aceste schimbări
    
    Instrucţiunile 1, 4 şi 5 sunt instrucţiuni standard în multe calculatoare contemporane. Însă execuţia corectă şi eficientă a instrucţiunilor 2 şi 3 poate necesita îndeplinirea a zeci, sute sau chiar mii de comenzi din setul standard, deoarece aceste instrucţiuni cer interacţiunea cu unele resurse cheie, cum ar fi memoria operativă şi dispozitivele de intrare-ieşire. Sistemul de operare asigură instrucţiuni pentru realizarea unor astfel de funcţii de administrare a resurselor. Din această cauză, instrucţiunile 2 şi 3 sunt instrucţiuni ale maşinii extinse, ele neavând echivalenţi în setul de instrucţiuni hardware. Sistemul de operare completează setul standard, realizat hardware, cu instrucţiuni de acest gen.
    Setul de instrucţiuni realizat hardware împreună cu instrucţiunile suplimentare ale sistemului de operare formează sistemul de comenzi al maşinii extinse. Grafic conceptul de maşină extinsă poate fi reprezentat conform fig.1.9.
    Nucleul sistemului de operare va fi executat pe maşina “goală”, iar programele utilizatorului – pe maşina extinsă. Să facem cunoştinţă acum cu modul în care sunt organizate оntr-un tot оntreg componentele sistemelor de operare.
    Primele sisteme de operare erau formate dintr-un singur program mare. Dar, odată cu sporirea complexităţii sistemelor, această abordare liniară conducea la dificultăţi serioase şi s-a propus să se utilizeze şi în acest domeniu conceptul de maşină extinsă. Acest concept, оn cazul sistemelor de operare, poate fi utilizat în două nivele (fig.1.10.) şi conduce la noţiunea de maşină ierarhică [4]:
    Primul nivel - funcţiile cheie, utilizate de majoritatea modulelor de sistem, pot fi realizate оn cadrul unei maşini extinse interne şi
   
    
    Nivelul doi - unele module pot fi executate оn cadrul unei maşini extinse externe, analogic proceselor utilizatorului.
       
    
    Оn această abordare ierarhică apare imediat problema alegerii corecte a nivelului de ierarhie pentru fiecare modul al sistemului de operare (în maşina extinsă internă, externă sau va fi prezent în calitate de proces extern). Pot fi evidenţiate subnivele ale celor două maşini extinse, iar interacţiunea proceselor sistemului de operare ne conduce la necesitatea introducerii mai multor straturi ale proceselor. Modulele sistemului, plasate în cadrul maşinii extinse, spre deosebire de modulele care aparţin straturilor proceselor, formează nucleul sistemului de operare. Concepţia maşinii ierarhice este pe larg utilizată în proiectarea programelor mari utilizвnd metodele, cunoscute sub denumirea programare modulară sau  programare structurală. Nu există reguli stricte în privinţa numărului de nivele, amplasării modulelor pe nivele, componenţa nucleului. De obicei, nucleul conţine doar cele mai necesare şi evidente funcţii, celelalte, atunci când este posibil, vor fi prezente ca procese de sistem separate. O detalizare a conceptului de maşină ierarhică este adusă în fig.1.11. Procesele (incluse în dreptunghiuri) se adresează către funcţiile nucleului şi utilizează împreună toate resursele sistemului. Unele procese generează sau comandă alte procese (graniţa dintre ele este prezentată de liniile în zig-zag, care separă diferite straturi ale proceselor). Într-o realizare strict ierarhică modulele, situate оntr-un nivel oarecare, pot accesa (se pot adresa) numai resursele nivelelor inferioare.
    
       
    
    La nivelul 1 (nivelul cel mai inferior) sunt situate funcţiile de care au nevoie toate componentele administrării resurselor. Una dintre acestea este funcţia care urmăreşte repartizarea resurselor, funcţie, care la rândul său, necesită anumite mijloace de sincronizare. Aceste operaţii elementare sunt numite P-operator (ocuparea resursei sau cererea de acces) şi V-operator (eliberarea resursei). Sincronizarea se face printr-o tehnică de programare, numită semafor. Pot fi semafoare simple (binare) sau polivalente (care pot avea mai multe valori). Fiecărei resurse îi este ataşat un semafor. Atunci când în sistem apare o cerere pentru o resursă oarecare, pentru testarea semaforului respectiv este utilizat P-operatorul; dacă semaforul este “pe verde” (resursa este liberă), P-operatorul îl trece “pe roşu” (îl închide) şi returnează comanda. În caz contrar, procesul care a generat cererea este trecut în stare de aşteptare, pentru ca mai târziu, atunci când V-operatorul va elibera resursa şi va trece semaforul “pe verde”, să acceseze resursa.
    Amplasarea funcţiilor elementare pe nivele poate fi făcută în felul următor:
    Nivelul 1.    Administrarea procesoarelor (nivelul inferior)
•    P-operatorii de sincronizare
•    V-operatorii de sincronizare
•    planificarea proceselor (aparatul de multiprogramare)
Nivelul 2.    Administrarea memoriei
•    alocarea memoriei
•    eliberarea memoriei
Nivelul 3.    Administrarea procesoarelor (nivelul superior)
•    crearea şi distrugerea unui proces
•    transmiterea şi recepţionarea mesajelor între procese
•    lansarea unui proces
•    oprirea unui proces
Nivelul 4.    Administrarea dispozitivelor
•    urmărirea stărilor tuturor dispozitivelor periferice
•    planificarea intrărilor/ieşirilor
•    iniţierea operaţiilor de intrare/ieşire
Nivelul 5.    Administrarea informaţiei
•    crearea şi distrugerea unui fişier
•    deschiderea şi închiderea unui fişier
•    citirea şi înscrierea unui fişier.
Nucleul sistemului de operare este format de subprogramele, care asistă execuţia proceselor. Pentru a decide care funcţii pot fi realizate în formă de procese separate este necesar să se stabilească funcţiile care pot fi executate independent şi în mod paralel cu procesele utilizatorului (nu se va câştiga nimic evidenţiind în procese separate funcţii care trebuie să fie îndeplinite secvenţial). Sistemele avansate permit crearea oricărui număr de procese, ceea ce este foarte comod pentru organizarea calculelor paralele sau a regimurilor de timp real. În cadrul tehnologiilor noi (Win32, de exemplu) noţiunea de proces a fost substanţial modificată, introducându-se alte concepte (thread-uri), care exploatează într-un mod mai eficient ideile multitasking-ului şi multiprogramării.
Alte puncte de vedere asupra sistemelor de operare
Оn compartimentele precedente au  fost tratate sistemele de operare din diferite puncte de vedere, cum ar fi SO şi procesele, SO şi maşina extinsă sau SO şi maşina ierarhică. Există şi alte puncte de vedere asupra sistemelor de operare pe care un specialist ar trebui să le cunoască.
Abordare funcţională
Pentru un utilizator obişnuit, convins că un calculator este doar un instrument care îl ajută în rezolvarea unor probleme din domeniul său de activitate, noţiuni cum ar fi administrarea memoriei cu paginaţie sau driverele dispozitivelor nu semnifică prea multe. Destinaţia principală a unui sistem de operare pentru această categorie de utilizatori este punerea la dispoziţie a unui set de programe care ar ajuta în formularea şi rezolvarea problemelor concrete. Abordarea sistemelor de operare din acest punct de vedere (abordare funcţională) poate conduce la confundarea lor cu unele programe, utile şi foarte importante (translatoare, biblioteci, medii integrate, etc.). Pentru a evita posibilitatea apariţiei unei astfel de probleme aceste programe, de obicei, nu sunt considerate componente ale sistemului de operare.
Abordare din punctul de vedere al interfeţei cu utilizatorul
Interfaţa sistemului de operare cu utilizatorul prezintă un interes aparte. Progresul în acest domeniu este spectaculos, dacă vom lua în consideraţie că în primele sisteme utilizatorul era obligat să indice în mod explicit şi manual fiecare pas, oricât de nesemnificativ ar fi părut. Formularea paşilor cu ajutorul Job Control Language (JCL) nu a schimbat substanţial situaţia. Acest limbaj, nefiind agreat de utilizatorii simpli, care l-au denumit limbaj păsăresc, aşa şi nu a fost acceptat în cunoştinţă de cauză de către aceştia.
Conform JCL utilizatorul trebuie să încorporeze programul propriu într-un set de instrucţiuni, care indicau începutul, sfârşitul programului şi al datelor de intrare, paşii şi conţinutul concret al paşilor. JCL în principiu era un metalimbaj de programare (programare la nivel macro). Pentru mijloacele tehnice de la acea perioadă JCL a sporit substanţial eficienţa sistemelor de calcul, deşi au existat multe inconveniente, principala fiind lipsa posibilităţii lucrului interactiv.
Microprocesoarele şi memoriile anilor ’70 au pus problema lansării pe piaţă a calculatoarelor personale (PC) cu toate consecinţele respective. Una din consecinţe este şi interfaţa utilizator-calculator, sistemul de operare devenind până la urmă responsabil de aceasta. Interfaţa grafica a utilizatorului (Graphical User Interface - GUI) a apărut mai întâi ca un complement al sistemului de operare (pentru MS DOS - Windows 1, Windows 2 sau chiar Windows 3, de exemplu), pentru ca mai apoi să fie integrată în cadrul sistemului (Windows 95, Windows NT, etc.). Un sistem de operare nu este, în principiu, obligat să posede o interfaţă sofisticată, totul este determinat de baza tehnică utilizată şi de necesităţile concrete. Oricum, un specialist trebuie să distingă aceste două noţiuni – sistemul de operare şi interfaţa utilizatorului.
Evoluţia sistemelor de operare
O analiză cronologică a dezvoltării sistemelor de operare este greu de realizat, deoarece multe din principiile foarte importante au fost realizate pentru prima dată cu mult înainte de a deveni unanim acceptate. De exemplu, conceptele de memorie paginată şi memorie virtuală au fost realizate pentru prima dată în 1959 în cadrul sistemului “Atlas” [5], fiind utilizate la mijlocul anilor ’60 în unele sisteme cu destinaţie specială, pentru ca în 1972 să fie preluate de firma IBM în cadrul familiei de calculatoare mari.
Primele sisteme erau caracterizate prin prelucrarea secvenţială a taskurilor. Timpul de execuţie a programelor era relativ mare, instrumentele de depanare – primitive, fiecare programator îşi încărca în mod individual programul (pachetul de cartele perforate), apăsa butoane, controla conţinutul locaţiunilor de memorie, etc. (1950 – 1956).
Sporirea vitezei de calcul, dar şi a preţului calculatoarelor cerea o utilizare mai eficientă a timpului de calculator. Nu putea fi tolerată situaţia ca un calculator să “nu facă nimic”, atunci când utilizatorul îşi încarcă în mod manual programul. Au fost propuse programe de monitorizare (monitoare), care treceau de la o lucrare la alta în mod automat, utilizatorul fiind responsabil de organizarea corectă a programelor în cadrul unui pachet – primele încercări de prelucrare pe loturi (1956 – 1959).
Odată cu creşterea complexităţii calculatoarelor, îndeosebi în ceea ce consta administrarea dispozitivelor periferice, au fost propuse sisteme supervizoare (executive), care se aflau în memoria calculatorului în mod constant şi acordau utilizatorilor servicii în gestiunea operaţiilor de intrare/ieşire (1959 – 1963). În aceste sisteme mai erau realizate şi o serie de facilităţi noi, cum ar fi controlul unor posibile încercări din partea programului de a încălca restricţiile existente în sistem, culegerea informaţiilor de evidenţă, etc.
Au urmat apoi sistemele cu multiprogramare, menite la început să rezolve problema concordării vitezei de calcul a unităţii centrale şi a perifericelor. Drept consecinţă, au apărut o mulţime de limbaje de control a lucrărilor, a fost realizată o standardizare substanţială a operaţiilor de intrare-ieşire.
După 1965 au apărut primele sisteme cu partajare a timpului (time sharing), au fost propuse sisteme sofisticate de administrare a informaţiei (sisteme de gestiune a datelor sau sisteme de fişiere, File Systems). Principiul time sharing oferea posibilitatea lucrului interactiv a mai multor utilizatori pe un singur calculator, fiecărui utilizator în mod ciclic acordându-i-se un interval anume de timp (cuantă de timp) şi, datorită vitezei mari de calcul a unităţii centrale, creându-i-se impresia posesiei tuturor resurselor calculatorului.
Memoria virtuală şi maşinile virtuale sunt nişte principii care nici până astăzi nu au fost exploatate până la capăt. Progresele ultimilor ani în domeniul resurselor tehnice au permis implementarea acestor principii nu numai în cadrul sistemelor de calcul mari, ci şi pentru calculatoarele personale. Specificaţiile sistemelor de operare au fost în mare măsură standardizate, diversitatea SO devine tot mai mică, mulţi specialişti exprimându-şi îngrijorarea de o posibilă monopolizare a domeniului în viitorul apropiat. Evident, aceasta nu poate să sugereze nici într-un caz ideea că studierea principiilor de bază (mai vechi şi mai noi) ale sistemelor de operare ar fi de prisos, ca şi familiarizarea sau chiar cercetarea minuţioasă a unor sisteme existente, nicidecum nu poate însemna, în special pentru un specialist, pierderea interesului faţă de analiza şi concepţia sistemelor de operare.
O prezentare succintă a evoluţiei sistemelor de operare facilitează înţelegerea caracteristicilor actuale ale acestora şi a termenilor deja introduşi.
De la "poartă deschisă " la tratarea pe loturi
Primele calculatoare nu dispuneau de sisteme de operare. Fiecărui utilizator i se rezerva pentru un timp determinat calculatorul cu toate resursele acestuia. Interacţiunea era directă, programul şi datele fiind introduse în mod manual sub formă de zerouri şi unităţi. Utilitele care au apărut aveau destinaţia de a asista elaborarea programelor (asambloare, compilatoare, etc.) sau de a facilitata operaţiile de intrare-ieşire.
Acest mod de exploatare, numit "poartă deschisă" [6], era de o eficacitate minimă, dispozitive foarte costisitoare fiind utilizate ineficient. Din această cauză la sfârşitul anilor '50 au apărut primele "monitoare de înlănţuire" - programe care permiteau executarea secvenţială a unui set de lucrări, pregătite anticipat, trecerea de la o lucrare la alta fiind automatizată.
Funcţia principală a unui atare sistem era gestiunea resurselor: memoria, procesorul, intrarea-ieşirea. Automatismul acestei gestionări implică o funcţie de protecţie a setului de lucrări contra unor riscuri perturbatorii in caz de eroare:
•    limitarea timpului de ocupare a procesorului pentru a evita blocarea sistemului atunci când un program conţine o buclă infinită;
•    administrarea corectă a intrărilor-ieşirilor pentru a evita buclele în utilizarea perifericelor;
•    protecţia zonei de memorie rezervate monitorului pentru a împiedica modificarea accidentală a acestuia.
Deşi utilizarea monitoarelor de înlănţuire a ameliorat notabil randamentul utilizării procesorului, acest randament rămânea foarte scăzut din cauza că procesorul nu era eliberat în timpul operaţiilor de intrare-ieşire. O soluţionare ar fi constat în utilizarea a două calculatoare - unul (principal) pentru executarea programelor şi altul (auxiliar) pentru operaţiile de intrare-ieşire. O planificare adecvată a executării lucrărilor permitea utilizarea celor două calculatoare în paralel, dând posibilitatea sporirii la maximum a randamentului calculatorului principal.
Multiprogramarea şi partajarea timpului
Progresul tehnologic şi conceptual al anilor '60 - '70 a permis excluderea unor limitări caracteristice sistemelor de prelucrare pe loturi. Astfel, au fost introduse procesoare specializate pentru operaţiile de intrare-ieşire (unităţile de schimb sau canalele), care permitea eliberarea procesorului central de gestionarea dispozitivelor de intrare-ieşire. Utilizarea principiului multiprogramării sau partajarea memoriei între mai mulţi utilizatori a permis o utilizare şi mai bună a procesorului central. Exploatarea unui calculator conform principiului timpului partajat oferă utilizatorilor posibilităţi analogice unui calculator individual, permiţând beneficiul unor servicii comune la un preţ redus.
Organizarea intrărilor - ieşirilor în memorii tampon
Un canal este un procesor specializat în executarea autonomă a operaţiilor de intrare-ieşire, paralel cu procesul de prelucrare a informaţiilor. Viteza de lucru a organelor periferice este relativ mică din cauza unor dispozitive mecanice care intră în componenţa acestora. Pentru excluderea influenţei perifericelor asupra vitezei de lucru a sistemului de calcul s-a propus să se păstreze în memorie în anumite zone tampon datele de intrare (care vor fi utilizate la necesitate) şi rezultatele (care vor fi imprimate în mod autonom) mai multor lucrări. Această situaţie este prezentată în fig.1.12.










Pentru a exclude utilizarea ineficientă a memoriei operative prin formarea zonelor-tampon, acestea erau organizate în memoria secundară de capacitate înaltă, transferurile între aceste două nuvele ale memorie fiind de asemenea comandate de un canal.
Deşi utilizarea memoriilor tampon prezintă o serie de avantaje în vederea sporirii randamentului dispozitivelor calculatorului, totuşi două momente negative pot fi menţionate:
•    atunci când lucrarea în curs de execuţie are nevoie de nişte date unitatea centrală rămâne inactivă pe toată perioada citirii acestora;
•    o lucrare de scurtă durată, sosită în timpul execuţiei unei lucrări "lungi", trebuie să aştepte terminarea acesteia din urmă.
Multiprogramarea
Ultimele două momente au condus la ideea utilizării unui mod de funcţionare a SO în care:
•    o lucrare aflată în starea blocat ar putea folosi unitatea centrală, eliberată de o lucrare care este în aşteptarea datelor,
•    unitatea centrală ar putea schimba timpul său de alocare înainte de terminarea unei lucrări în scopul satisfacerii cerinţelor legate de timpul de răspuns.
Оn acest caz este necesar ca valoarea timpului de realocare a unităţii centrale să fie mai mică în raport cu durata unui transfer între nivelele memoriei. Aceasta implică prezenţa simultană în memoria operativă a mai multor programe sau părţi de programe. Acest mod de funcţionare este numit multiprogramare [6] şi este prezentat în fig.1.13.






































Această schemă evidenţiază două momente importante: rolul principal al memoriei operative (în sistemele anterioare acest rol era deţinut de către unitatea centrală) şi fluxul informaţional între memoria operativă şi cea secundară. Drept consecinţă, volumul memoriei operative şi viteza de transfer între aceste două nivele ale memoriei devin caracteristici determinante ale performanţei sistemului.
Principalele avantaje şi restricţii ale multiprogramării pot fi prezentate în rezumat după cum urmează:
•    un sistem cu multiprogramare este mai complicat pentru că el trebuie să asigure partajarea memoriei şi protecţia reciprocă a programelor;
•    multiprogramarea necesită dispozitive speciale pentru reactivarea programelor şi protecţia memoriei;
•    un sistem cu multiprogramare asigură o utilizare mai uniformă a diferitor resurse: unitatea centrală, memoria, organele de intrare-ieşire;
•    multiprogramarea permite reducerea timpului de răspuns în cazul lucrărilor de durată mică într-un sistem cu prelucrare secvenţială.
Sisteme cu timp partajat
Un sistem de operare cu partajarea timpului trebuie să garanteze fiecărui utilizator un timp acceptabil de răspuns. Acest rezultat este obţinut prin alocarea succesivă a procesorului pentru tranşe de timp foarte mici (cuante) programelor utilizatorilor.
Viabilitatea unei asemenea tehnici este legată de caracteristicile lucrului interactiv. Activitatea unui utilizator conţine două componente: timpul de reflecţie (gândire), în care utilizatorul elaborează, propune subiecte de lucru, introducând în calculator informaţii şi timpul de aşteptare, când aşteaptă executarea de către sistem a serviciului cerut. Prima componentă este de o durată medie mult mai mare decât a doua şi sistemul poate să servească simultan mai mulţi utilizatori, folosind timpul mort, datorat perioadei de reflecţie.
Ca exemplu, fie un sistem cu partajarea timpului, care deserveşte 1000 utilizatori cu un comportament mediu identic. Admitem că durata timpului de gândire este în medie de 9 ori mai mare decât a timpului de aşteptare, acesta din urmă reprezentând 10% din timpul total. Avem, deci, în medie 100 utilizatori activi (care se află în aşteptarea unui răspuns la un serviciu cerut). Presupunem că valoarea cuantei este de 5 ms. Dacă executarea unei cereri durează o cuantă, timpul de răspuns va fi de ordinul unei jumătăţi de secundă.
Am admis în acest exemplu că toate programele utilizatorilor activi se află în memoria principală: timpul de comutare între programele a doi utilizatori se reduce la timpul de realocare a unităţii centrale, care este neglijabil în comparaţie cu valoarea cuantei. Multiprogramarea devine obligatorie, dacă ţinem cont de raportul dintre acest timp şi timpul necesar pentru încărcarea unui program din memoria secundară. Situaţia este de fapt şi mai complicată: volumul memoriei principale nu permite aflarea aici a tuturor programelor utilizatorilor activi. Este posibil ca o informaţie să fie lipsă în memoria operativă atunci când unitatea centrală are nevoie de ea. Rolul sistemului de operare este de a minimiza pe cât este posibil probabilitatea apariţiei unui atare eveniment.
Dezvoltarea sistemelor de operare cu partajarea timpului a pus în evidenţă importanţa interacţiunii om-calculator. Acest aspect a fost mult timp neglijat, dar cei care nu au făcut acest lucru au avut doar de câştigat.
Apariţia microprocesoarelor cu posibilităţi mari de calcul şi de preţuri tot mai mici a permis pe de o parte utilizarea la scară largă a calculatoarelor personale, iar pe de altă parte, satisfacerea cerinţelor utilizatorilor sistemelor informatice de partajare a resurselor fizice şi logice distribuite geografic. Au apărut noi tipuri de sisteme informatice: calculatoarele personale, reţelele locale şi reţelele globale.
Conceptele şi tehnicile elaborate pentru sistemele centralizate au rămas valabile şi în cazul serverelor sau sistemelor de operare pentru calculatoarele personale. Repartizarea distribuită a informaţiei, precum şi transmiterea ei la distanţe mai mari sau mai mici a ridicat probleme noi, cum ar fi coordonarea activităţilor la distanţă sau menţinerea coerenţei informaţiilor distribuite. Toate acestea au trebuit să fie luate în consideraţie la elaborarea sistemelor de operare pentru sistemele informatice ale anilor care au urmat.
Realizări conceptuale
Paralel cu evoluţia tehnică şi funcţională a sistemelor de operare a avut loc şi o importantă evoluţie conceptuală, care a permis o mai bună înţelegere a funcţionării sistemelor de operare şi a condus la elaborarea unor metode proprii de concepere.
Debutul unei cercetări ştiinţifice a sistemelor de operare poate fi considerat anul 1964, care a succedat o etapă importantă de dezvoltare tehnică: primele sisteme cu partajare a timpului (Thor, CTSS), anunţarea seriei IBM 360 şi introducerea canalelor de intrare-ieşire, prima memorie paginată (Atlas), etc.
Оn perioada 1965-1968 au fost elaborate noţiunile necesare conştientizării gestionării activităţilor fizice sau conceptuale paralele: proces secvenţial, formularea şi soluţionarea unor probleme de excludere mutuală, sincronizarea şi inventarea semaforului. Acestea au fost aplicate cu succes în elaborarea sistemelor de operare: sistemul THE (1967) utilizează semafoarele, sistemul Multics (1964-1970) conţine un nucleu de gestionare a proceselor. Metode şi utilitare destinate sistemelor distribuite sunt propuse la sfârşitul anilor '70. Utilite de sincronizare încep să fie introduse în limbajele de programare. Sunt propuse primele metode de specificare şi control al validităţii sincronizărilor.
Problema definirii informaţiei a fost pusă iniţial în seama limbajelor de programare: fiecare limbaj definea universul său de obiecte accesibile şi mijloacele efective de accesare. Sistemul de operare trebuia doar să implementeze obiectele definite de limbajul de programare in memoria fizică, direct adresabilă.
Restricţiile de capacitate şi preţ a memoriei principale a condus foarte repede la apariţia necesităţii unei memorii secundare şi a unor mecanisme de schimb de informaţii între aceste două nivele ale memoriei. Prima memorie paginată apare în 1962 (Atlas), tot atunci compilatoarele limbajului Algol 60 folosesc paginaţia virtuală pentru gestionarea programelor în curs de execuţie. În 1965 este fundamentată noţiunea de segmentare, deşi încă în 1962 sistemul Burroughs B5000 utiliza un mecanism de adresare logică prin unităţi de volum variabil sau segmente.
În 1966 este propus un model de arhitectură pentru calculatoare cu partajare a timpului, implementat în IBM 360/67. În acest calculator segmentele sunt doar simulate printr-o dublă paginaţie, din care cauză noţiunea de segmentare va rămâne pentru mult timp puţin înţeleasă de comunitatea informatică.
Problemele partajării şi protecţiei informaţiei, alocării resurselor conduc la noţiunea de memorie virtuală, care permite izolarea mecanismelor de gestionare a ansamblului “memorie principală - memorie secundară”, lăsând utilizatorilor simpli impresia unui spaţiu de adresare uniform (contiguu). Au fost introduse noţiunile de modularitate şi structurare ierarhică, obiect, etc.
Windows, Unix şi alte sisteme
Paralel cu evoluţia tehnică şi funcţională a sistemelor de operare a avut loc şi o importantă evoluţie conceptuală, care a permis o mai bună înţelegere a funcţionării sistemelor de operare şi a condus la elaborarea unor metode proprii de concepere.
Debutul unei cercetări ştiinţifice a sistemelor de operare poate fi considerat anul 1964, care a succedat o etapă importantă de dezvoltare tehnică: primele sisteme cu partajare a timpului (Thor, CTSS), anunţarea seriei IBM 360 şi introducerea canalelor de intrare-ieşire, prima memorie paginată (Atlas), etc.
În perioada 1965-1968 au fost elaborate noţiunile necesare conştientizării gestionării activităţilor fizice sau conceptuale paralele: proces secvenţial, formularea şi soluţionarea unor probleme de excludere mutuală, sincronizarea şi inventarea semaforului. Acestea au fost aplicate cu succes în elaborarea sistemelor de operare: sistemul THE (1967) utilizează semafoarele, sistemul Multics (1964-1970) conţine un nucleu de gestionare a proceselor. Metode şi utilitare destinate sistemelor distribuite sunt propuse la sfârşitul anilor '70. Utilite de sincronizare încep să fie introduse în limbajele de programare. Sunt propuse primele metode de specificare şi control al validităţii sincronizărilor.
Problema definirii informaţiei a fost pusă iniţial în seama limbajelor de programare: fiecare limbaj definea universul său de obiecte accesibile şi mijloacele efective de accesare. Sistemul de operare trebuia doar să implementeze obiectele definite de limbajul de programare in memoria fizică, direct adresabilă.
Restricţiile de capacitate şi preţ a memoriei principale a condus foarte repede la apariţia necesităţii unei memorii secundare şi a unor mecanisme de schimb de informaţii între aceste două nivele ale memoriei. Prima memorie paginată apare în 1962 (Atlas), tot atunci compilatoarele limbajului Algol 60 folosesc paginaţia virtuală pentru gestionarea programelor în curs de execuţie. În 1965 este fundamentată noţiunea de segmentare, deşi încă în 1962 sistemul Burroughs B5000 utiliza un mecanism de adresare logică prin unităţi de volum variabil sau segmente.
În 1966 este propus un model de arhitectură pentru calculatoare cu partajare a timpului, implementat în IBM 360/67. În acest calculator segmentele sunt doar simulate printr-o dublă paginaţie, din care cauză noţiunea de segmentare va rămâne pentru mult timp puţin înţeleasă de comunitatea informatică.
Problemele partajării şi protecţiei informaţiei, alocării resurselor conduc la noţiunea de memorie virtuală, care permite izolarea mecanismelor de gestionare a ansamblului “memorie principală - memorie secundară”, lăsând utilizatorilor simpli impresia unui spaţiu de adresare uniform (contiguu). Au fost introduse noţiunile de modularitate şi structurare ierarhică, obiect, etc.
Astăzi sistemele de operare în sensul tradiţional de concepere sunt obiectul unor elaborări industriale, decât de cercetare. Chiar şi lucrările care au avut loc sau mai derulează în SUA capătă tot mai multe trăsături de lucrări semiindustriale. Aceasta este datorat atât de achiziţionării unei rezerve extraordinare de metode şi algoritmi, cât şi standardizării stricte a funcţiilor şi interfeţelor sistemelor de operare. Au totuşi loc unele activităţi de cercetare, ca de exemplu cercetările din domeniul mediilor operaţionale obiect-orientate.
SО UNIX şi standardele sistemelor deschise
Sistemul de operare UNIX, primul sistem mobil care asigură un mediu fiabil de dezvoltare şi utilizare a softului de aplicaţie, este fundamentul practic de elaborare a sistemelor fizico-logice deschise. Implementarea largă a sistemului de operare UNIX a permis trecerea de la declararea sistemelor deschise la dezvoltarea practică a acestui concept. Este greu de supraestimat şi influenţa activităţilor de standardizare a interfeţelor SO UNIX asupra dezvoltării domeniului sistemelor deschise. Cu toate acestea, pot fi evidenţiate câteva versiuni ale SO UNIX, care diferă atât prin realizare, cât şi prin interfeţe şi semantică (deşi, odată cu dezvoltarea procesului de standardizare, aceste diferenţe devin tot mai nesemnificative).
Modulele sursă ale SO UNIX au fost scrise de către colaboratorii companiei AT&T şi timp îndelungat drepturile de autor, ca şi drepturile de licenţiere, au aparţinut acestei companii. Mai târziu, din mai multe motive (complexitate tehnică în elaborarea şi întreţinerea acestui produs program complicat, unele dificultăţi juridice, etc.), compania AT&T a creat compania USL (UNIX System Laboratories), care avea în şarjă exclusivă dezvoltarea şi susţinerea modulelor sursă ale SO UNIX.
Compania USL a propus versiunea UNIX System V 4.0, care a devenit standardul de-facto şi baza mai multor versiuni UNIX, create de producătorii de staţii de lucru şi servere. În ultimul succes al USL în calitate de filială a firmei AT&T, versiunea SVR 4.2, pentru prima oară în istoria sistemelor de operare UNIX a fost realizat mecanismul proceselor “legere” (thread, fire), care erau executate în baza unei memorii virtuale comune şi permitea utilizarea posibilităţilor dispozitivelor fizice, numite “arhitectura multiprocesorală simetrică” în care mai multe procesoare au drepturi egale de accesare a memoriei centrale comune.
Оn 1993 compania USL a fost absorbită de compania Novell, astăzi departament al acesteia, marca înregistrată UNIX fiind cedată consorţiumului X/Open. La începutul anului 1995 compania Novell a anunţat o variantă nouă a SO UixWare 2.0 bazată pe System V 4.2. Era un sistem de operare cu un sistem de fişiere foarte fiabil, fiind admis accesul la fişierele păstrate pe serverele NetWare, administratorul avea la dispoziţie o interfaţă grafică bine pusă la punct, etc.
Pe parcursul a mai multor ani sistemul de operare de bază al companiei Sun a fost UNIX BSD. Însă, începând cu SunOS 4.0, s-a trecut la System V 4.0, firma Sun introducând o serie de modificaţii şi extensii în această versiune. Ca exemplu, Sun a implementat paralelizarea programelor pentru sistemele multiprocesorale simetrice. Solaris este un mediu de interfaţare a lui SunOS cu mijloace suplimentare GUI şi resurse de nivel înalt pentru organizarea lucrului în reţea (de exemplu, apelarea procedurilor la distanţă – RPC).
Şi la baza SO HP/UX, DG/UX şi AIX se află SVR 4.x din care cauză setul de bază al funcţiilor de sistem şi biblioteci este acelaşi. Variantele SO UNIX, propuse de compania SCO şi destinate exclusiv platformelor Intel, sunt bazate pe modulele iniţiale ale System V 3.2, fiind total compatibile cu toate standardele de bază
OSF-1 şi alte variante UNIX
Open Software Foundation (OSF) a fost prima companie comercială, care a încercat elaborarea SO UNIX în baza micronucleului Mach. A fost creat sistemul de operare OSF-1, care nu era în sens de licenţiere „curat”, deoarece folosea o parte a modulelor iniţiale din SVR 4.0.
Variantele SO UNIX, propuse de Universitatea din California, sunt o alternativă reală pentru UNIX AT&T. De exemplu, UNIX BSD 4.2 era pus la dispoziţie în module iniţiale şi folosită chiar în fosta URSS pe calculatoarele de tip DEC. Grupul BSD a influenţat enorm dezvoltarea sistemelor de operare UNIX, printre realizări amintim mult controversatul SO UNIX BSD 4.4, construit în baza principiilor „micronucleare”, sistemul FreeBSD şi altele.
Nu putem să nu amintim aici şi de realizarea originală a SO UNIX pentru platformele Intel, propusă de Torvald Linus – LINUX. Este un sistem de operare foarte popular în mediul studenţesc, care are şi una din cele mai populare teleconferinţe în Internet.
Odată cu ieşirea SO UNIX pe piaţă şi creşterea substanţială nu numai a numărului de utilizatori, ci şi a numărului de specialişti din toate colţurile lumii, care propuneau modificări şi chiar variante proprii, a apărut necesitate elaborării unor standarde, care ar conduce la sisteme compatibile. Prin standard al unei interfeţe al SO subînţelegem un set de proprietăţi, mai mult sau mai puţin formale, sintactice sau semantice ale componentelor sistemului de operare. Activitatea de standardizare a început cu mai mult de 10 ani în urmă, dar este puţin probabil să se ajungă la finiş într-un viitor apropiat. Totuşi rezultatele sunt mai mult decât vizibile, permiţând elaborarea unor sisteme de operare mobile.
Standarde UNIX

1 Unul dintre primele standarde de-facto a fost cel publicat de USL pentru versiunea SO UNIX System V Release 4 - System V Interface Definition (SVID). Majoritatea variantelor comerciale respectau standardul SVID. Evident, SVID fiind un document de firmă, publicat fără discuţii publice nu putea fi adoptat standard oficial.
Paralel exista direcţia BSD (Berkeley Standard Distribution), susţinută de comunitatea universitară. Deşi majoritatea realizărilor comerciale se baza pe Sistem V, UNIX BSD era foarte popular în universităţi din care cauză a fost elaborat un standard, care a unit practic AT&T cu BSD. Acest lucru a fost început de asociaţia programatorilor profesionali din cadrul UniForum (Sistemele Deschise) şi continuat de grupurile de lucru POSIX (Portable Operating System Interface). Cel mai popular standard, adoptat de ISO la recomandarea IEEE, POSIX 1003.1 defineşte cerinţele minime pentru componentele unui sistem de operare.
Organizaţia internaţională X/Open, care activează în domeniul elaborării şi propagării ideilor sistemelor deschise, culege şi sistematizează standardele de-jure şi de-facto de importanţă industrială în aşa numitul X/Open Common Application Environment (CAE). Specificaţiile interfeţelor resurselor, care formează CAE, sunt publicate în X/Open Portability Guide (XPG).
Pentru lumea UNIX este foarte important şi standardul limbajului de programare C, adoptat mai întâi de ANSI şi apoi de ISO. În acest standard sunt specificate, în afara limbajului C, bibliotecile necesare într-o realizare standard. Deoarece chiar de la apariţie limbajul C şi sistemele de programare respective erau strвns legate de UNIX, componentele bibliotecilor standard corespundeau exact mediului standard al SO UNIX.
Mai menţionăm standardul de-facto SPARC Complience Definition, propus de organizaţia SPARC International, propunerea organizaţiei 88/Open pentru procesoarele RISC Motorola, standardul sistemului de ferestre, susţinut de X Consorţium (Institutul de Tehnologie din Massachussets) şi OSF/Motif, elaborat de Open Software Foundation.
Sisteme de operare cu micronucleu
Micronucleul este partea minimă principală a unui sistem de operare, folosită pentru asigurarea modularităţii şi transportabilităţii. Noţiunea de micronucleu a fost introdusă de compania Next prin sistemul de operare cu micronucleul Mach. Nucleul acestui sistem de operare, de dimensiuni mici, în jurul căruia se situau subsistemele executate în regim user, trebuia să asigure o flexibilitate şi modularitate foarte înaltă. Dar în realitate acestea au fost umbrite de prezenţa serverului monolit, care realiza sistemul de operare UNIX BSD 4.3, ales de compania Next în calitate de nivel superior pentru micronucleul Mach. Totuşi, utilizarea micronucleului Mach a permis introducerea administrării mesajelor şi a unei serii de funcţii de serviciu orientate pe obiecte, în baza cărora a fost creată o interfaţă grafică elegantă a utilizatorului cu mijloace simple de configurare, administrare şi dezvoltare program.
Următorul SO cu micronucleu a fost MS Windows NT, în care momentul principal era declarat, în afara modularităţii, transportabilitatea. Acest sistem de operare poate fi utilizat în sistemele mono- şi miltiprocesor, bazate pe procesoarele Intel, Mips, şi Alpha. Mai mult, deoarece NT trebuia să execute şi programele scrise pentru DOS, Windows, OS/2 şi SO, compatibile cu standardele Posix, compania Microsoft a folosit modularitatea abordării „micronucleare” pentru crearea unei structuri generalizate, care nu repetă sistemele de operare existente, fiecare SO fiind emulat printr-un modul separat sau printr-un subsistem.
Au aderat la tehnologia „micronucleară” şi companiile Novell/USL, Open Software Foundation (OSF), IBM, Apple şi altele. Unul din concurenţii principali ai lui NT în domeniul SO cu micronucleu sunt Mach 3.0, creat în Universitatea Carnegy-Mellon, şi Chorus 3.0 al companiei Chorus Systems.

Baze de date
Sistemele informaţionale sunt orientate, în linii mari, spre păstrarea, accesarea şi modificarea informaţiilor existente. Structura informaţiilor este adesea foarte complicată, şi, deşi structurile datelor diferă de la sistem la sistem, ele au foarte multe momente comune. La etapa iniţială de folosire a tenicii de calcul în gestiunea informaţiei problemele structurării datelor erau rezolvate în mod individual pentru fiecare sistem informaţional. Erau elaborate aplicaţii speciale pentru sistemele de gestiune a fişierelor (biblioteci de programe), la fel cum se procedează în cazul compilatoarelor, editoarelor, etc. Dar, fiindcă sistemele informaţionale necesită structuri de date complicate, aceste resurse suplimentare de gestiune a datelor formau partea principală a sistemelor, repetându-se de la un sistem la altul. Tendinţa de evidenţiere şi generalizare a acestei părţi comune a sistemelor informaţionale, responsabile de gestiunea datelor structurate, a fost prima cauză de creare a sistemelor de gestiune a bazelor de date (SGBD). Foarte repede a devenit clară imposibilitatea rezolvării problemei doar cu ajutorul unei biblioteci de programe, care ar realiza metode mai complicate de manipulare a datelor prin intermediul SGF.
Vom exemplifica prin următoarea situaţie. Presupunem că dorim să realizăm un sistem informaţional simplu, care ar duce evidenţa colaboratorilor unei organizaţii. Sistemul va îndeplini următoarele funcţii:
•    să formeze lista colaboratorilor unei secţii,
•    să permită transferul unui colaborator dintr-o secţie în alta,
•    să asigure primirea la lucru a colaboratorilor şi eliberarea acestora.
•    Pentru fiecare secţie trebuie susţinută posibilitatea aflării numelui şefului acestei secţii, numărului total de colaboratori din secţie, valoarea ultimului salariu total, etc. Pentru fiecare colaborator trebuie să existe posibilitatea aflării numărului legitimaţiei de serviciu folosind numele şi prenumele colaboratorului şi invers, să se obţină informaţii despre faptul dacă colaboratorul dat corespunde postului ocupat, nivelul salariului, etc.
    Presupunem că am hotărât să bazăm acest sistem informaţional pe Sistemul de Gestiune a Fişierelor (SGF) şi să utilzăm pentru aceasta un singur fişier, extinzând posibilităţile de bază ale SGF, creând o bibliotecă specială de funcţii. Unitatea informaţională minimală în acest caz este colaboratorul din care cauză vom cere ca în acest fişier să existe o înregistrare pentru fiecare coalborator. Care vor fi câmpurile acestei înscrieri? Numele complet al colaboratorului (COL_NUME), numărul legitimaţiei (COL_NR_LEGIT), informaţia depsre corepunderea postului ocupat ((COL_STARE), pentru simplitate, “da” sau “nu”), mărimea salariului (COL_SAL), numărul secţiei (COL_NR_SEC). Deoarece dorim să avem un singur fişier, aceeaşi înregistrare trebuie să conţină şi numele şefului secţiei (COL_SEF_SEC).
    Reieşind din funcţiile sistemului nostru informaţional, trebuie să fie asigurat accesul multicriterial la acest fişier utilizând cheile unice (care nu sunt repetate în diferite înregistrări) COL_NUME şi COL_NR_LEGIT. În afară de aceasta mai este necesar să putem selecta toate înregistrările, care conţin aceeaşi valoare COL_NR_SEC (colaboratorii unei secţii), adică să existe acces conform unei chei multiple. Mai mult, pentru a obţine numărul de colaboratori dintr-o secţie sau salariul total, sistemul informaţional va trebui de fiecare dată să acceseze fiecare colaborator al secţiei şi să calculeze valorile respective.
    Observăm, că chiar penru un astfel de sistem simplu, realizarea în baza SGF cere (1) - crearea unei infrastructuri complicate pentru accesul multicriterial, şi (2) - generează o metodă de păstrare evident redundantă (repetarea numelui şefului secţiei pentru fiecare colaborator) şi executarea selectării şi calculelor masive pentru obţinerea informaţiilor sumare despre secţii. În afară de aceasta, dacă dorim, de exemplu, să tipărim lista colaboratorilor, care au un salariu dat, va trebui să cercetăm tot fişierul sau să-l restructurăm în aşa mod încât câmpul COL_SAL să devină cheie.
    Prima propunere ar fi să creăm două fişiere cu chei multiple: COLABORATORI şi SECŢII. Primul fişier va conţine câmpurile COL_NUME, COL_NR_LEGIT, COL_STARE, COL_SAL şi COL_NR_SEC, iar al doilea – SEC_NR, SEC_SEF, SEC_SAL (slariul total) şi SEC_NR_COL (numărul de colaboratori dintr-o secţie). Majoritatea inconvenienţelor de mai sus vor fi depăşite. Fiecare fişier va conţine doar informaţii nedublate, nu sunt necesare calcule suplimentare pentru a afla informaţii de tipul salariului total. Dar în acest caz sistemul nostru capătă proprietăţi noi, care îl apropie de un Sistem de Gestiune a Bazelor de Date (SGBD).
    Mai întâi de toate, sistemul trebuie în acest caz să ştie că lucrează cu două fişiere legate (este primul pas în direcţia schemei bazelor de date), să cunoască structura şi sensul fiecărui câmp (de exemplu, că COL_NR_SEC în fişierul COLABORATORI şi SEC_NR în fişierul SECŢII înseamnă acelaşi lucru), şi să înţeleagă că în unele cazuri modificarea informaţiei într-un fişier trebuie să genereze modificarea automată în celălalt fişier, pentru ca să fie coordonat (nu sunt sigur că este corect spus româneşte, am făcut facultatea în limba rusă) conţinutul lor. De exemplu, dacă la lucru este primit un nou colaborator, se va adăuga o înregistrare în fişierul COLABORATORI, vor fi schimbate şi câmpurile SEC_SAL şi SEC_NR_COL în înregistrarea din fişierul SECŢII, care descrie secţia colaboratorului dat.
    Noţiunea de coordonare(?) a datelor este o noţiune cheie a bazelor de date. De fapt, dacă un sistem informaţional (chiar la fel de simplu ca şi în exemplul nostru) susţine modul coordonat de păstrare a informaţiilor în câteva fişiere, putem afirma că sistemul susţine o bază de date. Iar dacă un sistem auxiliar de gestiune a datelor permite lucrul cu mai multe fişiere, asigurând coordonarea lor, acesta poate fi numit sistem de gestiune a bazelor de date. Deja singură cererea de susţinere a coordonării datelor în câteva fişiere nu ne mai permite să ieşim din situaţie doar cu ajutoul unei biblioteci de funcţii: un atare sistem trebuie să posede şi unele date proprii (metadate) şi chiar valori, care definesc integritatea datelor.
    Dar aceasta încă nu este totul ce este cerut de la un SGBD. În primul rând, chiar şi în exemplul nostru este incomodă îndeplinirea unor interpelări de tipul “să se pună la dispoziţie numărul de colaboratori din secţia în care lucrează Maria Mirabela Popescu”. Ar fi mult mai simplu dacă SGBD ar permite formularea unor astfel de interpelări într-un limbaj apropiat de cel natural. Astfel de limbaje se numesc limbaje de interpelare a bazelor de date. De exemplu, în limbajul SQL interpelarea noastră poate fi exprimată astfel:
    SELECT SEC_NR_COL
    FROM COLABORATORI, SECŢII
    WHERE COL_NUME = "Maria Mirabela Popescu"
    AND COL_NR_SEC = SEC_NR
•    Formularea unei interpelări în SQL permite să nu ne deranjeze modul cum va fi îndeplinită această interpelare. Printre metadatele acesteia va fi prezentă informaţia conform căreia câmpul COL_NUME este câmp cheie pentru fişierul COLABORATORI, iar SEC_NR – pentru fişierul SECŢII şi sistemul se va folosi de aceasta.
    Dacă va fi necesar să obţinem lista colaboratorilor, care nu corespund postului ocupat vom proceda astfel:
    SELECT COL_NUME, COL_NR_LEGIT
    FROM COLABORATORI
    WHERE COL_STARE = "nu",
    şi sistemul va îndeplini căutarea necesară în fişierul COLABORATORI, deoarece câmpul COL_STARE nu este câmp cheie.
    Acum să ne închipuim, că în prima realizare a sistemului informaţional, bazată pe utilizarea unor biblioteci de extensii a metodelor de accesare a fişierelor, are loc operaţia de înregistrare a unui nou colaborator. Conform proprietăţii de modificare coordonată, sistemul a introdus o nouă înregistrare în fiţirerul COLABORATORI şi trebuia să treacă la modificarea înregistrării fişierului SECŢII, dar anume în acest moment a avut loc decontectarea accidentală a alimentării cu curent electric. Evident, după relansarea sistemului baza de date se va afla într-o stare necoordonată. Va fi necesar să controlăm în mod explicit fişierele noastre şi să introducem modificările necesare. O aplicaţie poate su nu-şi facă griji în acest sens, dar SGBD-urile adevărate au în şarjă astfel de funcţii. Mai mult, sistemele de gestiune a bazelor de date rezolvă o serie de probleme, care nu pot fi în principiu rezolvate cu ajutorul sistemelor de gestiune a fişierelor (accesarea paralelă a informaţiilor, de ex.).
    Ca şi concluzie: există aplicaţii pentru care sunt suficiente fişierele, aplicaţii pentru care trebuie să hotărâm care este nivelul necesar de lucru cu datele în memoria externă, şi aplicaţii care au evident nevoie de baze de date.
    2. Funcţiile unui SGBD. Organizarea-tip a SGBD
    După cum am observat, posibilităţile tradiţionale ale sistemelor de gestiune a fişierelor sunt insuficiente pentru construirea unor sisteme informaţionale, chiar foarte simple. Aceasta este cauza principală a apariţiei SGBD.
    2.1. Funcţiile principale ale unui SGBD
    2.1.1. Administrarea explicită (directă) a datelor în memoria externă
    Această funcţie presupune susţinerea structurilor necesare în memoria externă atât pentru păstrarea datelor care sunt parte componentă a BD, cât şi pentru scopuri de service, de exemplu, pentru accelerarea accesului la date (de obicei sunt utilizaţi idicii în acest scop). În unele realizări ale SGBD pentru aceasta sunt utilizate posibilităţile SGF, altele pot lucra chiar şi cu dispoziltivele de memorie externă. Utilzatorii nu sunt obligaţi să cunoască dacă un SGBD utilizează SGF şi, în caz afirmativ, cum sunt organizate fişierele. SGBD susţine un sistem propriu de desemnare a obiectelor BD.
    2.1.2. Administrarea tampoanelor (buferelor) din memoria operativă
    SGBD lucrează cu BD de dimensiuni semnificative, de obicei cel puţin aceste dimensiuni sunt mult mai mari decât volumul memoriei operative prezente. Evident, dacă la accesarea fiecărui element de date va fi nevoie de schimb de informaţii cu memoria externă, tot sistemul va lucra cu viteza suportului extern de memorie. Unica posibilitate de sporire a acestei viteze este buferizarea datelor în memoria operativă. Chiar dacă SO execută buferizarea de sistem (cum este în cazul SO UNIX), aceasta nu este suficient pentru scopurile SGBD. Din această cauză SGBD concurente susţin un set propriu de bufere în memoria operativă cu propriul algoritm de dispecerizare.
    Notăm, că există o direcţie întreagă în domeniul SGBD, dedicată prezenţei constante a întregii BD în memoria operativă (cazul sistemelor de căutare, tranzacţionale în Internet, de exemplu). Aici presupunem că capacitatea memoriei operative poate fi suficient de mare şi nu trebuie să ne facem probleme cu buferizarea.
    2.1.3. Administrarea tranzacţiilor
    Tranzacţiile sunt o succesiune de operaţii asupra BD, considerate de SGBD un tot întreg. Dacă tranzacţia este executată în totalitate SGBD fixează (COMMIT) modificările în BD, în caz contrar nu are loc nici o modificare. Noţiunea de tranzacţie este necesară pentru asigurarea integrităţii logice a BD. În exemplul precedent atunci când este îndeplinită operaţia de primire la lucru a unui colaborator nou, această operaţie este uniunea operaţiilor elementare asupra fişierelor COLABORATORI şi SECŢII într-o tranzacţie. Noţiunea dată este şi mai importantă pentru SGBD multiuser. Proprietatea că fiecare tranzacţie începe atunci când starea BD este consistentă şi lasă această stare la fel consistentă după terminarea sa, face folosirea noţiunii tranzacţie оn calitate de unitate de activitate a user-ului. Dacă tranzacţiile sunt gestionate corect de către SGBD, fiecare utilizator are impresia că este singurul care foloseşte baza de date (dacă nu-s prea mulţi, evident!).
    Străns legate de administrarea tranzacţiilor în SGBD multiuser sunt noţiunile de serializare a tranzacţiilor şi planul secvenţial (serializat) de îndeplinire a tranzacţiilor. Prin serializarea unor tranzacţii care ar trebui să fie îndeplinite în mod paralel înţelegem o astfel de planificare a executării lor, în care efectul final este acelaşi, deşi tranzacţiile nu sunt îndeplinite paralel, ci secvenţial (din cauza resurselor limitate, de exemplu).
    2.1.4. Jurnalizarea
    Una din proprietăţile de bază ale SGBD este fiabilitatea păstrării datelor în memoria externă, prin aceasta înţelegându-se că, dacă a avut loc orice cădere hardware sau software, SGBD-ul trebuie să fie în stare să restabilească ultima stare coordonată a BD. Evident, pentru a restabili BD trebuie să existe nişte informaţii suplimentare. Altfel spus, susţinerea fiabilităţii păstrării datelor în BD necesită o redundanţă a informaţiilor, iar aceea parte a informaţiilor, care este folosită pentru restabilire trebuie păstrată extrem (straşnic!) de fiabil. Cea mai răspândită metodă de susţinere a unei astfel de redundanţe este întreţinerea unui jurnal de bord în care să fie fixate schimbările BD. Jurnalul este o parte specială a BD, inaccesibilă utilizatorilor BD şi întreţinută în mod foarte pedant (adesea există două copii ale jurnalului, care se află pe discuri fizice diferite), în care vin informaţiile despre toate înscrierile în BD (partea principală, fără Jurnal, adică). În dependenţă de SGBD şi înscrierile în jurnal se fac în mod diferit. În unele cazuri înscrierea în jurnal corespunde unei operaţii logice oarecare (eliminarea unei linii, de ex.), în alte cazuri unei operaţii interne minime de modificare a unei pagini de memorie externă, sau combinaţia acestora.
    Оn toate cazurlie este utilizată strategia înscrierii “profilactice” în jurnal (protocolul Write Ahead Log - WAL). În linii mari asta ar însemna, că înscrierea despre modificarea oricărui obiect al BD trebuie să nimerească în memoria externă a jurnalului înainte ca obiectul modificat să ajungă în memoria externă a părţii principale a BD. Dacă SGBD-ul respectă protocolul WAL, jurnalul permite rezolvarea tuturor problemelor de restabilire a BD după oricare tip de cădere.
    2.1.5. Susţinerea limbajelor BD
    Pentru lucrul cu bazele de date sunt utilizate limbaje speciale, numite limbaje ale bazelor de date. Оn SGBD-urile timpurii erau susţinute câteva limbaje specializate funcţional. Cel mai frecvent importante erau două limbaje – limbajul de definire a schemei BD (SDL - Schema Definition Language) şi limbajul de manipulare a datelor (DML - Data Manipulation Language). Primul era utilizat pentru determinarea structurii logice a BD (cum îşi închipuie utilizatorul baza de date). DML conţinea instrucţiuni de manipulare a datelor (introducerea datelor în BD, eliminarea, modificarea sau selecatarea datelor existente). În SGBD contemporane este susţinut un limbaj integrat unic. Cel mai răspândit este limajul SQL (Structured Query Language). Acest limbaj combină posibiltăţile SDL şi DML. Desemnarea obiectelor BD (desemnarea tabelelor şi coloanelor lor, în cazul unor BD de tip relaţional) este susţinută la nivelul limbajului în sens că compilatorul SQL transformă numele externe ale obiectelor în identificatori interni în baza unor tabele-catalog de serviciu. Nucleul SGBD în genere nu are “treabă” cu numele tabelelor şi coloanelor acestora. Limbajul SQL conţine resurse speciale pentru determinarea resticţiilor de consistenţă a BD. Aceste restricţii sunt păstrate în tabele-catalog speciale, iar garantarea consistenţei are loc la nivel de limbaj, adică la compilarea instrucţiunilor de modificare a BD compilatorul SQL în baza restricţiilor de consistenţă generează codul respectiv.
    Autorizarea accesului la BD la fel se realizează cu ajutorul unui set de instrucţiuni SQL, fiind posibil accesul diferenţiat în dependenţă de statutul utilizatorului.
    2.2. Organizarea tipică a unui SGBD concurent
    Organizarea unui SGBD tip şi setul de componente ale acestuia corespunde funcţiillor stabilite mai sus. Noi am stabilit următoarele funcţii de bază:
•    administrarea datelor în memoria externă,
•    administrarea buferelor în memoria externă,
•    adminstrarea tranzacţiilor,
•    jurnalizarea şi restabilirea BD după căderi,
•    susţinerea limbajelor BD.
La nivel logic оn cadrul unui SGBD concurent putem evidenţia nivelul cel mai intern – nucleul SGBD (numit adesea Data Base Engine), compilatorul SGBD (de obicei SQL), subsistemul Run-Time şi un set de utilitare.
•    Nucleul SGBD este responsabil de administrarea datelor în memoria externă, gestiunea buferelor memoriei operatve, adminstrarea tranzacţiilor şi jurnalizare. Respectiv, pot fi evidenţiate astfel de componente ale nucleului cum ar fi managerul datelor, managerul buferelor, managerul tranzacţiilor şi managerul jurnalului. Funcţiile acestor componente sunt interdependente din care cauză ele trebuie să funcţioneze şi să interacţioneze conform unor protocoale bine gândite şi strict validate. Nucleul SGBD posedă o interfaţă proprie, dar care este utilizată doar de programele SQL şi utilitarele BD. Nucleul SGBD este partea rezidentă principală a sistemului de gestiune a BD. În arhitectura “client-server” nucleul este componenta principală a părţii server a sistemului.
•    Destinaţia principală a compilatorului este translatarea instrucţiunilor scrise în limbajul BD în cod executabil. Problema principală constă în faptul că aceste limbaje (de obicei SQL) sunt neprocedurale, adică în operatorul unui atare limbaj sunt specificate nişte acţiuni asupra BD, dar această specificare nu este procedură, ci doar descrie într-o formă oarecare condiţiile de îndeplinire a acţiunii dorite. Compilatorul trebuie să hotărască cum să execute operatorul limbajului înaintea generării codului executabil. În rezultatul compilării se obţine un program executabil, reprezentat de obicei în cod intern independent de maşină. În acest caz executarea reală a operatorului are loc utilizând un subsistem de susţinerea a regimului run-time, care nu este altceva decât un interpretor al acestui limbaj intern.
Din categoria utilitarelor BD fac parte unele proceduri, îndeplinirea cărora nu este binevenită utilizând limbajul BD. Dintre acestea aminitim încărcarea şi unload-ul unei BD, culegere date statistice, controlul global al consistenţei BD, etc.
3. Despre calculul relaţional
Presupunem că lucrăm cu BD care are schema COLABORATORI(NR_COL, NUME_COL, SAL_COL, NR_SEC_COL) (aici NR_COL este numărul legitimaţiei colaboratorului, NUME_COL – numele colaboratorului, SAL_COL - salariul, iar NR_SEC_COL – numărul secţiei în care colaboratorul concret lucrează) şi SECŢII(NUMĂRUL_SEC, NR_COL_IN_SECŢIE, SEF_SECŢIE). Dorim să aflăm numele şi numerele colaboratorilor, care sunt şefii secţiilor cu numărul total de colaboratori mai mare ca 50. În sensul algebrei relaţionale am fi obţinut expresia, care ar fi citită aproximativ astfel:
•    Să se unească relaţiile COLABORATORI şi SECŢII cu condiţia NR_COL= SEF_SECŢIE;
•    Relaţia obţinută să fie restricţionată cu condiţia NR_COL_IN_SECŢIE > 50;
•    Rezultatul să fie proiectat pe atributul NR_COL, NUME_COL.
Fiecare pas corespunde unei operaţii relaţionale. Dacă vom formula aceeaşi interpelare cu ajutorul calculului relaţional (ceea ce va urma în continuare), vom obţine o formulă, care ar putea fi citită astfel: să se determine NR_COL, NUME_COL pentru colaboratorii pentru care există secţie cu aceeaşi valoare SEF_SECŢIE (ca şi NUME_COL (sau NR_COL)) şi cu valoarea NR_COL_IN_SECŢIE mai mare decât 50.
Aici am arătat numai caracteristicile relaţiei rezultante, nu am spus nimic despre modalitatea de formare a acesteea. Sistemul va trebui singur să decidă, care operaţii şi în care ordine să fie îndeplinite peste relaţiile COLABORATORI şi SECŢII. Spunem că formularea algebrică este procedurală, adică defineşte regulile de îndeplinire a interpelării, iar formularea logică (a doua) este descriptivă sau declarativă, deoarece ea doar descrie proprietăţile rezultatului dorit. Aceste două mecanisme sunt echivalente şi există reguli, relativ simple, care permit transformarea unui formalism în celălalt.
3.1. Relaţii şi proprietăţile lor
Se numeşte relaţie n-ară pe M submulţimea R  Mn. Vom zice că a1,..., an, sunt în relaţia R dacă (a1,...,an)R. O relaţie unară este o parte a mulţimii M şi determină o proprietate a elementelor unei submulţimi a mulţimii M din care cauză pentru n = 1 denumirea de relaţie practic nu se utilizează. Un interes mai mare prezintă cazul când n = 2 - relaţiile binare. Dacă a şi b se află în relaţia R, aceasta se va scrie aRb.
Exemplul 3.1.    Pentru mulţimea N: relaţia "<" are loc pentru perechea (3,9) şi nu are loc pentru (6,4). Relaţia "a fi divizor" are loc pentru perechea (7,35) şi nu are loc pentru (18,2) sau (4,9). Pentru o mulţime de oameni pot fi relaţii de tipul "a fi prieteni", "a locui in acelaşi oraş", "a fi fiu", etc. <
Restricţia lui R pe M1M este R1 = RM12.
Pentru definirea unei relaţii pot fi utilizate oricare din metodele de definire a mulţimilor. O posibilitate suplimentară este matricea de relaţie. Pentru mulţimea M = {a1, a2,..., am} aceasta este o matrice mxm оn care
     1 dacă aiRaj,
    a(i,j) =
     0 оn caz contrar.
Deoarece relaţia este în ultimă instanţă o mulţime, pot fi executate aceleaşi operaţii (reuniune, intersecţie etc.) şi cu relaţiile.
O relaţie se numeşte inversa relaţiei R (se va nota R-1) dacă aiRaj are loc atunci şi numai atunci cвnd are loc ajR-1ai.
Relaţia poate poseda o serie de proprietăţi dintre care vom menţiona reflexivitatea, simetria şi tranzitivitatea. Dacă pentru aM are loc aRa relaţia R se numeşte reflexivă. Diagonala principală a matricei relaţiei R conţine numai unităţi. Relaţia R se numeşte antireflexivă dacă nu există aM pentru care ar avea loc aRa. Diagonala principală a matricei unei astfel de relaţii conţine numai zerouri. Relaţiile "", "a avea un divizor comun" sunt reflexive. Relaţiile "a fi fiu", ">" - sunt antireflexive.
Dacă pentru o pereche (a,b)M2 din aRb rezultă bRa (relaţia are loc în ambele părţi sau nu are loc de fel), relaţia R se numeşte simetrică. Pentru astfel de relaţii c(i,j) = c(j,i): matricea este simetrică faţă de diagonala principală. Relaţia se va numi antisimetrică, dacă din aiRaj şi ajRai rezultă că ai=aj . Relaţia "" este antisimetrică, iar "a locui în acelaşi oraş" - simetrică.
Relaţia R se numeşte tranzitivă dacă pentru oricare a, b şi c din aRb şi bRc rezultă aRc. Relaţiile "a locui în acelaşi oraş", "egal", "<" sunt tranzitive, iar "a fi fiu" nu este tranzitivă.
Pentru oricare relaţie R poate fi definită noţiunea de închidere tranzitivă R*: aR*b (a se află în relaţia R* cu b), dacă în M există o secvenţă de n elemente a=a1,..., an-1, an = b оn care pentru elementele vecine are loc R: aRa2, a2Ra3,..., an-1Rb. Dacă R este tranzitivă, atunci R*=R. Pentru relaţia "a fi fiu" relaţia "a fi descendent direct" este închidere tranzitivă (este reuniunea relaţiilor "a fi fiu", "a fi nepot", "a fi strănepot" s.a.m.d.).
O relaţie care posedă proprietăţile reflexivitate, simetrie şi tranzitivitate se numeşte relaţie de echivalenţă.
Se numeşte relaţie de ordine oricare relaţie care posedă proprietăţile reflexivitate, antisimetrie şi tranzitivitate. O relaţie antireflexivă, antisimetrică şi tranzitivă se numeşte relaţie de ordine strictă. Două elemente a şi b se numesc comparabile conform relaţiei de ordine R dacă are loc aRb sau bRa. O mulţime M cu o relaţie de ordine definită pe M se numeşte total ordonată dacă oricare două elemente din M sunt comparabile şi parţial ordonată, оn caz contrar.
Exemplul 3.2.    Relaţiile "", "" pentru o mulţime de numere sunt relaţii de ordine, iar "<", ">" - de ordine strictă. Relaţia de subordonare în cadrul unei întreprinderi defineşte o ordine strictă (dar parţială - nu pot fi comparaţi colaboratorii diferitor departamente).
În alfabetul latin literele sunt aranjate într-o ordine binecunoscută: se află în relaţia de precedare a literelor. Conform acestei relaţii poate fi stabilită relaţia de precedare a cuvintelor - ordinea lexicografică a cuvintelor (utilizată de exemplu în dicţionare). Relaţia de ordine lexicografică poate fi definită şi pentru informaţii numerice. De exemplu, în calculator data şi anul sunt memorizate sub forma "anul, luna, ziua" pentru ca ordinea de creştere a datei totale să coincidă cu ordinea lexicografică. <
Exemplul 3.3.    B este mulţimea tuturor cuvintelor binare de orice lungime şi  desemnează unicul cuvânt binar de lungime 0. Dacă m este un cuvвnt binar de lungime p, vom nota biţii acestuia m1, m2,..., mp. Relaţia de ordine , definită peste B, se numeşte de ordine lexicografică, dacă:
a)      m, m
b)    pentru m de lungime p şi n de lungime q cu proprietatea 0 < p  q
m  n, dacă m1=n1, m2=n2,..., mp=np,
m  n, dacă m1=n1, m2=n2,..., ms-1=nsi1,       ms < ns, pentru 1  s  p,
n  m, dacă m1=n1, m2=n2,..., ms-1=nsi1,       ms > ns, pentru 1  s  p. <
3.2. Operaţii şi algebre. Proprietăţile operaţiilor
Funcţia de tipul : MnM se va numi operaţie n-ară pe M. Setul A = <M, >, оn care  este o mulţime de operaţii definite pe M, se numeşte algebră. Mulţimea M se va numi mulţime de bază sau suportul, iar  = {1, 2,..., m,...} - signatura algebrei A. Vectorul, componentele căruia sunt arităţile operaţiilor 1, 2,... se numeşte tipul algebrei A.
Operaţia  se numeşte:
a)    comutativă, dacă ab = ba,
b)    asociativă, dacă pentru oricare a, b, c are loc (ab)c = a(bc),
c)    idempotentă, dacă aa = a,
d)    distributivă stânga faţă de operaţia g, dacă pentru oricare a, b, c are loc relaţia
e)    a(bgc) = (ab)g(ac), şi distributivă dreapta dacă (agb)c = (ac)g(bc).
Dacă există un element e pentru care are loc ae = ea = a, atunci acest element se numeşte neutru (sau unitate).
Exemplul 3.4.    a)    Pentru o mulţime arbitrară U şi mulţimea tuturor părţilor B(U), algebra A = {B(U), , ,  } se numeşte algebră booleana a mulţimilor. Tipul ei este (2,2,1).
b)    Algebra A = {R,+,x} se numeşte câmp al numerelor reale. Ambele operaţii sunt binare, deci tipul este (2,2).<
Algebrele L = {M,,} (cu două operaţii binare - reuniunea şi intersecţia) se numesc latice, dacă au loc axiomele:
    P1: ab = ba, ab = ba - comutativitate,
    P2: a(bc) = (ab)c, a(bc) = (ab)c - asociativitate,
    P3: a(ba) = a, a(ba) = a - absorbţie,
pentru oricare a, b, cM.
3.3. Modele si sisteme algebrice. Algebra relaţiilor
Noţiunea de model este una din noţiunile de bază în matematica discretă. Se va numi model M setul care constă din mulţimea D - suportul modelului, şi o mulţime de relaţii S definite pe D:
M = <D, S>.
Aici S = {R11, R12,..., R1n1, R21, R22,..., R2n2,..., Rm1, Rm2,..., Rmnm} este signatura modelului, RijMi. Exponenta suportului determină aritatea relaţiei. Două relaţii Ri şi Rj care au aceeaşi aritate se numesc compatibile.
Setul care conţine mulţimea D, operaţiile şi relaţiile definite pe D
A = <D, F, S>.
se numeşte sistem algebric.
Modelul este un caz particular al sistemului algebric, când mulţimea F este vidă, iar pentru o algebră mulţimea S este vidă.
Un alt caz particular al sistemelor algebrice оl constituie algebra relaţiilor şi extensia acesteea - algebra relaţională. Pentru o algebră a relaţiilor drept suport serveşte mulţimea relaţiilor considerate, iar signatura o formează operaţiile de reuniune, intersecţie, diferenţă şi produsul cartezian extins al relaţiilor. Să facem cunoştinţă cu aceste operaţii.
Reuniunea RiRj a două relaţii compatibile Ri şi Rj este mulţimea tuturor cortejurilor, fiecare dintre care aparţine cel puţin uneia din relaţii.
Intersecţia RiRj a două relaţii compatibile Ri şi Rj se va numi mulţimea tuturor cortejurilor care aparţin ambelor relaţii în acelaşi timp.
Diferenţa Ri\Rj a două relaţii compatibile Ri şi Rj se numeşte mulţimea tuturor cortejurilor care aparţin lui Ri şi nu aparţin relaţiei Rj .
Produs cartezian extins RixRj a două relaţii Ri şi Rj se va numi mulţimea tuturor cortejurilor formate prin concatenarea lui aRi şi a lui bRj.
Exemplu: dacă Ri ={(a,b),(a,c),(a,e)}, iar Rj = ((a,b,c),(c,d,e)}, atunci
RixRj = {(a,b,a,b,c), (a,b,c,d,e), (a,c,a,b,c), (a,c,c,d,e), (a,e,a,b,c), (a,e,c,d,e)}.
Algebra relaţiilor şi modelele sunt utilizate pentru formalizarea unor obiecte reale. Vom exemplifica prin folosirea algebrei relaţiilor în cazul bazelor relaţionale de date.
O bază de date de tip relaţional este un tablou bidimensional în care coloanele determină aşa numitele domene (atribute), iar liniile sunt cortejuri de valori concrete ale atributelor, care se află în relaţia R.
Exemplul 3.5.    Relaţia R5 - "examene" (v.tab. 3.1). Relaţia R5 este o submulţime a produsului cartezian D1xD2xD3xD4xD5. Elemente ale domenului Di sunt valorile atributelor:
    D1 = {3-101, 3-501, 3-502, 3-310} - numerele auditoriilor unde au loc examenele;
D2 = {Matematica discretă în inginerie, Microelectronica, Fizica, Circuite integrate, Electrotehnica} - denumirea disciplinelor;
    D3 = {conf.V.Beşliu, conf. V.Negură, conf.A.Diligul, conf.V.Şontea, prof.I.Samusi} -examinatorii;
    D4 = {3 iunie, 4 iunie, 8 iunie, 13 iunie} - data examenului;
    D5 = {TI-961, TI-962, TI-963, C-941, C-942, C-951, C-952} - denumirea grupei.
    Tabelul 3.1. Relaţia “examene”.
R5    D1    D2    D3    D4    D5
 1    3-101    Matematica discretă în inginerie    conf. V.Beşliu    3 iunie    TI-961
 2    3-202    Microelectronica     conf. V.Şontea    4 iunie    C-951
 3    3-310    Fizica    prof. I.Samusi    3 iunie    TI-962
 4    3-101    Circuite integrate    conf. V.Negură    4 iunie    C-941
 5    3-104    Electrotehnica    conf. A.Diligul    3 iunie    TI-951
 6    3-101    Matematica discretă în inginerie    conf. V.Beşliu    8 iunie    TI-962
 7    3-101    Matematica discretă în inginerie    conf. V.Beşliu    13 iunie    TI-963
 8    3-202    Microelectronica    conf. V.Şontea    8iunie    C-952
 9    3-310    Fizica    prof. I.Samusi    8iunie    TI-961
 10    3-101    Circuite integrate    conf. V.Negură    8iunie    C-942
Numerele 1, 2,..., 10 din prima coloană identifică elemente ale relaţiei R5. <
Algebra relaţională este o extensie a algebrei relaţiilor în sens că signatura S în afară de cele 4 operaţii descrise anterior mai conţine câteva operaţii speciale, de exemplu proiecţia, selecţia şi joncţiunea.
Operaţia selecţie permite evidenţierea unei submulţimi de cortejuri care posedă o proprietate dată. De exemplu, operaţia selecţie permite evidenţierea relaţiei orarul conf. V.Beşliu - liniile оn care valoarea domenului D3 este conf. V.Beşliu:
    Tabelul 3.2. Rezultatul operaţiei selecţie pentru valoarea “conf. V.Beşliu”
R5    D1    D2    D3    D4    D5
1    3-101    Matematica discretă în inginerie    conf. V.Beşliu    3 iunie    TI-961
6    3-101    Matematica discretă în inginerie    conf. V.Beşliu    8 iunie    TI-962
7    3-101    Matematica discretă în inginerie    conf. V.Beşliu    13 iunie    TI-963
Operaţia proiecţie se defineşte introducând pentru suportul D al algebrei relaţionale o partiţie de n submulţimi (n este aritatea relaţiei) RnDn.
Proiecţia relaţiei binare R2AxB pe A (PrR2/A) se numeşte mulţimea {ai | (ai,bi)R2}.
Proiecţia PrRn/Ai1,...,Aim a relaţiei n-are RnA1xA2x...xAn, m  n, pe Ai1, Ai2,..., Aim se numeşte mulţimea cortejurilor (ai1, ai2,..., aim), оn care ai1Ai1, ai2Ai2,..., aimAim şi fiecare cortej este parte a unui element al relaţiei n-are Rn. Cu alte cuvinte, operaţia proiecţie permite construirea unei submulţimi verticale a relaţiei (a unei mulţimi de submulţimi de atribute care se obţine prin alegerea unor domene concrete). De exemplu, Pr(R5/D2,D3) determină denumirea examenelor şi numele examinatorilor (liniile care coincid se scriu o singură dată, v.tab. 3.3).
    Tabelul 3.3. Rezultatul operaţiei “proiecţie”.
D2    D3
Matematica discretă în inginerie    conf. V.Beşliu
Microelectronica     conf. V.Şontea
Fizica    prof. I.Samusi
Circuite integrate    conf. V.Negură
Electrotehnica    conf. A.Diligul
Operaţia joncţiune (join) a două tabele care au un domen comun permite construirea unui tabel nou în care fiecare linie se va obţine din unirea a două linii din tabelele iniţiale. Aceste linii corespund aceluiaşi atribut din domenul comun. Domenul comun se va scrie o singură dată.
De exemplu, pentru tabele 3.4 şi 3.5 domenul comun este D5, rezultatul operaţiei de joncţiune este prezentat în tabelul 3.6.
    Tabelul 3.4.
D1    D2    D3    D4    D5
3-202    Microelectronica     conf. V.Şontea    4 iunie    C-951
3-310    Fizica    prof. I.Samusi    3 iunie    TI-962
3-104    Electrotehnica    conf. A.Diligul    3 iunie    TI-951
    Tabelul 3.5.
D1    D2    D3    D4    D5
3-104    Electrotehnica    conf. A.Diligul    13 iunie    C-951
3-310    Matematica    conf. L.Dogotaru    13 iunie    TI-962
3-202    Microelectronica     conf. V.Şontea    14 iunie    TI-951
    Tabelul 3.6. Rezultatul operaţiei “join”.
D1    D2    D3    D4    D11    D21    D31    D41    D5
3-202    Microelectronica     conf. V.Şontea    4 iunie    3-104    Electrotehnica    conf. A.Diligul    13 iunie    C-951
3-310    Fizica    prof. I.Samusi    3 iunie    3-310    Matematica    conf. L.Dogotaru    13 iunie    TI-962
3-104    Electrotehnica    conf. A.Diligul    3 iunie    3-202    Microelectronica     conf. V.Şontea    14 iunie    TI-951
Operaţia join este definită nu numai pentru condiţia de egalitate a două domene, ci pot fi şi alte condiţii de comparare, de exemplu, >, , <, , etc.
4. Proiectarea bazelor de date relaţionale
Proiectarea bazelor de date rezolvă două probleme:
•    Cum să fie reprezentate obiectele domeniului obiectiv în obiecte abstracte ale modelului datelor astfel ca această reprezentare să nu contrazică semantica domeniului obiectiv şi să fie, în măsura posibilităţilor, cea mai bună (eficientă, comodă, etc.)? Adesea această problemă este numită proiectarea logică a BD.
•    Cum să se asigure executarea eficientă a interpelărilor BD? Altfel, luând în consideraţie specificul unui SGBD concret, cum vor fi plasate datele în memoria externă, care structuri vor fi create suplimentar (de ex., indici), etc. Această problemă este numită proiectarea fizică a BD.
Este dificil să fie propuse nişte reţete de ordin general pentru rezolvarea problemei proiectării fizice. Prea multe depind de SGBD folosit. De exemplu, cu ajutorul SGBD Ingres poate fi aleasă una dintre metodele de organizare fizică a relaţiilor, iar lucrând cu System R ar trebui să ne gândim în primul rând la clasterizarea relaţiilor şi la setul necesar de indici, etc. Din această cauză vom cerceta mai departe doar momentele, legate de proiectarea logică a BDR, care au importanţă mare atunci când utilizăm orice SGBDR. Mai mult, nu vom discuta un aspect foarte important al proiectării – determinarea cererilor de consistenţă (cu excepţia restricţiei cheii primare). Aceasta din cauza, că atunci când este utilizat un SGBD cu mecanisme de asigurare a consistenţei datelor (de ex., sistemele SQL orientate) este foarte dificil să fie propusă o abordare generală de determinare a cererilor de consistenţă. Aceste cereri (restricţii) pot fi de ordin foarte general, iar formularea lor ţine mai repede de artă, decât de măiestria inginerească. În literatură în această direcţie este propus cel mult controlul automat al necontradicţiei setului de restricţii al consistenţei.
Vom considera, deci, că problema proiectarii unei baze de date de tip relaţional constă în luarea unei decizii motivate în vederea obţinerii unor răspunsuri la următoarele întrebări:
•    Care sunt relaţiile din care este formată baza de date?
•    Care vor fi atributele acestor relaţii?
4.1. Proiectarea logică
Vom face cunoştinţă mai întâi cu abordarea clasică, când întreg procesul de proiectare are loc în termeni din domeniul modelului relaţional de date, folosind metoda determinării consecvente a setului satisfăcător de relaţii. Punctul de plecare este reprezentarea domeniului obiectiv sub forma uneia sau mai multor relaţii şi la fiecare pas al procesului de proiectare se va produce un set oarecare de scheme ale relaţiilor, care posedă proprietăţi mai bune decât la pasul precedent. Procesul de proiectare se transformă într-un proces de normalizare a schemelor relaţiilor, iar fiecare formă normală care urmează posedă proprietăţi mai bune decât forma precedentă.
Fiecărei forme normale îi corespunde un set anumit de cerinţe, iar relaţia se află într-o formă normală, dacă satisface setul de cerinţe caracteristic ei. Ca exemplu de set de cerinţe poate fi considerată restricţia primei forme normale – valorile tuturor atributelor relaţiei sunt atomare. Deoarece restricţia primei forme normale este o cerinţă fundamentală a modelului de date relaţional clasic, vom considera că setul iniţial de relaţii deja corespunde acestei cerinţe. În teoria bazelor de date relaţionale este evidenţiat următorul şir de forme normale:
•    Prima formă normală (1FN);
•    A doua formă normală (2FN);
•    A treia formă normală (3FN);
•    Forma normală Boyce-Codde (BCNF);
•    A patra formă normală (4FN);
•    A cincea formă normală sau forma normală proiecţie-reuniune (5FN sau PJ/NF).
Proprietăţile principale ale formelor normale:
•    Fiecare următoare formă normală este într-un anumit sens mai bună decât precedenta;
•    Trecerea la următoarea formă normală păstrează proprietăţile formelor normale precedente.
La baza procesului de proiectare se află metoda normalizării - decompoziţia relaţiei, care se află în forma normală precedentă în două sau mai multe relaţii, care vor respecta cerinţele următoarei forme normale.
În practică, cele mai importante forme normale ale relaţiilor sunt bazate pe noţiunea fundamentală, numită în teoria BDR dependenţă (relaţie) funcţională.
Definiţia 1. Dependenţă funcţională. În relaţia R atributul y depinde funcţional de atributul x (x şi y pot fi compuse) dacă şi numai dacă fiecărei valori a lui x îi corespunde exact o valoare a lui y: x R y.
Definiţia 2. Dependenţă funcţională totală. Dependenţă funcţională x R y se numeşte totală, dacă atributul y nu depinde funcţional de nici o submulţime proprie a lui x.
Definiţia 3. Dependenţă funcţională tranzitivă. Dependenţă funcţională x R y se numeşte tranzitivă, dacă există un atribut z, astfel încât au loc dependenţele funcţionale totale x R  z şi z R y şi lipseşte dependenţa funcţională R.z  R.x. (Dacă ultima cerinţă nu va fi îndeplinită vom avea în orice relaţie, care posedă mai multe chei, dependenţe tranzitive “neinteresante”).
Definiţia 4. Atribut simplu. Numim atribut simplu orice atribut al relaţiei, care nu intră în componenţa cheii primare.
Definiţia 5. Atribute reciproc independente. Două şi mai multe atribute sunt reciproc independente dacă nici unul dintre aceste atribute nu este dependent funcţional de altele.
4.1.1. A doua formă normală
Considerăm următoarea schemă a relaţiei:
COLABORATORI–SECŢII-PROIECTE(Nr_COL, Salariu_COL, SECŢIA_Nr, Nr_PROIECT, SARCINA_COL).
Cheie primară: Nr_COL, Nr_PROIECT.
Dependenţe funcţionale:
Nr_COL  Salariu_COL
Nr_COL  SECŢIA_Nr
SECŢIA_Nr  Salariu_COL
Nr_COL, Nr_PROIECT  SARCINA_COL.
Observăm, că deşi în calitate de cheie primară a fost luat atributul compus Nr_COL, Nr_PROIECT, atributele Salariu_COL şi SECŢIA_Nr depind funcţional de o parte a cheii primare, atributul Nr_COL. Drept rezultat, nu vom putea introduce în relaţia COLABORATORI-SECŢII-PROIECTE cortejul, care descrie un colaborator, care nu este încă implicat în realizarea vreunui proiect (cheia primară nu poate conţine valori indefinite). Atunci când acest cortej va fi eliminat va fi distrusă nu numai legătura colaboratorului cu proiectul dat, dar va fi pierdută şi informaţia, că acest colaborator lucrează într-o secţie oarecare. Dacă colaboratorul este transferat într-o altă secţie vom fi nevoiţi să modificăm toate cortejurile, care descriu acest colaborator, în caz contrar vom obţine rezultate necoordonate. Aceste fenomene neplăcute se numesc anomalii ale schemei relaţiei. Ele sunt eliminate prin normalizare.
Definiţa 6.    A doua formă normală (aici vom considera, că unica cheie a relaţiei este cheia primară). Relaţia R se află în a doua forma normală (2FN) atunci şi numai atunci, când aflându-se în prima formă normală, fiecare atribut simplu depinde total de cheia primară.
Ca exemplu va fi următoarea decompoziţie a relaţiei COLABORATORI-SECŢII-PROIECTE în două relaţii COLABORATORI-SECŢII şi COLABORATORI-PROIECTE:
COLABORATORI-SECŢII(Nr_COL, Salariu_COL, SECŢIA_Nr)
Cheia primară: Nr_COL.
Dependenţe funcţionale:
Nr_COL  Salariu_COL
Nr_COL  SECŢIA_Nr
SECŢIA_NR  Salariu_COL
COLABORATORI-PROIECTE(Nr_COL, Nr_PROIECT, SARCINA_COL)
Cheia primară: Nr_COL, Nr_PROIECT
Dependenţe funcţionale:
Nr_COL, Nr_PROIECT  SARCINA_COL
Fiecare dintre aceste relaţii se află în a doua formă normală şi în ele sunt eliminate anomaliile evidenţiate mai sus.
Dacă se va permite prezenţa mai multor chei, definiţia 6 va avea următoarea formulare:
Relaţia R se află în a doua forma normală (2FN) atunci şi numai atunci, când ea se află în prima formă normală şi fiecare atribut simplu depinde total de fiecare cheie a relaţiei R. Nu ne vom opri la exemple de relaţii cu mai multe chei, acestea fiind prea complicate şi rar întâlnite în practică.
4.1.2. A treia formă normală
Fie relaţia COLABORATORI-SECŢII, care se află în forma a doua normală. Observăm, că dependenţa funcţională Nr_COL  Salariu_COL este tranzitivă, fiind consecinţa dependenţelor funcţionale Nr_COL  SECŢIA_Nr şi SECŢIA_Nr  Salariu_COL. Altfel spus, salariul unui colaborator nu este o caracteristică a colaboratorului, ci a secţiei în care acesta lucrează (presupunere poate nu chiar corectă, dar acceptabilă pentru exemplu).
Drept rezultat, nu vom putea introduce în BD informaţii despre salariul unei secţii până când în această secţie nu va apare cel puţin un colaborator (cheia primară nu poate conţine valori indefinite). Eliminând cortejul, care descrie ultimul colaborator al secţiei date se va pierde informaţie despre salariul secţiei. Pentru a modifica în mod coordonat salariul secţiei vom fi nevoiţi să găsim mai înrâi toate cortejurile, care descriu colaboratorii secţiei date. Asta înseamă, că în relaţia COLABORATORI-SECŢII există în continuare anomalii. Acestea pot fi eliminate prin aceeaşi procedură de normalizare.
Definiţa 7.    A treia formă normală. (Din nou vom defini presupunând existenţa unei chei unice). Relaţia R se află în a treia forma normală (3FN) atunci şi numai atunci, când se află în a doua formă normală, şi fiecare atribut simplu depinde netranzitiv de cheia primară.
Iată decompoziţia relaţiei COLABORATORI-SECŢII în două relaţii COLABORATORI şi SECŢII:
COLABORATORI(Nr_COL, SECŢIA_Nr)
Cheia primară: Nr_COL
Dependenţe funcţionale: Nr_COL  SECŢIA_Nr
SECŢII(SECŢIA_Nr, Salariu_COL)
Cheia primară: SECŢIA_Nr
Dependenţe funcţionale: SECŢIA_Nr  Salariu_COL
Fiecare dintre aceste două relaţii se află în a treia formă normală şi nu are anomaliile de mai sus.
Dacă vrem să omitem restricţia, că fiecare relaţie are o singură cheie, atunci definiţia 3FN va fi următoarea:
Definiţia 71 . Relaţia R se află în a treia forma normală (3FN) atunci şi numai atunci, când se află în a doua formă normală, şi fiecare atribut simplu depinde netranzitiv de o cheie oarecare a relaţiei R.
În practică, forma a treia normală în marea majoritate a cazurilor este cea finală şi cu determinarea acestei forme, de obicei, procesul de proiectare a BDR ia sfârşit. Dar câteodată, totuşi, procesul de normalizare trebuie continuat.
4.1.3. Forma normală Boyce-Codd
Considerăm următoarea schemă a relaţiei:
COLABORATORI-PROIECTE (Nr_COL, Nume_COL, Nr_PROIECT, SARCINA_COL)
Chei posibile:
Nr_COL, Nr_PROIECT
Nume_COL, Nr_PROIECT
Dependenţe funcţionale:
Nr_COL  Nume_COL
Nr_COL  Nr_PROIECT
Nume_COL  Nr_COL
Nume_COL  Nr_PROIECT
Nr_COL, Nr_PROIECT  SARCINA_COL
Nume_COL, Nr_PROIECT  SARCINA_PROIECT
Am presupus în acest exemplu, că persoana colaboratorului este definită în totalitate atât de numărul acestuia, cât şi de numele lui (nu оntotdeauna are loc оn realitate).
În conformitate cu definiţia 71 relaţia COLABORATORI-PROIECTE se află în forma normală 3. Însă, deoarece există dependenţe funcţionale ale atributelor relaţiei de un atribut, care este parte a cheii primare, apar anomalii. De exemplu, pentru a schimba în mod consistent numele colaboratorului cu numărul dat va fi necesar să modificăm toate cortejurile, care conţin numărul lui.
Definiţia 8.    Determinant. Numim determinant orice atribut de care deăpinde funcţional în totalitate un oarecare alt atribut.
Definiţa 9.    Forma normală Boyce-Codde. Relaţia R se află în forma normală Boyce-Codde atunci şi numai atunci când determinantul ei este o cheie posibilă.
Este evident, că această cerinţă nu este îndeplinită pentru relaţia COLABORATORI-PROIECTE. Putem realiza decompoziţia ei în relaţiile COLABORATORI şi COLABORATORI-PROIECTE:
COLABORATORI(Nr_COL, Nume_COL)
Chei posibile:
Nr_COL
Nume_COL
Dpendenţe funcţionale:
Nr_COL  Nume_COL
Nume_COL  Nr_COL
COLABORATORI_PROIECTE(Nr_COL, Nr_PROIECT, SARCINA_COL)
Cheie posibilă: Nr_COL, Nr_COL
Dependenţe funcţionale: Nr_COL, Nr_PROIECT  Sarcina_COL
Este posibilă şi o altă decompoziţie, dacă am lua la bază Nume_COL. În ambele cazuri relaţiile obţinute COLABORATORI şi COLABORATORI-PROIECTE se află în BCNF cu anomaliile evidenţiate.
4.1.4. A patra formă normală
Fie următorul exemplu de schemă a relaţiei:
PROIECTE(Nr_PROIECT, COL_PROIECT, PROIECT_SARCINĂ)
Relaţia PROIECTE conţine numerele proiectelor, lista colaboratorilor fiecărui proiect şi lista lucrărilor prevăzute în proiect. Colaboratorii pot participa în mai multe proiecte, iar proiecte diferite pot avea lucrări de acelaşi fel.
•    Fiecare cortej al relaţiei legă un proiect oarecare de colaboratorul care participă în acest proiect şi de lucrarea pe care colaboratorul o îndeplineşte în cadrul proiectului dat (presupunem că orice colaborator participant la proiect îndeplineşte toate lucrările prevăzute de proiect). Din această cauză unica cheie posibilă a relaţiei este atributul compus Nr_PROIECT, COL_PROIECT, PROIECT_SARCINĂ şi nu există alţi determinanţi. Relaţia PROIECTE se află, deci, în BCNF. Ea are un şir de neajunsuri. De exemplu, dacă un colaborator oarecare este delegat la un proiect dat, va fi necesar să inserăm în relaţia PROIECTE atâtea cortejuri, câte lucrări sunt în proiect.
    Definiţia 10. Dependenţe multiple. În relaţia R(A, B, C) există o dependenţă multiplă R.A > > R.B dacă şi numai dacă mulţimea valorilor lui B, care corespunde unei perechi de valori A şi C depinde numai de A şi nu depinde de C.
    În relaţia PROIECTE există două dependenţe multiple
    Nr_PROIECT > > COL_PROIECT
    Nr_PROIECT > > PROIECT_SARCINĂ.
    În caz general, în relaţia R(A, B, C) există o dependenţă multiplă R.A > > R.B dacă şi numai dacă există o dependenţă multiplă R.A > > R.C.
    Normalizarea relaţiilr asemănătoare relaţiei PROIECTE se bazaează pe următoarea teoremă:
    Relaţia R(A, B, C) poate fi proiectată fără pierderi în relaţiile R1(A,B) şi R2(A,C) atunci şi numai atunci când există MVD A > > B|C.
    Prin proiectare fără pierderi se consideră decompoziţia uei relaţii, când relaţia iniţială poate fi restabilită integral şi fără redundanţă prin joncţiunea simplă a relaţiilor obţinute prin decompoziţie.
    Definiţia 11. A patra formă normală. Relaţia R se consideră în a patra formă normală atunci şi numai atunci când în cazul existenţei dependenţei multiple A> > B toate celelalte atribute ale R depind funcţional de A.
    În exemplul nostru putem propune decompoziţia relaţiei PROIECTE în două relaţii PROIECTE_COLABORATORI şi PROIECTE_SARCINI:
    PROIECTE_COLABORATORI(Nr_PROIECT, COL_PROIECT)
    PROIECTE_SARCINI(Nr_PROIECT, PROIECT_SARCINĂ).
    Ambele relaţii sunt în a patra formă normală şi nu au anomaliile de mai sus.
    4.1.5. A cincea formă normală
    În toate operaţiile de normalizare petrecute până acum o relaţie a fost descompusă în două. Nu întotdeauna este posibil acest lucru, dar este posibilă decompoziţia în mai multe relaţii, fiecare având proprietăţi mai bune. Considerăm relaţia COLABORATORI_SECŢII_PROIECTE(Nr_COL, Nr_SECŢIE, Nr_PROIECT).
    Presupunem că un colaborator poate lucra în mai multe secţii, iar în fiecare secţie – cu mai multe proiecte. Cheie primară pentru această relaţie este întreaga totalitate a atributelor, lipsind dependenţe funcţionale şi multiple. Din această cauză relaţia se află în 4NF. Însă pot exista anomalii, care pot fi eliminate prin decompoziţia relaţiei iniţiale în trei relaţii.
    Definiţia 12. Dependenţa joncţiunii. Relaţia R(X, Y,…, Z) satisface dependenţele joncţiunii *(X, Y,…, Z) atunci şi numai atunci când R poate fi restabilită fără pierderi prin joncţiunea proiecţiilor sale pe X, Y,…, Z.
    Definiţia 13. A cincea formă normală. Relaţia R se află în a cincea formă normală (proiecţie-joncţiune – PJ/NF) atunci şi numai atunci când orice dependenţă a joncţiunii în R rezultă din existenţa unei oarecare chei posibile în R.
    Introducem următoarele nume pentru atributele compuse:
    CS = {Nr_COL, Nr_SECŢIE}
    CP = {Nr_COL, Nr_PROIECT}
    SP = {Nr_SECŢIE, Nr_PROIECT}
    Presupunem că în relaţia COLABORATORI_SECŢII_PROIECTE există dependenţa joncţiunii *(CS, CP, SP): Prin exemple poate fi arătat, că la inserarea şi eliminarea cortejurilor pot să apară probleme. Acestea pot fi evitate prin decompoziţia relaţiei iniţiale în trei relaţii noi:
    COLABORATORI_SECŢII(Nr_COL, Nr_SECŢIE)
    COLABORATORI_PROIECTE(Nr_COL, Nr_PROIECT)
    SECŢII_PROIECTE(Nr_SECŢIE, Nr_PROIECT)
    A cincea formă normală este ultima, care poate fi obţinută prin decompoziţie. Condiţiile acestei forme sunt departe de a fi triviale din care cauză 5NF în practică se foloseşte relativ rar

Cele mai ok referate!
www.referateok.ro