Sunteți pe pagina 1din 32

Ce este un sistem de operare 1.

1 Ce este un sistem de operare Un sistem de operare este o parte importanta a (aproape) oricarui sistem de calcul. Putem imparti un sistem de calcul in patru componente principale: hardware, sistemul de operare, programele de aplicatie si utilizatorii. Componenta hardware ofera resursele de calcul de baza. Programele de aplicatie definesc modul in care sunt utilizate aceste resurse in scopul rezolvarii problemelor de calcul ale utilizatorilor. Pot exista numerosi utilizatori diferiti, incercand sa rezolve probleme diferite. Corespunzator, pot exista numeroase programe de aplicatie. Sistemul de operare controleaza si coordoneaza utilizarea componentei hardware printre diferitele programe de aplicatie pentru diferitii utilizatori. Componentele unui sistem de calcul sunt hardware-ul, software-ul si datele sale. Sistemul de operare ofera mijloacele unei utilizari corespunzatoare a acestor resurse in functionarea sistemului de calcul. Un sistem de operare nu realizeaza o functie utila prin el insusi; ofera doar un mediu in care alte programe pot realiza ceva util. Un sistem de operare poate fi privit ca un alocator de resurse. Sistemul de calcul poseda numeroase resurse care pot necesita rezolvarea unei probleme cum ar fi: timpul CPU, spatiul de memorie, dispozitivele I/O. Sistemul de operare actioneaza ca un manager al acestor resurse si le aloca unui anumit program sau utilizator pentru rezolvarea sarcinilor acestora. Deoarece cererile de resurse pot fi numeroase, sistemul de operare trebuie sa decida caror cereri va aloca resursele pentru a opera sistemul de calcul eficient si just. Pe de alta parte, un sistem de operare este un program de control. Un program de control controleaza executia programelor utilizator pentru a preveni erorile si utilizarea nepotrivita a calculatorului. O atentie speciala se acorda operarii si controlului dispozitivelor I/O. Scopul primar al unui sistem de operare este conveninta pentru utilizator. Sistemele de operare exista deoarece se asteapa ca este mai usor de lucrat cu un sistem de operare decat fara el. Un scop secundar este operarea eficienta a sistemului de calcul. Acest scop este important in particular pentru sistemele multiutilizator mari. Astfel de sisteme sunt prin definitie costisitoare, astfel incat este de dorit ca ele sa devina cat mai eficiente posibil. Cele doua scopuri, convenienta si eficienta, sunt uneori contradictorii. In trecut, consideratiile de eficienta au fost deseori mai importante decat cele de convenienta. De aceea, mare parte din teoria sistemelor de operare se concentreaza asupra utilizarii optimee a resurselor de calcul. 1.2 Scurta istorie Pentru a vedea ce sunt si ce fac sisteme de operare, este necesara o privire asupra modului in care s-au dezvoltat acestea de-a lungul timpului. Trasarea evolutiei sistemelor de operare va pune in evidenta elementele generale ale sistemelor de operare, dar si motivul pentru care acestea s-au dezvoltat intr-o anumita directie. De-a lungul timpului, sistemele de operare si arhitectura calculatorului au avut o deosebita influenta una asupra celeilalte. Pentru a usura utilizarea hardware-ului, au fost dezvoltate sistemele de operare. Pe masura ce sistemele de operare s-au dezvoltat, a devenit evident faptul ca modificari ale hardware-ului lear putea simplifica. Aceasta scurta istorie a evolutiei sistemelor de operare pune in evidenta cum probleme ale sistemelor de operare au dus la introducerea unor caracteristici harware noi. 1.2.1 Primele sisteme Primele sisteme erau masini imense (din punct de vedere fizic) operate de la o consola. Programatorul unei astfel de masini era in acelasi timp si operatorul. Acesta scria un program, apoi il opera direct de la consola operatorului. Pentru inceput, programul trebuia incarcat manual in memorie, fie de la comutatorii panoului frontal, fie de pe o banda de hartie, fie de pe cartele perforate. Apoi, manipuland butoanele potrivite, era fixata adresa de start a programului si lansata executia acestuia. Pe masura ce programul isi realiza executia, programatorul o putea monitoriza cu ajutorul semnalelor luminoase de pe consola. In cazul semnalarii unei erori, programatorul putea opri executia acestui program, examina continutul memoriei si al registrilor, si depana programul direct de la consola. Iesirea era fie tiparita, fie depusa pe benzi de hartie sau cartele perforate pentru intrebuintare ulterioara.

De-a lungul timpului, parti software si hardware aditionale au fost dezvoltate. Lectorii de cartele, imprimante si benzi magnetice au devenit banale. Asamblori (assembler), incarcatori (loader) si editori de legaturi (linker) au fost creati pentru a usura sarcinile de programare. Biblioteci de functii uzuale au fost de asemenea create, astfel incat acestea puteau fi acum copiate intr-un program nou fara a mai fi necesara rescrierea acestora, ceea ce a condus la reutilizarea software-ului. Rutinele care realizau operatii I/O erau deosebit de importante. Fiecare nou dispozitiv I/O poseda caracteristici proprii, necesitand o programare deosebit de atenta. O subrutina speciala a fost scrisa pentru fiecare dispozitiv I/O. O astfel de subrutina s-a numit driver de dispozitiv (device driver). Un astfel de driver stie cum urmeaza sa fie utilizate buffer-ele, indicatorii, registrii, bitii de control si bitii de stare pentru un anume dispozitiv. O sarcina simpla, cum ar fi citirea unui caracter de pe o cartela, ar putea presupune secvente complexe de operatii-dispozitiv. In loc de a mai introduce tot acest cod de fiecare data, driverul de dispozitiv era pur si simplu utilizat dintr-o biblioteca. Mai tarziu, au aparut primele limbaje de programare si compilatoare (FORTRAN, COBOL), usurand munca de programare, dar facand ca operarea unui calculator sa devina mai complexa. Astfel, pentru a pregati un program FORTRAN pentru executie, programatorul urma pentru inceput sa incarce compilatorul FORTRAN de pe o banda magnetica. Apoi programul era citit printr-un lector de cartele si depus pe o alta banda. Rezultatul compilarii FORTRAN era o iesire in limbaj de asamblare, care urma sa fie supusa asamblarii, ceea ce de obicei insemna montarea unei alte benzi care sa contina asamblorul. Mai departe, rezultatul asamblarii necesita legarea cu rutine de biblioteca necesare. In final era obtinut un obiect, forma binara a programului, care era pregatit pentru executie. Mai departe, acesta putea fi incarcat in memorie si depanat de la consola ca inainte. 1.2.2 Sisteme simple de prelucrare n loturi In tot procesul de mai sus apareau numerosi timpi de pregatire ai lucrarii. In timpul montarii unei benzi sau a realizarii unor operatii la consola, CPU era neutilizata. Cum primele calculatoare erau extrem de costisitoare, nevoia unei utilizari maxime pentru a se obtine cat mai mult dintr-o asemenea investitie era evidenta. 1.2.2.1 Monitoare rezidente Pentru inceput a fost angajat un operator de calculator. Programatorul nu mai era astfel nevoit sa opereze masina. Indata ce o lucrare era gata, operatorul o putea incepe pe urmatoarea. Datorita specializarii operatorilor, timpii de pregatire ai lucrarilor erau redusi. Pe de alta parte, operatorul nu putea depana un program incorect de la consola, astfel incat in cazul aparitiei unei erori, se realiza o vidare a memoriei si registrilor, iar programatorul trebuia sa depaneze programul pe baza acestor informatii. Vidarea memoriei si a registrilor permitea operatorului sa continue imediat cu urmatoarea lucrare, lasand insa in seama programatorului o dificila sarcina de depanare... Apoi lucrarile cu nevoi similare au fost grupate in loturi si rulate in computer ca un grup de lucrari. Cu aceste modificari, prin care operatorul devenea diferit de utilizator si lucrarile similare erau grupate in loturi, a fost obtinuta o oarecare imbunatatire a utilizarii. In continuare insa existau timpi morti. De exemplu, la oprirea unei lucrari operatorul trebuia sa observe aceasta la consola, sa determine cauzele opririi si sa actioneze in consecinta inainte de a incarca urmatoarea lucrare. Pentru a preveni acesti timpi morti au fost dezvoltata succesiunea automata a lucrarilor; aceasta tehnica marcand aparitia primului sistem de operare rudimentar. Ceea ce se urmarea era o procedura pentru a permite trecerea automata de la o lucrare la alta. Pentru acest scop a fost dezvoltat un program micut, numit monitor rezident, care, desigur, era totdeuna prezent in memorie. La pornirea calculatorului, era apelat monitorul rezident, care urma sa transfere controlul unui program. Odata terminat acest program, controlul era inapoiat monitorului rezident, care urma sa treaca la urmatorul program. Astfel, un monitor rezident putea sa treaca automat de la un program la altul, si de la o lucrare la alta. Pentru ca monitorul rezident sa stie ce program urmeaza sa execute, au fost introduse cartelele de control. Acestea contineau informatii destinate direct monitorului rezident. Aceste informatii (directive) indicau programul care urmeaza sa fie rulat, dar puteau de asemenea si sa delimiteze fiecare lucrare. Un monitor rezident are astfel mai multe parti separate. In primul rand, un interpretor de cartele de control, responsabil cu citirea si indeplinirea instructiunilor acestor cartele. Interpretorul de cartele de control, dupa un timp apeleaza un incarcator pentru a incarca programele sistem sau programele de

aplicatie in memorie. Astfel, incarcatorul este o parte a monitorului rezident. Ambele parti identificate pana acum trebuie sa realizeze operatii I/O, prin urmare un monitor rezident este inzestrat cu un set de drivere de dispozitiv pentru dispozitivele I/O. [Astfel, un sistem de operare cu prelucrare in loturi in mod normal citeste un sir de lucrari separate, fiecare cu cartelele de control proprii, predefinind ce urmeaza sa realizeze lucrarea. La terminarea lucrarii, iesirea este de obicei tiparita. Un aspect clar al unui astfel de sistem este lipsa interactiunii dintre utilizator si lucrare in timpul executiei acesteia. Lucrarea este pregatita si trimisa. Dupa un timp, se obtine rezultatul. Intarzierea dintre cele doua momente se poate datora cantitatii de calcul necesara, sau timpilor necesari sistemului de operare pentru a ajunge la pornirea lucrarii.] 1.2.2.2 CPU acoperite (suprapuse) partial si operatiile I/O Chiar cu o succesiune automata a lucrarilor, CPU are in continuare numerosi timpi morti. De data aceasta problema este viteza dispozitivelor mecanice I/O. Chiar cu o CPU extrem de lenta, diferenta de viteza fata de un lector de cartele rapid (pe la 1200 cartele pe minut) este de trei ordine de marime. Desigur, de-a lungul timpului dispozitivele I/O si-au marit considerabil viteza. Din nefericire, viteza CPU a crescut mult mai mult, astfel incat problema initiala nu numai ca nu a fost rezolvata, dar s-a agravat de-a lungul timpului. Procesare off-line O solutie simpla a fost inlocuirea lentelor cititoare de cartele (ca dispozitive de intrare) si a imprimantelor (ca dispozitive de iesire) cu unitati de banda magnetica. [Majoritatea sistemelor de la sfarsitul anilor 1950 si inceputul anilor 1960 erau sisteme cu prelucrare in loturi, care realizau citirea intrarii prin cititoare de cartele si scriau iesirea la imprimantele atasate sau perforatoare de cartele.] Acum in loc ca CPU sa citeasca direct de pe cartele, acestea erau intai copiate pe o banda magnetica prin intermediul unui dispozitiv separat. Odata umpluta banda, aceasta era montata la un calculator, citirea unei cartele fiind inlocuita cu citirea unei inregistrari de pe banda. Similar, rezultatele erau scrise pe o banda, continutul acesteia urmand a fi tiparit ulterior. Astfel, cititoarele de cartele si imprimanta erau acum operate off-line, si nu prin intermediul calculatorului. Principalul avantaj al operarii off-line consta in faptul ca de acum calculatorul nu mai era nevoit sa astepte dupa dispozitive lente I/O, dar inca era constrans de viteza unor dispozitive ceva mai rapide, unitatile de banda magnetica. Castigul real al operarii off-line consta insa in posibilitatea utilizarii unor sisteme multiple cititor--banda, banda--imprimanta impreuna cu o singura CPU. Pe de alta parte, pentru a executa o anumita lucrare, de acum va fi nevoie de ceva mai mult timp. Aceasta, pentru inceput, trebuie sa fie depusa pe o banda, posibil impreuna cu alte lucrari, pentru a umple banda. Banda trebuie apoi manipulata pana la montarea ei intr-o unitate de banda libera. Totusi, pentru sistemele cu procesare in loturi, castigul este evident. Spooling Problema benzilor magnetice era ca in timp ce cititorul de cartele scria datele intr-un capat al acesteia, CPU nu putea citi informatiile din celalalt capat. Banda trebuia scrisa in intregime, apoi derulata pentru ca CPU sa o poata utiliza. Problema se datora faptului ca benzile sunt prin natura lor dispozitive cu acces secvential. Spre deosebire de acestea, sistemele de discuri, care devin din ce in ce mai raspandite, elimina problema prin natura lor de dispozitive cu acces aleator. Deoarece capul de citire/scriere se putea muta relativ rapid dintr-o zona in alta, un disc putea trece rapid de la zona in care era utilizat de cititorul de cartele la zona in care CPU citea "urmatoarea" cartela. Intr-un sistem cu discuri, cartelele sunt citite direct de la cititorul de cartele pe disc. Locatiile (pozitiile) iamginilor cartelelor sunt inregistrate intr-o tabela mentinuta de sistemul de operare. La executarea unei lucrari, sistemul de operare ii satisface cererile de citire de la cititorul de cartele (dispozitivul de intrare) citind de pe disc. De asemenea, cand lucrarea cere tiparirea unei linii la imprimanta, aceasta este copiata intr-un buffer sistem si scrisa pe disc. Intreaga iesire este apoi tiparita la incheierea lucrarii. Aceasta forma de procesare se numeste spooling (simultaneous peripheral operation on-line). In linii mari, aceasta tehnica foloseste discul ca un buffer destul de mare, pentru a citi cat mai mult posibil de la dispozitivele de intrare si pentru a depozita fisierele de iesire pana cand dispozitivul de iesire poate sa le accepte.

Aceasta tehnica este de asemenea utilizabila pentru procesarea datelor unui sistem la distanta. CPU poate trimite acum datele (printr-o cale de comunicatie) catre o imprimanta la distanta, sau poate chiar accepta o lucrare de la un cititor de cartele aflat la distanta. Procesarea la distanta se poate realiza astfel fara interventia propriu-zisa a CPU. CPU urmeaza sa fie anuntata doar cand este procesarea incheiata, pentru a putea prelucra urmatorul lot de date. Tehnica spooling suprapune operatiile I/O ale unei lucrari cu partea de calcul a unei alte lucrari. Chiar si intr-un sistem simplu spoolerul poate citi intrarea unei lucrari in timp ce tipareste iesirea unei alte lucrari. Intre timp o alta lucrare poate fi executata. Astfel, prin spooling atat CPU cat si dispozitivele I/O pot fi utilizate la un nivel mult mai inalt. 1.2.3 Sisteme de prelucrare n loturi, multiprogramate Prin spooling se ofera o importanta structura de date: job pool (fondul de lucrari). Prin spooling se obtin in general mai multe lucrari care au fost deja citite, asteptand sa fie rulate. Un fond de lucrari pe disc permite sistemului de operare sa selecteze urmatoarea lucrare, pentru a creste utilizarea CPU, spre deosebire de situatia in care lucrarile sunt citite direct de la un dispozitiv de intrare (cititor de cartele, banda). Astfel, devine posibila planificarea lucrarilor. Cel mai important aspect in planificarea lucrarilor este posibilitatea multiprogramarii. Prin multiprogramare creste utilizarea CPU prin organizarea lucrarilor astfel incat CPU sa aiba totdeauna de lucru. Principiul de functionare este urmatorul. Sistemul de operare pastreaza in memorie la un moment dat mai multe lucrari. Multimea acestor lucrari este doar o parte a lucrarilor care constituie fondul de lucrari. Sistemul de operare alege si executa una dintre lucrarile aflate in memorie. Posibil, lucrarea va trebui sa astepte indeplinirea unei sarcini (montarea unei benzi, o comanda de la consola, o operatie I/O). In aceasta situatie, sistemul de operare comuta la o alta lucrare (eventual intrerupta anterior) pe care o executa mai departe si asa mai departe. Atata vreme cat exista lucrari in fondul de lucrari, CPU nu ramane neutilizat. Multiprogramarea este prima situatie in care sistemul de operare trebuie sa ia decizii in numele utilizatorilor. Prin urmare, sistemele de operare multiprogramate sunt destul de sofisticate. Toate lucrarile introduse in sistem sunt depozitate in fondul de lucrari. Daca mai multe lucrari sunt pregatite pentru a fi incarcate in memoria principala, si nu exista suficient spatiu pentru toate, sistemul trebuie sa faca o alegere intre acestea. Aceasta decizie se numeste planificarea lucrarilor. Cand sistemul de operare selecteaza o lucrare, aceasta este incarcata in memorie in scopul executarii ei. Avand mai multe programe simultan in memorie necesita o forma de management al memoriei. In plus, daca mai multe lucrari sunt pregatite pentru executie simultan, sistemul trebuie sa faca iar o alegere intre acestea. Aceasta decizie se numeste planificarea CPU. In fine, lucrari multiple ruland concurent au nevoie ca posibilitatea de a se influenta reciproc sa fie limitata in toate fazele sistemului de operare, incluzand planificarea proceselor, depozitarea pe disc, managementul memoriei. 1.2.4 Sisteme cu partajarea timpului Sistemele de prelucrare in loturi multiprogramate ofera un mediu in care diferitele resurse ale sistemului sunt utilizate efectiv. Totusi, exista dificultati cu un sistem de prelucrare in loturi din punctul de vedere al programatorului sau utilizatorului. Deoarece utilizatorul nu poate interactiona cu lucrarea care se executa, utilizatorul trebuie sa pregateasca cartele de control pentru a manipula toate situatiile posibile. De asemenea, depanarea programelor trebuie realizata static, pe baza vidarilor instantanee. Programatorul nu poate modifica programul in timpul executiei acestuia pentru a-i studia comportamentul. Conceptul de partajare a timpului (time sharing, sau multitasking) este extensia logica a multiprogramarii. In continuare CPU executa mai multe lucrari, comutand intre acestea, dar acum comutarea se realizeaza atat de frecvent, incat utilizatorul poate interactiona cu programul in timp ce acesta ruleaza. Un sistem de calcul interactiv (hands-on) ofera comunicare directa intre utilizator si sistem. Utilizatorul poate da instructiuni direct sistemului de operare sau programului, si poate receptiona raspunsul imediat. Acum cand sistemul de operare termina executia unei comenzi, va cauta urmatoarea "cartela de control" la dispozitivul de intrare al utilizatorului, de obicei o tastatura. Utilizatorul acum poate oferi comenzi si, in functie deraspuns, decide urmatoarea comanda pe care o va incerca. Astfel, utilizatorul poate experimenta comportamentul unui program si vedea rezultatele imediat.

Daca se presupune ca utilizatorii ar trebui sa aiba acces la date si cod in mod convenabil, trebuie sa fie disponibil un sistem de fisiere on-line. Un fisier este o colectie de informatii inrudite definite de catre creatorul sau. In mod uzual, fisierele reprezinta programe si date. In general, un fisier este o secventa de biti, octeti, linii sau inregistrari al caror inteles este definit de catre creatorul fisierului si utilizator. Sistemul de operare implementeaza conceptul abstract de fisier prin administrarea dispozitivelor de stocare in masa (benzi, discuri). Fisierele sunt in mod normal organizate in clustere logice, sau directoare, care usureaza utilizarea fisierelor. Cum utilizatori multipli pot avea acces la fisiere, este de dorit de asemenea un control despre cine si in ce mod sunt accesate fisierele. Conceptul de time-sharing (partajarea timpului) a fost dezvoltat pentru a oferi o utilizare interactiva sistemului de calcul la un cost rezonabil. Un sistem cu time-sharing foloseste planificarea CPU si multiprogramarea pentru a oferi fiecarui utilizator o mica parte dintr-un calculator partajat in timp. Fiecare utilizator are cel putin un program separat in memorie. Un program care este incarcat in memorie si se executa se numeste de obicei proces. Cand un proces ruleaza, acesta se executa de obicei un timp scurt inainte de a fi terminat sau de a cere realizarea unei operatii I/O. Operatiile I/O pot fi interactive; totusi, deoarece operatiile interactive I/O se desfasoara cu viteza factorului uman (utilizatorului), deseori pana la incheierea unei asemenea operatii poate trece un timp indelungat. In loc de a lasa CPU neutilizat in timpul acestei operatii I/O interactive, sistemul de operare comuta CPU la un alt program, probabil al unui alt utilizator. Un sistem de operare cu partajarea timpului permite mai multor utilizatori sa partajeze calculatorul simultan. Deoarece fiecare actiune (comanda) intr-un astfel de sistem tinde sa fie destul de scurta, doar o mica parte din timpul CPU va fi necesar fiecarui utilizator. Ideea de time-sharing a aparut la inceputul anilor 1960, insa datorita faptului ca astfel de sisteme erau mai costisitoare si mai dificil de construit, au devenit uzuale abia la inceputul anilor 1970. Pe masura ce popularitatea sistemelor cu partajarea timpului a crescut, cercetatorii au incercat sa combine sistemele cu prelucrare in loturi cu sistemele cu partajarea timpului. Majoritatea sistemelor de azi ofera suport atat pentru procesare in loturi cat si pentru partajarea timpului, desi designul si utilizarea lor de baza sunt orientate spre unul dintre aceste tipuri. Ca in cazul multiprogramarii, la partajarea timpului mai multe lucrari trebuie mentinute in memorie simultan, ceea ce necesita o forma de management al memoriei si mecanisme de protectie. Pentru a obtine un timp de raspuns rezonabil, s-ar putea sa trebuiasca ca lucrarile sa fie mutate in/din memoria principala pe disc, care acum serveste ca un depozit de sprijin pentru memoria principala. O metoda uzuala pentru a atinge acest scop este memoria virtuala, care este o tehnica prin care se permite executarea unei lucrari care s-ar putea sa nu se gaseasca integral in memorie. Avantajul imediar al acestei scheme este ca programele pot fi mai mari acum decat memoria fizica disponibila. Mai departe, rezuma memoria principala intr-un tablou larg, uniform de depozitare. Astfel, programatorii sunt eliberati de problemele legate de limitarile de memorie. Sistemele cu partajarea timpului de asemenea trebuie sa ofere un sistem de fisiere on-line. Fisierele se gasesc pe o colectie de discuri, prin urmare este necesar un mecanism de management al discurilor. De asemenea, sistemele cu partajarea timpului ofera un mecanism pentru executia concurenta, care necesita metode complicate de planificare a CPU. Pentru a asigura executarea ordonata, sistemul trebuie sa puna la dispozitie mecanisme pentru sincronizarea lucrarilor si comunicare, si trebuie sa se asigure ca lucrarile nu se impotmolesc (deadlock) asteptand pentru totdeauna una dupa alta. Multiprogramarea si partajarea timpului sunt temele centrale in sistemele de operare moderne. 1.2.5 Sisteme PC Pe masura ce costurile hardware au scazut, a devenit din nou fezabil sa avem un sistem de calcul dedicat unui singur utilizator. Astfel de tipuri de sisteme sunt numite in mod curent calculatoare personale (PC). Dispozitivele I/O s-au schimbat complet: de la panouri frontale prevazute cu comutatoare si cititoare de cartele, la tastaturi simple si mouse. vechile implrimante si perforatoare de cartele au fost inlocuite cu monitoare si imprimante mici, rapide. Era calculatoarelor personale a inceput in anii 1970. In principiu, sunt microcomputere mult mai mici si mai putin costisitoare decat sistemele mainframe. Pana curand, CPU-urile acestor tipuri de sisteme de calcul erau complet lipsite de caracteristicile necesare pentru a proteja un sistem de operare de programele utilizator. Prin urmare sistemele de operare pentru PC-uri nu erau nici multiutilizator, nici multitasking.

Totusi, scopurile acestor sisteme de operare s-au schimbat in timp; in loc de a incerca maximizarea utilizarii CPU si a perifericelor, s-a optat pentru pentru comoditatea si usurinta utilizarii. Sistemele de operare pentru aceste calculatoare au beneficiat de dezvoltarile sistemelor de operare pentru mainframe-uri in mai multe moduri: microcalculatoarele au fost capabile sa adopte imediat tehnologiile dezvoltate pentru sistemele de operare mari; pe de alta parte, costurile hardware pentru microcomputere sunt suficient de mici pentru ca un singur utilizator sa poata folosi un calculator, in plus utilizarea CPU nu mai este o prima cerinta. Astfel, cateva dintre deciziile de design care sunt luate pentru sistemele de operare pentru mainframe-uri ar putea sa nu se mai potriveasca sistemelor de calcul mici. De exemplu, protectia fisierelor ar putea sa nu mai fie necesara pe o masina personala; de altfel MS-DOS nu ofera nici un suport pentru o asemenea facilitate. Totusi, costurile scazute pentru hardware nu numai ca nu vor face ca sistemele de operare sa devina depasite, dar vor permite ca implementarea unui numar tot mai mare de concepte sofisticate de (teoria) sisteme de operare, cum ar fi partajarea timpului sau memoria virtuala, sa fie posibila pe tot mai multe sisteme. Astfel, desi protectia fisierelor pe un sistem izolat nu pare a fi necesara, in momentul in care sistemele izolate sunt interconectate si utilizatorii altor sisteme capata acces la fisierele unui PC, protejarea fisierelor devine o facilitate necesara intr-un astfel de sistem de operare. De fapt, analizand evolutia unor concepte ale sistemelor de operare pentru mainframe-uri si microcomputere pune in evidenta faptul ca diferitele caracteristici disponibile la un moment dat mainframe-urilor au fost adoptate ulterior de catre microcomputere. De exemplu, sistemul MULTICS, dezvoltat in perioada 1965--1970 la MIT a functionat initial pe un computer mainframe complex(numit GE 645). Multe dintre ideile utilizate in dezvoltarea MULTICS au fost ulterior utilizate in dezvoltarea sistemului de operare UNIX. UNIX a fost initial conceput pentru un microcalculator PDP-11, in 1970. In anii 1980, caracteristicile UNIX sunt folosite ca baze pentru sistemele de operare tip UNIX ruland pe microcomputere, multe dintre ele figurand in sisteme de operare ca Microsoft Windows, IBM OS/2, Macintosh Operating System version 7 si altele. Astfel, caracteristici initial dezvoltate pentru sisteme mainframe mari s-au "mutat" in timp la sistemele PC. Pe masura ce caracteristicile sistemelor de operare pentru calculatoare mari au fost scalate in jos pentru a se potrivi sistemelor PC, au fost dezvoltate sisteme hardware din ce in ce mai puternice, rapide si sofisticate. Statia de lucru personala este un calculator personal mare, cum ar fi SUN, HP/APOLLO sau IBM RS/6000. Pe masura ce PC-urile devin tot mai puternice din punct de vedere hardware si software, linia care desparte (inca) cele doua "rase" devine tot mai palida. 1.2.6 Sisteme paralele Majoritatea sistemelor actale sunt sisteme mono-procesor; adica sunt dotate cu o singura CPU. Spre deosebire de acestea, sistemele multiprocesor poseda mai mult de un singur procesor, in comunicare stransa, folosind impreuna acelasi ceas sistem, magistrala si chiar dispozitive periferice sau memorie. Astfel de sisteme sunt referite ca sisteme cuplate strans. Exista mai multe motive pentru a construi astfel de sisteme. Prin cresterea numarului de procesoare, ne putem astepta sa obtinem mai multe lucrari indeplinite intr-o perioada de timp mai scurt. Factorul de crestere a vitezei pentru n procesoare nu este egal cu n, ci mai degraba este mai mic decat n. Cand mai multe procesoare coopereaza pentru o lucrare, o anumita cantitate de efort este utilizata pentru a face ca totul sa functioneze corect. Aceasta, impreuna cu disputa pentru resursele partajate, determina scaderea castigului asteptat prin cresterea numarului de procesoare. Sistemele multiprocesor, de asemenea, sunt mai ieftine decat mai multe sisteme cu un singur procesor lucrand impreuna datorita faptului ca intr-un sistem multiprocesor perifericele, si alte elemente hard pot fi partajate intre toate aceste procesoare. Daca mai multe programe urmeaza sa foloseasca aceleasi seturi de date, este mult mai ieftin ca aceste date sa se gasesca pe un singur disc partajat de catre procesoarele prezente in sistem. Un alt motiv al utilizarii sistemelor multiprocesor este cresterea reliabilitatii. Daca functiile (unui program) pot fi distribuite corespunzator intre mai multe procesoare, o defectiune a unui dintre ele nu va avea ca efect blocarea intregului sistem, ci mai degraba incetinirea acestuia, procesoarele ramase in functiune fiind nevoite sa preia o parte din sarcinile procesorului care a esuat. Capacitatea de a continua

oferirea serviciilor proportional cu nivelul de hardware functional se numeste degradare gratioasa. Sistemele care sunt proiectate pentru aceasta degradare se numesc fail-soft. Cele mai uzuale sisteme cu procesoare multiple folosesc modelul multiprocesarii paralele, in care fiecare dintre procesoare ruleaza cate o copie identica a sistemului de operare, iar aceste copii comunica unele cu altele dupa cum este necesar. Exista sisteme care folosesc multiprocesarea simetrica, in care fiecarui proces ii este atribuita o sarcina specifica. Un procesor principal controleaza intregul sistem, in timp ce celelalte procesoare asteapta instructiuni de la procesorul principal sau au sarcini predefinite. Prin aceasta schema se defineste o relatie de tip master-slave. Procesorul master este cel care aloca si planifica activitatea procesoarelor slave. Multiprocesare asimetrica este mai des intalnita in cazul sistemelor extrem de mari, in care printre activitatile mari consumatoare de timp se gasesc procesarile I/O. In vechile sisteme cu procesare in loturi, procesoare mai mici, situate la o oarecare distanta de unitatea centrala, erau utilizate pentru a manipula cititoarele de cartele si imprimantele (de linie) si pentru a transfera lucrarile la si de la computerul principal. Aceste locatii se numesc locuri pentru intrari de lucrari la distanta (remote job entry, RJE). Intrun sistem cu partajarea timpului (time-sharing), o activitate I/O de baza este procesarea caracterelor intre terminale si calculator. Daca CPU principala ar trebui sa accepte intreruperi pentru fiecare caracter de la fiecare terminal, ar fi foarte probabil ca ar trebui sa-si petreaca mare parte a timpului doar pentru a procesa caractere. Cum o astfel de situatie trebuie sa fie evitata, najoritatea sistemelor poseda un procesor dedicat manipularii tuturor terminalelor I/O. Acesta actioneaza ca un buffer intre terminale si CPU de baza, permitand acesteia sa manipuleze linii si blocuri de caractere, in loc de caractere individuale. Astfel de sisteme sufera de o sigurante scazute in schimbul unei specializari crescute. Este important de stiut faptul ca diferenta intre multiprocesarea simetrica si multiprocesarea asimetrica poate rezulta fie la nivel hardware fie la nivel software. Pot exista echipamente hard specializate pentru a diferentia procesoarele multiple, sau software-ul poate fi scris pentru a permite un procesor master si mai multe slave. Pe masura ce microprocesoarele devin tot mai putin costisitoare si mai puternice, functii suplimentare ale sistemului de operare sunt transferate procesoarelor slave. De exemplu, nu este dificila adaugarea unui procesor cu memorie proprie pentru a gestiona sistemul de disc. Acesta ar putea receptiona o secventa de cereri de la CPU principala si ar putea implementa coada proprie si algoritmi de planificare proprii. Prin aceasta adaptare CPU principala scapa de sarcina planificarii discului. De exemplu, in cazul IBM PC, tastatura contine un microprocesor destinat transformarii apasarilor de taste in coduri transmise CPU. [Acesta utilizare a microprocesoarelor este atat de des intalnita incat nu mai este considerata multiprocesare.] 1.2.7 Sisteme distribuite O tendinta in sistemele de calcul este distribuirea calcului intre mai multe procesoare. Spre deosebire de sistemele cuplate strans, procesoarele nu mai partajeaza memoria sau ceasul. In schimb, fiecare procesor poseda o memorie (locala) proprie. Procesoarele comunica intre ele pe diferite linii de comunicatie. Astfel de sisteme se numesc cuplate slab, sau sisteme distribuite. Procesoarele intr-un sistem distribuit pot varia in dimensiune si functii. Acestea pot include microprocesoare, statii de lucru, minicalculatoare sau sisteme de calcul mari. Aceste procesoare sunt referite prin nume diferite site, nod, calculator, etc in functie de contextul in care sunt mentionate. Exista numeroase motive pentru a construi sisteme distribuite: Partajarea resurselor Daca un numar de calculatoare diferite (cu posibilitati diferite) sunt conectate intre ele, atunci un utilizator al unui calculator poate fi capabil sa utilizeze resurse disponibile pe un alt calculator. Astfel, partajarea resurselor intr-un sistem distribuit ofera mecanisme pentru partajarea fisierelor pe locatii la distanta, procesarea informatiilor intr-o baza de date distribuita, tiparirea fisierelor la distanta, utilizarea de dispozitive hardware specializate la distanta sau realizarea altor operatii. Cresterea vitezei de calcul Daca in cazul unui calcul acesta poate fi impartit intr-un numar de sub-calcule care pot rula concurent, atunci un sistem distribuit ne poate permite sa distribuim calculul intre diferite calculatoare, pentru a rula calculele concurent. In plus, daca un calculator este supraincarcat cu lucrari, unele dintre acestea ar putea

fi transferate pe alte calculatoare, mai putin incarcate. Acest transfer de lucrari se numeste partajarea incarcarilor. (load sharing) Siguranta Daca un calculator dintr-o retea distribuita esueaza, celelalte calculatoare ar trebui sa isi poata continua lucrul. Astfel, daca sistemul este compus dintr-un numar de instalatii autonome, esecul uneia dintre acestea nu ar trebui sa le afecteze si pe celelalte. In schimb, daca sistemul este compus dintr-un numar de sisteme mici, fiecare responsabil cu anumite functii cruciale pentru sistem, atunci un simplu esec poate efectiv intrerupe activitaeta intregului sistem. In general, daca exista destula redundanta in sistem (atat la nivel hardware cat si la nivel de date), sistemul isi poate continua functionarea chiar daca anumite componente ale sistemului esueaza. Comunicare Exista numeroase situatii in care programele au nevoie de a schimba date intre ele. Cand un numar de calculatoare sunt conectate intre ele printr-o retea de comunicatie, procesele aflate pe calculatoare diferite au posibilitatea de a schimba informatii intre ele. Structura sistemelor de calcul 1.1 Functionarea sistemului de calcul Un sistem de calcul modern este constituit dintr-o CPU si un numar de controllere de dispozitiv care sunt interconectate prin intermediul unei magistrale comune care ofera acces la memoria partajata. Fiecare controller este responsabil pentru un anumit tip de dispozitive (unitati de disc, monitoare etc.) CPU si controllerele pot functiona concurent, concurand pentru ciclurile de memorie. Pentru a asigura un acces ordonat la memoria partajata, este functional un controller de memorie a carui functie este de a sincroniza accesul la memorie. Pentru ca un calculator sa inceapa sa functioneze este nevoie ca pe acesta sa existe un program initial apt de functionare. Acest program initial (program de boot, bootstrap program) tinde sa fie simplu. Sarcinile acestui program consta in initializarea tuturor aspectelor sistemului, de la registrele CPU pana la controllerele de dispozitive si continutul memoriei. Programul de boot trebuie sa stie cum sa incarce sistemul de operare si cum sa inceapa executia acestuia. Pentru a atinge acest scop, programul boot trebuie sa identifice pozitia nucleului sistemului de operare si sa il incarce in memorie. Apoi sistemul de operare urmeaza sa inceapa executia primului proces, procesul init, dupa care asteapta aparitia evenimentelor. Aparitia unui eveniment este de obicei semnalata printr-o cerere de intrerupere venita fie de la hardware fie de la software. Hardware-ul poate declansa o intrerupere oricand prin trimiterea unui semnal catre CPU, de obicei prin intermediul magistralei sistemului. Software-ul poate declansa o intrerupere prin executarea unei operatiuni speciale, numita apel sistem (uneori apel monitor). Exista numeroase tipuri de evenimente care pot declansa o intrerupere (terminarea unei operatiuni I/O, diviziune prin zero, acces memorie invalid etc.) si cere servicii din partea sistemului de operare. Pentru fiecare astfel de intrerupere, este oferita o rutina de deservire responsabila pentru realatia cu intreruperea. Cand CPU este intrerupta, aceasta opreste activitatea curenta si transfera imediat executia la o locatie fixa. Aceasta locatie fixa contine de obicei adresa de start a rutinei pentru tratarea intreruperii. Este executata apoi rutina pentru tratarea intreruperii, iar la incheierea acesteia CPU isi continua activitatea intrerupta anterior. Intreruperile sunt o parte extrem de importanta in arhitectura unui calculator. Fiecare proiectare a unui calculator poseda un mecanism propriu de intreruperi. Totusi, anumite functii sunt universale. O intrerupere trebuie sa transfere controlul rutinei potrivite pentru tratarea intreruperii. Metoda directa de a manipula acest transfer ar fi invocarea unei rutine generice care sa examineze informatiile intreruperii si care, la randul ei, sa apeleze handlerul specific intreruperii. Totusi, intreruperile trebuie sa fie tratate extrem de rapid, si datorita faptului ca numarul de intreruperi posibile este predefinit, poate fi utilizata o tabela de pointeri la handler-ele intreruperilor. In aceasta situatie, intreruperile sunt apelate indirect prin intermediul acestei tabele, fara a mai fi necesara o rutina intermediara. In general, aceasta tabela de pointeri se gaseste in memoria inferioara (primele 100 de locatii, de exemplu). Aceste locatii pastreaza adresele rutinelor de tratare ale intreruperilor pentru diverse dispozitive. Acest tablou de adrese, numit vector de intreruperi, este apoi indexat printr-un numar de dispozitiv unic, care este specficat impreuna cu cererea de intrerupere, pentru a oferi adresa rutinei de deservire (tratare) a intreruperii pentru dispozitivul

care solicita intreruperea. [Sisteme de operare foarte diferite, cum ar fi MS-DOS sau UNIX, trateaza intreruperile in acest mod.] Arhitectura intreruperilor trebuie de asemenea sa salveze adresa instructiunii intrerupte. In multe dintre modelele vechi, adresa instructiunii intrerupte era depozitata intr-o locatie fixa, sau o locatie indexata cu numarul dsipozitivului. In arhitecturile mai recente se depoziteaza adresa de intoarcere in stiva sistem. Daca rutina de intrerupere trebuie sa modifice, de exemplu, starea procesorului prin modificarea valorilor registrilor, va trebui sa salveze explicit starea curenta si sa o restaureze inainte de a-si termina executia. Dupa ce intreruperea este tratata, adresa de intoarcere salvata este incarcata in contorul (de) program (PC), iar operatia intrerupta va continua ca si cum nu ar fi avut loc vreo intrerupere. De obicei, intreruperile sunt dezactivate in timp ce o alta intrerupere este procesata, intarziind orice alte intreruperi pana cand sistemul de operare o incheie pe cea curenta, dupa care intreruperile sunt din nou activate. Daca intreruperile n-ar fi fost dezactivate, tratarea unei a doua intreruperi in timpul servirii primei intreruperi ar fi suprascris datele primei intreruperi, iar prima ar fi devenit o intrerupere pierduta. Arhitecturile sofisticate de (tratare a) intreruperi permit totusi ca o intrerupere sa poata fi procesata in timp ce o alta intrerupere este tratata. Deseori se foloseste o schema de prioritate in care tipurilor de cereri le sunt asignate prioritati in concordanta cu importanta lor relativa. O intrerupere de prioritate inalta va fi abordata chiar daca o intrerupere de nivel inferior este activa, pe cand intreruperile de acelasi nivel sunt mascate, sau dezactivate selectiv, pentru a preveni pierderea intreruperilor sau aparitia unor intreruperi care nu sunt necesare. Sistemele de operare moderne sunt orientate spre intreruperi. Daca nici un proces nu se executa, nici un dispozitiv I/O nu este deservit, si nu exista utilizatori carora sa i se raspunda, un sistem de operare va sta in liniste, asteptand sa se intample ceva. Evenimentele sunt aproape totdeauna semnalate prin aparitia unei intreruperi sau a unei trape (trap). O trapa (sau o exceptie) este o intrerupere generata soft determinata fie de o eroare (impartire la zero, acces memorie invalid etc.) fie de o cerere particulara a unui program utilizator prin care este cerut un serviciu al sistemului de operare. Natura orientata catre intreruperi a unui sistem de operare defineste structura generala a acelui sistem. Cand o intrerupere (sau exceptie) are loc, harware-ul transfera controlul sistemului de operare. Intai sistemul de operare conserva starea CPU depozitand registrele si contorul program. Apoi, determina ce tip de intrerupere a avut loc. Aceasta determinare ar putea necesita polling, interogarea tuturor dispozitivelor I/O pentru a determina care dintre acestea a cerut serviciul, sau poate fi un rezultat natural a unui sistem de intreruperi vectorizat. Pentru fiecare tip de intrerupere, segmente separate de cod in sistemul de operare determina ce actiune urmeaza sa fie abordata. 1.2 Structura (sistemului) I/O Asa cum am specificat deja, un sistem de calcul este format dintr-o CPU si un numar de controllere de dispozitive conectate prin intermediul unei magistrale. Fiecare dintre aceste controllere este responsabil pentru un anumit tip de dispozitiv. In functie de tipul controllerului, pot exista mai multe dispozitive atasate acestuia. Un controller de dispozitiv mentine cateva buffere locale si o multime de registrii specializati. Controllerul este responsabil cu mutarea datelor intre dispozitivele periferice pe care le controleaza si bufferee locale. Marimea acestor buffere variaza de la un controller la altul, depinzand de dispozitivul particular care este controlat. 1.2.1 Intreruperi I/O Pentru a incepe o operatie I/O, CPU incarca registrii potriviti in controllerul dispozitivului. Controllerul, la randul lui, examineaza continutul acestor registri pentru a determina actiunea pe care o va realiza. Astfel, daca gaseste o cerere de citire, controllerul va initia transferul datelor de la dispozitiv catre bufferul sau local. Odata acest transfer incheiat, controllerul informeaza CPU ca a terminat operatiunea, aceasta comunicare realizandu-se prin producerea unei intreruperi. Aceasta situatie va aparea, in general, ca rezultat al unui proces utilizator care cere o operatie I/O. Odata ce operatiunea I/O este pornita, exista doua desfasurari posibile ale actiunii. In cel mai simplu caz, operatia I/O este pornita; apoi la indeplinirea acesteia, controlul este redat programului utilizator. Aceasta este numeste I/O sincron. Cealalta posibilitate (I/O asincron) este de a reda controlul programului utilizator fara a astepta terminarea operatiunii I/O. Apoi operatia I/O poate continua, in timp ce alte operatii ale sistemului pot avea loc.

Asteptarea terminarii (indeplinirii) operatiunii I/O se poate realiza in doua moduri. ANumite calculatoare sunt "inzestrate" cu o instructiune speciala wait care provoaca o pauza a CPU pana la urmatoarea intrerupere. Masinile care nu sunt dotate cu aceasta instructiune pot avea un ciclu wait: Loop: jmp Loop Acest ciclu pur si simplu continua sa tina CPU "ocupata" pana la aparitia unei intreruperi, transferand controlul unei alti parti a sistemului de operare. O astfel de bucla ar putea de asemenea sa poll orice dispozitiv I/O care nu suporta structura de intrerupere; in loc de aceasta ele pur si simplu fixeaza un indicator in unul dintre registrii proprii si asteapta ca sistemul de operare sa observe aceasta, Instructiunea wait este probabil mai potrivita decat un ciclu, aceasta deoarece un ciclu de asteptare genereaza o serie de instructiuni false care pot determina dispute semnificative pentru accesul la memorie. Disputa este determinata de dispozitivele I/O care transfera informatie si de instructiunile de transfer ale CPU. Asteptarea terminarii operatiunilor I/O prezinta avantajul major ca cel mult o operatiune I/O este in desfasurare la un moment dat. Astfel, de fiecare data cand are loc o intrerupere I/O, sistemul de operare cunoaste exact care este dispozitivul care determina intreruperea. Pe de alta parte insa, aceasta abordare exclude procesarile I/O simultane. O alternativa este de a porni operatiunea I/O si imediat sa se intoarca controlul programului utilizator. un apel sistem (sau o cerere catre catre sistemul de operare) este apoi necesara pentru a permite utilizatorului sa astepte terminarea I/O. Cu alte cuvinte, si in aceasta situatie este necesar codul de asteptare la fel ca inainte. De asemenea trebuie sa fim capabili sa urmarim mai multe cereri I/O in acelasi timp. Pentru acest scop, sistemul de operare utilizeaza o tabela continand cate o intrare pentru fiecare dispozitiv I/O: tabela de stare a dispozitivelor. Fiecare intrare de tabel indica tipul dispozitivului, adresa acestuia, si starea. Daca dispozitivul este ocupat cu o cerere, tipul cererii si alti parametrii vor fi depozitati in intrarea de tabel pentru acest dispozitiv. Deoarece este posibil ca alte procese sa emita cereri catre acelasi dispozitiv, vom avea o lista (inlantuita) de cereri in asteptare. Astfel, in plus fata de tabela dispozitivelor I/O, un sistem de operare poate pastra o lista de cereri pentru fiecare dispozitiv in parte. Un dispozitiv I/O intrerupe cand are nevoie de un serviciu. Cand are loc o intrerupere, sistemul de operare intai determina care dispozitiv I/O a cauzat intreruperea. Apoi indexeaza in tabela dispozitivului I/O pentru a determina starea dispozitivului, si modifica intrarea de tabel penrtu a reflecta aparitia intreruperii. Pentru majoritatea dispozitivelor, o intrerupere semnaleaza indeplinirea unei cereri I/O. Daca exista cereri aditionale pentru acest dispozitiv, sistemul de operare va incepe sa proceseze urmatoarea cerere. Intr-un final, controlul este intors din intreruperea I/O. Daca exista un proces care asteapta terminarea acestei cereri (situatie reflectata in tabela de stare a dispozitivului), putem acum sa ii intoarcem controlul. In caz contrar, controlul se intoarce activitatii care se executa inaintea intreruperii I/O: executarea programului utilizator (programul a initiat operatia I/O, care acum s-a incheiat, dar programul inca nu a asteptat incheierea operatiei) sau bucla de asteptare (programul a initiat doua sau mai multe operatii I/O si asteapta ca o anume operatie sa se incheie, dar aceasta intrerupere a fost una din celelalte...). Intr-un sistem cu partajarea timpului, sistemul de operare ar putea comuta la un alt proces pregatit pentru rulare. Principalul avantaj al operatiilor I/O asincrone consta in cresterea eficientei sistemului. In timp ce I/O au loc, CPU poate fi utilizata pentru procesare sau chiar pentru planificarea altor operatii I/O. Deoarece operatiile I/O pot fi chiar lente comparativ cu viteza procesorului, sistemul isi va utiliza mult mai bine facilitatile. 1.2.2 Structura DMA Sa consideram un driver de intrare pentru un terminal simplu. Cand urmeaza sa fie citita o linie de la acest terminat, primul caracter tiparit este trimis calculatorului. Cand acest caracter este receptionat, dispozitivul asincron de comunicatie la care este conectat terminalul va intrerupe CPU. Cand cererea de intrerupere de la terminal soseste, CPU probabil ca este pe cale sa execute niste instructiuni. [Daca insa CPU este in mijlocul executiei unei instructiuni, intreruperea va fi mentinuta in asteptare pana la incheierea executiei instructiunii.] Adresa instructiunii intrerupte este salvata iar controlul este transferat rutinei de deservire a intreruperii pentru dispozitivul potrivit. Rutina de deservire a intreruperii salveaza continutul tuturor registrilor CPU de care va avea nevoie. Verifica apoi orice conditie de eroare care ar fi putut rezulta in urma ultimei operatii de intrare. Apoi preia caracterul de la dispozitiv si il depoziteaza intr-un buffer. Rutina intreruperii trebuie de asemenea sa ajusteze pointerul si variabila contor pentru a se asigura ca urmatoarea intrare de caracter va fi depozitata

in urmatoarea pozitie a bufferului. Rutina de intrerupere va fixa apoi un indicator in memorie pentru a indica celorlalte parti ale sistemului de operare ca a fost receptionata o noua intrare. Celelalte parti sunt responsabile cu procesarea datelor din buffer si transferul caracterelor catre programul care a cerut intrarea. Apoi, rutina de deservire a intreruperii restaureaza continutul registrilor salvati si transfera controlul inapoi instructiunii intrerupte. Daca caracterele sunt tiparite la un terminal de 9600-baud, acesta poate accepta si transfera cam un caracter la fiecare milisecunda (1000 de microsecunde). O rutina de deservire a intreruperii pentru introducerea caracterelor intr-un buffer, bine scrisa, poate avea nevoie de doua microsecunde pe caracter, ceea ce inseamna 998 de microsecunde nefolosite de CPU pentru alte operatii (calcule, deservirea altor intreruperi). Data fiind aceasta situatie, operatiile I/O asincrone capata de obicei o prioritate de intrerupere scazuta, permitand altor intreruperi mai importante sa fie procesate, sau chiar sa pre-evacueze intreruperea curenta pentru o alta intrerupere. Un dispozitiv de inalta viteza (banda, disc, comunicatie pe retea) s-ar putea sa fie capabil sa transmita informatii aproape la viteza memoriei; CPU va avea nevoie de 2 microsecunde pentru a raspunde la fiecare intrerupere, cu intreruperi la fiecare 4 microsecunde, de exemplu. O astfel de situatie nu va lasa prea mult timp executiei procesului. Pentru a rezolva aceasta situatie, se foloseste accesul direct la memorie (DMA) pentru dispozitive I/O de inalta viteza. Dupa ce sunt setate bufferele, pointerii si contoarele dispozitivului I/O, controllerul dispozitivului transfera un intreg bloc de date din sau catre bufferul propriu direct in memorie, fara interventia CPU. Este generata astfel o singura intrerupere pe bloc, in loc de cate o intrerupere pentru fiecare octet (byte, cuvant) cum se intampla in cazul dispozitivelor de viteza mica. Functionarea de baza a CPU este aceeasi. Un program utilizator, sau chiar sistemul de operare, poate cere un transfer de date. Sistemul de operare gaseste un buffer (un buffer gol pentru intrare sau un buffer plin pentru iesire) dintr-o coada de buffere pentru transfer. Controllerul DMA isi fixeaza apoi registrele la adresele sursa si destinatie corespunzatoare. Setarea registrelor este de obicei realizata de un device driver, care stie exact modul in care urmeaza sa furnizeze aceasta informatie controllerului. Apoi controllerul DMA este instruit (prin intermediul bitilor de control dintr-un registru de control) sa inceapa operatia I/O. Intre timp, CPU este liber sa execute alte sarcini din moment ce informatiile de transfer au fost date controllerului. Controllerul DMA intrerupe CPU doar cand transferul a fost terminat. Intr-un IBM PC, acesta suporta atat operatii I/O bazate pe intreruperi, cat si canalele DMA. Astfel, programul backup folosit de sistemul de operare MS-DOS, foloseste numai operatii I/O bazate pe intreruperi pentru a copia datele intre harddisk si unitatea floppy. Programe similare au fost scrise avand in vedere avantajele transferului de date DMA, ceea ce a insemnat o crestere semnificativa in viteza realizarii backup-ului. 1.3 Structuri de depozitare Pentru ca un calculator sa-si indeplineasca sarcinile de executie a programelor, acestea trebuie sa se gaseasca in memoria principala. Memoria principala este singura zona mare de depozitare (a informatiei) pe care procesorul o poate accesa direct. Aceasta este un tablor de cuvinte (octeti), a carei dimensiune variaza intre sute de mii si sute de milioane (de octeti). Fiecare cuvant are adresa proprie. Interactiunea este obtinuta printr-o secventa de instructiuni load sau store pentru locatii specifice de memorie. Instructiunea load muta un cuvant din memoria principala intr-un registru intern al CPU, in timp ce instructiunea store muta continutul unui registru in memoria principala. In afara de instructiuni load si store explicite, CPU incarca automat instructiuni din memoria principala in vederea executiei. Un ciclu de executie a unei instructiuni tipic (asa cum se executa el pe o arhitectura de sistem von Neumann) va aduce intai o instructiune din memorie si o va depozita in registrul de isntructiuni. Instructiunea este apoi decodata si poate determina aducerea unor operanzi din memorie in vederea stocarii in niste registrii interni. Dupa ce a fost executata instructiunea asupra operanzilor, rezultatul va putea fi stocat inapoi in memorie. Sa observam ca unitatea de memorie vede doar un sir de adrese de memorie; nu are nici o idee asupra felului in care acestea au fost generate sau la ce folosesc acestea. Prin urmare, putem ingnora felul in care este generata o adresa de memorie de un program. De fapt suntem interesati numai de secventa de adrese de memorie generate de un program care ruleaza. In mod ideal, vom dori ca datele si programele sa se gaseaca in memoria principala in mod permanent. Aceasta insa nu este posibil din urmatoarele motive:

1. Memoria principala este in general prea mica pentru a depozita in permanenta toate programele si datele. 2. Memoria este un dispozitiv de depozitare volatil, adica intregul sau continut se pierde cand alimentarea calculatorului dispare. Astfel, majoritatea sistemelor de calcul ofera dispozitive secundare de depozitare ca extensii ale memoriei principale. Principala cerinta asupra dispozitivelor secundare este astfel capacitatea de a pastra un numar extrem de mare de informatii in mod permanent. 1.3.1 Memoria principala Memoria principala si registrii construiti in interiorul procesorului sunt singurele zone de stocare pe care CPU le poate accesa direct. Prin urmare, orice instructiuni in executie, si orice date utilizate de instructiuni trebuie sa se gaseasca in unul dintre aceste dispozitive de depozitare cu acces direct. Daca datele necesare nu se gasesc in memorie, acestea trebuie mutate acolo inainte ca CPU sa poata opera asupra lor. In cazul operatiilor I/O, fiecare controller I/O include registrii care pastreaza comenzile si datele care se transfera. In mod uzual, instructiuni I/O speciale permit transferul de date intre acesti registrii si memoria sistemului. Pentru a oferi un acces mai convenabil la dispozitivele I/O, anumite sisteme asigura memorymapped I/O. In acest caz, domenii de adrese de memorie sunt fixate (deo)aparte, si sunt mapate fizic asupra registrilor dispozitivelor. Citirile si scrierile in aceste adrese de memorie determina transferul informatiilor la si de la registrii dispozitivelor. Aceasta metoda este potrivita pentru dispozitive cu viteza de raspuns mare, cum ar fi controllerele video. [Astfel, in cazul sistemelor IBM/PC, fiecare pozitie a ecranului este mapata pe o locatie de memorie. Afisarea textului pe ecran este astfel aproape la fel de simplu ca scrierea acestuia in locatiile de memorie mapate potrivite.] Aceasta metoda este de asemenea convenabila pentru dispozitive cu utilizare frecventa, cum ar fi porturile seriale. Sa observam ca "numararea" este din nou necesara intr-o asemenea situatie, cu calculatorul cicland, verificand in mod constant pentru a vedea cand un caracter este pregatit pentru citire. Intreruperile pentru semnalarea disponibilitatii unei noi intrari poate fi utilizata in loc de acasta, functie de configuratia hardware. Dat find ca registrii sunt parte a CPU, acestia sunt accesibili intr-un singur ciclu de ceas al CPU. CPU poate decodifica o instructiune si executa operatia data asupra continutului unui registru in acelasi tact de ceas. Nu se poate spune acelasi lucru despre memoria principala, care ar putea fi localizata pe o magistrala sistem iar accesul poate lua mai multe cicluri de ceas. In acest caz, procesorul in mod normal are nevoie sa se blocheze asteptand terminarea accesului. O astfel de situatie este, evident, de netolerat, dat fiind frecventa mare a acceselor la memorie. Remediul consta in adaugarea unei memorii rapide intre CPU si memoria principala. Un buffer de memorie utilizat pentru adaptarea la diferenta de viteza se numeste cache. 1.3.2 Discuri magnetice Discurile magnetice ofera cea mai mare parte a dispozitivelor secundare de depozitare intr-un sistem de calcul modern. Din punct de vedere fizic, discurile sunt relativ simple. Fiecare platan de disc are o forma ciculara, plata. Cele doua suprafete ale sale sunt acoperite cu un material magnetic, similar cu benzile magnetice. Informatia este inregistrata pe aceste suprafete. Cand un disc este in utilizare, motorul unitatii roteste discul la viteze inalte (de obicei, 60 rotatii pe minut). Un cap de citire-scriere este pozitionat deasupra suprafetei discului. Suprafata discului este divizata logic in piste, care la randul lor sunt impartite in sectoare. Informatia este depozitata prin inregistrarea acesteia magnetic pe sectorul care se gaseste sub capul de scriere-citire. Suprafata unui disc poate contine sute de piste concentrice, impartite in mii de sectoare. Chiar si dimensiunile platanelor variaza intre 1.8 si 14, discurile de dimensiuni mai mici fiind caracteristice sistemelor PC, datorita costurilor reduse dar si a dimensiunilor mai mici. Un disc cu cap fix este inzestrat cu cate un cap pentru fiecare pista. Prin aceasta modificare calculatorul poate comuta extrem de rapid de la o pista la alta, in schimb numarul de capete de scriere citire creste considerabil, facand ca aceste dispozitive sa devina extrem de scumpe. Uzuale sunt discurile cu un singur cap de scriere-citire, care se misca de-a lungul discului pentru a accesa diferitele piste. Discul cu cap mobil, sau hard-disk, cere dispozitivului sa (comande) mute capul, dar cum este nevoie de un singur cap,

costul este mult mai mic. Diferitele platane, montate pe un ax si inconjurate de capetele descriere-citire, conduse de un motor, formeaza "head-disk assemblies". Functia initiala a discurilor era de depozitare a fisierelor, astfel incat primele criterii in constructia discurilor au fost pretul, marimea si viteza. Pentru a creste capacitatea de depozitare, dezvoltatorii au avut in vedere mai multe abordari. Primul castig a fost obtinut prin imbunatatirea densitatii de inregistrare, permitand ca mai multi biti sa fie depusi pe suprafata. Aceasta densitate este reflectata de numarul de piste pe inch (TPI), sectoare pe pista si biti pe sector. In plus, cu capete de citire separate pentru fiecare parte a unui platan, capacitatea discului se poate dubla pentru un pret de cost minim. Putem extinde aceasta abordare suprapunand mai multe discuri, fiecare cu cate doua suprafete de inregistrare, pe acelasi ax. Deoarece toate discurile se invart impreuna, este necesar un singur motor, desi fiecare suprafata are inca nevoie de propriul cap de scriere-citire. Aceste discuri variaza in functie de rata de transfer a informatiei intre 1 si 5 MB/sec. Viteza medie de acces, incluzand timpul necesar pozitionarii capului deasupra datelor cerute, este intre 10 si 40 milisecunde, in conditiile in care capacitatea variaza intre 10 MB si 7500 MB. In fine, exista discuri inlocuibile, care permit ca discuri diferite sa poata fi montate, dupa cum este necesar. Pachetele de astfel de discuri pot consta din unul sau mai multe platane fixate pe un ax. In general, sunt mentinute in carcase din plastic dur pentru a preveni deterioararea in perioada in care nu se gasesc in unitate. Discurile sunt platouri dintr-un metal rigid sau sticla, acoperite cu un material magnetic de inregistrare. Fiecare platou este divizat in sectiuni foarte mici, iar fiecare dintre aceste sectiuni poate fi modificata de catre capul de scriere-citire al discului pentru a se gasi in starea incarcat sau neincarcat. In functie de aceasta stare, fiecare sectiune poate reprezenta una dintre valorile 0 sau 1. Cu cat este mai mica o astfel de sectiune, cu atat mai multa informatie poate fi depusa pe suprafata, crescand astfel densitatea. Pentru a putea creste aceasta densitate, capetele de scriere-citire sunt tinute cat mai aproape posibil de suprafata discului. Deseori capetele se gasesc la cativa microni deasupra suprafetei discului, suportate doar de o pelicula de aer. Floppy-diskurile au nevoie de o abordare diferita. Discurile sunt imbracate cu o suprafata dura, astfel incat capul de citire-scriere se poate gasi chiar pe suprafata discului, fara a distruge datele. Astfel, discul este mult mai usor de produs si utilizat, iar pretul acestuia poate fi pastrat extrem de redus. Datorita frecarii insa, un flopy-disk se va roti mult mai incet decat un hard-disk. De asemenea, imbracamintea (si capul de citire-scriere) se vor uza in timp si vor necesita inlocuirea. Deoarece sunt mult mai "grosolane", acest tip de discuri sunt inlocuibile. Discurile nu sunt montate permanent intr-un ansamblu cap-disc, insa pot fi introduse manual intr-o deschizatura care contine un ax care sa-l poata roti, si un motor si cap pentru a permite accesarea discului. Prin aceasta costurile pentru acest tip de discuri este pastrat extrem de scazut, deoarece o aceeasi unitate poate fi folosita pentru a accesa sute sau mii de discuri diferite. Discurile flexibile au de obicei o capacitate de depozitare mult mai mica decat discurile fixe deoarece densitatea de depozitare este mult mai scazuta, sunt dotate cu un singur platou iar viteza de rotatie este de asemenea scazuta. Capacitatea unui disc flexibil variaza intre cateva sute de kB pana la cativa mB. De asemenea, dimensiunile discurilor variaza in functie de densitate (simpla, dubla), numarul de fete utilizate (una sau doua) sau marime (3 1/2 sau 5 1/4). In general, discurile flexibile sunt formatate si utilizate in acelasi mod cu discurile fixe, cu marea diferenta ca discurile flexibile fiind inlocuibile pot fi un instrument extrem de convenabil pentru a transporta informatii intre mai multe sisteme. O unitate de disc poseda un controller de disc care determina interactiunea logica intre dispozitiv si calculator. Controllerul preia instructiunile de la CPU si cere unitatii de disc sa indeplineasca aceste instructiuni. Exista posibilitatea ca anumite unitati de disc sa fie dotate cu o zona cache incorporata, capabila sa pastreze datele citite/scrise recent pe disc. Astfel, accesul la date aflate pe disc care se gasesc in cache devine inutil. 1.4 Ierarhia dispozitivelor de depozitare Marea diversitate a dispozitivelor de stocare care se pot gasi intr-un sistem de calcul pot fi organizate intro ierarhie in functie de viteza si cost. Nivelele mai inalte ale ierarhiei sunt mai costisitoare, dar mai rapide. Pe masura ce coboram in aceasta ierarhie, costul pe bit scade, in defavoarea timpului de acces, care creste.

In plus fata de viteza si costul diferitelor dispozitive de stocare, trebuie luat in considerare si caracterul volatil al dispozitivelor. Dispozitivele de depozitare volatile isi pierd continutul la pierderea alimentarii. In lipsa unor baterii (permanente) costisitoare si a unor sisteme de generare de backup, datele trebuie sa se gaseasca depozitate pe un mediu nevolatil pentru siguranta. In ierarhia mentionata anterior, sistemele de depozitare care se gasesc deasupra sistemelor cu disc sunt volatile, in timp ce cele care se gasesc sub memoria principala sunt nevolatile. La proiectarea unui sistem de memorare complet se incearca realizarea unui echilibru intre toti acesti factori: se va folosi cantitatea minima necesara de dispozitive de memorare costisitoare, in timp ce pentru dispozitivele de memorare nevolatile, dar mai putin costisitoare, vor fi oferite cantitati cat mai mari posibil. Dispozitive cache pot fi instalate pentru imbunatatirea performantelor sistemelor in care exista diferente mari pentru timpii de acces sau rata de transfer intre componente diferite. Caching Acesta este un principiu important intr-un sistem de calcul, atat la nivel hardware cat si la nivel software. In mod normal, informatia se gaseste intr-un sistem de stocare oarecare. Pe masura ce este utilizata, este copiata intr-un sistem mai rapid de stocare, zona cache, pe o baza temporara. Atunci cand vom avea nevoie de o anumita informatie, vom verifica intai daca aceasta se gaseste in cache, in acest caz informatia fiind utilizata direct din cache; in caz contrar urmand a fi utilizata informatia din sistemul de depozitare principal (memoria principala) si depozitand o copie in cache in ideea ca exista o mare probabilitate ca aceasta informatie sa fie utilizata din nou curand. Extinzand punctul de vedere, registrele interne programabile, cum ar fi registrii de index sau acumulatorii, reprezinta zone cache de viteza inalta pentru memoria principala. Programatorul (compilatorul) implementeaza algoritmii de alocare a registrilor si de inlocuire a registrilor pentru a decide care informatie urmeaza sa fie mentinuta in registrii si care in memoria principala. Exista de asemenea zone cache care sunt implementate integral in hardware. De exemplu, majoritatea sistemelor poseda un cache pentru instructiuni, pentru a pastra urmatoarea instructiune care se asteapta sa fie executata. Fara acest cache, CPU ar trebui sa astepte mai multe cicluri pana cant instructiunea ar fi adusa din memoria principala. Datorita dimensiunii limitate, managementul cache-ului este una din problemele importante de proiectare. O alegere atenta a marimii cache-ului si a politicii de inlocuire poate determina ca 80 pana la 99 la suta din toate accesele sa se gaseasca in cache, ceea ce inseamna obtinerea unei performante extrem de mari. Memoria principala poate fi privita ca un cache rapid pentru memoria secundara, de vreme ce datele care sunt depozitate in dispozitivele secundare trebuie sa fie copiate in memoria principala in vederea utilizarii, iar datele trebuie sa se gaseasca in memoria principala inainte de a fi mutate pe dispozitivele secundare, pentru siguranta. Sistemul de fisiere, de asemenea, care trebuie sa se gaseasca pe un suport de depozitare nevolatil, poate avea mai multe niveluri de depozitare. La cel mai inalt nivel se gaseste stocarea electronica pe disc (RAM), care este sustinuta de stocarea pe discuri magnetice, oferind un suport mai mare, dar mult mai incet. La randul lor, acestea sunt sustinute de stocarea pe dispozitive care ofera un suport chiar mai mare, dar mai incet, cum este cazul stocarii pe benzi magnetice. Discurile optice sunt de asemenea medii de stocare de capacitate mare eficiente si cu un cost relativ scazut.. Totusi, comparate cu benzile magnetice, acestea poseda dezavantajul unui pret mai mare, dar ofera o viteza mult mai mare si usurinta in utilizare. Transferul intre aceste doua niveluri de depozitare este in general cerut explicit. Totusi, anumite sisteme realizeaza automat arhivarea fisierelor care nu au fost utilizate vreme indelungata si apoi acestea sunt aduse inapoi pe disc in momentul in care se face vreo referire la acestea. Mutarea informatiilor intre diferitele nivele ale unei ierarhii de depozitare pot fi fie implicite fie explicite, in functie de proiectarea hardware si de software-ul de control al sistemului de operare. Coerenta si consistenta Intr-o structura ierarhica de depozitare, aceleasi date pot aparea in diferite sisteme de stocare. De exemplu, sa consideram un intreg A care se gaseste intr-un fisier B si care este incrementat cu 1. Sa presupunem de asemenea ca fisierul B se gaseste pe un disc magnetic. Operatia de incrementare incepe prin cererea unei operatii I/O pentru copierea blocului de disc pe care se gaseste A in memoria principala. Aceasta operatie este urmata de o posibila copiere a lui A in cache, si de copierea lui A intr-un registru intern. Astfel, copii ale lui A se vor gasi in diferite locuri. Odata ce incrementarea are loc in registrul

intern, valoarea lui A va fi diferita in diferitele sisteme de stocare. Valoarea lui A devine aceeasi peste tot doar dupa ce noua valoare a lui A a fost depusa pe discul magnetic. Intr-un mediu cu un singur proces care se executa la un moment dat, aceasta reglementare nu pune nici un fel de probleme, deoarece accesul la valoarea intreaga A va reprezenta accesul la copia de la cel mai inalt nivel in ierarhie. Totusi, intr-un mediu multitasking, unde CPU comuta intre diferite procese, trebuie luate toate masurile pentru a ne asigura ca daca mai multe procese doresc sa acceseze valoarea A, atunci toate aceste procese vor obtine cea mai recenta valoare modificata a lui A. Situatia devine chiar mai compicata intr-un mediu multiprocesor unde, in afara registrilor interni, CPU contine de asemenea un cache local. Intr-un astfel de mediu, cate o copie a lui A poate exista simultan in mai multe zone cache. Deoarece diferitele CPU pot functiona concurent, trebuie sa ne asiguram ca o modificare a valorii lui A intr-un cache se reflecta imediat in toate zonele cache care contin valoarea A. Aceasta problema se numeste coerenta cache, si este de obicei o cerinta hardware (manipulata sub nivelul sistemului de operare). Intr-un mediu distribuit, situatia devine chiar mai complexa. Intr-un astfel de mediu, mai multe copii (replici) ale aceluiasi fisier pot fi mentinute pe mai multe calculatoare care sunt distribuite in spatiu. Deoarece diferitele replici pot fi accesate si actualizate concurent, trebuie sa ne asiguram ca atunci cand o replica este actualizata intr-un loc, toate celelalte replici sunt aduse la aceeasi valoare cat mai curand posibil. 1.5 Protectie hardware Primele calculatoare erau sisteme mono-utilizator, operate de catre programator. Acesta avea un control complet asupra sistemului de la consola acestuia. Odata cu dezvoltarea sistemelor de operare, controlul sistemelor a trecut in sarcina sistemelor de operare. Incepand cu monitoarele rezidente, sistemul de operare a inceput sa execute multe dintre functiile care anterior erau in sarcina programatorului. In plus, pentru a imbunatati utilizarea sistemului, sistemul de operare a inceput sa partajeze resursele intre mai multe programe simultan. Odata cu spoolingul, un program putea fi executat in timp ce un altul realiza operatii I/O, iar discul pastra simultan date pentru mai multe procese. Multiprogramarea a adus in memorie mai multe programe simultan. Aceasta partajare a determinat atat o utilizarea imbunatatita cat si probleme mai mari. Cand un sistem rula fara partajare, o eroare intr-un program putea pune probleme numai programului insusi. In schimb intr-un sistem partajat, o eroare intr-un program poate influenta numeroase alte procese. De exemplu, monitoarele rezidente timpurii nu ofereau nimic altceva decat succesiunea automata a lucrarilor. Sa presupunem ca un program se impotmoleste in bucla de citire a cartelelor de intrare. Acest program va citi toate datele proprii, apoi va continua sa citeasca datele lucrarii urmatoare, pana la sfarsitul lotului de cartele. Aceasta va afecta rularea corecta a numeroase lucrari care urmeaza. Fara o protectie impotriva acestui gen de erori, fie calculatorul va fi nevoit sa execute un singur proces la un moment dat, fie orice rezultat urmeaza a fi suspect. O proiectare exacta a unui sistem de operare trebuie sa se asigure ca programe incorecte (sau rauvoitoare) nu pot determina o executie incorecta a altor programe. Multe dintre erorile de programare sunt detectate la nivel hardware. Aceste erori sunt in mod normal manipulate de catre sistemul de operare. Daca un program utilizator esueaza cumva (printr-o incercare de executie a unei instructiuni ilegale sau a unui acces la memorie in afara spatiului de adrese), hardware-ul va initia o trap catre sistemul de operare. Aceasta transfera controlul prin intermediul vectorului de intrerupere catre sistemul de operare, intocmai ca o intrerupere. De fiecare data cand apare o eroare a unui program, sistemul de operare trebuie sa-l incheie anormal. Aceasta situatie este manipulata ca si cand ar fi vorba de o terminare anormala ceruta de utilizator. De asemenea este oferit un mesaj de eroare corespunzator iar memoria ocupata de program este golita. [Intr-un sistem cu prelucrare in loturi acest proces poate fi insotit de o listare a continutului memoriei, in vreme ce intr-un sistem interactiv listarea poate fi inlocuita cu scrierea intr-un fisier.] 1.5.1 Operare in mod dual Pentru a asigura o functionare corecta, trebuie sa protejam sistemul de operare si toate celelalte programe si datele acestora de orice program cu functionare defecta. Protectia este necesara pentru orice tip de resurse partajate. Abordarea luata in considerare este de a oferi suport hardware pentru a ne permite sa facem distinctie intre diferitele moduri de functionare. Vom avea nevoie (cel putin) de doua moduri

separate de operare: modul utilizator si modul monitor (numit si mod supervisor, mod sistem, mod privilegiat). Un bit, numit bit de mod, este adaugat la hardware-ul calculatorului pentru a indica modul curent: monitor (0) sau utilizator (1). Cu ajutorul acestui bit putem face acum distinctie intre o executie realizata in contul sistemului de operare si una realizata in contul utilizatorului. La momentul boot-arii, harware-ul porneste in mod monitor. Apoi este incarcat sistemul de operare, care porneste procesele utilizator in mod utilizator. De fiecare data cand are loc o intrerupere sau trap, hardware-ul comuta de la modul utilizator la modul monitor (prin modificarea bitului de mod). Astfel, de fiecare data cand sistemul de operare castiga controlul asupra calculatorului, acesta este in mod monitor. Sistemul comuta totdeauna la modul utilizator inainte de a transfera controlul la un program utilizator. Modul dual de operare ne ofera mijloace de protectie a sistemului de operare impotriva utilizatorilor "ratacitori" dar si a utilizatorilor intre ei. Aceasta protectie se poate obtine prin specificarea instructiunilor masina care pot produce pagube ca instructiuni privilegiate. Hardware-ul permite executia instructiunilor privilegiate numai in mod monitor. Daca insa se realizeaza o incercare de executie a unei instructiuni privilegiate in mod utilizator, hardware-ul va refuza executia acesteia, tratand instructiunea ca fiind ilegala si trap (comutand) la sistemul de operare. Lipsa unui hardware cu suport pentru modul dual poate determina probleme serioase intr-un sistem de operare. De exemplu, MS-DOS a fost dezvoltat pentru sisteme pe bazate pe arhitectura Intel 8088, care nu ofera un bit de mod, adica mod dual. Intr-un asemenea sistem de operare, un utilizator este capabil sa distruga intregul sistem de operare scriind datele proprii peste cele ale sistemului, sau mai multi utilizatori pot incerca sa acceseze simultan acelasi dispozitiv. Incepand cu procesoare 80486, este oferit suportul pentru modul de operare dual. 1.5.2 Protectie I/O Un program utilizator poate intrerupe operarea normala a sistemului prin emiterea unei instructiuni I/O ilegale, accesarea unor locatii de memorie ocupate de sistemul de operare sau prin refuzul de a elibera CPU. Sunt utilizate mecanisme diferite pentru ca asemenea intreruperi sa nu poata avea loc in sistem. Pentru a preveni realizarea unor operatii I/O ilegale de catre utilizator, toate instructiunile I/O urmeaza sa fie definite ca fiind privilegiate. Astfel, utilizatorii nu mai pot emite instructiuni I/O direct, aceasta putandu-se realiza doar prin intermediul sistemului de operare. Pentru ca protectia operatiilor I/O sa fie completa, trebuie sa ne asiguram ca un program utilizator nu poate castiga controlul calculatorului in mod monitor. Daca aceasta se poate intampla, protectia I/O poate fi compromisa. Un calculator va comuta in mod monitor la fiecare aparitie a unei intreruperi, realizand un salt la adresa determinata din vectorul de intrerupere. Sa presupunem ca un program utilizator este capabil sa depoziteze o noua adresa in vectorul de intrerupere. Aceasta adresa va putea suprascrie adresa anterioara cu o adresa in programul utilizator. Atunci la aparitia intreruperii corespunzatoare, hardware-ul va comuta la modul monitor si va transfera programul prin intermediul vectorului modificat chiar programului utilizator, care in acest fel va detine controlul sistemului in mod monitor. 1.5.3 Protectia memoriei Pentru a asigura o functionare corecta, vectorul de intrerupere trebuie sa fie protejat de eventuale modificari din partea unui program utilizator. In plus, trebuie de asemenea sa protejam rutina de deservire a intreruperii impotriva modificarilor. In caz contrar un program utilizator ar putea fi capabil sa suprascrie instructiuni ale rutinei de deservire a unei intreruperi cu salturi la programul utilizator, obtinand astfel controlul asupra calculatorului prin intermediul unei rutine de deservire a unei intreruperi, care se executa in modul monitor. Chiar si fara a obtine controlul asupra calculatorului, modificarea rutinei de deservire a intreruperii ar putea produce o bresa in functionarea corecta a sistemului de calcul. Protectia memoriei trebuie realizata cel putin pentru securitatea vectorului de intreruperi si a rutinei de deservire a intreruperilor sistemului de operare. In general, vom dori sa protejam sistemul de operare de accese din partea programelor utilizator si, in plus, sa protejam programele utilizator unele fata de altele. Aceasta protectie trebuie sa fie oferita la nivel hardware. O implementare posibila este urmatoarea. Pentru a separa spatiul de memorie a fiecarui program este nevoie de abilitatea de a determina rangul de adrese legale pe care un program le poate accesa, si de a proteja memoria in afara acestui spatiu. Putem oferi aceasta protectie prin intermediul a doi registri, numiti baza si limita. Registrul de baza pastreaza cea mai mica adresa de memorie fizica legala, iar registrul limita contine marimea domeniului de adrese.

Astfel, daca baza=300040 iar limita=120900, programul va putea accesa in mod legal toate adresele cuprinse intre 300040 si 420940, inclusiv. Aceasta protectie este realizata de catre hardware-ul CPU prin compararea fiecarei adrese generate in mod utilizator cu valorile registrilor. Orice incercare a unui program care ruleaza in mod utilizator de a accesa memoria monitor sau memoria altui utilizator duce la o trap catre monitor, care trateaza aceasta incercare ca pe o eroare fatala. Aceasta schema previne ca programele utilizator sa modifice (accidental sau deliberat) codul sau structurile de date ale sistemului de operare sau a unui alt utilizator. Registrii baza si limita pot fi incarcate doar de catre sistemul de operare, care foloseste instructiuni specializate privilegiate. Deoarece instructiunile privilegiate pot fi executate doar in mod monitor, si cum numai sistemul de operare se poate executa in modul monitor, este singurul care poat incarca acesti registri. Aceasta schema permite monitorului sa modifice valorile registrilor, dar previne ca programele utilizator sa modifice continutul registrilor. Sistemul de operare, care se executa in mod monitor, capata acces nerestrictionat atat la memoria monitorului cat si la memoria utilizatorilor. Aceasta permite sistemului de operare sa incarce programele utilizator in memoria utilizator si sa le evacueze in caz de erori, sa acceseze si sa modifice parametrii apelurilor sistem si asa mai departe. 1.5.4 Protectia CPU In al treilea rand trebuie sa asiguram ca sistemul de operare pastreaza controlul. Trebuie sa prevenim ca un program utilizator sa se impotmoleasca intr-o bucla infinita, si sa nu mai intoarca controlul sistemului de operare. Pentru a atinge acest scop vom utiliza un timer (cronometru). Un timer poate fi fixat pentru a intrerupe calculatorul dupa o perioada de timp specificata. Aceasta perioada poate fi fixa sau variabila. Un timer variabil este in general implementat printr-un ceas cu rata fixa (tact fix) si un contor. Sistemul de operare fixeaza valoarea contorului. La fiecare tact al ceasului, contorul este decrementat. Odata ce acesta ajunge la valoarea zero, apare o intrerupere. Inainte de a oferi controlul unui utilizator, sistemul de operare se asigura ca timerul este fixat pentru a intrerupe. Daca timerul intrerupe, controlul se transfera automat catre sistemul de operare, care poate trata intreruperea ca pe o eroare fataa sau poate acorda programului un timp suplimentar. Evident, instructiunile care modifica functionarea unui timer sunt privilegiate. Astfel, timer-ul poate fi utilizat pentru a preveni ca un program utilizator sa functioneze prea mult. O tehnica simpla ar fi de a initializa contorul cu timpul pe care un program il poate folosi pentru a rula. Un program care capata un timp total de 5 minute va avea valoarea initiala a contorului fixata pe 300. La fiecare secunda timerul intrerupe iar contorul este decrementat cu 1. Atata vreme cat contorul este pozitiv, controlul este intors programului utilizator. Cand contorul devine negativ, sistemul de operare termina executia programului datorita depasirii limitei de timp alocata. O utilizare mai frecventa a timer-elor este de a implementa partajarea timpului. In cea mai directa abordare, timerul poate fi fixat pentru intrerupere la fiecare N milisecunde, unde N este valoarea feliei de timp pe care fiecare utilizator o poate utiliza pentru executie inainte ca un alt utilizator sa capete controlul asupra CPU. Sistemul de operare este invocat la sfarsitul fiecarei felii de timp pentru a realiza diferitele sarcini interne: adaugarea valorii N la inregistrarea care specifica timpul pe care programul utilizator l-a utilizat pana acum, resetarea registrilor, variabilelor interne si zonelor tampon, precum si modificarea altor parametrii pentru a pregati executia programului urmator. (Aceasta procedura se numeste comutare de context). Urmand o comutare de context, urmatorul program isi continua executia din punctul in care a fost intrerupt anterior (la sfarsitul feliei de timp pe care a utilizat-o anterior). O alta utilizare a timer-ului este de a determina ora curenta. Totusi, majoritatea calculatoarelor poseda un hardware specializat, independent de sistemul de operare, care ofera ora curenta. 1.6 Arhitectura sistemului general Dorinta de a imbunatati utilizarea sistemului de calcul a dus la dezvoltarea multiprogramarii si a partajarii timpului, unde resurse ale sistemului de calcul sunt partajate intre multe programe si procese diferite. Partajarea a condus la modificari in arhitectura calculatorului de baza, pentru a permite sistemului de operare sa-si mentina controlul asupra sistemului de calcul, in special asupra I/O. Acest control trebuie mentinut pentru a putea oferi o functionare continua, consistenta si corecta.

Pentru a mentine controlul, a fost introdusa executia in mod dual. Prin aceasta schema este oferit suportul pentru conceptul de instructiune privilegiata, care se poate executa numai in mod monitor. Instructiunile I/O sau instructiunile care modifica registrii de management al memoriei sunt instructiuni privilegiate. De asemenea, alte instructiuni sunt clasificate ca fiind privilegiate. Astfel, instructiunea halt este privilegiata; nici un program utilizator nu ar trebui sa fie capabil sa opreasca sistemul. Instructiunile care opresc si/sau pornesc sistemul de intreruperi sunt de asemenea privilegiate, datorita faptului ca functionarea corecta a timerului sau a sistemului I/O depinde de abilitatea de a raspunde corect la intreruperi. Instructiunile care determina trecerea de la modul utilizator la modul privilegiat sunt, de asemenea, privilegiate, la fel cum se intampla cu orice modificare a bitului de mod pe multe masini. Deoarece instructiunile I/O de baza sunt privilegiate, acestea pot fi executate numai de catre sistemul de operare. Prin aceasta am prevenit ca un program utilizator sa mai fie capabil sa execute orice operatii I/O, valide sau nu. In schimb, deoarece numai monitorul este capabil sa execute I/O, utilizatorul trebuie sa ceara monitorului sa execute operatia I/O in contul sau. O astfel de cerere se numeste apel sistem (sau apel monitor sau apel de functie a sistemului de operare). Un apel sistem poate fi realizat in diferite moduri, in functie de functionalitatea oferita de procesorul de baza. In toate formele, aceasta este metoda utilizata de un proces pentru a cere o actiune din partea sistemului de operare. Un apel sistem ia de obicei forma unei trap catre o locatie specifica in vectorul de intrerupere. Aceasta poate fi executata printr-o instructiune trap generica. Cand este executat un apel sistem, acesta este tratat de catre hardware ca o intrerupere software. Controlul este transferat prin intermediul vectorului de intreruperi catre o rutina de deservire din sistemul de operare, iar bitul de mod este fixat pe modul monitor. Rutina de deservire a apelului sistem este parte a sistemului de operare, Monitorul examineaza instructiunea care intrerupe pentru a determina felul apelului sistem; un parametru indica tipul serviciului pe care programul utilizator il cere. Informatii aditionale necesare cererii pot fi transmise de asemenea ca parametrii in registrii, stiva sau memorie (pointerii catre locatiile de memorie sunt transmisi prin intermediul registrilor). Monitorul verifica faptul ca parametrii sunt corecti si legali, executa cererea si intoarce controlul instructiunii urmatoare apelului sistem. Astfel, pentru a realiza o operatie I/O, un program utilizator executa un apel sistem pentru a cere sistemului de operare ca acesta sa realizeze operatia I/O in contul sau. Sistemul de operare, care functioneaza in mod monitor, verifica daca cererea este valida si executa cererea I/O, dupa care sistemul de operare se intoarce la utilizator.

Structurile sistemului de operare 1.1 Componentele sistemului Un sistem atat de mare si complex cum este un sistem de operare poate fi creat doar partitionandu-l in parti mai mici. Fiecare dintre aceste parti trebuie sa reprezinte o portiune bine delimitata a sistemului, cu intrari si iesiri clar definite, si o functie de asemenea clara. Evident, nu toate sistemele vor avea aceeasi structura, insa pentru multe dintre sistemele de operare moderne se pot pune in evidenta tipuri de componente ale sistemului comune. 1.1.1 Managementul proceselor Un program nu realizeaza nimic util daca instructiunile acestuia nu sunt executate de catre CPU. Ne putem gandi la un proces ca la un program in executie. Astfel o lucrare dintr-un lot este un proces, un program utilizator cu partajarea timpului este un proces sau o sarcina sistem oarecare este de asemenea un proces. O definitie mai exacta a notiunii de proces o vom intalni in capitolele dedicate acestora. Un proces are nevoie de anumite resurse pentru a-si putea indeplini sarcina, de la timpul CPU, memorie, fisiere pana la dispozitive I/O. Aceste resurse sunt oferite procesului la creare, sau sunt alocate acestuia in timpul rularii. Pe langa diferitele resurse logice si fizice pe care un proces le poate obtine la creare, anumite date (de intrare) pot fi transmise acestuia in timpul functionarii. La terminarea procesului, sistemul de operare va revendica orice resurse care pot fi reutilizate. Subliniem faptul ca un program nu este un proces. Un program este o entitate pasiva, la fel cu continutul unui fisier stocat pe disc, in timp ce procesul este o entitate activa, cu un contor program care specifica

urmatoarea instructiune care urmeaza a fi executata. Executia unui proces trebuie sa avanseze intr-o maniera secventiala. CPU executa cate o instructiune a unui proces, pana la terminarea procesului. Mai mult, in orice moment cel mult o instructiune este executata din partea procesului. Astfel, desi se pot asocia mai multe procese unui acelasi program, ele sunt totusi considerate ca fiind secvente de executie separate. Este uzual ca un program sa dea nastere la mai multe procese in timpul functionarii. Un proces este o unitate de lucru intr-un sistem. Un astfel de sistem consta dintr-o colectie de procese, unele dintre ele fiind procese ale sistemului de operare (cele care executa codul sistemului) iar celelalte procese utilizator (executand codul utilizator). Toate proceselor se pot executa (potential) concurent, prin multiplexarea CPU intre acestea. Sistemul de operare este responsabil cu urmatoarele activitati in legatura cu managementul proceselor: Crearea si stergerea proceselor utilizator si sistem Suspendarea si reluarea proceselor Asigurarea mecanismelor pentru sincronizarea proceselor Asigurarea mecanismelor pentru comunicarea intre procese Asigurarea mecanismelor pentru manipularea impasurilor (deadlock) 1.1.2 Managementul memoriei principale Memoria este, asa cum s-a specificat deja, esentiala functionarii si operarii unui sistem de calcul modern. Memoria este un tablou mare de cuvinde sau octeti, fiecare posedand o adresa proprie. Memoria este un depozit de date rapid accesibile partajate de catre CPU si dispozitivele I/O. Procesorul central citeste instructiuni din memoria principala de-a lungul unui ciclu de aducere a unei instructiuni, si citeste sau scrie date din memoria principala de-a lungul unui ciclu de aducere a datelor. I/O implementate via DMA de asemenea citesc si scriu date in memoria principala. Memoria principala este in general singurul dispozitiv de depozitare pe care CPU il poate accesa direct. Pentru ca un program sa poata fi executat, acesta trebuie sa fie mapat la adrese absolute si incarcat in memorie. Pe masura ce programul se executa, se acceseaza instructiuni si date ale programului prin generarea acestor adrese absolute. Eventual, programul se termina, iar spatiul sau de memorie este declarat disponibil, astfel incat un alt program poate fi incarcat si executat. Pentru a imbunatati atat utilizarea CPU cat si timpul de raspuns catre utilizatori, trebuie sa pastram mai multe programe in memorie. Exista numeroase scheme de management al memoriei. Acestea reflecta diferitele abordari ale managementului memoriei, iar eficacitatea diferitilor algoritmi depinde de situatie. Selectarea unei scheme de management a emoriei pentru un anumit sistem depinde de numerosi factori -in primul rand de designul hardware-ului sistemului. Fiecare algoritm necesita un anumit suport hardware. Sistemul de operare este responsabil cu urmatoarele activitati legate de managementul memoriei: Tine evidenta partilor de memorie care sunt utilizate curent, precum si cine le utilizeaza Decide care procese urmeaza sa fie incarcate in memorie cand spatiul de memorie devine disponibil Aloca si dealoca spatiul de memorie dupa cum este necesar. 1.1.3 Managementul dispozitivelor secundare de depozitare Principala destinatie a unui sistem de calcul este de a executa programe. Aceste programe, impreuna cu datele pe care le acceseaza, trebuie sa se gaseasca in memoria principala (dispozitivul de depozitare primar) de-a lungul executiei. Deoarece memoria principala este prea mica pentru a gazdui toate datele si programele, si in plus continutul memoriei dispare la pierderea sursei de alimentare, sistemul de calcul trebuie sa ofere dispozitive de depozitare secundare pentru a sustine memoria principala. Majoritatea sistemelor de calcul folosesc discurile ca principal mediu de depozitare on-line, atat pentru date cat si pentru programe. Majoritatea programelor se gasesc pe un disc inainte de a ajunge in memorie, iar apoi folosesc discul atat ca sursa cat si ca destinatie pentru prelucrarea lor. Asadar, un management corespunzator pentru depozitarea pe disc este de o importanta centrala pentru un sistem de calcul. Sistemul de operare este responsabil cu urmatoarele activitati legate de managementul discurilor: Managementul spatiului liber Alocarea spatiului Planificarea discului

Intreaga viteza de functionare a unui calculator poate depinde de subsistemele de disc si de algoritmii utilizati pentru manipularea acestora. 1.1.4 Managementului sistemului I/O Unul dintre scopurile unui sistem de operare este de a ascunde particularitatile anumitor dispozitive hardware de utilizator. Astfel, particularitatile dispozitivelor I/O sub sistemul de operare UNIX sunt ascunse de cea mai mare parte a sistemului de operare insusi prin sistemul I/O. Sistemul I/O consta din Un sistem buffer-caching Un driver de dispozitiv general Drivere pentru dispozitivele hardware specifice. Numai driverul dispozitivului cunoaste particularitatile dispozitivului la care este atasat. 1.1.5 Managementul fisierelor Managementul fisierelor este una dintre cele mai vizibile componente ale sistemului de operare. Calculatoarele pot depozita informatii pe diferite tipuri de medii fizice. Fiecare dintre aceste medii poseda propriile caracteristici si organizare fizica. Fiecare mediu este controlat de cate un dispozitiv, cu propriile sale caracteristici, unice. Aceste proprietati includ viteza, capacitatea, rata de transfer a datelor, metoda de acces (metoda de acces secventiala sau aleatoare). Pentru o utilizare convenabila a sistemului de calcul, sistemul de operare ofera un punct de vedere logic uniform al depozitarii informatiei. Sistemul de operare extrage din proprietatile fizice ale dispozitivelor sale de depozitare pentru a defini o unitate de depozitare logica, fisierul. Sistemul de operare mapeaza fisierele pe mediile fizice, si acceseaza aceste fisiere via dispozitivele de depozitare. Un fisier este o colectie de informatii inrudite definite de catre creatorul sau. Uzual, fisierele reprezinta programe si date. Fisierele de date pot fi numerice, alfabetice sau alfanumerice. Fisierele pot avea o forma libera, sau pot fi riguros formatate. Un fisier consta dintr-o secventa de biti, octeti, linii sau inregistrari al caror sens este definit de catre creatorii lor. Conceptul de fisier este insa un concept extrem de general. Sistemul de operare implementeaza conceptul abstract de fisier prin managementul mediilor de stocare in masa si a dispozitivelor care le controleaza. De asemenea, fisierele sunt in mod normal organizate in directoare pentru usurinta utilizarii. In fine, cand mai multi utilizatori au acces la acelasi fisier este de dorit sa putem controla cine si in ce fel poate accesa fisierele. Sistemul de operare este responsabil cu urmatoarele activitati legate de managementul fisierelor: Crearea si stergerea fisierelor Crearea si stergerea directoarelor Suportul functiilor primitive pentru manipularea fisierelor si directoarelor Maparea fisierelor pe dispozitivele secundare de depozitare Salvarea (backup) fisierelor pe un mediu de depozitare stabil (nevolatil). 1.1.6 Sistemul de protectie Daca un sistem poseda mai multi utilizatori si permite existenta proceselor concurente multiple, diferitele procese trebuie sa fie protejate unele de activitatea celorlalte. Pentru aceasta, sunt oferite mecanisme pentru a ne asigura ca fisierele, segmentele de memorie, CPU si alte resurse pot fi operate numai de catre acele procese care au obtinut autorizarea potrivita din partea sistemului de operare. De exemplu, hardware-ul de adresare a memoriei se asigura ca un proces poate executa numai in interiorul propriului spatiu de adrese. Timerul se asigura ca nici un proces nu poate obtine controlul CPU fara ca eventual sa renunte la control. In fine, utilizatorilor nu le este permis sa realizeze operatii I/O proprii, astfel incat sa fie protejata integritatea diverselor dispozitive periferice. Protectia se refera la un mecanism pentru controlul accesului programelor, proceselor sau utilizatorilor la resursele definite de un sistem de calcul. Acest mecanism trebuie sa ofere un mijloc pentru specificarea de controalelor care trebuie impuse, impreuna cu mijloacele de impunere. Protectia poate imbunatati reliabilitatea prin detectarea erorilor latente la interfetele dintre componentele subsistemelor. Detectarea timpurie a erorilor interfetelor pot deseori preveni contaminarea unui sistem sanatos de un subsistem defectuos. O resursa neprotejata nu se poate apara impotriva utilizarii de catre un utilizator incompetent sau neautorizat. Un sistem orientat spre protectie ofera mijloacele de a realiza distinctia dintre utilizarea autorizata si utilizarea neautorizata. 1.1.7 Accesul n retea

Un sistem distribuit este o colectie de procesoare care nu partajeaza memorie sau un ceas. In schimb, fiecare procesor poseda propria memorie locala, iar procesoarele comunica intre ele prin diferite linii de comunicatie. Procesoarele dintr-un sistem distribuit pot diferi in marime sau functionalitate. Pot exista microprocesoare mici, statii de lucru, minicalculatoare sau sisteme de calcul mari, de scop general. Procesoarele din sistem sunt conectate printr-o retea de comunicatie, care poate fi configurata in diferite moduri. Reteaua poate fi conectata partial sau integral. Proiectarea retelei de comunicatie trebuie sa tina seama de strategiile de rutare si conectare, si de problemele securitatii si disputei. Un sistem distribuit colecteaza fizic sisteme separate, posibil eterogene, intr-un singur sistem coerent, oferind utilizatorilor acces la diferitele resurse pe care acest sistem le intretine. Accesul la o resursa partajata permite cresterea vitezei de calcul, disponibilitatea ridicata a datelor si o siguranta crescuta. Sistemele de operare de obicei generalizeaza accesul prin retea la o forma de acces al fisierelor, unde detaliile accesului in retea sunt continute in driverul de dispozitiv al interfetei de retea. 1.1.8 Interpretorul de comenzi Unul dintre cele mai importante programe sistem este interpretorul de comenzi, care este interfata intre utilizator si sistemul de operare. Anumite sisteme de operare includ interpretorul de comenzi chiar in nucleu. Alte sisteme, cum este cazul sistemului UNIX, trateaza interpretorul de comenzi ca un program special care ruleaza cand este initiata o lucrare, sau cand are loc conectarea initiala a unui utilizator (in cazul sistemelor cu partajarea timpului). Multe dintre comenzi sunt transmise sistemului de operare prin intermediul instructiunilor de control. Cand incepe o lucrare noua intr-un sistem cu prelucrare in loturi, sau cand se conecteaza un utilizator intrun sistem cu partajarea timpului, este executat un program care citeste si interpreteaza diferitele instructiuni de control. Acest program poate fi numit interpretor de cartele de control, interpretorul liniei de comanda sau shell (in cazul sistemului de operare UNIX). Functia lui este extrem de simpla: preia urmatoarea comanda si o executa. Sistemele de operare sunt in mod frecvent diferentiate in domeniul interpretarii comenzilor, cu un interpretor prietenos, care face sistemul extrem de agreabil pentru anumiti utilizatori; cu interpretoare extrem de puternice, complex (si greu de invatat) apreciate de alti utilizatori, mai sofisticati. Pentru aceste interpretoare, comenzile sunt transmise prin intermediul tastaturii si afisate pe un ecran sau terminal, iar tasta ENTER semnalizeaza incheierea introducerii unei comenzi, care astfel este pregatita pentru executie. Instructiunile de control insasi au de-a face cu crearea si managementul proceselor, manipularea I/O, managementul dispozitivelor secundare de depozitare, managementul memoriei principale, sistemul de acces la fisiere, protectie si acces in retea. 1.2 Serviciile Sistemelor de operare Un sistem de operare ofera un mediu pentru executia programelor. Sistemul de operare ofera anumite servicii programelor, dar si utilizatorilor acestor programe. Serviciile specifice oferite vor diferi, desigur, de la un sistem de operare la altul. Totusi, pot fi identificate cateva clase comune de servicii. Serviciile sistemului de operare sunt oferite pentru comoditatea programatorului, pentru usura sarcina de programare. Executia programelor: Sistemul trebuie sa fie capabil sa incarce un program in memorie si sa-l execute. Programul trebuie sa fie capabil sa isi incheie executia, fie normal fie anormal (indicand eroarea). Operatii I/O: Un program care functioneaza poate cere operatii I/O. Aceste operatii I/O pot implica un fisier sau un dispozitiv I/O. Pentru dispozitive specifice, pot fi dorite functii speciale (cum ar fi stergerea ecranului pentru CRT). Pentru eficienta si protectie, utilizatorii nu pot controla operatiile I/O direct, prin urmare sistemul de operare trebuie sa ofere mijloacele de a realiza operatiile I/O. Manipularea sistemului de fisiere: Sistemul de fisiere este de un interes deosebit (particular). Ar trebui sa fie evidenta nevoia programelor de a citi si scrie fisiere. Acestea au nevoie de asemenea sa creeze si stearga fisiere prin nume. Comunicatii: Exista numeroase situatii in care un proces are nevoie sa schimbe informatii cu un alt proces. Exista doua cai principale prin care se poate realiza o astfel de comunicare. Prima are loc intre procese care se executa

pe acelasi calculator; a doua are loc intre procese care se executa pe diferite sisteme de calcul care sunt legate intre ele printr-o retea de calculatoare. Comunicatiile pot fi implementate prin intermediul unei memorii partajate, sau prin tehnica transmiterii mesajelor, in care pachete de informatie sunt mutate intre procesele unui sistem de operare. Detectarea erorilor: Sistemul de operare trebui sa fie in mod constant atent la posibilele erori. Erorile pot avea loc in CPU si hardware-ul memoriei, in dispozitivele I/O sau in programele utilizator. Pentru fiecare tip de eroare, sistemul de operare urmeaza sa abordeze actiunea potrivita care sa asigure realizarea calculului corect si consistent. In plus, alte functii ale sistemului de operare exista nu pentru a ajuta utilizatorii, ci mai degraba pentru a asigura func;tionarea eficienta a sistemului insusi. Sistemele cu utilizatori multipli pot castiga in eficienta prin partajarea resurselor calculatoarelor intre utilizatori. Alocarea resurselor: Cand exista utilizatori multipli sau lucrari multiple care functioneaza simultan, resursele trebuie sa fie alocate fiecareia dintre acestea. Multe tipuri diferite de resurse sunt administrate de catre sistemul de operare. Unele dintre acestea (ciclurile CPU, memoria principala, depozitarea fisierelor) pot avea coduri speciale de alocare, in vreme ce altele (dispozitive I/O) pot avea coduri mult mai generale de cerere si eliberare. De exemplu, in determinarea utilizarii optime a CPU, sistemul de operare poseda rutine de planificare a CPU care tin seama de viteza CPU, lucrarile care trebuie sa fie executate, numarul de registri disponibili si multi alti factori. Pot exista de asemenea rutine pentru alocarea unei unitati de banda pentru utilizarea acestuia de catre o lucrare. O astfel de rutina identifica o unitate de banda neutilizata si indica o tabela interna pentru a inregistra noul utilizator al dispozitivului. O alta rutina este utilizata pentru a goli tabela. Aceste rutine pot fi de asemenea utilizate pentru a aloca un plotter, modem sau alt dispozitiv periferic. Accounting: Vom dori de asemenea sa tinem o evidenta a utilizatorilor care utilizeaza resursele calculatorului, cat timp si ce fel de resurse utilizeaza. Aceasta inregistrare de activitate poate fi realizata doar pentru contabilizare sau pentru a acumula statistici de utilizare. Statisticile de utilizare pot fi instrumente extrem de valoroase pentru cercetatorii care doresc sa reconfigureze un sistem in scopul imbunatatirii serviciilor de calcul. Protectie: Utilizatorii informatiilor depozitate intr-un sistem de calcul multiutilizator ar putea dori sa il controleze pe acesta. Cand mai multe procese disjuncte se executa concurent va trebui sa nu fie posibil ca un proces sa interfere cu altele, sau cu sistemul de operare. Protectia implica asigurarea ca toate accesele la resursele sistemului sunt controlate. Securitatea sistemului de strain este de asemenea importanta. Aceasta securitate incepe cu fiecare utilizator nevoit sa se identifice in sistem, de obicei prin intermediul unei parole, pentru a putea sa patrunda in sistem. Se extinde la apararea dispozitivelor I/O, incluzand modemuri si adaptoare de retea, de incercari de acces invalide, si prin inregistrarea tuturor acestor conexiuni pentru determinarea patrunderilor in sistem. Daca un sistem urmeaza sa fie protejat si securizat, trebuie luate anumite precautii peste tot. 1.3 Apeluri sistem Apelurile sistem asigura interfata dintre un proces si sistemul de operare. Aceste apeluri sunt in general disponibile ca instructiuni in limbaj de asamblare, si sunt de obicei listate in manualele utilizate de programatorii in limbaj de asamblare. Anumite sisteme pot permite ca apelurile sistem sa fie realizate direct dintr-un limbaj de nivel inalt, caz in care in mod normal apelurile seamana cu functii predefinite sau apeluri de subrutine. Acestea pot genera un apel al unei rutine run-time care realizeaza apelul sistem, sau apelul sistem poate fi generat direct inline. Ca un exemplu despre modul in care sunt utilizate apelurile sistem, sa consideram cazul simplu al scrierii unui program care citeste date dintr-un fisier si le copiaza in alt fisier. Prima intrare necesara programului o va reprezenta numele celor doua fisiere: cel de intrare si cel de iesire. Aceste nume pot fi specificate in diferite moduri, functie de designul sistemului de operare. O abordare este de a scrie un program care sa ceara utilizatorului numele celor doua fisiere. Intr-un sistem interactiv, aceasta abordare va necesita o

secventa de apeluri sistem, prima data scrierea unui mesaj pe ecran, apoi citirea de la tastatura a caracterelor care definesc numele celor doua fisiere. O alta abordare, intalnita frecvent in sistemele cu prelucrare in loturi, este de a specifica numele celor doua fisiere prin intermediul cartelelor de control. In acest caz, trebuie sa existe un mecanism pentru transmiterea parametrilor de la aceste cartele de control catre programul in curs de executie. In cazul unui sistem bazat pe mouse si iconuri, este de obicei afisat un meniu de nume de fisiere pentru a selecta numele fisierului sursa, iar o fereastra poate fi deschisa pentru a specifica numele fisierului destinatie. Odata specificate numele celor doua fisiere, programul trebuie sa deschida fisierul de intrare si sa creeze fisierul de iesire. Fiecare dintre aceste operatii necesita alte apeluri sistem. Exista de asemenea posibile conditii de eroare pentru fiecare operatie: cand un program incearca sa deschida un fisier, se poate intampla ca acesta sa nu existe sau sa fie protejat impotriva acceselor. In aceste cazuri programul va tipari un mesaj la consola (din nou apeluri sistem) si se va termina anormal (din nou, un apel sistem). Odata fixate lucrurile pentru cele doua fisiere urmeaza un ciclu care citeste date din fisierul de intrare (un apel sistem) si scrie in fisierul de iesire (apel sistem). Fiecare citire si scriere trebuie sa intoarca informatii de stare referitoare la diferitele conditii de eroare posibile. La intrare, programul poate afla ca a fost atins sfarsitul fisierului sau ca a existat o eroare hardware la citire (eroare de paritate, de exemplu). Operatiunea de scriere poate intalni diferite erori, functie de dispozitivul de iesire (nu mai exista spatiu, de exemplu). In fine, dupa ce intregul fisier a fost copiat, programul poate inchide ambele fisiere (din nou prin apeluri sistem), scrie un mesaj la consola (alte apeluri sistem) si in fine se termina normal (un ultim apel sistem). Din toate acestea se poate observa ca programele pot utiliza din greu sistemul de operare. Desigur, majoritatea utilizatorilor nu vad toate aceste detalii. Sistemul de suport run-time pentru majoritatea limbajelor de programare ofera o interfata mult mai simpla. De exemplu, o instructiune write in Pascal este probabil compilata intr-un apel catre o rutina de suport run-time care lanseaza apelurile sistem necesare, realizeaza verificarile pentru erori si in final intoarce controlul programului utilizator. Astfel, majoritatea detaliilor interfetei sistemului de operare sunt ascunse programatorului de catre compilator si de catre pachetul de suport run-time. Apelurile sistem apar in diferite moduri, functie de calculatorul utilizat. Deseori sunt necesare mai multe informatii decat doar identificarea apelului sistem dorit. Tipul exact si cantitatea de informatie difera in concordanta cu sistemul de operare particular si apelul sistem. Astfel, pentru a obtine o intrare (dintr-un fisier) va fi necesara specificarea numelui fisierului sau dispozitivului sursa, precum si adresa si lungimea bufferului de memorie in care va fi depusa (citita) intrarea. Sunt utilizate pentru transmiterea parametrilor catre sistemul de operare trei metode generale. Cea mai simpla abordare este de a transmite parametrii in registrii. In anumite situatii insa pot exista mai multi parametrii decat registrii. In aceste cazuri, parametrii sunt in general depozitati intr-un bloc sau tabela in memorie, iar adresa blocului este transmisa ca parametru intr-un registru. Parametrii pot fi de asemenea depozitati, sau impinsi, pe stiva de catre program si sunt descarcati din stiva de catre sistemul de operare. Anumite sisteme de operare prefera metoda blocului sau metoda stivei, deoarece acestea nu limiteaza numarul sau lungimea parametrilor transmisi. Apelurile sistem pot fi grupate in linii mari in cinci categorii majore: controlul proceselor, manipularea fisierelor, manipularea dispozitivelor, intretinerea informatiei si comunicarea. 1.3.1 Controlul proceselor si lucr arilor Un program in functiune trebuie sa fie capabil sa-si incheie executia fie normal (end) fie anormal (abort). Daca este realizat un apel sistem pentru a termina programul curent anormal, sau daca programul ajunge la o problema si determina o trap de eroare, uneori este realizata o vidare a memoriei si este generat un mesaj de eroare. Vidajul este scris pe disc si poate fi examinat cu un debugger pentru a determina cauza problemei. Fie in circumstante normale fie anormale, sistemul de operare trebuie sa transfere controlul interpretorului de comenzi. Apoi interpretorul de comenzi citeste urmatoarea comanda. Intr-un sistem interactiv, interpretorul de comenzi continua pur si simplu cu urmatoarea comanda; se presupune ca utilizatorul va da o comanda potrivita pentru a raspunde oricarei erori. Intr-un sistem cu prelucrare in loturi, interpretorul de comenzi va termina de obicei intreaga lucrare si va continua cu urmatoarea lucrare. Anumite isteme permit cartelelor de control sa indice actiuni speciale de recuperare in cazul aparitiei unei erori. Daca programul descopera o intrare in intrarea sa si doreste sa se termine anormal, poate dori de asemenea sa defineasca un nivel de eroare. Erori mai grave pot fi indicate printr-un parametru de eroare

de nivel mai inalt. Este apoi posibil sa combinam terminarea normala si terminarea anormala prin definirea unei terminari normale ca o eroare de nivel 0. Interpretorului de comenzi sau un program ulterior poate folosi acest nivel de eroare pentru a determina urmatoarea actiune de indeplinit in mod automat. Un proces sau executia unei lucrari poate dori sa incarce (load) si execute (execute) un alt program Aceasta caracteristica permite interpretorului de comenzi sa execute un program ca fiind dirija de o comanda utilizaor. O intrebare interesanta este unde urmeaza sa se intoarca controlul cand programul astfel incarcat se termina. Aceasta intrebare este legata de problema daca programul existent este pierdut, salvat sau i se permite sa continue executia concurent cu noul program. Daca controlul se intoarce la programul existent cand noul program se incheie, va trebui sa salvam imaginea memoriei programului existent. Astfel, am creeat efectiv un mecanism pentru ca un program sa poata apela un alt program. Daca ambele programe continua concurent, am creeat o lucrare sau proces nou care trebuie multiprogramata. Deseori, exista apeluri sistem special definite pentru acest scop (create process sau submit job). Daca creem o lucrare sau proces noi, sau poate chiar o multime de lucrari sau procese, va trebui sa le controlam executia. Acest control necesita abilitatea de a determina si reseta atributele unei lucrari sau proces, inclusiv prioritatea lucrarii, timpul maxim de executie permis, si altele (get process attributes, set process attributes). S-ar putea sa dorim de asemenea sa terminam o lucrare sau proces pe care l-am creeat (terminate process) daca determinam ca acesta este incorect sau nu mai este necesar. Odata creeate lucrari sau procese noi, am putea avea nevoie sa asteptam terminarea executiei lor. Putem astepta o anumita cantitate de timp (wait time) sau aparitia unui anumit eveniment (wait event). Lucrarile sau procesele vor trebui asadar sa semnalizeze aparitia acelui eveniment (signal event). Un alt set de apeluri sistem sunt de ajutor in depanarea programelor. Multe sisteme ofera apeluri sistem pentru a vida (dump) memoria. Aceasta posibilitate este utila depanarii. O trasare (trace) afiseaza fiecare instructiune care se executa. Chiar si microprocesoarele ofera un mod CPU cunoscut ca single step, in care o trap este executata de catre CPU dupa fiecare instructiune. Aceasta este de obicei interceptata de catre un depanator, care este un program sistem desemnat sa ajute programatorul in depistarea si corectarea erorilor. Un profil in timp al programului este oferite de milte sisteme. Acesta indica timpul utilizat de catre un program intr-o anumita locatie sau un set de locatii. Un profil in timp necesita fie o facilitate de trasare fie obisnuitele intreruperi de timer. De fiecare data cand apare o intrerupere timer, este inregistrata valoarea contorului prgoram. Cu suficient de multe intreruperi, se poate obtine o imagine statistica a timpului petrecut de diferitele parti ale unui program. Exista de asemenea numeroase fatete si variatii in controlul proceselor si lucrarilor. Sistemul MS-DOS este un exemplu de sistem single-tasking, si poseda un interpretor de comenzi invocat la pornirea calculatorului. Fiind un sistem single-tasking, va folosi o metoda simpla de a rula un program, decat sa creeze un proces nou. Acesta incarca programul in memorie, scriindu-l chiar si peste o parte a lui insusi pentru a oferi programului cat mai multa memorie posibil. Apoi fixeaza pointerul de instructiune la prima instructiune a programului. Apoi programul se executa si, fie o eroare determina o trap, fie programul realizeaza un apel sistem pentru a se incheia. In orice situatie, codul de eroare este salvat in memoria sistem pentru utilizare ulterioara. Dupa aceasta actiune, mica parte a sistemului de operare care nu a fost suprascrisa isi continua executia. Prima lui sarcina este de a incarca restul interpretorului de comenzi de pe disc. Odata aceasta sarcina indeplinita, interpretorul de comenzi ofera precedentul cod de eroare utilizatorului sau urmatorului program. UNIX este, pe de alta parte, un exemplu de sistem multitasking. Cand un utilizator patrunde in sistem, un interpretor de comenzi (shell) ales de catre utilizator este lansat in executie. Acest shell este similar cu interpretorul de comenzi din MS-DOS in sensul ca accepta comenzi si executa programe la cererea utilizatorului. Totusi, UNIX fiind un sistem multitasking, interpretorul de comenzi poate sa-si continue functionarea in timp ce un alt program este executat. Pentru a incepe un proces nou, shell-ul executa un apel sistem fork. Apoi, programul selectat este incarcat in memorie prin intermediul unui apel sistem exec, iar programul este apoi executat. In functie de modul in care a fost data comanda, shell-ul va putea astepta ca un proces sa se incheie (adica ruleaza procesul in "foreground"), fie ruleaza procesul in "background". In acest caz, shellul va cere imediat o comanda noua. Cand un proces ruleaza in

background, acesta nu poate cere date de la utilizator, shell-ul asteptan el insusi intrari. Prin urmare operatiile I/O pentru un proces in background se vor realiza prin intermediul fisierelor. Intre timp utilizatorul poate cere shell-ului sa ruleze un alt proces, sa schimbe prioritatea unui program, sa monitorizeze desfasurarea unui proces in rulare, etc. Cand un proces este incheiat, va executa un apel sistem exit pentru a se termina, intorcand un cod de stare egal cu 0, sau un cod de eroare nenul. Acest cod (de stare sau eroare) este apoi disponibil shell-ului sau unui alt program. 1.3.2 Manipularea fisierelor Putem identifica mai multe apeluri sistem obisnuite in manipularea fisierelor.In primul rand trebuie sa fim capabili sa creem (create) si stergem (delete) fisiere. Oricare dintre aceste apeluri sistem au nevoie de numele fisierului si, posibil de atributele fisierului. Odata creeat un fisier, trebuie sa il putem deschide (open) pentru a-l utiliza. Putem de asemenea sa citim (read), scriem (write) sau sa ne repozitionam (reposition -- rewind sau salt la sfarsitul fisierului). In fine, fisierul trebuie inchis (close) pentru a specifica faptul ca nu mai este folosit (in programul curent). Operatii similare ar putea fi necesare pentru directoare, in situatia in care exista o structura de directoare pentru organizarea fisierelor in sistemul de fisiere. In plus, fie pentru fisiere sau directoare, trebuie sa fim capabili sa determinam valorile diferitelor atribute. Atributele fisierelor includ numele fisierului, tipul fisierului, codurile de protectie, etc. Cel putin doua (tipuri de) apeluri sistem sunt necesare, get file attribute si set file attribute. 1.3.3 Managementul dispozitivelor In timpul rularii unui program, acesta poate avea nevoie de resurse suplimentare pentru a functiona. Resursele suplimentare includ memoria suplimentara, dispozitive de banda/disc, acces la fisiere etc. Daca aceste resurse sunt disponibile, pot fi concesionate iar controlul se intoarce programului utilizator; in caz contrar, programul este nevoit sa astepte pana cand sunt disponibile destule resurse. Fisierele pot fi gandite ca dispozitive virtuale abstracte. Astfel, multe dintre apelurile sistem pentru fisiere vor fi disponibile si pentru dispozitive. Daca exista mai multi utilizatori in sistem, intai va trebui sa fie cerut (request) un dispozitiv, pentru a asigura accesul exclusiv al dispozitivului. Cand dispozitivul nu mai este necesar, acesta trebuie eliberat (release). Aceste functii sunt similare cu apelurile sistem close si open pentru fisiere. Odata ce un dispozitiv este cerut (si alocat), putem realiza citirea (read), scrierea (write) sau repozitionarea (reposition) dispozitivului, intocmai cum se intampla cu lucrul cu fisiere. De fapt, similitudinea dintre dispozitivele I/O si fisiere este atat de mare incat multe sisteme de operare (inclusiv UNIX si MS-DOS) le combina intr-o structura fisier-dispozitiv. In acest caz, dispozitivele I/O sunt identificate prin nume speciale de fisiere. 1.3.4 Intretinerea informatiilor Multe apeluri sistem exista doar pentru (scopul) transferului de informatie intre programele utilizator si sistemul de operare. De exemplu, majoritatea sistemelor de operare poseda apelurile sistem time si date. Alte apeluri sistem pot intoarce informatii despre sistem, cum ar fi numarul utilizatorilor curenti, numarul de versiune al sistemului, cantitatea de spatiu liber disponibil etc. In plus, sistemul de operare pastreaza informatii despre toate procesele sale, iar apeluri sistem specializate sunt utilizate pentru a accesa aceste informatii. In general, exista apeluri pentru a obtine/fixa informatiile despre procese (get process attributes, set process attributes). 1.3.5 Comunicare Exista doua modele comune de comunicatie. In modelul cu transmitere de mesaje (message-passing model), informatia este schimbata printr-o facilitate de comunicare intre procese oferita de catre sistemul de operare. Inainte ca comunicatia sa poata avea parte, este deschisa o conexiune. Numele celeilalte parti comunicante trebuie cunoscut, fie el un alt proces pe acelasi CPU sau un proces pe un alt calculator conectat printr-o retea de comunicatie. Fiecare calculator intr-o retea poseda un nume de sistem (host name) prin care este recunoscut in mod uzual. Similar, fiecare proces poseda un nume de proces, care este tradus intr-un identificator pe care sistemul de operare il poate referi. Apelurile sistem get hostid si get processid sunt raspunzatoare pentru aceasta traducere. Acesti identificatori sunt apoi transmisi apelurilor de scop general open si close oferite de catre sistemul de fisiere, sau apelurilor sistem specifice open connection si close connection, depinzand de modelul de comunicatie al sistemului. Procesul care receptioneaza trebuie de obicei sa-si dea acordul pentru ca comunicatia sa poata avea loc folosind un apel

sistem accept connection. Majoritatea proceselor care vor receptiona conexiuni sunt daemoni specializati, care sunt programe sistem oferite pentru acest scop. Acestia executa un apel wai for connection si sunt "treziti" in momentul in care se realizeaza o conexiune. Sursa comunicatiei, sau clientul, si daemonul receptioner, sau serverul, vor schimba apoi mesaje folosind apelurile sistem read message si write message. In fine, apelul sistem close connection determina terminarea comunicatiei. In modelul cu memorie partajata, procesele utilizeaza apeluri sistem map memory pentru a obtine accesul la regiuni de memorie detinute de alte procese. Cum sistemul de operare incearca sa previna ca procesele sa poata accesa memoria altor procese, memoria partajata cere ca doua sau mai multe procese sa se inteleaga sa elimine aceasta restrictie. Ele pot schimba informatii prin citirea si scrierea datelor in aceasta zona partajata. Forma datelor si locatiile datelor sunt determinate de catre aceste procese, si nu sunt sub controlul sistemului de operare. Procesele sunt de asemenea responsabile evitarea unei situatii in care ele scriu in aceeasi locatie simultan. Ambele metode sunt obisnuite in sistemele de operare, iar unele sisteme implementeaza ambele metode. Transmiterea mesajelor este utila cand este nevoie de schimbarea unei cantitati mici de date, deoarece nu este nevoie sa se elimine nici un fel de conflicte. Este de asemenea mai usor de implementat decat memoria partajata pentru comunicarea intre calculatoare. Memoria partajata permite un maxim de viteza si confortul comunicarii, atat cat se poate realiza la viteza memoriei. Totusi, exista anumite probleme la nivelul protectiei si sincronizarii. 1.4 Programe sistem Un alt aspect al sistemelor moderne il constituie colectia de programe sistem. Acestea ofera un mediu mai convenabil pentru dezvoltarea si executia programelor. Unele dintre acestea sunt simple interfete utilizator catre apeluri sistem, in timp ce altele sunt mult mai complexe. Programele sistem pot fi impartite in cateva categorii: Manipularea fisierelor Aceste programe creeaza, sterg, copiaza, redenumesc, tiparesc, videaza, listeaza si manipuleaza in general fisiere si directoare. Informatii de stare Anumite programe pur si simplu intreaba sistemul asupra datei, orei, memoria disponibila, spatiul disc disponibil, numarul de utilizatori, sau alte informatii de stare similare. Informatiile sunt formatate si tiparite la un dispozitiv de iesire, fisier sau terminal. Modificare fisierelor Editoarele de text pot fi disponibile pentru a creea si modifica continutul fisierelor depozitate pe disc sau banda. Suport pentru limbaje de programare Compilatoare, asambloare, interpretoare pentru limbajele de programare uzuale sunt deseori oferite utilizatorului impreuna cu sistemul de operare. Incarcarea si executia programelor Odata un program asamblat sau compilat, acesta trebuie sa fie incarcat in memorie. Sistemul poate oferi incarcatori (loader) absoluti, relativi, editori de legaturi. Sunt necesare de asemenea sisteme de depanare fie pentru limbaje de nivel inalt sau limbaj masina. Comunicatie Aceste programe ofera mecanismul pentru crearea conexiunilor virtuale intre procese, utilizatori si diferite sisteme de calcul. Aceste programe permit utilizatorilor sa trimita mesaje sau sa transfere fisiere intre doua masini, eventual chiar sa utilizeze alte sisteme la distanta ca si cum ar fi locale (remote login). Programe de aplicatie Majoritatea sistemelor de operare sunt ditate cu programe care sunt utile in rezolvarea problemelor curente, sau pentru a realiza operatii obisnuite. Astfel de programe includ compilatoare, formatoare de text, sisteme de baze de date, calcul tabelar, pachete statistice, jocuri, etc. Probabil cel mai important program sistem pentru un sistem de operare este interpretorul de comenzi, a carui principala functie este de a prelua si executa urmatoarea comanda utilizator specificata. Majoritatea comenzilor date la acest nivel manipuleaza fisiere: create, delete, list, print, copy, execute. Exista in general doua moduri in care pot fi implementate aceste comenzi. Intr-o abordare, chiar interpretorul de comenzi contine codul pentru a executa aceste comenzi. De exemplu, o comanda de

stergere a unui fisier poate determina un salt al interpretorului de comenzi catre o sectiune a codului acestuia care fixeaza parametrii si realizeaza apelul sistem potrivit. In acest caz, numarul de comenzi care pot fi date determina marimea interpretorului de comenzi, de vreme ce fiecare comanda necesita codul propriu pentru implementare. Alternativa utilizata de UNIX consta in implementarea majoritatii comenzilor prin programe sistem speciale. In acest caz interpretorul de comenzi nu "intelege" comanda in nici un fel; mai degraba utilizeaza comanda pentru a identifica un fisier pe care-l incarca in memorie si il executa. Astfel, comanda delete G va cauta un fisier numit delete, il incarca in memorie si il executa impreuna cu un parametru G. Functia asociata comenzii delete este definita complet de catre codul fisierului delete. Astfel, programatorii pot adauga noi comenzi sistemului destrul de simplu, creand noi fisiere cu nume corespunzatoare. Interpretorul de comenzi, care acum poate fi chiar mic, nu are nevoie de modificari pentru a putea adauga noi comenzi. Exista totusi anumite probleme legate de constructia interpretorului de comenzi in aceasta abordare. Sa observam pentru inceput ca, datorita faptului ca codul pentru executarea unei comenzi este un program sistem separat, sistemul de operare trebuie sa ofere un mecanism de transmitere a parametrilor de la interpretorul de comenzi catre sistemul de operare. Aceasta sarcina poate fi deseori deseori cam ... stangace deoarece interpretorul de comenzi si programul sistem ar putea sa nu se gaseasca simultan in memorie, iar lista de parametrii poate fi destul de extinsa. De asemenea, este ceva mai rapid sa se realizeze un salt catre alta sectiune de cod in programul curent decat sa se incarce si execute un alt program. O alta problema consta in faptul ca interpretarea parametrilor este lasata in seama programatorului programului sistem. Astfel, pot fi transmisi parametrii inconsistenti intre programe care par asemanatoare utilizatorului, dar care au fost scrise in momente diferite si de catre programatori diferiti. Felul in care este vazut sistemul de operare de catre majoritatea utilizatorilor este astfel definita de catre programele sistem decat de catre apelurile sistem. De exemplu, MS-DOS ofera un interpretor de comenzi in linia de comanda, in vreme ce Windows (3.1) ofera o interfata gen Macintosh. Cu toate acestea, ambele folosesc acelasi set de apeluri sistem, insa aspectul este complet diferit. In consecinta, acest punct de vedere este destul de indepartat de structura reala a sistemului. Proiectarea unei interfete prietenoase si utile nu este asadar o functie directa a sistemului de operare. 1.5 Structura sistemului Un sistem de marimea si complexitatea unui sistem de operare modern trebuie sa fie construit cu grija pentru a putea sa functioneze corect si sa poata fi modificat cat mai usor. O abordare frecventa consta in impartirea sarcinii in componente de dimensiuni mai mici, in loc de a avea un sistem monolitic. Fiecare dintre aceste module urmeaza sa reprezinte o parte bine definita a sistemului, cu intrari, iesiri si o functionare ingrijita. 1.5.1 O structura simpla Exista numeroase sisteme comerciale pentru care nu se poate pune in evidenta o structura bine definita. In mod frecvent, astfel de sisteme de operare au inceput prin a fi sisteme mici, simple, cu o functie limitata, dezvoltandu-se ulterior dincolo de destinatia lor originala (vezi cazul MS-DOS). Desi MS-DOS poseda o anumita structura, interfetele si nivelele de functionalitate nu sunt bine separate. De exemplu, programele de aplicatie sunt capabile sa acceseze rutine I/O de baza scriind direct la dispozitivul de disc sau pe ecran. O astfel de libertate face ca MS-DOS sa fie extrem de vulnerabil in fata unor programe malitioase . Desigur, limitarile MS-DOS se datoreaza in parte si hardware-ului pentru care a fost conceput. Fiind initial dezvoltat pentru procesoare Intel 8088, nu poate beneficia de protectia hardware sau de un mod dual. Un alt exemplu de structurare limitata il ofera sistemul de operare UNIX, in designul original. UNIX este de asemenea un sistem de operare care initial a fost limitat de functionalitatea hardware-ului. Acesta consta din doua parti separabile: nucleul si programele sistem. Nucleul este mai departe separat intr-o serie de interfete si drivere de dispozitive, care au fost adaugate si dezvoltate de-a lungul evolutiei UNIX.Putem privi sistemul de operare UNIX poate fi privit ca fiind stratificat ca in figura . Tot ceea ce apare sub interfata apelurilor sistem si deasupra hardware-ului fizic reprezinta nucleul. Nucleul ofera

sistemul de fisiere, planificarea CPU, gestiunea memoriei si alte functii ale sistemului de operare prin intermediul apelurilor sistem. Sumate toate acestea, rezulta o cantitate enorma de functionalitate care urmeaza sa fie combinata intr-un singur nivel. Programele sistem folosesc apelurile sistem suportate de nucleu pentru a oferi functii utile, cum ar fi compilarea si manipularea fisierelor. Apelurile sistem definesc interfata programatorului catre UNIX; multimea programelor in general disponibile definesc interfata utilizatorului. Cele doua interfete definesc contextul pe care nucleul trebuie sa-l suporte. Diferite versiuni de UNIX dezvoltate ulterior partitioneaza nucleul mai departe de-a lungul barierelor functionale. Uneori nucleul (Mach, Carnegie Melloin University) este redus la un set restrans de functii esentiale mutand toate functiile mai putin esentiale in programe sistem sau chiar programe utilizator. Ceea ce ramane este un micronucleu al sistemului de operare, care implementeaza numai un set restrans de primitive necesare. 1.5.2 Abordarea stratificata [layered] Noile versiuni UNIX sunt proiectate pentru a utiliza echipamente hardware mai avansate. Cu un suport hardware potrivit, sistemul de operare poate fi spart in bucati mai mici, mult mai potrivite decat cele permise de sistemele originale MS-DOS sau UNIX. In acesta situatie, sistemul de operare poate detine un mai mare control asupra calculatorului si a aplicatiilor care folosesc calculatorul. Implementatorii in schimb au mai multa libertate sa realizeze modificari in munca interna a sistemului. Sub abordarea topdown, functionalitatea si caracteristicile generale pot fi determinate si separate in componente. Ascunderea informatiilor este de asemenea importanta, lasand programatorilor libertatea de a implementa rutinele de nivel jos, cu conditia ca interfata exterioara a rutinei ramane neschimbata iar rutina insasi realizeaza sarcina anuntata. Modularizarea unui sistem se poate realiza in mai multe moduri. Cea mai des intalnita este abordarea stratificata, care consta in spargerea sistemului de operare intr-un numar de straturi (nivele), fiecare construit peste nivelele de mai jos. Nivelul de baza (stratul 0) este hardware-ul, in timp ce nivelul cel mai inalt il reprezinta interfata utilizator. Un sistem de operare stratificat este o implementare a uni obiect abstract care reprezinta incapsularea datelor si a operatiilor care pot manipula aceste date. Un strat tipic dintr-un sistem de operare consta in niste structuri de date si un set de rutine care pot fi invocate de (din) straturile de nivel mai inalt. Acest strat, in schimb, poate apela operatii ale straturilor de nivel mai jos. Principalul avantaj al abordarii stratificate este modularitatea. Straturile sunt selectate astfel incat fiecare dintre acestea utilizeaza numai functii (operatii) si servicii ale straturilor de nivel inferior. O astfel de abordare simplifica depanarea si verificarea sistemului. Primul strat poate fi depanat fara a ne face griji in legatura cu restul sistemului, deoarece, prin definitie, utilizeaza numai hardware-ul de baza pentru a-si implementa functiile. Odata primul nivel depanat, putem presupune ca functionarea acestuia este corecta in timpul depanarii urmatorului nivel, si asa mai departe. O eroare identificata in timpul depanarii unui nivel (strat) ne asigura asupra faptului ca aceasta se gaseste pe stratul curent. Astfel, proiectarea si implementarea sistemului este simplificata daca sistemul este spart in straturi. Fiecare strat este implementat folosind numai acele operatii oferite de straturile inferioare. Un strat asadar nu are nevoie de informatii asupra implementarii acestor operatii, decat asupra operatiilor indeplinite. Asadar fiecare strat ascunde existenta unor structuri de date, operatii si hardware nivelelor de nivel mai inalt. Abordarea stratificata pentru proiectarea unui sistem de operare a fost utilizata pentru prima oara la sistemul de operare THE (Technische Hogeschool Eindhoven). Acesta a fost definit in sase straturi: hardware (nivelul 0), planificarea CPU (nivelul 1), gestiunea memoriei (nivelul 2), driverul de dispozitiv pentru consola operator (nivelul 3), buffering pentru dispozitivele I/O (nivelul 4) si programele utilizator (nivelul 5). Principala dificultate in abordarea stratificata implica definitia corecta a diferitelor straturi. Deoarece un strat poate folosi numai acele straturi care sunt de un nivel inferior, este necesara o planificare atenta in definitia straturilor. Astfel, spatiul disc utilizat de algoritmii pentru memoria virtuala trebuie sa se gaseasca pe un nivel inferior decat rutinele de gestiune a memoriei, deoarece gestiunea memoriei presupune abilitatea de a utiliza acest spatiu. Totusi, alte cerinte s-ar putea sa nu fie chiar clare. De exemplu, spatiul disc utilizat de algoritmii pentru memoria virtuala ar trebui sa se gaseasca in mod normal deasupra stratului de planificare a CPU, deoarece

ar putea fi necesara incheierea operatiilor I/O asupra acestui spatiu, iar CPU ar putea fi replanificata pentru aceasta perioada. Totusi, pe sisteme mari, planificatorul CPU ar putea detine informatii mai multe despre toate procesele care se gasesc in memorie, prin urmare aceste informatii ar putea avea nevoie de spatiul memoriei virtuale pentru a fi scoase sau introduse in memorie, prin urmare in aceasta situatie planificarea CPU ar trebui sa se gasesca pe un nivel mai inalt. O alta problema cu implementarea stratificata este ca aceasta tinde sa fie mai putin eficienta decat altele. Astfel, pentru un program utilizator care realizeaza o operatie I/O, urmeaza sa se execute un apel sistem, transmis catre nivelul I/O, acesta apeleaza nivelul de gestiune al memoriei, trecand prin nivelul de planificare al CPU pana la nivelul hardware. La fiecare nivel parametrii pot fi modificati, alte date ar putea fi transmise, astfel incat fiecare nivel poate adauga informatii apelului sistem, ceea determina un apel sistem mai greoi decat intr-un sistem nestratificat. 1.6 Masini virtuale Conceptual, un sistem de calcul este format din mai multe straturi. Hardware-ul reprezinta cel mai mic nivel in toate aceste sisteme. Nucleul care ruleaza la nivelul urmator utilizeaza instructiunile hardware pentru a creea o multime de apeluri sistem pentru utilizarea straturilor exterioare. Programele sistem care se gasesc deasupra nucleului sunt asadar capabile sa utilizeze fie apelurile sistem fie instructiunile hardware. Astfel, desi accesul se realizeaza diferentiat, ambele ofera functionalitate pe care programul o poate utiliza pentru a creea functii mai avansate. La randul lor, programele sistem trateaza atat hardwareul cat si apelurile sistem ca si cum s-ar afla la acelasi nivel. Anumite sisteme duc aceasta schema un pas mai departe, permitand programelor sistem sa fie apelate usor de catre programele de aplicatie. Ca inainte, desi programele sistem se gasesc la un nivel mai inalt decat celelalte rutine, programele de aplicatie pot "vedea" tot ceea ce se gaseste sub nivelul lor in ierarhie ca si cum partea de sub ele ar face parte chiar din masina. Aceasta abordare stratificata a dus la dezvoltarea conceptului de masina virtuala. Folosind planificarea CPU si tehnicile de memorie virtuala, un sistem de operare poate creea iluzia proceselor multiple, fiecare executandu-se pe procesorul propriu, cu memoria (virtuala) proprie. Acest proces are nevoie de cateva trasaturi suplimentare, cum ar fi apelurile sistem si sistemul de fisiere, care in mod obisnuit nu sunt oferite de hardware. Abordarea cu masini virtuale, pe de alta parte, nu ofera nici o functie suplimentara, insa poate oferi o interfata care este identica cu cea catre hardware-ul de baza. Fiecarui proces ii este oferita p copie (virtuala) a calculatorului. Resursele calculatorului fizic sunt partajate pentru a creea masina virtuala. Planificarea CPU poate fi utilizata pentru a partaja CPU si pentru a creea aparenta ca utilizatorii poseda propriul procesor. Tehnica spooling si un sistem de fisiere pot oferi lectori de cartele virtuali sau imprimante (de linie) virtuale. O dificultate majora in ceea ce priveste abordarea cu masina virtuala implica sisteme de discuri. Sa presupunem ca memoria fizica este dotata cu trei unitati de disc dar este nevoie de suport pentru sapte masini virtuale. Evident, nu se poate aloca cate un disc pentru fiecare masina virtuala. Solutia consta in oferirea de discuri virtuale, identice din toate punctele de vedere, cu exceptia marimii. Aceste minidiscuri sunt implementate de catre sistem prin alocarea numarului de piste necesare pe un disc fizic. Astfel, utilizatorii primesc o masina virtuala proprie. Ei pot rula orice parte a sistemului de operare sau pachet software disponibil pe masina. Software-ul pentru masina virtuala este interesat de multiprogramarea masinilor multiple pe o masina fizica, dar nu trebuie sa aiba in vedere orice usersupport software. Aceasta poate oferi o partitionare utila a problemei proiectarii unui sistem interactiv multiutilizator in doua bucati mai mici. Desi conceptul de masina virtuala este extrem de util, este dificil de implementat. Este nevoie de un efort considerabil pentru a oferi o copie exacta a masinii. Sa ne aducem aminte ca masina fizica poate poseda doua moduri: modul utilizator si modul monitor. Software-ul masinii virtuale poate rula in mod monitor, fiind (parte a) sistemului de operare. Pe de alta parte, masina virtuala poate rula doar in mod utilizator. Totusi, la fel ca masina fizica, masina virtuala trebuie sa aiba cele doua moduri. Prin urmare, trebuie sa existe un mod virtual utilizator si un mod virtual monitor, ambele ruland intr-un mod fizic utilizator. Actiunile care determina transferul din modul utilizator in modul monitor pe o masina fizica trebuie sa determine de asemenea transferul din mod virtual utilizator in mod virtual monitor pe o masina virtuala. Acest transfer se poate realiza in general relativ simplu. Cand are loc un apel sistem, acesta este realizat de catre un program care ruleaza intr-o masina virtuala in mod virtual utilizator, si va determina un

transfer la monitorul masinii virtuale in masina reala. Modul utilizator virtual este de asemenea un mod utilizator fizic. Cand monitorul masinii virtuale capata controlul, acesta poate modifica continutul registrilor si contorul program pentru masina virtuala pentru a simula efectul apelului sistem. Acesta poate reporni masina virtula, observand ca este acum in mod monitor virtual. Daca apoi masina virtuala apoi incearca, de exemplu, sa citeasca de la un lector de cartele virtual, va executa o instructiune I/O privilegiata. Deoarece masin virtuala ruleaza in mod utilizator fizic, aceasta instructiune va trap catre monitorul masinii virtuale. Monitorul masinii virtuale va simula apoi executarea instructiunii I/O. Intai va identifica fisierul spooled care implementeaza cititorul de cartele virtual. Apoi, transforma citirea de la cititorul de cartele virtual intr-o citire din fisierul disc identificat mai sus, dupa care transfera urmatoarea "imagine" de cartela virtuala in memoria virtuala a masinii virtuale. In fine, va putea reporni masina virtuala. Starea masinii virtuale s-a modificat ca si cum s-ar fi executat instructiunea I/O de la un cititor de cartele real intr-o masina reala, care ruleaza in mod utilizator real. Diferenta principala este, desigur, timpul. In timp ce o operatie reala I/O ar dura, sa zicem, 100 milisecunde, operatia virtuala I/O ar putea dura mai putin (datorita fisierului spool) sau mai mult (datorita faptului ca este interpretata). In plus, CPU este multiprogramata intre mai multe masini virtuale, ceea ce determina o incetinire a masinilor virtuale intr-un mod impredictibil. Intr-un caz extrem, ar putea fi nevoie de simularea tuturor instructiunilor pentru a oferi o masina virtuala completa. Conceptul de masina virtuala poseda mai multe avantaje. Sa observam pentru inceput ca in acest mediu exista o protectie completa a diferitelor resurse ale sistemului. Fiecare masina virtuala este complet izolata de celelalte masini virtuale, prin urmare nu exista probleme de securitate. Pe de alta parte, nu exista o partajare directa a resurselor. Pentru a oferi partajarea, au fost implementate doua abordari. In primul rand, este posibila partajarea minidiscurilor. Aceasta schema este modelata dupa discul fizic partajat, insa la nivel software. Prin aceasta tehnica, este posibila partajarea fisierelor. In al doilea rand, este posibil sa definim o retea de masini virtuale, fiecare putand transmite informatii printr-o retea de comunicatie virtuala. Din nou, reteaua este modelata dupa retelele fizice de comunicatie, insa la nivel software. Astfel de masini virtuale sunt vehicule perfecte pentru cercetarea si dezvoltarea in sistemele de operare. In mod normal, modificarea unui sistem de operare este o sarcina dificila. Deoarece sistemul de operare este un program complex si de dimensiuni mari, este dificil sa ne asiguram ca o modificare intr-un punct nu va conduce la aparitia unor erori obscure intr-o alta parte a sistemului. Datorita puterii sistemului de operare, aceasta situatie este deosebit de periculoasa. Astfel, deoarece sistemul de operare se executa in mod monitor, o modificare gresita a unui pointer poate duce la distrugerea intregului sistem de fisiere. AStfel, este necesar ca orice modificare intr-un sistem de operare sa fie testata cu foarte multa atentie. Totusi, sistemul de operare ruleaza pe si controleaza intreaga masina. Prin urmare, sistemul curent trebuie oprit si scos din uz pe perioada realizarii si testarii modificarilor. Aceasta perioada este in mod normal numita perioada de dezvoltare a sistemului. Deoarece aceasta face ca sistemul sa devina indisponibil utilizatorilor, aceasta activitate este deseori programata in perioadele cu incarcare joasa a sistemului. O masina virtula insa poate elimina mare parte din aceste probleme. Programatorilor sistem le sunt oferite propriile masini virtuale, iar dezvoltarea sistemului se realizeaza in aceste masini virtuale, decat direct pe masina fizica. Astfel, functionarea normala a sistemului are rareori nevoie de intreruperi in vederea dezvoltarii sistemului 1.7 Proiectarea si implementarea sistemului 1.7.1 Tintele proiectarii Prima problema in proiectarea unui sistem este de a defini tintele (scopurile) si specificatiile sistemului. La cel mai inalt nivel, proiectarea sistemului poate fi afectata de alegerea hardware-ului si de tipul sistemului: cu prelucrare in loturi, cu partajarea timpului, mono-utilizator, multi-utilizator, distribuit, in timp real sau de scop general. Dincolo de acest nivel inalt de proiectare, cerintele pot fi specificate mult mai greu. Acestea pot fi divizate in doua grupuri de baza: cerintele utilizator si cerintele sistem. Utilizatorii doresc ca un sistem sa posede cateva proprietati evidente: sistemul trebuie sa fie usor de utilizat, usor de invatat, rapid, sigur, solid si comod in utilizare. Desigur, aceste specificatii nu sunt de utilitate in proiectarea unui sistem, de vreme ce nu exista o intelegere generala asupra felului in care se pot atinge aceste scopuri.

O multime similara de cerinte poate fi definita de catre cei care vor proiecta, creea, intretine si opera sistemul: sistemul de operare trebuie sa fie usor de proiectat, implementat, intretinut; trebuie sa fie flexibil, de incredere, lipsit de erori si eficient. Din nou, aceste cerinte sunt prea vagi pentru a putea oferi o solutie generala. Nu exista o solutie unica a problemei definirii cerintelor unui sistem de operare. Varietatea sistemelor arata ca cerinte diferite pot duce la o varietate larga de solutii pentru diferitele medii. Specificatiile si proiectarea (designul) unui sistem de operare este o sarcina extrem de creativa. Ingineria software este domeniul care poate oferi idei si principii cu aplicabilitate directa in sistemele de operare. 1.7.2 Mecanisme si politici Un principiu important este separarea politicilor de mecanisme. Mecanismele determina modul in care se realizeaza ceva, in timp ce politicile stabilesc ce se va realiza. De exemplu, un mecanism pentru asigurarea protectiei CPU este timer-ul. Decizia asupra lungimii perioadei acestuia pentru un utilizator particular este, pe de alta parte, o decizie de politica. Separarea politicii de mecanism este importanta pentru flexibilitate. Este de asteptat ca politicile sa se modifice din cand in cand. In cel mai rau caz, orice modificare a politicii va determina o schimbare in mecanismul corespunzator. Un mecanism general ar fi insa mai de dorit. O modificare in politica ar duce atunci doar la modificarea a catorva parametrii ai sistemului. Sistemele de operare bazate pe micro-nuclee duc separarea mecanismelor de politici la extrem, implementand o multime de baza de blocuri de constructie primitive. Aceste blocuri sunt aproape independente de politici, permitand adaugarea mai multor mecanisme avansate si politici sa fie adaugate prin modulele-nucleu create de catre utilizator, sau chiar a programelor utilizator. La cealalta extremitate se gasesc sisteme de operare (Apple Macintosh, de exemplu) care codifica atat mecanismele cat si politicile in sistem pentru a forta un aspect si comportare globala a sistemului. Toate programele au interfete similare, de vreme ce interfata insasi este incorporata in nucleu. Deciziile de politica sunt importante pentru alocarea tuturor resurselor si pentru problemele de planificare. De fiecare data cand este necesar sa decidem daca urmeaza sa fie alocata sau nu o resursa, urmeaza sa fie luata o decizie de politica. Pe de alta parte, de fiecare data cand intrebarea este cum in loc de ce, va fi vorba despre determinarea unui mecanism. 1.7.3 Implementare Odata proiectat sistemul de operare, acesta trebuie sa fie implementat. In mod traditional, sistemele de operare sunt scrise in limbaj de asamblare. Totusi, sistemele de operare moderne pot fi scrise acum chiar in limbaje de programare de nivel inalt. Avantajele utilizarii unui limbaj de programare de nivel inalt (sau cel putin un limbaj de implementare a sistemelor) pentru implementarea unui sistem de operare, sunt cele rezultate din utilizarea limbajelor de nivel inalt in scrierea programelor de aplicatie: codul poate fi scris mai rapid, este mai compact si mai usor de inteles si depanat. Principalele dezavantaje ar fi viteza redusa si cerintele suplimentare de depozitare. Desi nici un compilator nu poate produce cod mai eficient decat o poate face un programator expert in limbaj de asamblare, compilatorul poate totusi produce deseori cod cel putin la fel de bun cu cel realizat de programatorul mediu in limbaj de asamblare. In plus, simpla inlocuire a compilatorului utilizat cu un compilator mai bun va duce la o imbunatatire uniforma a codului generat pentru intregul sistem de operare printr-o simpla recompilare. In fine, un sistem de operare este mult mai usor de portat daca este scris intr-un limbaj de nivel inalt. La fel cu cazul altor sisteme, imbunatatiri majore a performantei se pot obtine mai degraba prin structuri de date mai potrivite si algoritmi mai buni decat printr-o codificare mai curata. In plus, desi sistemele de operare sunt sisteme mari, doar o mica parte a codului este critica pentru obtinerea unor performante inalte; gestiunea memoriei si planificarea CPU sunt probabil cele mai critice rutine. Dupa ce sistemul este scris si functioneaza corect, rutinele critice pot fi identificare si inlocuite cu echivalentul lor in limbaj de asamblare. Pentru identificarea rutinelor critice (care produc gatuirea sistemului), trebuie sa fim capabili sa monitorizam performanta sistemului. Trebuie adaugat cod pentru a calcula si afisa masuratorile comportarii sistemului. In cateva sisteme, sistemul de operare realizeaza aceasta sarcina producand trasarea comportarii sistemului. Toate evenimentele interesante pot fi insemnate impreuna cu momentul producerii si cei mai importanti parametrii. Analiza ulterioara a fisierelor care contin aceste informatii

poate fi realizata pentru a determina performanta sistemului si eventualele locuri de gatuire sau ineficienta. De asemenea, aceste trasari pot fi utilizate ca intrare intr-o simulare a unei variante imbunatatite a sistemului. In fine, trasarile pot fi extrem de utile si in depistarea posibilelor erori in comportamentul sistem. O alternativa posibila este de a determina si afisa masuratorile de performanta in timp real. Aceasta abordare poate permite operatorilor sistemului sa devina mai familiari cu comportamentul sistemului si sa modifice functionarea sistemului in timp real. 1.8 Generarea sistemului Este posibil ca un sistem de operare sa fie proiectat, codificat si implementat pentru o anume masina dintr-o anumita locatie. Uzual insa este ca sistemelor de operare sa fie proiectate sa ruleze pe orice clasa de masini dintr-o varietate de locatii si o varietate de configuratii ale perifericelor. Sistemul trebuie sa fie configurat si generat pentru fiecare locatie specifica. Acest proces se numeste generarea sistemului. In mod normal, sistemul de operare este distribuit pe un suport magnetic. Pentru a genera sistemul, urmeaza sa fie utilizat un program spcial (SYSGEN). Acesta citeste date dintr-un fisier sau interogheaza operatorul in legatura cu configurarea specifica a sistemului hardware: Ce fel de CPU urmeaza a fi utilizata? Care sunt optiunile instalate? Pentru sisteme cu mai multe CPU, fiecare dintre acestea urmeaza sa fie descrise. Care este cantitatea de memorie disponibila? Anumite sisteme vor determina singure aceasta valoare incercand sa determine ultima locatie de momeorie prin intermediul unei erori "adresa ilegala". Astfel, este definita ultima adresa legala, determinand asadar cantitatea de memorie disponibila. Care sunt dispozitivele disponibile? Sistemul va trebui sa cunoasca pentru fiecare dispozitiv modul de adresare (numarul dispozitivului), intreruperea, tipul si modelul dispozitivului, si orice alte caracteristici speciale. Care dintre optiunile sistemului de operare sunt dorite, sau ce valori ale parametrilor urmeaza sa fie utilizate? Aceste optiuni sau valori pot include numarul si marimile bufferelor, algoritmul de planificare al CPU dorit, numarul maxim de procesoare suportate, si altele. Odata aceste informatii definite, acestea pot fi utilizate in mai multe moduri. In cazul extrem, pot fi utilizate pentru a modifica o copie a sursei sistemului de operare. In aceasta situatie declaratiile de date, initializarile si constantele, impreuna cu compilarea condiionata vor conduce la o versiune obiect a sistemului de operare care este croita dupa descrierea oferita sistemului. La un alt nive, descrierea sistemului poate determina crearea unot tabele si selectarea modulelor dintr-o biblioteca precompilata. Aceste module urmeaza sa fie legate impreuna pentru a forma sistemul de operare generat. Procesul de selectie va permite astfel ca biblioteca sa contina drivere de dispozitiv pentru toate dispozitivele I/O suportate, urmand ca numai cele necesare sa fie legate in sistemul de operare. Deoarece sistemul nu are nevoie de o recompilare, generarea sistemului prin aceasta metoda este mai rapida, dar se poate ajunge la un sistem cu un grad mai ridicat de generalitate decat s-a dorit. Ca un caz extrem, este posibil sa construim un sistem care este orientat in intregime spre tabele. Intregul cod va fi totdeauna parte a sistemului de operare, iar selectia se va produce in momentul executiei in loc de momentul compilarii. Generarea sistemului implica doar crearea tabelelor potrivite pentru a descrie sistemul. Diferenta majora dintre aceste abordari diferite consta in marimea si generalitatea dorita a sistemului generat, precum si usurinta modificarii pe masura ce configuratia hardware sufera modificari. Dupa ce este generat sistemul de operare, acesta trebuie facut disponibil hardware-ului. Procedura de pornire a calculatorului prin incarcarea nucleului unui sistem de operare se numeste bootare. Pe majoritatea sistemelor este vorba de o mica bucata de cod, depozitata in ROM, a carui denumire este de bootstrap program sau bootstrap loader. Acest cod este capabil sa identifice nucleul, sa il incarce in memorie si sa porneasca executia acestuia.

S-ar putea să vă placă și