Examen-somipp

  • Uploaded by: Ana Toma
  • 0
  • 0
  • March 2021
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Examen-somipp as PDF for free.

More details

  • Words: 25,351
  • Pages: 65
Loading documents preview...
1. Noţiuni de bază și clasificări Un calculator constă dintr-un ansamblu de componente funcţionale fizice şi logice, care cooperează pentru a satisface cerinţele utilizatorilor privind introducerea, stocarea, prelucrarea, căutarea şi transmiterea informaţiilor. Aceste componente funcţionale sunt structurate pe niveluri, care interacţionează prin interfeţe bine definite. Prin noţiunea de sistem de operare înţelegem modulele program ale unui SO, care administrează resursele tehnice. Modulele în cauză soluționează situațiile de conflict, optimizează productivitatea sistemului, sporesc eficiența utilizării lui. Valorile concrete ale atributelor sistemelor de operare şi combinaţii ale acestora determină diverse tipuri de SO. Conform acestor atribute pot fi evidenţiate următoarele tipuri de sisteme de operare:  secvenţiale,  cu multiprogramare,  cu prelucrare multiplă,  în timp real, etc. 2. Noţiuni şi termeni din domeniul resurselor tehnice Pentru a trece la noţiunile principale, legate de hardware, vom face cunoştinţă mai întâi cu funcţiile de bază ale unui calculator. Pot fi evidenţiate cinci funcţii esenţiale : stocarea datelor şi extragerea rezultatelor:  iniţializarea implică testarea părţilor importante ale calculatorului, rularea fişierelor de pornire şi încărcarea altor fişiere necesare, cum ar fi driverele dispozitivelor periferice;  introducerea reprezintă transferul datelor dintr-o sursă externă în calculator. Surse externe pot fi tastatura, mouse-ul, discheta, discul mobil, memory stick-ul, aparatul digital de fotografiat etc.;  procesarea se referă la manipularea datelor introduse în scopul producerii unui rezultat (ieşirea);  stocarea constituie procesul salvării informaţiilor (date sau programe) într-un dispozitiv de păstrare, de exemplu discul fix, pentru recuperarea ulterioară. 3. Noţiuni şi termeni din domeniul sistemelor de operare Un sistem de operare este un ansamblu de programe de control şi de serviciu care ghidează un calculator în execuţia sarcinilor sale, asistă programele de aplicaţie şi interacţionează cu utilizatorul prin intermediul anumitor funcţiuni. Natura funcţiilor şi modul în care acestea sunt realizate determină atributele care caracterizează un sistem de operare: timpul de răspuns- exprimă durata intervalului delimitat de lansarea unei cereri de serviciu şi achitarea acesteia de către sistem, simultaneitatea utilizării- măsoară gradul în care un sistem poate să execute în acelaşi timp mai multe lucrări., eficienţa- măsoară proprietatea unui sistem de a folosi în mod optim resursele de care dispune, partajarea resurselor şi protecţia informaţiei în calculator-caracterizează nivelul la care utilizatorii au posibilitatea să utilizeze în comun informaţia prezentă în sistem şi nivelul la care pot să comunice între ei, în deplină siguranţă, generalitatea, flexibilitatea, extensibilitatea, fiabilitatea şi disponibilitatea, transparenţa şi vizibilitatea. Un sistem de operare este obligat:  să păstreze informaţia despre starea fiecărei resurse,  să ia decizia cărui proces să i se aloce resursa, în ce cantitate, când, cum şi unde,  să aloce resursa şi, la momentul oportun, să o retragă.

1

4. Tipuri de sisteme de operare, obiective şi funcţii Valorile concrete ale atributelor sistemelor de operare şi combinaţii ale acestora determină diverse tipuri de SO. Conform acestor atribute pot fi evidenţiate următoarele tipuri de sisteme de operare:  Un sistem secvenţial (tratare pe loturi, engl. batch processing, fr. traitement par lots) execută la un moment dat un singur program, care trebuie terminat înainte de a începe execuţia unui alt program.  Sistemele cu multiprogramare acceptă la un moment dat mai multe programe în memoria centrală, acestea aflându-se în diferite stadii de execuţie.  Un sistem de calcul cu prelucrare multiplă dispune de mai multe procesoare, care pot să execute simultan unul sau mai multe programe. Sistemele de timp real funcţionează, de obicei, în cadrul unor sisteme de comandă şi este necesar ca valorile anumitor atribute să se încadreze în limite destul de restrictive, dictate de dinamica proceselor comandate. 5. Exemple de sisteme de operare Windows, Unix, MS DOS 6. Exemple de sisteme de operare. Cazul calculatoarelor personale Cea mai simplă configuraţie a unui calculator personal (PC) include o unitate centrală, o memorie principală, un display, o tastatură şi un mouse. Această configuraţie, de regulă, este completată de o memorie secundară şi o imprimantă. Utilizatorul unui astfel de sistem va cere minimum următoarele două tipuri de servicii: identificarea şi crearea unor fişiere sau mulţimi structurate de informaţii; Stocarea acestor fişiere în memoria secundară; transferarea informaţiilor între fişiere şi dispozitivele de intrare/ieşire; execuţia unor programe existente sau introduse sub formă de fişiere în PC; 7. Exemple de sisteme de operare. Comanda unor procese industriale Procesul de producere este comandat de un calculator care îndeplineşte următoarele funcţii:  Reglare. Pentru o derulare bună a procesului de fabricaţie parametrii de funcţionare (temperatura, presiunea, concentraţia, etc.) trebuie să se afle într-o plajă de valori predefinite. Pentru aceasta va fi acţionat debitul de intrare a materiilor prime A sau B. Parametrii de funcţionare sunt măsuraţi cu ajutorul unor captoare. Calculatorul preia aceste măsurări şi, în dependenţă de algoritmul de comandă, acţionează robinetele de intrare.   Înregistrare. Rezultatele măsurărilor sunt periodic înregistrate; valorile lor sunt afişate pe un tablou de bord şi recopiate într-un fişier ("jurnal de bord") în scopul unor prelucrări ulterioare (date statistice).   Securitate. În cazul în care unul dintre parametrii măsuraţi depăşeşte o valoare critică predefinită reactorul trebuie oprit imediat.   8. Exemple de sisteme de operare. Sisteme tranzacţionale  sistemul gestionează un set de informaţii sau baze de date, care pot atinge volume importante de informaţie;  asupra acestor informaţii pot fi executate un anumit număr de operaţii predefinite sau tranzacţii, adesea interactive;  sistemul este dotat cu un mare număr de puncte de acces şi un mare număr de tranzacţii se pot derula simultan. Caracteristicile obligatorii ale unui astfel de sistem tranzacţional sunt disponibilitatea şi fiabilitatea; pentru unele sisteme poate fi importantă şi toleranţa la defecţiuni. O caracteristică importantă ale sistemelor tranzacţionale este multitudinea activităţilor paralele, iar în multe cazuri şi repartizarea geografică a componentelor. 2

9. Exemple de sisteme de operare. Sisteme în timp partajat Destinaţia principală a unor astfel de sisteme este furnizarea serviciilor necesare unei mulţimi de utilizatori, fiecare dintre ei beneficiind de servicii:  echivalente serviciilor unui calculator individual;  legate de existenţa unei comunităţi de utilizatori: partajarea informaţiilor, comunicaţii între utilizatori. Problemele care apar datorită conceptului de partajare a timpului sunt o combinaţie a problemelor existente în cazul unui calculator individual cu cele din sistemele tranzacţionale. Caracteristicile obligatorii ale unui astfel de sistem îmbină, în egală măsură, calităţile unui sistem de operare al unui calculator individual şi al unui sistem tranzacţional, cum ar fi: disponibilitatea, fiabilitatea, securitatea, exploatarea optimă a caracteristicilor resurselor fizice, calitatea interfeţei şi serviciilor utilizatorului, facilitatea adaptării şi extensibilităţii. 10. Sistemul de operare și procesele Noţiunea de proces este asociată conceptului de lucrare şi poate fi definită ca o suită temporală de execuţii de instrucţiuni, considerată ca fiind o entitate de bază în descrierea sau analiza funcţionării unui sistem. Evoluţia în timp a unui proces presupune un consum de resurse, dictat de natura şi complexitatea instrucţiunilor de execuţie. În particular, rezultă că ori de câte ori se execută procedurile de sistem, resursele, pe care le utilizează acesta, intră în administrarea procesului, care a cerut serviciul. Resursele alocate unui proces variază în timp. 11. Mașină ierarhică și mașină extinsă Setul de instrucţiuni realizat hardware împreună cu instrucţiunile suplimentare ale sistemului de operare formează sistemul de comenzi al maşinii extinse. Nucleul sistemului de operare va fi executat pe maşina “goală”, iar programele utilizatorului – pe maşina extinsă.

3

12. Alte puncte de vedere asupra sistemelor de operare. Abordare funcţională. Abordare din punctul de vedere al interfeţei cu utilizatorul Sistemele de operare pot fi abordate din diferite puncte de vedere, cum ar fi SO şi procesele, SO şi maşina extinsă sau SO şi maşina ierarhică. Există şi alte puncte de vedere asupra sistemelor de operare pe care un specialist ar trebui să le cunoască.  Abordare funcţională Abordare funcţională-Pentru un utilizator obişnuit, convins că un calculator este doar un instrument care îl ajută în soluţionarea unor probleme din domeniul său de activitate, noţiunile, cum ar fi administrarea memoriei cu paginaţie sau driverele dispozitivelor, nu semnifică prea multe. Destinaţia principală a unui sistem de operare pentru această categorie de utilizatori este punerea la dispoziţie a unui set de programe care l-ar ajuta în formularea şi soluţionare problemelor concrete ce ţin de domeniul său de activitate.  Abordare din punctul de vedere al interfeţei cu utilizatorul Interfaţa sistemului de operare cu utilizatorul prezintă un interes aparte. Progresul în acest domeniu este spectaculos, dacă vom lua în consideraţie că în primele sisteme de operare utilizatorul era obligat să indice în mod explicit şi manual (în regim textual) fiecare pas, oricât de nesemnificativ ar fi părut. Formularea paşilor cu ajutorul unui limbaj specializat, cum ar fi Job Control Language (JCL), nu a schimbat substanţial situaţia.

13. Evoluția sistemelor de operare. Multiprogramarea şi partajarea timpului. Organizarea intrărilor - ieşirilor în memorii tampon. Multiprogramarea. Sisteme cu timp partajat. 4

Primele sisteme erau caracterizate prin prelucrarea secvenţială a taskurilor. Timpul de execuţie a programelor era relativ mare, instrumentele de depanare – primitive, fiecare programator îşi încărca în mod individual programul (pachetul de cartele perforate), apăsa butoane, controla conţinutul locaţiunilor de memorie, etc. (1950 – 1956). Au fost propuse programe de monitorizare (monitoare), care treceau de la o lucrare la alta în mod automat, utilizatorul fiind responsabil de organizarea corectă a programelor în cadrul unui pachet – primele încercări de prelucrare pe loturi (1956 – 1959). După 1965 au apărut primele sisteme cu partajare a timpului (time sharing), au fost propuse sisteme sofisticate de administrare a informaţiei Memoria virtuală şi maşinile virtuale sunt nişte principii care nici până astăzi nu au fost exploatate până la capăt. Progresele ultimilor ani în domeniul resurselor tehnice au permis implementarea acestor principii nu numai în cadrul sistemelor de calcul mari, ci şi pentru calculatoarele personale.  Multiprogramarea şi partajarea timpului Utilizarea principiului multiprogramării sau partajarea memoriei între mai mulţi utilizatori a permis o utilizare şi mai bună a procesorului central. Exploatarea unui calculator conform principiului timpului partajat oferă utilizatorilor posibilităţi analogice unui calculator individual, permiţând beneficiul unor servicii comune la un preţ redus.  Organizarea intrărilor - ieşirilor în memorii tampon  Multiprogramarea Multiprogramarea este un termen utilizat în cazul unui sistem în care pot exista simultan câteva procese în stare de execuţie. Un proces se consideră în stare de execuţie, dacă calculele au început, dar la momentul considerat nu au fost terminate sau întrerupte. Multiprogramarea permite menţinerea unităţii centrale în stare activă pentru perioada încărcării programelor sau operaţiilor de intrare-ieşire. Acest mod de funcţionare este adaptat tratării pe loturi pe un calculator, care nu dispune de un mecanism de reamplasare dinamică.  Sisteme cu timp partajat Destinaţia principală a unor astfel de sisteme este furnizarea serviciilor necesare unei mulţimi de utilizatori, fiecare dintre ei beneficiind de servicii:  echivalente serviciilor unui calculator individual;  legate de existenţa unei comunităţi de utilizatori: partajarea informaţiilor, comunicaţii între utilizatori. Problemele care apar datorită conceptului de partajare a timpului sunt o combinaţie a problemelor existente în cazul unui calculator individual cu cele din sistemele tranzacţionale şi pot fi clasificate după cum urmează:  definirea maşinii virtuale oferite fiecărui utilizator;  partajarea şi alocarea resurselor fizice comune: procesoare, memorii, dispozitive de comunicaţie;  gestionarea informaţiilor partajate şi a comunicaţiilor.

14. Windows, Unix şi alte sisteme. SО UNIX şi standardele sistemelor deschise

5

Paralel cu evoluţia tehnică şi funcţională a sistemelor de operare a avut loc şi o importantă evoluţie conceptuală, care a permis o mai bună înţelegere a funcţionării sistemelor de operare şi a condus la elaborarea unor metode proprii de concepere. Debutul unei cercetări ştiinţifice a sistemelor de operare poate fi considerat anul 1964, care a succedat o etapă importantă de dezvoltare tehnică: primele sisteme cu partajare a timpului (Thor, CTSS). Sistemul de operare UNIX, primul sistem mobil care asigură un mediu fiabil de dezvoltare şi utilizare a softului de aplicaţie, este fundamentul practic de elaborare a sistemelor fizico-logice deschise.  SО UNIX şi standardele sistemelor deschise Sistemul de operare UNIX, primul sistem mobil care asigură un mediu fiabil de dezvoltare şi utilizare a softului de aplicaţie. Implementarea largă a sistemului de operare UNIX a permis trecerea de la declararea sistemelor deschise la dezvoltarea practică a acestui concept. Variantele SO UNIX, propuse de compania SCO şi destinate exclusiv platformelor Intel, sunt bazate pe modulele iniţiale ale System V 3.2, fiind total compatibile cu toate standardele de bază 15. OSF-1 şi alte variante UNIX. Standarde UNIX Open Software Foundation (OSF) a fost prima companie comercială, care a încercat elaborarea SO UNIX în baza micronucleului Mach. A fost creat sistemul de operare OSF-1, care nu era în sens de licenţiere „curat”, deoarece folosea o parte a modulelor iniţiale din SVR 4.0. Nu putem să nu amintim aici şi de realizarea originală a SO UNIX pentru platformele Intel, propusă de Torvald Linus – LINUX Prin standard al unei interfeţe al SO subînţelegem un set de proprietăţi, mai mult sau mai puţin formale, sintactice sau semantice ale componentelor sistemului de operare.  Standarde UNIX Unul dintre primele standarde de-facto a fost cel publicat de USL pentru versiunea SO UNIX System V Release 4 - System V Interface Definition (SVID). Mai menţionăm standardul de-facto SPARC Complience Definition, propus de organizaţia SPARC International. Pentru lumea UNIX este foarte important şi standardul limbajului de programare C, adoptat mai întâi de ANSI şi apoi de ISO. În acest standard sunt specificate, în afara limbajului C, bibliotecile necesare într-o realizare standard. Deoarece chiar de la apariţie limbajul C şi sistemele de programare respective erau strâns legate de UNIX, componentele bibliotecilor standard corespundeau exact mediului standard al SO UNIX. 16. Sisteme de operare cu micronucleu Micronucleul este partea minimă principală a unui sistem de operare, folosită pentru asigurarea modularităţii şi transportabilităţii. Noţiunea de micronucleu a fost introdusă de compania Next prin sistemul de operare cu micronucleul Mach. Următorul SO cu micronucleu a fost MS Windows NT, în care momentul principal declarat era, în afara modularităţii, transportabilitatea. Acest sistem de operare poate fi utilizat în sistemele mono- şi miltiprocesor, bazate pe procesoarele Intel, Mips, şi Alpha Au aderat la tehnologia „micronucleară” şi companiile Novell/USL, Open Software Foundation (OSF), IBM, Apple şi altele. Unul din concurenţii principali ai lui NT în domeniul SO cu micronucleu sunt Mach 3.0, creat în Universitatea Carnegy-Mellon, şi Chorus 3.0 al companiei Chorus Systems.

17. Modul de secvențial de execuție a unui program. Noţiuni fundamentale. Starea şi contextul procesorului 6

Un program secvenţial = o mulţime de proceduri, care se pot apela reciproc. Fiecărei proceduri îi este asociat un segment distinct de procedură. Datele sunt reprezentate prin segmente, pot fi proprii unei proceduri sau partajate între mai multe proceduri. Numim activitate fenomenul care rezultă din execuţia neîntreruptă a unei proceduri unice. !!Execuţia unui program secvenţial constă dintr-un lanţ de activităţi!!!! Numim context al unei activităţi mulţimea informaţiilor accesibile procesorului în cursul acestei activităţi. Contextul activităţii este compus din contextul procesorului (registrele programabile şi interne) şi contextul memoriei (segmentul procedurii şi segmentul datelor). Trecerea de la o activitate la alta este realizată de instrucţiuni speciale: apelarea şi returul din procedură, care realizează comutarea contextului.  Starea şi contextul procesorului Starea procesorului este determinată de conţinutul registrelor acestuia. Registrele pot fi: adresabile, numite registre generale, manipulate de programe, registre speciale - cuvânt de stare program (program status word, PSW). PSW conţine informaţii: Referitoare la starea procesorului: Starea de execuţie. Procesorul se poate afla în starea activ în care îndeplineşte instrucţii, sau în starea de aşteptare, când execuţia este suspendată. Modul de funcţionare: Protecţie - se permite doar programelor SO executarea unor instrucţiuni anumite (speciale), programele utilizatorilor neavând acces la aceste instrucţiuni. Masca întreruperilor. Referitoare la contextul accesibil al memoriei şi drepturile de acces asociate: tabele de segmente, indicatori de protecţie a memoriei, etc. Referitoare la derularea activităţii curente: codul condiţiei, contorul operaţiei următoare (contor ordinal). 18. Activităţi asincrone. Mecanisme de comutare a contextului. Pentru cazuri mai generale sunt necesare mecanisme suplimentare, cum ar fi conceptele de asincronism sau de protecţie reciprocă între activităţi. Prin asincronism înţelegem efectul care îl pot avea asupra derulării unei activităţi anumite evenimente exterioare. Numim protecţie reciprocă între activităţi o modificare mai profundă a contextului, atunci când se trece de la o activitate la alta, în comparaţie cu ceea ce are loc în cazul unei simple apelări de procedură. Un caz tipic de asincronism este executarea intrărilor-ieşirilor simultan cu execuţia unui program. Trebuie să fie asigurată posibilitatea informării programului despre terminarea unui transfer de informaţii.  Mecanisme de comutare a contextului Comutarea contextului unui procesor permite executarea într-o manieră indivizibilă (atomară) a următoarelor două operaţii: trecerea cuvântului de stare într-un amplasament specificat al memoriei, încărcarea în cuvântul de stare a conţinutului unui alt amplasament specificat al memoriei. Comutarea contextului poate fi necesară din mai multe cauze distincte. Presupunem că fiecărei cauze i-a fost asociat un număr de ordine. Pot fi întâlnite două scheme de comutare a contextului.  Salvare în amplasamente fixe.  Salvare într-o stivă. 19. Întreruperi.

20. Devieri şi apelarea supervizorului. O deviere semnalizează o anomalie în derularea unei instrucţiuni, care prohibitează executarea instrucţiunii. Originile pot fi diverse: date incorecte, instrucţiune neexecutabilă . Devierile pot fi 7

clasificate, ca şi întreruperile, conform cauzelor care le generează. O deviere poate fi suprimată, dar nici intr-un caz retardată. Un apel al supervizorului (supervisor call, prescurtat SVC, eng., appel au superviseur, fr.) este o instrucţiune chemată să provoace o comutare a contextului procesorului. Acest efect este analogic apelării unei proceduri, însă modificarea contextului este mai profundă. Destinaţia unui apel al supervizorului este de a permite apelarea unei proceduri a sistemului de operare, pretinzând la drepturi mai mari 21. Exemple de sisteme de întreruperi Sistemul de întreruperi are 5 nivele (în ordinea de descreştere a priorităţilor): eroare hardware, deviere, apelare supervizor, extern şi intrare-ieşire. Fiecărui nivel îi corespunde în memoria operativă un cuplu de amplasamente rezervate cuvintelor de stare vechi şi nou. Fiecare nivel conţine mai multe cauze de întrerupere. 22. Implementarea mecanismelor de comutare a contextului. Implementarea mecanismelor este ilustrată prin exemple, legate de utilizarea lor. Vom preciza notaţia utilizată în schemele programelor:  conţinutul unui cuvânt de stare este reprezentat prin notaţia . Dacă csp desemnează un cuvânt de stare, câmpurile sale vor fi desemnate de csp.act, csp.mod, csp.masc şi csp.co.  operatorul adr aplicat unui identificator de variabilă sau de procedură, desemnează adresa amplasamentului unde se află variabila sau prima instrucţiune a procedurii,  notaţia Mp[adr] desemnează conţinutul amplasamentului cu adresa adr.  notaţiile svc_vechi, dev_vechi, intr_x_vechi, svc_nou, dev_nou, intr_x_nou desemnează amplasamentele unde sunt plasate şi de unde sunt încărcate cuvintele de stare. Vom mai presupune că  apelarea supervizorului este de forma SVC , unde reprezintă un număr care permite identificarea funcţiei cerute,  un indicator permite stabilirea cauzei care provoacă o deviere. 23. Utilizarea devierilor şi apelării supervizorului

24. Exemple de utilizare a întreruperilor Principala utilizare a întreruperilor este măsurarea timpului şi administrarea operaţiilor de intrare-ieşire. Prezentăm mai jos câteva exemple de utilizare a ceasului calculatorului. procedura iniţializare; intr_ceas_nou:=
intr_ceas rel="nofollow">; svc_nou :=; dezarmare(intr_ceas); procedura tratare_svc; save(zonă); case cod of … apel_lim_timp_ex: -- parametrii p, q, tratare_eroare ceas:=q; cspretur:=svc_vechi; -- salvare pentru retur csplucrare:= ; csperoare:= ; armare(intr_ceas); restabileşte(zonă); încarcă_csp(csplucrare); … retur: -- datorat terminării procedurii p dezarmare(intr_ceas); încarcă_csp(cspretur); … endcase procedura intr_ceas; -- expirarea timpului limită dezarmare(intr_ceas); încarcă_csp(csperoare); 25. Programarea operațiilor de intrare- ieșire. Organizarea generală Prin noţiunea de intrare-ieşire numim orice transfer de informaţii din sau spre nucleul calculatorului. Operaţiile de I/E semnifică: transferurile de informaţii dintre diferite nivele ierarhice ale memoriei, transferurile de informaţii din sau spre mediul exterior (organe periferice locale sau la distanţă, captoare sau dispozitive de acţionare, alte calculatoare, etc.).  Organizarea generală Un organ de intrare-ieşire este un dispozitiv capabil să transfere informaţii între procesorul sau memoria calculatorului şi un suport extern de informaţie. Acest transfer este comandat de către procesorul central. Un canal este un procesor specializat în operaţiile de intrare-ieşire. El poate fi lansat doar de un procesor central, nu posedă întreruperi, dar poate întrerupe un procesor central. Un contróler este un dispozitiv de comandă adaptat la un tip concret de echipament periferic. Autonomia sa este limitată de operaţii foarte elementare. Destinaţia principală a unui controler este de a permite conectarea a mai multor periferice de acelaşi tip la un singur controler. Un periferic este un organ capabil să transfere informaţii din sau spre un suport extern. Controlerul este legat de periferic printr-o interfaţă, care conţine un set de funcţii şi o linie de comunicaţie, care serveşte la transferul informaţiilor. 26. Programarea operațiilor de intrare- ieșire. Metode de comandă a perifericelor Programul, care controlează funcţionarea elementară a unui dispozitiv periferic se numeşte driver. Driverul gestionează în mod direct interfaţa controlerului perifericului, tratează întreruperile generate de acesta, detectează şi tratează cazurile de eroare. Modurile principale de control ale perifericelor  Intrări-ieşiri programate pe canal sau acces direct la memorie Intrări-ieşiri asincrone cu întreruperi  Intrări-ieşiri sincrone 9

27. Programarea operațiilor de intrare- ieșire. Intrări-ieşiri buferizate în memorie Diferenţa considerabilă dintre viteza de lucru a unităţii centrale şi cea a organelor periferice impune "buferizarea" intrărilor-ieşirilor, adică introducerea unei zone-tampon de memorie între periferic şi programul utilizatorului. Scopul este de a reduce timpul de inactivitate a unităţii centrale, dezlegând funcţionarea acesteia de periferice. Programul utilizatorului va transfera informaţiile din sau spre zona-tampon, iar această zonătampon va servi, în mod paralel, drept sursă sau destinaţie la schimbul de date cu perifericul. Dezlegarea unităţii centrale de periferic este cu atât mai bine realizată cu cât este mai mare capacitatea zonei-tampon. Adesea, pentru a nu supraîncărca memoria principală, zona-tampon este situată pe discul fix. 28. Gestionarea activităţilor paralele. Exemple introductive 29. Gestionarea activităţilor paralele. Administrarea tamponată a intrărilor-ieşirelor Analiza acestui mod de funcţionare (fig.3.1) pune în evidenţă patru activităţi, care pot avea loc simultan: primitiva scriere_linie SL (unitatea centrală) scriere pe disc SD (canal 1) citire de pe disc CD (canal 2) imprimare fizică IF (canal 3) Pot fi evidenţiate două tipuri de condiţii, care trebuie respectate: Condiţii, care stabilesc posibilitatea existenţei unor activităţi Condiţii de validitate a informaţiilor partajate. 30. Gestionarea activităţilor paralele. Comanda unui proces industrial 31. Noţiune de proces secvenţial Executarea unui program se traduce într-o suită de acţiuni a1, a2,..., ai,..., cu început(ai)<sfârşit(ai) ** O astfel de suită este numită proces secvenţial sau simplu proces. Un proces poate, deci, fi descris cu ajutorul succesiunii evenimentelor început(a1), sfârşit(a1), început(a2), sfârşit(a2),...

32. Proces unic. Context Noţiunea de proces pune la dispoziţie un model pentru reprezentarea unei activităţi, care rezultă din executarea unui program pe calculator. , contextul unui proces rezultant din executarea unui program conţine: Contextul procesorului (cuvântul de stare şi registrele), Un context în memorie, sau spaţiul de lucru (segmente procedură, date, stivă de execuţie), O mulţime de atribute ataşate procesului şi care specifică diferite proprietăţi: 10

Nume. Numele unui proces, care serveşte pentru identificarea lui. Prioritate. Prioritatea proceselor permite ordonarea lor pentru alocarea procesorului. Dacă toate procesele au aceeaşi prioritate, alocarea se face conform ordinii “primul sosit, primul servit”. Drepturi. Drepturile unui proces specifică operaţiile care îi sunt permise, în scopul asigurării protecţiei informaţiei . 33. Relaţii între procese. Mulţimi de procese. Paralelism Vom cerceta în continuare execuţia unei mulţimi de procese şi interacţiunea reciprocă a acestora. Noţiunile, introduse mai sus, pot fi extinse pentru o mulţime de procese: traiectoria temporală a unei mulţimi de procese este şirul evenimentelor formate de începuturile şi sfârşiturile acţiunilor rezultante din executarea programelor acestor procese. contextele unor procese diferite pot avea părţi comune. Două procese, contextele cărora sunt disjuncte, se numesc independente; ele nu pot avea interacţiuni reciproce. Partea contextului, care aparţine unui singur proces, se numeşte context privat al procesului dat.  Mulţimi de procese. Paralelism Să considerăm două programe distincte P şi Q, fiecare având în memorie un segment cod şi un segment de date. Numim p şi q procesele rezultante din executarea respectivă a acestor două programe. Executarea setului (p, q) poate să se producă în diferite moduri, caracterizate de forma particulară a traiectoriei sale temporale.

schema 3 are loc un paralelism real, iar în schema 2 – un pseudo-paralelism. Paralelismul real necesită două procesoare distincte. Două observaţii importante sunt necesare: Diferenţa acestor scheme de execuţie este legată de alegerea nivelului de observare. Astfel, la nivelul de bază, diferenţa dintre schemele 1 şi 2 dispare: ambele sunt secvenţiale.

34. Concurenţa proceselor. Resurse virtual. Excluderea mutuală Funcţionarea corectă a unei mulţimi de procese, care participă la îndeplinirea unei lucrări comune, implică relaţii logice de cooperare. Este comod să se separe această cooperare de concurenţa pentru resursele fizice cu scopul de a simplifica înţelegerea şi aplicarea celor două tipuri de relaţii. Pentru aceasta este folosită noţiunea de resurse virtuale: fiecărei resurse fizice critice i se asociază tot atâtea copii imaginare (sau virtuale) ale acestei resurse câte procese concurente solicită utilizarea ei.  Excludere mutuală

11

Excluderea mutuală constă în extinderea pentru secvenţa de acţiuni a proprietăţii de indivizibilitate a acţiunilor nivelului de bază (acţiuni atomare). Posibilitatea executării unor acţiuni atomare se află la baza mecanismelor care realizează sincronizarea. 35. Sincronizarea proceselor 36. Exprimarea şi implementarea restricţiilor de precedare succesiune sfârşit(scriere(a)) < început(citire(a)) Această relaţie exprimă restricţia, că citirea lui a de către q nu poate începe înainte de terminarea scrierii lui a de către p. Dacă programul procesului pi are forma <debut_i>; ; atunci restricţiile de sincronizare se vor exprima după cum urmează: " pentru orice i, j din [1..N]: sfârşit(debut_i) < început(continuare_j) ◄ Restricţiile de sincronizare pot fi exprimate prin următoarele două forme echivalente: Se va impune o ordine de succesiune în timp logic pentru unele puncte ale traiectoriei temporale ale procesului, Se va impune unor procese o condiţie de autorizare a depăşirii acestor puncte ale traiectoriei lor temporale. 37. Probleme de realizare a sincronizării Un eveniment memorizat este o variabilă, care poate lua două valori: sosit şi non_sosit, valoarea iniţială este non-sosit. Asupra evenimentului memorizat sunt posibile două operaţii, care sunt acţiuni indivizibile: e:= -- atribuirea imediată a unei valori aşteptare(e). Operaţia aşteptare(e), executată de un proces p, are următoarea specificaţie: if e = non_sosit then starea(p) := blocat -- p este trecut în “aşteptarea lui e” endif Când e ia valoarea sosit, toate procesele care aşteptau e trec în starea activ.

38. Monitorul – mecanism de sincronizare. Definiţii. Exemple de utilizare Un monitor este constituit dintr-o mulţime de variabile de stare şi o mulţime de proceduri, care utilizează aceste variabile. Unele dintre aceste proceduri, numite externe, sunt accesibile utilizatorilor monitorului; numele acestor proceduri sunt numite puncte de intrare ale monitorului. Procesele, care utilizează monitorul pentru a se sincroniza, nu au acces direct la variabilele de stare. Monitorul poate fi utilizat doar prin apelarea procedurilor sale externe; acestea permit blocarea sau deblocarea proceselor conform specificaţiilor problemei. Un monitor conţine un fragment de cod de iniţializare, executat o singură dată la crearea monitorului.  Exemple de utilizare Monitorul este utilizat după cum urmează: 12

procesul p procesul q scriere(a); <debut_q> sinc.terminare_scriere;

sinc.debut_citire; citire(a);

39. Implementarea sincronizării. Probleme-tip Experienţa demonstrează, că problemele de sincronizare logică întâlnite în practică pot fi reduse, în marea lor majoritate, la combinaţia unui număr mic de situaţii elementare, schemele de soluţionare ale cărora sunt cunoscute.  Probleme-tip Problemele-tip sunt următoarele: accesarea de către o mulţime de procese a unei resurse partajate comune, comunicarea între procese, gestionarea perifericelor şi intrărilor-ieşirilor tamponate, sincronizare temporală. 40. Implementarea sincronizării. Administrarea unei resurse partajate Considerăm o resursă (fizică sau logică) partajată de o mulţime de procese. Utilizarea acestei resurse trebuie să respecte nişte reguli de utilizare, destinaţia cărora constă în garantarea unor proprietăţi specificate sau restricţii de integritate. Aceste restricţii sunt specificate pentru fiecare resursă. O modalitate de garantare a respectării regulilor de utilizare a unei resurse constă în adoptarea următoarei scheme: modul de folosire a resursei presupune utilizarea obligatorie a procedurilor de acces asociate resursei; orice tentativă de utilizare, care nu respectă acest mod este detectată automat, procedurile de accesare sunt grupate într-un monitor, sau mai multe, programul căruia impune respectarea restricţiilor de integritate. 41. Implementarea sincronizării. Alocarea resurselor banalizate Considerăm o resursă pentru care există un număr fix de N exemplare. Un proces poate accesa la cerere n unităţi din cele N, le poate utiliza şi apoi elibera. Toate unităţile sunt echivalente din punctul de vedere al proceselor utilizatoare, se mai zice că resursa este banalizată. Utilizarea resursei are loc conform schemei de mai jos. ps:resurse.cerere(n); -- cerere pentru n unităţi -- aşteptare în caz de eşec resurse.eliberare(n) -- eliberarea resurselor Condiţia de sincronizare se va scrie pentru orice proces: aut(ps) : n  nlibere

42. Modelul cititorului şi redactorului Să considerăm un fişier manipulat de procese din două clase diferite: cititori, care consultă fişierul fără a modifica conţinutul lui şi scriitori, care pot modifica acest conţinut. Fie pentru un moment arbitrar de timp ncit şi nscr numărul de cititori şi de scriitori, respectiv, care folosesc o procedură de acces la fişier. Cererea de asigurare a coerenţei fişierului ne impune să respectăm următoarele restricţii: (nscr=0) şi (ncit0) -- fişier în citire sau (nscr =1) şi (ncit=0) -- fişier în scriere 43. Comunicarea între procese Procesele pot comunica prin accesarea unei mulţimi de variabile comune. Acest mod de comunicare este slab structurat şi ineficient - cere excluderea reciprocă a variabilelor. Comunicarea prin mesaje - modelul producătorului şi consumatorului, realizată cu ajutorul 13

monitoarelor . O altă posibilitate, constă în a considera operaţiile de comunicare ca un fel de mecanisme primitive de sincronizare. 44. Modelul producătorului şi consumatorului Un proces (producătorul) trimite mesaje unui alt proces (consumatorul), utilizând o zonă tampon în memoria comună. Mesajele sunt de lungime fixă şi capacitatea tamponului este de N mesaje. Specificaţiile comunicaţiei: un mesaj dat poate fi preluat doar o singură dată după ce a fost depozitat în tampon, un mesaj nu poate fi pierdut; dacă tamponul conţine N mesaje nepreluate, nu pot fi depozitate alte mesaje, o operaţie “imposibilă” blochează procesul, care încearcă să o execute. 45. Primitive de comunicare Operaţiile de schimb de mesaje pot fi definite ca nişte mecanisme primitive şi să le utilizăm pentru sincronizarea proceselor. Primitivele de bază în comunicarea prin mesaje sunt: emitere(mesaj,destinaţie) recepţie(mesaj,origine) Specificările acestor primitive trebuie să precizeze: natura şi forma mesajelor, modul de adresare a proceselor emiţătoare şi destinatare, modul de sincronizare a acestor procese, tratarea erorilor. 46. 47. Aplicaţii : relaţia client-server O aplicaţie curentă a comunicărilor între procese este relaţia client-server. Un proces server are în şarjă îndeplinirea unor servicii (executarea unor programe predefinite) proceselor client. Pentru aceasta este utilizată următoarea schemă: Procesul server este asociat unei porţi, unde clienţii îşi depun cererile; el este blocat atâta timp cât nu există cereri de servicii în aşteptare. modelul client-server sunt reprezentative pentru două scheme de obţinere a unui serviciu cu ajutorul proceselor într-un sistem de operare: apelarea unei procedure de monitor sau activarea unui proces server ciclic prin emiterea mesajelor. Alegerea între aceste două scheme este dictată de considerente de eficacitate. 47. Implementarea sincronizării. Administrarea intrărilor-ieşirilor Pentru un proces care execută o intrare-ieşire apelând o procedură de schimb a acestui monitor, totul se petrece ca şi cum schimbul este sincron: la returul din procedură, informaţia a fost efectiv transferată (sau o eroare a fost detectată şi semnalizată). Mecanismul de blocare evită aşteptarea activă şi procesorul poate fi utilizat în timpul transferului de un alt proces. 48. Implementarea sincronizării. Administrarea unui periferic Fiecărui periferic îi este asociat un monitor procedurile externe ale căruia permit executarea intrărilor-ieşirilor la acest periferic. Acest monitor are următoarea formă generală (pentru un sistem mono-utilizator): perif: monitor; var ..., sfr_schimb_i,...: condiţie; <declaraţiile variabilelor de stare ale perifericului> ... 49. Implementarea sincronizării. Buferizarea imprimării Trei zone-tampon tm1 şi tm2 de capacitate N1 şi N2 în memoria centrală şi unul pe disc, td, de lungime Ndisc. Pentru simplitate presupunem, că transferurile se fac cu blocuri constante egale cu o linie. Fiecare bufer este comandat de un monitor cu aceeaşi structură care are rolul de a asigura excluderea mutuală şi sincronizarea condiţiilor tampon plin şi tampon vid. 14

Definind tm1, tm2 şi td ca tablouri de elemente de lungimea unei linii şi pointerii top şi coadă locali fiecărui monitor, procedurile de depozitare şi preluare pot fi: procedura intrare(l:linie); procedura intrare(l:linie); tm1[coadă] := l; tm2[coadă] := l; coadă := coadă+1 mod N1 coadă := coadă+1 mod N2 procedura ieşire(var l:linie); procedura ieşire(var l:linie); l := tm1[top]; l := tm2[top]; top := top+1 mod N1 top := top+1 mod N2 50. Implementarea sincronizării. Sincronizarea temporală Sincronizarea temporală face ca timpul să intervină nu numai ca mijloc de ordonare a evenimentelor, dar şi ca măsură de durată absolută. Acest mod de sincronizare este utilizat în aplicaţiile de timp real, care conţin interacţiuni cu organe externe (comanda proceselor industriale, de exemplu). Sincronizarea temporală solicită folosirea unui ceas, realizat prin intermediul generatorului de sincronizare, care emite impulsuri la intervale regulate. Aceste impulsuri pot fi utilizate pentru a declanşa o întrerupere la fiecare impuls sau pentru a decrementa în mod automat conţinutul unui registru contor, o întrerupere este declanşată atunci când conţinutul acestui registru atinge valoarea 0. 1. Gestionarea dinamică a proceselor În sistemele performante, mai ales în cele interactive, procesele sunt comandate dinamic. Crearea unui proces presupune alocarea resurselor şi iniţializarea contextului. Distrugerea unui proces eliberează toate resursele care i-au fost alocate. Primele primitive, propuse pentru gestionarea dinamică a proceselor, au fost fork şi join. Istoric şi cronologic, aceste operaţii au fost introduse pentru organizarea executării paralele a programelor pe un sistem multiprocesoral, noţiunea de proces nefiind încă clară. 2. Sincronizarea în Windows Platforma pe 32 de biţi pune la dispoziţia programatorului instrumente evoluate pentru multiprogramare, atât la nivelul unei mulţimi de lucrări, cât şi a unei lucrări singulare. Poate să apară întrebarea CÂND să fie utilizată multiprogramarea în cadrul unei singure aplicaţii. Răspunsul este foarte simplu: atunci când dorim ca mai multe fragmente de cod să fie executate simultan. De exemplu, dacă dorim ca unele activităţi să fie îndeplinite în regim de fond sau programul să continue să reacţioneze la unele evenimente exterioare în timpul îndeplinirii unor calcule foarte „costisitoare” 3. Procese şi fire în Windows Numim proces în Windows o instanţă (un exemplar) a programului, încărcat în memoria operativă. Această instanţă poate crea fire (thread) - secvenţe de instrucţiuni, care urmează a fi executate În cadrul sistemului de operare Windows există două tipuri de fire – fire interactive, care execută un ciclu propriu de prelucrare a mesajelor (de exemplu, firul principal al unei aplicaţii) şi fire de lucru, care sunt funcţii simple. În ultimul caz execuţia firului se încheie atunci când calculele, generate de funcţia respectivă, iau sfârşit. 4. Necesitatea sincronizării în Windows În realitate, din cauza multitaskingului controlat se poate întâmpla ca un fir să nu fi terminat încă lucrul cu o resursă comună oarecare, iar sistemul să treacă la un alt fir, care utilizează aceeaşi resursă. Rezultatele pot fi imprevizibile. Asemenea conflicte se pot produce şi în cazul unor fire, care aparţin chiar unor procese diferite. Problema poate să apară întotdeauna când două sau mai 15

multe fire folosesc o resursă comună. Este necesar un mecanism de coordonare a lucrului firelor cu resurse comune. În Windows acest mecanism se numeşte sincronizarea firelor . 5. Structura mecanismului de sincronizare în Windows Mecanismul de sincronizare este un set de obiecte ale sistemului de operare Windows, create şi gestionate program, comune pentru toate firele sistemului şi utilizate pentru coordonarea accesului la resurse. În calitate de resurse pot fi toate obiectele, care pot fi accesate de două şi mai multe fire – un fişier pe disc, un port, un articol al unei baze de date, o variabilă globală a unui program Sensul mecanismelor de sincronizare constă în faptul, că fiecare poate să fie în starea set. Pentru fiecare mecanism de sincronizare această stare poate să aibă sens propriu. Firele pot să testeze starea curentă a mecanismului de sincronizare şi/sau să aştepte modificarea acestei stări, coordonându-şi în acest fel acţiunile proprii Mecanismele de sincronizare nu pot interzice accesul nedorit la o resursă, ele doar indică firului momentul când acesta poate accesa resursa, sau când acesta trebuie să aştepte . 6. Administrarea obiectelor de sincronizare în Windows Crearea unui obiect de sincronizare se produce prin apelarea unei funcţii speciale din WinAPI de tipul Create… (de exemplu, CreateMutex). Acest apel returnează descriptorul obiectului (handle), care poate fi folosit de toate firele procesului dat. Un obiect de sincronizare poate fi accesat şi dintr-un alt proces, dacă acest proces a moştenit descriptorul obiectului dat, sau folosind funcţia de deschidere a unui obiect (Open…). Dacă în parametrul timp este indicată constanta simbolică INFINITE, funcţia va aştepta până când starea obiectului va deveni set, fără vre-o restricţie Starea mai multor obiecte poate fi aflată cu ajutorul funcţiei WaitForMultipleObjects. Pentru încheierea lucrului cu un obiect de sincronizare şi eliberarea descriptorului se apelează funcţia CloseHandle. Este important de ştiut, că apelarea unei funcţii de aşteptarea blochează firul curent, adică atâta timp cât un fir se află în starea de aşteptare el nu are acces la procesor.

7. Excluderea mutuală în Windows Mecanismele de excludere mutuală (mutex-ele, de la MUTual EXclusion) permit coordonarea accesului la o resursă partajată. Starea set a obiectului corespunde momentului de timp în care obiectul nu aparţine nici unui fir şi poate fi „utilizat”, iar starea reset – momentului când un fir oarecare controlează deja mutex-ul. Accesarea va fi permisă doar după eliberare. Pentru a lega mutex-ul de firul curent trebuie apelată una din funcţiile de aşteptare. Firul, căruia îi aparţine mutex-ul, îl poate „ocupa” de mai multe ori, fără autoblocare, însă mai apoi acesta va trebui eliberat tot de atâtea ori cu ajutorul funcţiei ReleaseMutex. 8. Evenimentele în Windows Obiectele-evenimente sunt utilizate pentru a informa firele, care sunt în aşteptare, despre producerea unui eveniment. În Windows există două tipuri de evenimente – cu resetare manuală şi automată. Resetarea manuală se execută cu funcţia ResetEvent. Aceste evenimente sunt folosite pentru informarea mai multor fire, iar evenimentele cu resetare automată sunt utilizate pentru informarea unui anumit fir, celelalte rămânând în aşteptare. 16

Funcţia CreateEvent crează un obiect-eveniment, funcţia SetEvent setează evenimentul în starea set, iar funcţia ResetEvent resetează evenimentul. Funcţia PulseEvent setează evenimentul, iar după semnalizarea firelor, care erau în aşteptare resetează obiectul 9. Semafoarele în Windows Un obiect-semafor este în ultimă instanţă un mutex cu contor. Acest obiect permite să fie „ocupat” de un număr anume de fire, după care „ocuparea” va fi posibilă numai dacă unul din fire va „elibera” semaforul. Semafoarele sunt utilizate pentru a limita numărul de fire, care lucrează simultan cu resursa. 10. Secţiunile critice în Windows Obiectul-secţiune critică permite programatorului să evidenţieze un fragment de cod în care firul obţine acces la o resursă partajată, preîntâmpinând utilizarea resursei de mai mulţi utilizatori. Pentru a utiliza resursa firul va intra mai întâi în secţiunea critică (apelarea funcţiei EnterCriticalSection). Diferenţa de mutex constă în faptul că secţiunea critică este utilizată numai pentru firele unui singur proces. Cu ajutorul funcţiei TryEnterCriticalSection se poate stabili, dacă secţiunea critică este liberă. 11. Protejarea accesării variabilelor în Windows Există o serie de funcţii, care permit lucrul cu variabilele globale ale tuturor firelor, fără a ne preocupa de sincronizare, deoarece aceste funcţii singure rezolvă problema sincronizării. Aceste funcţii sunt InterlockedIncrement, InterlockedDecrement, InterlockedExchange, InterlockedExchangeAdd şi InterlockedCompareExchange. De exemplu, funcţia InterlockedIncrement incrementează valoarea unei variabile pe 32 biţi cu o unitate. 12. Sincronizarea în MFC Biblioteca MFC conţine clase speciale pentru sincronizarea firelor (CMutex, CEvent, CCriticalSection şi CSemaphore). Aceste clase corespund obiectelor de sincronizare WinAPI şi sunt derivate de la clasa CSyncObject. Pentru utilizarea acestor clase trebuie consultaţi constructorii şi metodele lor –Lock şi Unlock. Obiectul de sincronizare MFC este inclus în această clasă în calitate de membru privat şi toate funcţiile clasei, care realizează accesarea resursei, îşi coordonează lucrul cu acest membru. Utilizând funcţiile Lock şi Unlock clasele de sincronizare MFC pot fi utilizate direct, iar în mod indirect – prin funcţiile CSingleLock şi CmultiLock. 13. Exemplu de sincronizare în Windows #include <windows.h> #include void main() { DWORD res; HANDLE mutex = CreateMutex(NULL, FALSE, "NUME_APLICATIE-MUTEX01"); cout<<"Încerc să ocup obiectul...\n"; cout.flush(); res = WaitForSingleObject(mutex,20000); if (res == WAIT_OBJECT_0) { cout<<"L-am prins! Aşteptare 10 secunde...\n"; cout.flush(); Sleep(10000); cout<<"Acum eliberăm obiectul\n"; cout.flush(); ReleaseMutex(mutex); } 17

CloseHandle(mutex); } 14. Utilizarea secţiunilor critice în Windows În acest caz secţiunile critice sunt utilizate pentru a permite la un moment de timp dat accesul la unele date importante unui singur fir al aplicaţiei, celelalte fire fiind blocate Secţiunile critice nu sunt obiecte ale nucleului sistemului de operare. Practic, tot lucrul cu secţiunile critice are loc in procesul care le-a creat. Din aceasta rezultă, că secţiunile critice pot fi utilizate numai pentru sincronizare în cadrul unui proces. 15. Structura RTL_CRITICAL_SECTION în Windows Este definită după cum urmează: typedef struct _RTL_CRITICAL_SECTION { PRTL_CRITICAL_SECTION_DEBUG DebugInfo; // Folosit de sistemul de operare LONG LockCount; // Contorul de utilizări LONG // Contorul accesării repetate din RecursionCount; firul utilizatorului HANDLE OwningThread; // ID firului utilizatorului (unic) HANDLE LockSemaphore; // Obiectul nucleului folosit pentru aşteptare ULONG_PTR // Numărul de cicluri goale înaintea SpinCount; apelării nucleului } RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION; Într-adevăr, secţiunile critice sunt destinate să protejeze datele la accesarea din câteva fire. Utilizarea multiplă a uneia şi aceeaşi secţiuni critice de un singur fir nu va genera eroare, ceea ce este normal.

16. Funcţii API pentru secţiunile critice în Windows Mai întâi funcţiile BOOL InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection) şi BOOL InitializeCriticalSectionAndSpinCount(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount). Funcţia DWORD SetCriticalSectionSpinCount(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount) setează valoarea câmpului SpinCount şi returnează valoarea precedentă a acestuia. VOID DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection ) eliberează resursele, ocupate de secţiunea critică. VOID LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection) eliberează secţiunea critică. 17. Clase de secţiuni critice în Windows Clasele CLock şi CAutoLock sunt utilizate, de obicei, pentru sincronizarea accesării variabilelor clasei, iar CScopeLock este destinat, în special, pentru a fi utilizată în proceduri. Compilatorul singur va avea grijă să apeleze ::LeaveCriticalSection() prin intermediul destructorului. Urmează un exemplu de folosire a CScopeLock. 18

class CLock { friend class CScopeLock; CRITICAL_SECTION m_CS; public: void Init() { ::InitializeCriticalSection(&m_CS); } void Term() { ::DeleteCriticalSection(&m_CS); } void Lock() { ::EnterCriticalSection(&m_CS); } BOOL TryLock() { return ::TryEnterCriticalSection(&m_CS); } void Unlock() { ::LeaveCriticalSection(&m_CS); } }; 18. Depanarea secţiunilor critice în Windows Depanarea secţiunilor critice este o ocupaţie foarte interesantă, dar şi dificilă. Poţi căuta ore şi chiar zile în şir cauza apariţiei unei probleme. Erorile, legate de secţiunile critice sunt de două tipuri: de realizare şi de arhitectură. Erorile de realizare pot fi depistate relativ uşor şi, de regulă, sunt generate de utilizarea incorectă (lipsa perechii) a apelurilor ::EnterCriticalSection() şi ::LeaveCriticalSection(). Dintre erorile de arhitectură cea mai frecventă este îmbrăţişarea fatală , când două fire încearcă să acceseze două şi mai multe secţiuni critice. -secţiunile critice sunt executate relativ repede şi nu cer multe resurse de sistem; -pentru sincronizarea accesării a mai multor variabile independente este mai bine să fie utilizate câteva secţiuni critice -nu este recomandat să fie apelate metode ale unor obiecte “străine” dintr-o secţiune critică. -codul unei secţiuni critice va fi redus la minimum;

19. Administrarea proceselor. Realizarea excluderii mutuale. Specificarea problemei Acest capitol este consacrat implementării noţiunilor proces şi sincronizare în cadrul unui sistem de operare. Mecanismele utilizate sunt bazate pe realizarea principiul excluderii mutuale. Principiile directoare ale reprezentării şi gestiunii proceselor (contexte, alocarea procesorului)  Realizarea excluderii mutuale Mecanismele care realizează excluderea mutuală pentru un set de programe sunt bazate pe un principiu comun: utilizarea mecanismului de excludere mutuală existent deja la un nivel inferior. Drept rezultat, sunt utilizate variabile comune ale proceselor concurente, iar coerenţa acestor variabile trebuie ea însăşi să fie garantată. La nivelul de bază există două mecanisme elementare: excluderea mutuală la accesarea unui amplasament de memorie şi masca întreruperilor. Aceste două mecanisme sunt, în principiu, suficiente pentru toate necesităţile.  Specificarea problemei Vom preciza mai întâi problema excluderii mutuale. Fie {p1, p2,...,pn} o mulţime de procese pe care le vom considera ciclice; programul fiecărui proces conţine o secţiune critică. Excluderea mutuală este asigurată prin două fragmente de program (prolog şi epilog), care încadrează secţiunea critică a fiecărui proces.Soluţia trebuie să posede următoarele proprietăţi: -excludere mutuală: la fiecare moment de timp cel mult un proces execută secţiunea critică, 19

absenţa blocajelor intempestive dacă în secţiunea critică nu se află vreun proces, nici un proces nu trebuie să fie blocat de mecanismul excluderii mutuale, toleranţă la defecte: soluţia trebuie să rămână validă şi în cazul unor defecte în unul sau în mai multe procese, care se află în afara secţiunii critice, absenţa privaţiunilor: un proces, care a cerut intrarea într-o secţiune critică nu trebuie să aştepte un timp infinit simetrie: prologul şi epilogul trebuie să fie identice pentru toate procesele şi independente de numărul lor. 20. Excluderea mutuală prin aşteptare activă Înainte de a descrie implementarea excluderii mutuale prin operaţii elementare de blocare şi deblocare a proceselor prezentăm un mecanism, care permite simularea efectului acestor operaţii, menţinând procesele în stare activă. Un proces în aşteptare activă simulează blocarea efectuând o testare repetată a condiţiei de depăşire, care poate fi actualizată de alte procese. 21. Algoritmul lui Dekker O soluţie (algoritmul lui Dekker) poate totuşi fi construită fără a folosi alte mecanisme de excludere mutuală, în afară de indivizibilitatea accesării în citire sau actualizarea unui amplasament de memorie. Prezentăm algoritmul pentru două procese, deşi el poate fi extins pentru un număr arbitrar de procese. Programul foloseşte trei variabile comune celor două procese: var c : array [0..1] of boolean; tur : 0..1; iniţializare: c[0]:=c[1]:=false; tur:=0; prolog :- pentru procesul i; se va pune j=1-i (celălalt proces) c[i]:=true; tur:=j; test: if c[j] and tur=j then go to test endif; ... epilog : -- pentru procesul i c[i]:=false; 22. Aşteptarea activă în sisteme multiprocesorale: Test & Set Pentru tratarea cu ajutorul aşteptării active a cazului în care mai multe procese actualizează şi consultă variabile comune, unele maşini au o instrucţiune, care realizează într-o manieră indivizibilă consultarea şi actualizarea unui amplasament de memorie. Această instrucţiune, adesea numită Test And Set (tas), este utilizată în sistemele multiprocesorale Efectul lui Test And Set este descris mai jos (Mp[m] desemnează amplasamentul de memorie cu adresa m): tas R, m : R:=Mp[m] Mp[m]:=1 <eliberare acces la Mp[m]> 23. Semaforul – instrument elementar pentru excluderea mutuală. Definiţii Un semafor s este constituit prin asocierea unui contor cu valori întregi, notat s.c., şi a unui fir de aşteptare, notat s.f. La crearea semaforului contorului i se atribuie o valoare iniţială s0 (s0≥0), şi firul de aşteptare s.f. este vid. Un semafor serveşte la blocarea proceselor aşteptând să se producă o condiţie pentru deblocarea lor; procesele blocate sunt plasate în s.f. Proprietăţile principale ale sincronizării cu ajutorul semafoarelor pot fi deduse din câteva relaţii invariante: relaţii verificate iniţial şi care rămân neschimbate după executarea primitivelor P şi V un număr arbitrar de ori. 20

s.c. = s0 – np(s) + n v(s) (1) nbloc(s) = if s.c. ≥ 0 then 0 else –s.c. endif nf(s) = min(np(s), s.c.+nv(s)). (3)

(2)

24. Semaforul – Proprietăţi 25. Realizarea excluderii mutuale cu ajutorul semafoarelor Fie nc numărul de procese, care se află în secţiunea critică la un moment concret de timp. Avem: nc = nf(mutex) – nv(mutex) (4) Proprietăţile în cauză pot fi verificate aplicând semaforului mutex relaţia (3) din 4.1.3.2: nf(mutex) = min(np(mutex), 1+nv(mutex)) (5) Excluderea mutuală Din (5) avem: nf(mutex) ≤ 1+nv(mutex) şi, utilizând (4), obţinem nc ≤ 1: excluderea mutuală este asigurată.

1. Funcţionarea şi structura unui nucleu de sincronizare. Stările unui proces. Fire de aşteptare În cadrul descrierii unui sistem de operare cu ajutorul maşinilor abstracte ierarhice (v. cap.9), nucleul constituie nivelul cel mai inferior, realizat direct pe maşina fizică. Maşina abstractă, realizată astfel poate fi numită o maşină a proceselor, care posedă, în afara setului de instrucţiuni de bază, primitivele care permit crearea, distrugerea şi sincronizarea proceselor. Primitivele de sincronizare, realizate de nucleu, ascund mecanismele fizice de comutare a contextului, de exemplu, cele oferite de întreruperi. Structura unui nucleu de sincronizare depinde, printre altele, de specificaţiile maşinii fizice şi de specificaţiile maşinii abstracte care trebuie realizate, îndeosebi de mecanismul de sincronizare ales.  Stările unui proces. Fire de aşteptare Am considerat până acuma că un proces se poate afla în două stări: activ sau blocat. Luarea în consideraţie a alocării fizice a unui procesor ne impune să descompunem starea activă în două stări noi. Un proces activ se numeşte ales, dacă el este în curs de execuţie pe un procesor fizic; el se numeşte eligibil dacă nu poate fi executat din cauza lipsei unui procesor disponibil. Administrarea proceselor face apel la fire de aşteptare. Astfel, fiecărei cauze distincte de blocare i se asociază un fir de aşteptare pentru a stabili o ordine a proceselor blocate. Mai mult, procesele eligibile sunt menţinute într-un fir special de aşteptare 2. Administrarea contextelor şi schemele primitivelor Operaţia de alocare a procesorului fizic impune păstrarea pentru fiecare proces a unei copii a contextului. Această copie a contextului descrie starea procesorului pentru procesul considerat. 21

În acest scop fiecărui proces i se asociază o mulţime de informaţii rezidente în memorie şi numită vector de stare, bloc de control al procesului sau blocul contextului, Organizarea nucleului Execuţia programelor nucleului este declanşată în două moduri prin apelarea unei primitive de administrare a proceselor (creare, distrugere, sincronizare, etc.); aceste primitive sunt realizate sub formă de apel al supervizorului,printr-o întrerupere: programele de tratare a întreruperilor fac parte din nucleu, deoarece întreruperile sunt traduse în operaţii de sincronizare şi sunt invizibile la nivelurile superioare. În ambele cazuri, mecanismul de intrare în nucleu conţine salvarea automată a cuvântului de stare şi, eventual, a registrelor procesorului Programul unei primitive a nucleului are următoarea schemă generală: prolog; - salvarea contextului şi intrarea în secţiunea critică control; -- verificarea drepturilor şi a parametrilor -- manipulează firele proceselor alocare_procesor; -- programul dispecer şi ieşirea din secţiunea critică 3. Realizarea unui nucleu de sincronizare. Organizarea generală Procesele pot fi create şi distruse în mod dinamic şi sunt organizate ierarhic conform relaţiei de paternitate. Un proces este creat cu ajutorul primitivei: creare(p, context iniţial, atribute) Atributele unui proces conţin prioritatea şi drepturile de a executa anumite operaţii. Contextul iniţial specifică starea iniţială a cuvântului de stare, a registrelor procesorului şi a spaţiului de lucru asociat procesului. Procesul este creat în starea eligibil.

4. Realizarea unui nucleu de sincronizare. Interfeţele Procesele sunt sincronizate cu ajutorul monitoarelor. Gestiunea întreruperilor este integrată în mecanismul monitoarelor: o întrerupere este asociată unei condiţii. Monitoarele sunt declarate în programele proceselor; un monitor este creat la compilarea programului, unde el este declarat, şi este mai apoi utilizat conform regulilor, definite de limbajul de programare utilizat. Procesele pot fi create şi distruse în mod dinamic şi sunt organizate ierarhic conform relaţiei de paternitate. Un proces este creat cu ajutorul primitivei: creare(p, context iniţial, atribute) Utilizarea primitivelor creare, distrugere, suspendare şi reluare este condiţionată de un drept, care figurează în atributul drepturi al procesului. 5. Realizarea unui nucleu de sincronizare. Structuri şi algoritmi Din momentul creării sale unui proces i se asociază un număr fix (nume intern, process handler), care serveşte la desemnarea lui şi permite accesarea blocului său de context. Blocul de context conţine următoarele câmpuri: Csp: zona de salvare a cuvântului de stare a programului, Reg : zona de salvare a registrelor generale ale procesorului, Stare : valoarea stării procesului (eligibil, blocat, ...), Prio : prioritatea procesului, Drepturi : drepturile procesului, Fire : legături de înlănţuire în ierarhia proceselor, Suc : legături de înlănţuire în firele de aşteptare (FA). 22

6. Realizarea unui nucleu de sincronizare. Realizarea monitoarelor. Monitorul, descris mai jos, în raport cu noţiunea clasică de monitor, prezintă următoarele diferenţe: Semantica primitivei semnalizare. Specificarea iniţială a primitivei c.semnalizare precizează că unul din procesele care sunt în aşteptarea condiţiei c (dacă există) este imediat deblocat, ceea ce implică trecerea temporară în starea blocat a procesului, care execută semnalizare. Verificarea validităţii monitorului este simplificată, deoarece condiţia de depăşire este consultată în timpul deblocării: procesul care execută semnalizare poate să se mulţumească cu garantarea unei condiţii mai slabe decât condiţia de depăşire. 7. Realizarea unui nucleu de sincronizare. Algoritmi de bază Programul monitorului trebuie să asigure două funcţii: excluderea mutuală pentru procedurile monitorului, blocarea şi deblocarea asociate primitivelor aşteptare şi semnalizare. Fiecărui monitor M îi sunt asociate următoarele structuri de date: un dispozitiv de excludere mutuală M.disp (lacăt), care poate lua două valori liber sau ocupat, un fir de aşteptare M.fir asociat acestui dispozitiv. Iniţial M.disp=liber, M.fir=. Fiecărei condiţii c de M îi este asociat un fir M.c.fir, un contor de gardă M.c.întârziere şi, pentru condiţiile asociate unei întreruperi, un indicator boolean M.c.într_sosită.. Firul proceselor eligibile este determinat de f_eligibil. 8. Realizarea unui nucleu de sincronizare. Tratarea întreruperilor Pentru asigurarea uniformităţii mecanismelor de sincronizare fiecărei întreruperi i se asociază: o condiţie într-un monitor, un proces ciclic care realizează tratarea întreruperilor, în stare de repaus acest proces este în aşteptarea condiţiei. O condiţie poate fi asociată unui singur nivel de întrerupere. Sosirea unei întreruperi provoacă executarea funcţiei semnalizare pentru condiţia asociată. Prioritatea relativă a întreruperilor este tradusă în prioritatea proceselor, care tratează întreruperile. 9. Realizarea unui nucleu de sincronizare. Tratarea erorilor Principiul de tratare a erorilor constă în blocarea procesului care a provocat eroarea şi expedierea unui mesaj procesului părinte, care va putea lua măsurile necesare. Pentru aceasta este folosit un fir special f_eroare Presupunem că o eroare care are loc în cursul execuţiei unui proces provoacă o deviere, tratarea căreia se va scrie astfel: prolog; p:=<proces apelant>; intrare(p, f_eroare); ; stare[p]:=suspendat; alocare_procesor; 10. Operaţii asupra proceselor 11. 12. Crearea şi distrugerea proceselor Problema principală, condiţionată de gestiunea dinamică a proceselor, este alocarea contextelor şi numelor proceselor. Pentru aceasta sunt utilizate două metode principale: pentru blocurile contextelor sunt rezervate un număr fix de amplasamente; amplasamentele neutilizate sunt determinate de o valoare specială (nil) a câmpului stare al lor; fiecare bloc este desemnat printr-un număr, care este numărul utilizat pentru desemnarea procesului asociat; amplasamentele rezervate blocurilor de context sunt alocate dinamic în memorie; numerele sunt alocate proceselor de asemenea în mod dinamic şi un tabel de corespondenţă, asociază numărului fiecărui proces adresa în memorie a blocului său de context.

23

Distrugerea unui proces trebuie să implice eliberarea resurselor, care îi fuseseră alocate. Printre aceste resurse, doar numele şi contextul sunt gestionate direct de nucleu; celelalte resurse, cum ar fi fişierele, sunt preluate de mecanisme specifice. Distrugerea unui proces, care se află în secţiunea critică poate conduce la o blocare. 1. Suspendarea şi reluarea Primitiva suspendare permite procesului-părinte să controleze activitatea unui proces descendent, întrerupând în mod forţat execuţia acestuia. O utilizare curentă este suspendarea unui proces, angajat într-o buclă infinită. Procesul întrerupt în acest mod este transferat într-un fir de aşteptare special, Efectul primitivei suspendare poate fi ca şi al unei devieri şi programul de tratare poate fi analogic. Suspendarea unui proces pune o problemă analogică celei de distrugere. Primitiva de reluare permite unui proces să deblocheze un fir suspendat, după modificarea eventuală a contextului său. 2. Excluderea mutuală şi alocarea procesorului Excluderea mutuală este realizată prin mascarea întreruperilor. Pentru aceasta trebuie pregătită masca întreruperii în cuvântul de stare, care ar specifica programele asociate primitivelor de tratare a întreruperilor. Dacă notăm prin proces_ales o variabilă globală, care conţine numărul procesului ales, iar prin salv_csp locaţiunea în care a fost salvat cuvântul de stare a procesorului la apelarea supervizorului sau la întrerupere, prologul va fi de forma: prolog: <mascarea întreruperilor> -- masca în cuvântul de stare csp[proces_ales] := salv_csp; salv_registre(Reg[proc_al]);

3. Realizarea pentru cazul monoprocesor Excluderea mutuală este realizată prin mascarea întreruperilor. Pentru aceasta trebuie pregătită masca întreruperii în cuvântul de stare, care ar specifica programele asociate primitivelor de tratare a întreruperilor. Dacă notăm prin proces_ales o variabilă globală, care conţine numărul procesului ales, iar prin salv_csp locaţiunea în care a fost salvat cuvântul de stare a procesorului la apelarea supervizorului sau la întrerupere, prologul va fi de forma: prolog: <mascarea întreruperilor> -- masca în cuvântul de stare csp[proces_ales] := salv_csp; salv_registre(Reg[proc_al]); 4. Realizarea pentru cazul unui sistem multiprocesoral Regimului de funcţionare multiprocesor îi sunt specifice două instrucţiuni: Test and Set(R, m) :asigură excluderea mutuală Întrerupere(k) :provoacă o întrerupere a procesorului k. O întrerupere sau un apel de supervizor provoacă introducerea cuvântului de stare şi a registrelor procesorului în cauză într-o stivă în memorie, proprie acestui procesor. 5. Procese şi fire în Linux. În Linux procesele „se înmulţesc” prin clonare: apelul de sistem, care crează un proces nou, se numeşte clone, iar procesul fiu este o copie aproape exactă a procesului părinte, doar că mai departe va executa codul său, iar procesul părinte – ceea ce este scris după apelarea lui clone.

24

6. Crearea şi distrugerea proceselor. Demoni în Linux. Obţinerea informaţiilor despre procese  Crearea proceselor Procesele sunt create prin utilizarea funcţiilor din familia exec ale bibliotecii Linux standard: execl, execlp, execle, execv, execve, execvp. Deşi formatul de apelare este diferit, în ultimă instanţă execută acelaşi lucru: înlocuiesc codul din procesul curent cu codul, care se află în fişierul indicat. Fişierul poate fi un fişier binar executabil Linux, un script al interpretorului limbajului de comandă, un fişier binar de un alt format.  Distrugerea proceselor La terminarea execuţieia unui proces , el este distrus eliberând toate resursele, care fusese alocate anterior. Dacă procesul părinte se termină înaintea procesului descendent, ultimul devine “orfan” . Toţi “orfanii” sunt “înfiaţi” în mod automat de programul init, executat de procesul cu numărul 1, care duce evidenţa terminării execuţiei lor. Dacă a fost terminată deja execuţia procesului descendent, iar procesul părinte nu este gata să recepţioneze de la sistem semnalul despre acest eveniment, descendentul nu dispare total, ci este transformat în Zombie; în câmpul Stat aceste procese sunt notate cu litera Z. Procesele Zombi nu cer timp de procesor, dar în tabelul proceselor este păstrată linia lor şi structurile respective ale nucleului nu sunt eliberate. După terminarea execuţiei procesului părinte, procesul Zombi orfan devine pentru o perioadă scurtă de timp descendentul lui init, ca mai apoi să “moară” definitiv.  Demoni în Linux Demon în Linux este numit procesul predestinat să lucreze în regim de fond fără terminal şi care execută anumite operaţii pentru alte procese De obicei, demonii îşi îndeplinesc în linişte lucrul şi ne amintim de ei doar în cazul unor situaţii ieşite din comun: spaţiu insuficient – demonul singur informând utilizatorul despre aceasta, sau refuz să lucreze şi sunteţi întrebat de şef când se vor termina problemele cu imprimantă .  Obţinerea informaţiilor despre proce Pentru obţinerea informaţiilor despre procese, vizualizate de programele ps şi top, Linux-ul utilizează un sistem special de fişiere, numit procfs. În majoritatea distributivelor el este 25

iniţializat la lansarea sistemului de operare cu titlul de catalog /proc. Datele despre procesul cu numărul 1 se află în subcatalogul /proc/1, despre procesul cu numărul 182 - în /proc/182, etc. Toate fişierele, deschise de un proces, sunt reprezentate sub forma unor referinţe simbolice în catalogul /proc//fd, iar referinţa la catalogul rădăcină este păstrată ca /proc//root. 7. Gestiunea informaţiei. Principii. Definiţii generale. Interpretarea numelor Suportul fizic al informaţiei este memoria. La acest nivel memoria poate fi considerată un şir de amplasamente caracterizate printr-un conţinut. Un proces desemnează un amplasament printr-un nume folosit de unitatea centrală pentru a citi şi la necesitate a modifica conţinutul acestui amplasament. Conţinutul unui amplasament poate fi interpretat ca un întreg, o instrucţiune . Reprezentarea externă este convertită în cuplul numele amplasamentului devenind numele obiectului. Numim durată de existenţă sau de viaţă a unui obiect perioada de timp în care acesta este accesibil. Sistemul de operare şi tipul obiectului determină durata de existenţă a obiectului. Numim obiect accesibil un obiect căruia i s-a asociat o cale de acces. Numim obiect partajat orice obiect care este accesibil mai multor utilizatori  Interpretarea numelor La nivelul SO obiectele sunt memorate în amplasamente, iar procesele le pot accesa prin nume. Stabilirea căii de acces la un obiect prin compunerea funcţiilor de acces ataşate se numeşte legare. Se spune că un obiect este legat atunci când pentru el este stabilită calea de acces. 8. Gestiunea informaţiei. Construirea căii de acces Fie F1 şi F2 doua funcţii de acces, F1 permiţând accesul de la o1 la o2, iar F2 de la o2 la o3: o1F1o2 şi o2F2o3, accesul de la o1 la o3 fiind realizat prin compunerea acestor funcţii. Calea de acces de la o1 la o3 poate fi construită prin metoda substituţiei sau prin metoda înlănţuirii. Metoda substituţiei stabileşte o nouă funcţie de acces F3, o3 fiind accesat direct de la o1: o1F3o3. Metoda are avantajul că accesul este rapid, dar şi dezavantajul că o2 este iremediabil pierdut. Metoda înlănţuirii cere ca la fiecare accesare a obiectului o3 pornind de la o1 să fie parcursă calea o1F1o2F2o3. Nu se pierde nici o informaţie, dar accesul este mai lent. 9. Gestiunea informaţiei. Structura reprezentărilor. Descriptori Numele obiectului compus se află într-un amplasament al cărui conţinut este un descriptor. Utilizarea unui descriptor pentru a accesa un obiect impune trecerea printr-un program de accesare care va interpreta acest descriptor şi prezintă următoarele avantaje: în cazul în care obiectul este pasat ca parametru unei proceduri este suficient să fie transmis descriptorul sau adresa acestuia: este mult mai simplu să administrezi informaţii de volum fix şi cunoscut, descriptorul constituie un “punct de trecere” impus pentru accesarea reperată a obiectului şi, ca rezultat, poate servi la implementarea unor controale ale accesării, de măsurare, etc., descriptorul asigură un acces indirect la obiectul reperat, ceea ce permite modificarea dinamică a căii de acces (substituirea unui obiect printr-un alt obiect) sau deplasarea unui obiect în memorie fără recompilarea modulului sursă, partajarea obiectelor între mai mulţi utilizatori cu drepturi sau proceduri de accesare diferite poate fi realizată construind tot atâţia descriptori, câţi utilizatori există; aceşti descriptori reperează acelaşi obiect şi au aceleaşi informaţii de localizare fizică. 10. Gestiunea informaţiei. Contexte şi medii Vom numi lexică o mulţime de identificatori. Mulţimea obiectelor, desemnate de identificatorii lexicii la un moment de timp dat, se numeşte context asociat la această lexică. Starea de execuţie a unui context este starea mulţimii obiectelor, care constituie acest context. Fiind dată doar lexica nu putem defini un context: mai trebuie să fie specificate regulile de interpretare, care vor fi aplicate identificatorilor din cadrul lexicii. 26

Vom numi mediu mulţimea formată dintr-o lexică şi informaţiile (programe, date, reguli de interpretare) necesare la utilizarea acestei lexici. Aceste informaţii pot lua diferite forme în dependenţă de limbajul utilizat. 11. Gestiunea informaţiei. Legarea Numim legare procesul construirii unei căi de acces. Legarea obiectelor unui program poate fi efectuată la diferite momente de viaţă a programului în sistem: În momentul scrierii programului.’- Un atare program poate fi imediat executat, dar orice modificare este dificilă şi conţine un risc ridicat de eroare. La una din fazele de translatare La o fază de încărcare şi editare a legăturilor- Încărcarea şi editarea legăturilor pot fi combinate într-o singură operaţie sau realizate separat. În timpul execuţiei; legătura este numită în acest caz dinamică.

12. Gestiunea informaţiei. Protecţia Vom înţelege prin termenul protecţie mulţimea metodelor şi mecanismelor, care vizează specificarea regulilor de utilizare a obiectelor şi garantează respectarea acestor reguli. Protecţia este asigurată de o combinaţie de dispozitive fizice şi logice. Există legături strânse între desemnarea obiectelor şi protecţia lor. Trei observaţii, legate de protecţie: O modalitate simplă de a interzice unui proces orice acces la un obiect constă în suprimarea tuturor căilor de acces la acest obiect, altfel spus, de a le retrage din contextul procesului. Atunci când operaţiile permise asupra unui obiect sunt specificate prin apartenenţa la o clasă sau un tip, este posibilă verificarea prealabilă execuţiei În cazul în care verificarea este făcută în momentul execuţiei, o procedură de acces facilitează implementarea verificării şi reduce riscul unor erori. 13. Gestiunea informaţiei. Domenii şi drepturi de acces Regulile de utilizare pot fi exprimate specificând drepturile de acces ale fiecărui obiect activ, adică mulţimea de operaţii pe care obiectele active sunt autorizate să le execute asupra altor obiecte. să definim entităţile cărora sunt ataşate drepturile a posibilităţii evoluţiei dinamice a drepturilor unui proces, a faptului, că mai multe procese pot avea, în aceleaşi circumstanţe, acelaşi set de drepturi. Un domeniu defineşte: o mulţime de obiecte accesibile sau context, pentru fiecare dintre aceste obiecte, o mulţime de operaţii permise (drepturi), un mecanism, care asigură accesul la aceste obiecte, respectând restricţiile de mai sus. 14. Gestiunea informaţiei. Problemele protecţiei Prezentăm succint câteva probleme, legate de implementarea protecţiei în sistemele informatice. Protecţie ierarhizată Subsisteme reciproc suspicioase Acordarea şi retragerea drepturilor de acces. - Problema pusă aici este problema modificării dinamice a drepturilor de acces. 15. Desemnarea şi legarea fişierelor şi intrărilor-ieşirilor Vom examina aici modul de desemnare a fişierelor, legarea lor cu programele, care le utilizează şi relaţiile lor cu intrările-ieşirile. Nu avem nevoie pentru aceasta să cunoaştem organizarea 27

internă a unui fişier, interesându-ne doar organizarea lui ca un tot întreg în cazul unui limbaj de comandă sau al unui program. 16. Căi de acces la un fişier Un fişier este desemnat de către utilizatorii externi cu ajutorul identificatorilor – nume externe. Aceste nume externe sunt definite într-un mediu comun mai multor utilizatori. Structurile de date, care permit construirea căii de acces la un fişier pornind de la unul din numele sale externe, sunt numite cataloage sau directorii. În afara numelor interne şi externe, adesea mai este definit un nume, zis local sau temporar. Un nume local este definit într-un mediu propriu unui utilizator şi are o existenţă doar temporară Acces selectiv: interpretarea numelor locale permite introducerea unui acces selectiv la un fişier în dependenţă de utilizator.

17. Desemnarea externă a fişierelor. Cataloage. Organizarea arborescentă Un catalog defineşte , un mediu, adică o mulţime de identificatori şi regulile de interpretare a acestor identificatori. Organizarea cea mai simplă poate fi schematic reprezentată de un tabel, care asociază unui identificator descriptorul fişierului pe care acesta îl desemnează. O organizare arborescentă este definită după cum urmează: Unui catalog i se asociază o mulţime (care poate fi vidă) de alte cataloage şi fişiere; aceste obiecte se numesc incluse în catalog; Există un catalog, şi numai unul singur, numit rădăcină, care nu are tată. Orice alt catalog are un tată, şi doar unul singur. Relaţia de legătură defineşte o arborescenţă de cataloage cu rădăcina în catalogul rădăcină. 18. Legarea fişierelor cu fluxurile de intrare-ieşire Un program schimbă informaţii cu mediul exterior prin intermediul unor operaţii de intrareieşire. care permit comunicarea cu un fişier sau un periferic. În momentul elaborării programului nu este încă cunoscut cu care fişier sau periferic se vor produce intrările-ieşirile; adesea este necesar să se utilizeze fişiere sau periferice, care diferă de la o execuţie la altă. Un flux de intrare-ieşire este un obiect, care posedă toate caracteristicile unui periferic de intrareieşire (nume, operaţii de acces), dar care nu are o existenţă reală La realizarea asocierii este folosită legarea prin înlănţuire. Fiecărui flux i se asociază un descriptor. Operaţia de asociere cere ca acest descriptor să conţină un pointer spre descriptorul fişierului sau perifericului, pe care îl asociază fluxului. 19. Legarea programelor şi datelor Program interpretat

Program compilat

28

20. Etapele de viaţă a unui program Program interpretat

2.Program compilat

Compararea acestor două scheme pune în evidenţă diferenţa importantă între interpretare şi compilare: modificarea unui program interpretat are efect imediat, în timp ce în cazul compilării suntem nevoiţi să parcurgem toate etapele, începând cu translatarea. 21. Funcţionarea unui încărcător Un încărcător este destinat să pună în formă absolută un program obiect în adrese relative. Această operaţie constă în înlocuirea tuturor adreselor relative la originea modulului prin adrese absolute. Pentru aceasta se va efectua un lucru preliminar în faza de translatare: înregistrărilor modulului obiect, care conţin o adresă translatabilă, li se va ataşa un indicator, care va fixa poziţia acestei adrese în interiorul înregistrării (dacă poziţia nu este specificată în mod implicit). Adresele translatabile pot să apară: sau în câmpul de adresă al instrucţiunii, sau în cazul datelor, în ”expresii pentru calcularea adresei”, destinate a fi utilizate ca relaţii de direcţionare sau să fie încărcate în registrele de bază.

29

22. Funcţionarea unui editor de legături Principiile de funcţionare a unui editor de legături: El este obligat: să determine adresa de implantare a acestuia, să îndeplinească modificările informaţiilor translatabile, să realizeze legarea referinţelor externe 23. Legarea prin substituţie În cazul editării legăturilor prin substituţie fiecare referinţă la un obiect extern în cadrul unui modul este înlocuită prin adresa absolută a acestui obiect. Prin definiţie, un modul A utilizează un modul B dacă programul lui A face referinţe la obiecte, conţinute în B. Deoarece graful relaţiei utilizează poate conţine circuite, editarea legăturilor foloseşte un algoritm în doi paşi. Primul pas construieşte planul implantării modulelor şi determină adresa absolută a tuturor obiectelor externe; al doilea pas soluţionează referinţele la aceste obiecte. 24. Legarea prin înlănţuire  Vector de transfer Metoda vectorului de transfer este relativ puţin utilizată pentru programele compilate, totuşi descriem principiile acestei tehnici, deoarece: ea este aplicabilă în cazul programelor interpretate sau celor combinate, ea permite introducerea într-o formă primitivă a noţiunii de segment de legătură, noţiune dezvoltată în continuare. Fiecare modul conţine un tabel, numit vector de transfer, care are câte o intrare pentru o referinţă externă. În corpul modulului fiecare referinţă la un obiect extern este înlocuită printr-o referinţă indirectă la intrarea respectivă a vectorului de transfer.  Registre de bază Ca şi în cazul încărcătorului, adresarea cu ajutorul registrelor de bază simplifică lucrul editorului de legături. Există două moduri distincte de utilizare a acestor registre: -Registrele de bază sunt accesibile utilizatorilor: în acest caz sunt definite convenţii de utilizare care permit, de exemplu, folosirea registrelor de bază specificaţi pentru a adresa un subprogram, o zonă de date, un bloc de parametri etc. Aceste convenţii sunt implementate de către translatoare sau direct de către utilizatori, dacă aceştia programează în limbaj de asamblare. -Registrele de bază sunt administrate de sistemul de operare şi sunt inaccesibili utilizatorilor. 25. Mecanisme de gestiune a obiectelor. Segmentarea Segmentarea poate fi considerată o extensie a adresării cu ajutorul registrelor de bază, care evită problemele realocării acestor registre, atunci când este necesară schimbarea segmentului. Un segment este p mulţime de informaţii considerată ca o unitate logică şi desemnată de un nume; reprezentarea sa ocupă o mulţime de amplasamente adiacente (contigue). Un segment poate fi de lungime variabilă. O informaţie este desemnată de un cuplu care se numeşte adresă segmentată .Este important să se noteze, că segmentele sunt reciproc independente atât din punct de vedere fizic, cât şi logic. pentru utilizator: necesitatea de a se conforma convenţiilor de folosire a registrelor de bază, pentru sistemul de operare: necesitatea gestiunii alocării registrelor de bază, dacă acestea sunt în număr insuficient.

30

26. Gestiunea fişierelor. Noţiuni generale Acest capitol este consacrat studierii detaliate a gestiunii fişierelor în sistemele de operare: organizarea logică, reprezentarea informaţiei, realizarea funcţiilor de acces, protecţia şi securitatea. Noţiunile menţionate sunt ilustrate cu exemple de gestionare a fişierelor în sistemele de operare Windows şi Unix. 27. Funcţiile unui sistem de gestiune a fişierelor Funcţiile principale, asigurate de un sistem de gestiune a fişierelor sunt:  crearea unui fişier (definirea numelui, alocarea eventuală a spaţiului),  distrugerea unui fişier (eliberarea numelui şi a spaţiului, alocat fişierului),  deschiderea unui fişier (declararea intenţiei de a folosi fişierul cu ajutorul funcţiilor de acces şi a drepturilor specificate),  închiderea unui fişier deschis (interzicerea oricărui acces ulterior),  diverse funcţii de consultare şi modificare: citire, scriere, modificarea lungimii, etc. (detaliile legate de aceste funcţii depind de organizarea logică a fişierului). 28. Organizarea generală a unui sistem de gestiune a fişierelor SGF realizează corespondenţa între organizarea logică şi organizarea fizică a fişierelor. Organizarea logică, unică cunoscută de utilizator, este determinată de consideraţii de comoditate şi universalitate; organizarea fizică, legată de suporturile de memorie utilizate, este determinată de considerente de economisire a spaţiului şi eficacitatea accesului. Aceste două organizări sunt, în genere, diferite fiecare fiind definite prin structuri de date proprii, controlate de SGF. Drept rezultat, SGF sunt construite conform unei structuri ierarhice, care are cel puţin două niveluri corespunzătoare celor două organizări, menţionate mai sus: orice acţiune, definită la nivelul logic este interpretată de un set de acţiuni la nivelul fizic. Pentru facilitarea concepţiei sau pentru a răspunde unor necesităţi specifice (portabilitate, de exemplu) pot fi definite şi unele nivele intermediare. 29. Organizarea logică a fişierelor. Acces secvenţial Pentru specificarea organizării logice a unui fişier definim mai întâi o structură abstractă a fişierului. Pentru aceasta vom utiliza un model simplu de descriere a datelor, care ne va permite să caracterizăm înregistrările, să definim organizarea globală a fişierului şi să exprimăm funcţiile de acces. Vom preciza mai apoi reprezentarea concretă a informaţiilor, care se conţin în fişier. Un fişier este o mulţime de înregistrări (articole). Fiecărui articol îi este asociat un număr constant de n atribute, aceleaşi pentru toate articolele. Un atribut este definit printr-un nume şi un domeniu de valori. Numele este pentru desemnarea atributului; două atribute distincte au nume diferite. Domeniul de valori specifică valorile pe care le poate lua atributul.  Acces secvenţial În cadrul unei organizări secvenţiale înregistrările sunt ordonate şi pot fi desemnate de valori întregi consecutive. Totuşi, aceste numere de ordine nu pot fi folosite în cadrul funcţiilor de acces; este permisă doar utilizarea funcţiei “succesor”. Accesul secvenţial este modul obişnuit de utilizare a unui fişier, implantat fizic pe un suport în care accesarea amplasamentelor este ea însăşi secvenţială, cum ar fi banda magnetică. Un fişier f poate fi deschis pentru citire sau scriere. Unele organizări autorizează scrierea începând de la o înregistrare oarecare (v. exemplul din capitolul 9). Considerăm, că scrierea se face la sfârşitul fişierului şi deschiderea pentru scriere iniţializează fişierul în “vid”.

31

30. Organizarea logică a fişierelor. Acces direct. Cheie unică În cadrul organizărilor cu acces direct funcţiile de acces sunt exprimate ca funcţii ale atributelor înregistrărilor; aceste atribute sunt valori ale diferitor câmpuri. Se numeşte cheie orice câmp al unei înregistrări valoarea căruia poate servi la identificarea înregistrării. Conform organizării adoptate, una sau mai multe câmpuri pot servi drept cheie.  Cheie unică Într-un fişier cu cheie unică fiecare înregistrare conţine o singură cheie, care identifică înregistrarea fără ambiguitate; restul înregistrării este informaţia propriu-zisă. Două înregistrări distincte vor avea totdeauna două valori diferite ale cheii. Definim o procedură căutare(cheie, al), care pentru orice valoare a cheii: sau pune la dispoziţie adresa logică al (unică) a înregistrării pentru care cheia posedă valoarea dată (caz de succes) sau semnalizează cu ajutorul unui mecanism descris, că o atare înregistrare nu există (caz de eşec): excepţie, cod de condiţie; valoarea al este adresa la care înregistrarea ar putea fi inserată (valoare specială, dacă nu mai este spaţiu liber). 31. Organizarea logică a fişierelor. Chei multiple Este cazul când pot fi utilizate mai multe chei pentru a desemna o înregistrare. În caz general, pot exista mai multe înregistrări pentru care o cheie particulară are o valoare dată. O cheie, valoarea căreia determină înregistrarea în mod univoc, se numeşte cheie primară; acest termen este aplicat, prin extensie, şi pentru o combinaţie de chei. Tehnica de bază folosită pentru manipularea unui fişier cu chei multiple este organizarea multilistă. Este utilizat câte un indice distinct pentru fiecare cheie. Fiecare intrare a tabelului indicilor, asociată unei chei concrete, care corespunde unei valori distincte a acestei chei, punctează topul unei liste în care sunt toate înregistrările pentru care cheia considerată posedă valoarea dată. Pentru realizarea acestor liste fiecare înregistrare trebuie să conţină tot atâţia pointeri câte chei ale referinţelor distincte există 32. Organizarea fizică a fişierelor. Implantare secvenţială. Implantare non contiguă În modelul ierarhic, prezentat mai sus, problema organizării fizice a fişierelor poate fi formulată astfel: să se elaboreze o implantare în memoria secundară a unei mulţimi de fişiere respectând următoarele ipoteze:  orice fişier este definit logic ca un segment, adică ca o mulţime de informaţii, care ocupă amplasamente adiacente, reperate prin adrese logice sau deplasări,  dacă nu există concretizări particulare (bandă magnetică, de exemplu), memoria secundară este de tip disc, organizată ca o mulţime de blocuri de lungime fixă. Modul de adresare a blocurilor este precizat în 6.3.3; este suficient să se cunoască că blocurile sunt desemnate de adrese fizice ordonate, adrese consecutive desemnând blocuri adiacente.  Implantare secvenţială În acest caz fiecare fişier ocupă o mulţime de blocuri consecutive în memoria secundară. Este unicul mod de implantare în cazul unei benzi magnetice: fişierele sunt aranjate consecutiv pe bandă, fiecare fiind separat de următorul cu ajutorul unui simbol, numit sfârşit de fişier (end of file, EOF). Un EOF dublu marchează sfârşitul părţii utilizate a benzii. Descriptorul unui fişier este plasat la începutul fişierului şi, adesea, repetat la sfârşitul fişierului. În interiorul fişierului înregistrările sunt aranjate consecutiv; dacă lungimea lor este variabilă, ea va fi prezentă la începutul fiecărei înregistrări. Caracterul EOF este detectat în mod automat de controlerul 32

mecanismului de derulare a benzii. O operaţie “căutarea EOF-ului fişierului” permite saltul de la un fişier la altul pentru căutarea unui fişier cu numele dat.  Implantare non contiguă Dacă abandonăm restricţia contiguităţii implantării, memoria secundară se transformă într-o resursă banalizată, blocurile memoriei secundare fiind echivalente din punctul de vedere al alocării lor. Pentru început introducem informaţiile necesare pentru realizarea funcţiilor de acces 33. Organizarea fizică. Blocuri înlănţuite. Tabele de implantare. Alocarea memoriei secundare Blocurile fizice, care conţin amplasamente logice consecutive sunt înlănţuite între ele; pentru această înlănţuire trebuie să fie rezervat în fiecare bloc un pointer.  Tabele de implantare În cazul accesului direct timpul de acces la un bloc trebuie să nu depindă de adresa sa, ceea ce poate fi obţinut punând toţi pointerii într-un tabel unic de implantare. Descriem mai multe variante ale acestei metode, care diferă prin modul de organizare a tabelului. Problema principală este garantarea uniformităţii timpilor de acces pentru tabelele de lungime mare şi permiterea inserării şi distrugerii blocurilor în orice punct al fişierului. Tabel unic Tabel înlănţuit Tabele cu mai multe nivele  Alocarea memoriei secundare Problema alocării memoriei secundare poate fi pusă în termeni similari cu cea a memoriei principale; restricţiile principale sunt: alocarea prin blocuri de lungime fixă, costul ridicat al accesului, caracteristicile proprii fiecărui suport: organizarea pe piste, dispozitive de citire-scriere mobile sau fixe. Interfaţa alocatorului memoriei secundare conţine două primitive: cerere_zonă(n,a) date : n (întreg), numărul de blocuri contigue cerute rezultat : a (adresă), adresa primului bloc excepţie : număr de blocuri insuficiente eliberare_zonă(n,a) date : n (întreg), numărul de blocuri contigue eliberate a (adresă), adresa primului bloc excepţie : număr de blocuri eliberate 34. Realizarea funcţiilor de acces elementar. Organizarea descriptorilor. Localizarea fizică Un descriptor de fişier trebuie să conţină informaţii de tipuri diverse: informaţii pentru localizarea fizică, informaţii referitor la utilizare, informaţii asociate protecţiei şi securităţii. Localizarea fizică Informaţiile pentru localizarea fizică a unui fişier au fost descrise în 6.3. Dacă aceste informaţii sunt de dimensiune fixă şi redusă (implantare contiguă, blocuri înlănţuite) ele se conţin direct în descriptor; în caz contrar (tabele de implantare înlănţuite sau pe mai multe niveluri), descriptorul conţine doar un pointer la tabelul de implantare şi nişte informaţii sintetice, cum ar fi dimensiunea fişierului, dimensiunea tabelului de implantare, etc.

33

35. Organizarea fizică a fişierelor. Informaţii de utilizare Informaţiile, legate de utilizarea unui fişier pot fi clasificate după cum urmează:  Informaţii de stare. Aceste informaţii definesc starea curentă a fişierului: deschis sau închis, gradul de partajare (numărul de utilizatori, care au deschis simultan fişierul), disponibilitatea pentru modificare, etc.  Informaţii despre conţinutul fişierului. Aceste informaţii permit interpretarea conţinutului fişierului. Este posibil să se asocieze unui fişier un tip, care specifică operaţiile permise. Sunt utilizate, de exemplu, tipurile “text ASCII”, “binar translatabil”, “binar absolut”, “catalog”, etc. Chiar la deschiderea unui fişier putem verifica, dacă utilizarea pretinsă este compatibilă cu tipul fişierului.  Informaţii despre structura logică. Aici pot fi plasate informaţiile care permit trecere de la structura logică la structura fizică a fişierului. De exemplu, în cazul înregistrărilor de lungime fixă este convenabil să se aleagă lungimea înregistrării multiplu sau submultiplu al lungimii blocului fizic. Raportul lungimea blocului/lungimea înregistrării, adesea numit factor de bloc, figurează în cadrul descriptorului.  Informaţii despre utilizările precedente. Aceste informaţii pot fi de natură statistică (numărul deschiderilor, accesărilor, intervalul mediu timp de între accesări, gradul mediu de partajare, etc.) şi au scopul de a înţelege mai bine funcţionarea sistemului pentru ameliorarea lui. De exemplu, informaţiile despre utilizare pot ajuta la o gestiune automată a ierarhiei memoriei secundare: fişierele neutilizate o perioadă lungă pot fi transferate într-o memorie de arhivare pentru a elibera loc în memoriile cu acces rapid. Aceste informaţii mai pot fi utilizate pentru diferite funcţii de securitate: înregistrarea datei ultimului acces sau a ultimei modificări permite un control al utilizării fişierului.

34

36. Crearea şi distrugerea fişierelor. Specificarea interfeţei Parametrii furnizaţi sunt: 1. numele fişierului 2. tipul (opţional) 3. lungimea (opţional) 4. starea iniţială (opţional) Cel mai frecvent, parametrii starea iniţială şi lungimea nu sunt furnizaţi, având valori implicite: lungimea = 0, fişierul este închis, lista de acces predefinită. Operaţii 1. să se creeze un descriptor pentru fişier, obţinem astfel un nume intern, 2. dacă numele furnizat este un nume extern, să se creeze o intrare a acestui nume în catalogul curent, 3. să se aloce memorie fişierului; chiar dacă lungimea sa este nulă, un fişier conţine un antet, care ocupă primul său bloc, 4. să se iniţializeze descriptorul cu informaţiile de localizare, lungime, protecţie (lista drepturilor iniţiale de acces), 5. dacă descriptorul nu se conţine direct în catalog, să se introducă o intrare în catalog cu numele intern al fişierului (adresa descriptorului). Cazuri anormale 1. nume furnizat incorect (incorect construit sau care desemnează un fişier deja existent); 2. memorie insuficientă în memoria secundară.  Distrugerea Specificarea interfeţei Unicul parametru furnizat este numele fişierului. Efectul operaţiei este de a suprima orice acces ulterior la fişier, invalidând toate numele acestuia şi eliberând toate resursele pe care fişierul le utilizează (intrări în tabele, memorie). Operaţii 1. să se elibereze toată memoria, care a fost alocată fişierului; 2. să se elibereze memoria alocată descriptorului şi numele intern să devină reutilizabil (sau invalidat definitiv); 3. suprimarea numelui extern al fişierului în catalogul, care-l include, de asemenea, dacă este cazul, în tabelul numelor locale.

4. Deschiderea şi închiderea fişierelor. Parametrii operaţiei de deschidere sunt: 1,numele fişierului 35

2,condiţiile de utilizare: -modul de acces (citire, scriere, execuţie, etc.) -procedurile de acces (secvenţial, direct, sincron, etc.) -parametrii de transfer (tampoane, etc.) Operaţii La deschidere vor fi realizate următoarele operaţii: localizarea fişierului şi, eventual, transferarea lui pe un suport mai rapid; cerere eventuală de montare a acestuia, controlarea dreptului utilizatorului de a deschide fişierul în modul specificat (consultând lista de acces), crearea unui descriptor local (dacă fişierul nu posedă deja unul în mediul curent) şi atribuirea unui nume local, alocarea eventuală a memoriei pentru zonele tampon de intrare-ieşire; în unele cazuri programul de intrare-ieşire al canalului poate fi construit în dependenţă de condiţiile specificate pentru transfer.  Închiderea Specificarea interfeţei Unicul parametru necesar este numele fişierului. Efectul operaţiei este de a interzice orice acces ulterior la fişier şi de a-l transfera într-o stare coerentă şi stabilă, redându-i definitiv toate modificările operate în perioada cât a fost deschis. Operaţii Descriptorul fişierului este actualizat (dacă aceasta nu a fost făcut anterior) pentru a înregistra definitiv modificările operate în perioada cât a fost deschis; descriptorul local este suprimat, numele local putând fi reutilizat. Memoria ocupată de zonele tampon şi procedurile de intrareieşire este eliberată, dacă ea a fost alocată doar pentru perioada de deschidere a fişierului. Fişierul este, eventual, transferat pe suportul său de origine; o cerere de demontare este trimisă dacă suportul de origine este amovibil. 1. Acces elementar la informaţii Parametrii primitivelor de transfer permit specificarea:  “metodei de acces” utilizate, care determină modul de desemnare a înregistrărilor obiectul transferului (acces secvenţial, direct, cu chei, etc.),  sincronizarea transferului (transfer sincron sau asincron); în cazul unui transfer asincron, modul de deblocare a unui proces apelant,  zonele tampon utilizate (specificate de către utilizator sau furnizate de SGF). Accesul elementar (citire sau scriere) la o înregistrare a fişierului constă din două etape:  determinarea adresei fizice a înregistrării plecând de la desemnarea sa logică; pentru aceasta sunt utilizate metodele descrise în 6.2,  executarea transferului fizic; va fi folosită adresa obţinută mai sus şi primitivele de acces fizic la disc (v.cap.4).

2. Securitatea fişierelor. Redundanţa internă şi restabilirea informaţiilor. Salvare periodică 36

Securitatea fişierelor este asigurată, după cum a fost menţionat, prin redundanţa informaţiilor. Redundanţa poate fi introdusă în două moduri: salvarea periodică a unor informaţii, pentru a putea restabili o stare anterioară în caz de distrugere, şi redundanţa internă, care permite reconstituirea unor informaţii devenite incoerente din cauza unui accident de origine fizică sau logică, care a provocat o alterare parţială.  Redundanţa internă şi restabilirea informaţiilor Principiul redundanţei interne constă în organizarea structurilor de date astfel, încât orice informaţie să poată fi obţinută prin cel puţin două căi distincte. Se reduce astfel probabilitatea că distrugerea accidentală a unei părţi a informaţiei va conduce la pierderea iremediabilă a conţinutului fişierului. Tehnicile frecvent utilizate în acest scop sunt următoarele:  pentru un fişier păstrat pe disc în blocuri înlănţuite se va folosi înlănţuirea dublă (succesor-predecesor),  se va include în fiecare bloc un pointer la blocul, care conţine descriptorul, sau indicaţia că blocul este liber,  se va include în descriptor numele simbolic al fişierului şi un pointer la catalogul în care se conţine fişierul,  parte a descriptorului va fi dublată (de exemplu, în primul şi ultimul bloc al fişierului).  Salvare periodică Se poate apriori conveni să fie salvate, la intervale regulate de timp, toate informaţiile conţinute într-un SGF. Admiţând o salvare pe discul dur la un debit de 20 Mo/s, durata acestei operaţii este de aproximativ 50 s pentru 1 Go. Poate fi realizată salvarea doar a modificărilor, care au avut loc pentru ultima perioadă, concomitent cu lucrul normal al sistemului. 3. Protecţia fişierelor Protecţia fişierelor foloseşte principiul listelor de acces. O listă de acces, asociată unui fişier, conţine drepturile fiecărui utilizator asupra fişierului, adică mulţimea operaţiilor care îi sunt permise. În practică, diferite convenţii permit reducerea listei. Este definită mai întâi mulţimea drepturilor atribuite implicit fiecărui utilizator (mulţime, care poate fi vidă); lista de acces va conţine doar utilizatorii, drepturile cărora diferă de cele implicite. Convenţii de grupare permit asocierea unei mulţimi de drepturi unui grup de utilizatori (membrii unui proiect, etc.), ceea ce reduce şi mai mult lista. Lista de acces serveşte la verificarea validităţii oricărei operaţii asupra fişierului.

4. Autentificarea în Windows. Funcţia LogonUser 37

Sistemul de operare Windows NT posedă mai multe instrumente de control a drepturilor de acces al utilizatorilor la resursele sistemului. Aceste instrumente ar fi absolut inutile în lipsa posibilităţii de a controla dacă la calculator se află anume acel utilizator, care corespunde datelor de evidenţă. Mecanismul, cu ajutorul căruia un utilizator îşi poate confirma autenticitatea se numeşte de autentificare. Autentificarea se produce în baza unui element secret (autentificator), aflat doar în posesia utilizatorului definit de informaţia de evidenţă. De obicei, drept autentificator serveşte parola utilizatorului, însă acesta poate fi şi o cartelă specială (smart, badge) sau informaţii, legate de datele biometrice ale utilizatorului Există mai multe motivaţii pentru aceasta:  Cereri suplimentare de introducere a numelui şi parolei pot fi enervante pentru unii utilizatori,  Programarea incorectă a mecanismului de autentificare poate diminua securitatea sistemului,  Windows NT permite extinderea mecanismului de autentificare. Programele, construite cu un mecanism propriu de autentificare pot fi inutile, dacă sistemul utilizează un alt mecanism, decât cel presupus la elaborarea aplicaţiei.  Funcţia LogonUser Funcţia LogonUser din Win32 API este destinată exclusiv pentru soluţionarea problemei autentificării şi este de forma: BOOL LogonUser( PTSTR pszUsername, // numele utilizatorului PTSTR pszDomain, // numele domenului PTSTR pszPassword, // parola DWORD dwLogonType, // tipul accesării DWORD dwLogonProvider, // provider-ul accesării PHANDLE phToken // token-ul utilizatorului ); 5. Autentificare în Windows cu ajutorul Security Support Provider Interface O altă posibilitate este cea bazată pe Security Support Provider Interface (SSPI), o variaţie a standardului Generic Security Service API (GSS-API), realizat de firma Microsoft. Ambele interfeţe sunt destinate autentificării şi protecţiei informaţiilor, transmise prin reţea. Ideea se bazează pe faptul, că toate protocoalele autentificării de reţea (fie NTLM, Kerberos sau SSL) pot fi reprezentate sub forma unui schimb ordonat de mesaje, în timpul căruia un participant identifică pe celălalt (sau părţile se autentifică reciproc). Evident, SSPI poate fi utilizat şi local, în acest caz transmiterea pachetelor prin reţea este înlocuită de transmiterea zonei de memorie tampon dintr-un loc al programului în altul. SSPI este doar o interfaţă care permite acces standardizat la diferite pachete de securitate (security packages). În componenţa SO Windows NT 4 intră un singur pachet (NTLM), care poate fi utilizat pentru autentificarea utilizatorilor. Începând cu Windows 2000 la acest pachet au mai fost adăugate pachetele Kerberos şi Negotiate. Fragmentul de cod, care urmează controlează corectitudinea numelui şi parolei unui utilizator folosind interfaţa SSPI şi pachetul de securitate NTLM.

38

6. Funcţia NetUserChangePassword în Windows. Utilizarea acestei funcţii pentru autentificare are loc conform codului care urmează: BOOL CheckPassword_ChangePwd( IN PCTSTR pszDomainName, IN PCTSTR pszUserName, IN PCTSTR pszPassword, OUT PHANDLE phToken ) { _ASSERTE(pszUserName != NULL); _ASSERTE(pszPassword != NULL); _ASSERTE(phToken == NULL); USES_CONVERSION; PCWSTR pszPasswordW = T2CW(pszPassword); ULONG lRes = NetUserChangePassword(T2CW(pszDomainName), T2CW(pszUserName), pszPasswordW, pszPasswordW); if (lRes == ERROR_INVALID_PASSWORD || lRes == NERR_UserNotFound) return SetLastError(ERROR_LOGON_FAILURE), FALSE; return TRUE; } 7. SGF din sistemul de operare Unix. Caracteristici generale. Organizarea datelor Toate fişierelor manipulate de utilizator formează o bază de date de tip ierarhic, modelul matematic fiind un arbore în care vârfurile intermediare corespund cataloagelor, iar frunzele – cataloagelor vide sau fişierelor. Structura sistemului de gestiune a fişierelor este prezentată în fig. 6.11. În realitate fiecare disc logic conţine o structură ierarhică separată de cataloage şi fişiere. Pentru a obţine în mod dinamic arborele general este utilizată „conectarea” ierarhiilor separate la o rădăcină fixă a sistemului de fişiere. În mediul utilizatorilor sistemului de operare UNIX istoric noţiunea de „sistem de fişiere” semnifică în acelaşi timp ierarhia cataloagelor şi fişierelor şi partea nucleului sistemului de operare, care administrează cataloagele şi fişierele. Ar fi mai corect că numim ierarhia cataloagelor şi fişierelor arhivă a fişierelor, iar noţiunea de „sistem de fişiere” să fie utilizată doar în cel de-al doilea sens.

8. SGF din sistemul de operare Unix. Descriptorii. Implantarea fizică

39

Într-un catalog, intrarea care corespunde unui fişier conţine identificatorul fişierului şi un nume intern, care este indicele descriptorului său într-un tabel general, asociat suportului. Descriptorul (“i-nod” în terminologia Unix) conţine:  tipul fişierului (ordinar, catalog, special),  numele şi grupul proprietarului fişierului (v.6.5.3),  informaţiile de protecţie,  informaţiile localizării fizice (v.6.3.2.2),  lungimea fişierului, în caractere,  datele despre creare, ultima modificare, ultimul acces. Implantarea fizică  Memoria secundară este organizată în blocuri de lungime fixă (512 octeţi). În descriptorul unui fişier este rezervat un tabel T de 13 cuvinte pentru informaţiile despre localizarea fizică. În dependenţă de numărul t al blocurilor ocupate de fişier, sunt utilizate 1, 2 sau 3 niveluri de direcţionare (v.6.3.2.2):  cuvintele de la T[0] la T[9] conţin adresele blocurilor 0 – 9 ale fişierului (ultimele fiind puse în 0, dacă t<10),  dacă t>10, cuvântul T[10] conţine adresa unui tabel de implantare de 128 de cuvinte, în care sunt adresele blocurilor de la 10 la 137,  dacă t>138, în cuvântul T[11] se află adresa unui tabel, care stabileşte adresele a 128 noi tabele de implantare; se poate ajunge astfel până la 10+128+1282 = 16522 blocuri,  în sfârşit, dacă t>16522, pentru blocurile următoare este utilizată o direcţionare pe trei niveluri; adresa tabelului primar este în T[12]; se poate astfel atinge o lungime maximă de 16522+1283 = 2 113 674 blocuri. 9. Administrarea perifericelor. Volume amovibile. Funcţionarea şi utilizarea Perifericele sunt reprezentate de fişiere speciale, grupate într-un catalog unic (/dev). În locul informaţiilor de implantare, descriptorul unui fişier special conţine un pointer la descriptorul perifericului, care, la rândul său conţine doi indici, numiţi major şi minor. Indicele major identifică tipul perifericului şi punctează la programele primitivelor sale de acces, partajate de periferice de acelaşi tip. Indicele minor identifică individual fiecare periferic şi permite accesul la datele sale proprii, adică la tampoanele de intrare-ieşire utilizate.  Volume amovibile Administrarea volumelor amovibile este realizată conform principiilor, descrise în 5.2.3.2. Catalogul unui volum amovibil este organizat exact ca şi catalogul general. Comanda unei montări logice (montare) permite integrarea catalogului unui volum în catalogul general, la un nivel oarecare şi cu un nume ales. De la acest moment, toate fişierele volumului devin accesibile

10. Gestiunea descriptorilor. Nume locale. Primitive de acces Din considerente de economie, doar descriptorii fişierelor deschise au o copie în memoria centrală. Aceşti descriptori, zişi activi, sunt grupaţi într-un tabel unic (TDA). Un fişier poate fi deschis simultan de mai mulţi utilizatori, fiecare utilizându-l independent cu ajutorul unui pointer 40

de citire-scriere propriu. Acest pointer nu poate fi conţinut în descriptorul fişierului, care este unic: el este păstrat într-un tabel rezident, numit tabel al fişierelor deschise (TFD). În sfârşit, pentru a reduce frecvenţa căutărilor în cataloage şi a simplifica desemnarea, un utilizator poate desemna un fişier printr-un nume local. Acest nume, care este un întreg din intervalul 0..nmax (nmax având valori până la 20), este alocat la deschiderea fişierului. Primitive de acces Funcţiile de acces, descrise mai jos sunt primitive realizate prin apelarea regimului supervizor. Ele sunt utilizate pentru a realiza operaţiile disponibile în limbajul de comandă. Fiecare primitivă returnează un rezultat de tip întreg, care serveşte în special pentru a semnala erorile posibile. Primitiva dup (duplicare) permite crearea unui alt nume local pentru un fişier deja deschis. Ea serveşte în special pentru a conecta tuburile şi pentru a determina, dacă un nume local dat este al unui fişier deschis. Citirea şi scrierea are loc pornind de la o poziţie curentă, definită de un pointer. Aceste operaţii incrementează în mod automat pointerul cu numărul de caractere citite sau scrise. Primitiva lseek permite deplasarea explicită a pointerului. 11. Protecţia fişierelor în UNIX Protecţia este asigurată cu ajutorul listelor de acces conform principiului din 6.5.3. Există trei moduri de acces elementar: citire, execuţie, scriere pentru un fişier; consultare, acces, modificare pentru un catalog. Pentru controlul drepturilor, utilizatorii nu sunt individualizaţi, ci partajaţi în trei clase: proprietarul fişierului, membrii unui grup de utilizatori, restul utilizatorilor. Lista de acces la un fişier este, deci, de lungime fixă; ea enumără drepturile de acces ataşate fiecărei grupe; ea poate fi modificată doar de proprietarul fişierului sau de administratorul sistemului. O caracteristică originală a sistemului de protecţie este că proprietarul unui fişier poate fi schimbat. De la începuturi UNIX a fost gândit ca un sistem de operare interactiv. Pentru a începe lucrul un utilizator trebuie „să intre” în sistem, introducând de la terminal numele propriu de evidenţă (contul, account name) şi, poate, parola (password), devenind astfel utilizator înregistrat al sistemului. Noii utilizatori sunt introduşi (înregistraţi) de către administrator. Utilizatorul nu-şi poate modifica contul propriu, în schimb parola este la discreţia lui. Parolele sunt codificate şi păstrate într-un fişier separat. Nici administratorul nu poate restabili o parolă uitată. Fiecărui utilizator înregistrat îi corespunde un catalog propriu al SGF, numit home. La intrare utilizatorului i se conferă acces total la acest catalog, inclusiv şi la toate cataloagele şi fişierele, care se conţin aici. Accesul la alte cataloage şi fişiere poate fi restricţionat.

12. Alocarea resurselor. Noţiuni generale. Definiţii Numim resursă orice obiect, care poate fi utilizat de către un proces. Unei resurse îi sunt asociate proceduri de acces, care permit utilizarea resursei şi reguli de utilizare, care constituie “modul de utilizare”. Exemple de asemenea reguli au fost aduse în capitolul 4 (acces exclusiv, cititori-redactori, etc.). Nu există vre-o diferenţă fundamentală între noţiunea de obiect şi cea de 41

resursă. Folosirea celor doi termeni semnifică mai mult o diferenţă de domeniu: se utilizează noţiunea obiect atunci când ne interesează specificarea şi realizarea obiectului şi a funcţiilor sale de acces, iar resursă pentru problemele de alocare şi partajare. Se spune că o resursă este alocată unui proces dacă procesul poate utiliza resursa, folosind procedurile ei de acces. Legarea unei resurse de un proces poate fi implicită sau explicită. În primul caz, este suficientă trecerea procesului într-o anumită stare pentru ca el să devină candidat la utilizarea resursei; în cel de-al doilea caz, solicitarea trebuie să fie formulată explicit sub forma unei cereri adresate unui alocator al resursei. Alocatoarele şi cererile pot lua forme diverse: de exemplu, un alocator poate fi un proces căruia cererile îi sunt transmise prin emiterea unor mesaje; sau chiar un monitor (v. capitolul 4) o procedură a căruia serveşte la emiterea unor mesaje. Reacţia unui alocator la o cerere poate de asemenea fi diferită: alocarea resursei solicitate, refuz cu sau fără blocarea procesului solicitant. Terminarea utilizării unei resurse de către un proces poate la fel lua diferite forme: eliberarea explicită sau implicită a resursei sau retragerea forţată a resursei de către alocator. O resursă se numeşte banalizată dacă ea există în mai multe exemplare echivalente, în sensul că o cerere poate fi satisfăcuta de alocator folosind indiferent care exemplar al resursei. 13. Probleme în alocarea resurselor. Exemple de sisteme cu fire de aşteptare Obiectivul unui sistem de alocare a resurselor este să satisfacă cererile într-un mod echitabil, asigurând în acelaşi timp şi performanţe acceptabile. Dacă toate procesele au aceeaşi prioritate, o alocare este echitabilă, atunci când este asigurată o tratare asemănătoare fiecărui proces, de exemplu, aşteptarea medie este identică. Dacă între procese există priorităţi, este dificil să se definească noţiunea de echitate în caz general, dar ea poate fi exprimată prin faptul, că calitatea serviciului (măsurată, de exemplu, prin valoarea inversă a timpului mediu de aşteptare sau printro altă expresie semnificativă) este funcţie crescătoare de prioritate, două procese de aceeaşi prioritate beneficiind de aceeaşi tratare. A fost stabilit, că unii algoritmi de alocare conţin riscul de a face un proces să aştepte la infinit: acest fenomen, numit privaţiune, este contrar principiului de echitate şi trebuie evitat.  Exemple de sisteme cu fire de aşteptare Un sistem informatic este constituit din N instalaţii identice, fiecare fiind descrisă de modelul M/M/1, cu parametrii λ şi μ (fig. 7.1a). Vom examina influenţa asupra timpului de răspuns al acestui sistem a utilizării comune a resurselor, caracteristicile totale de tratare fiind constante.

Fig.7.1. Modelul unui sistem de servire în masă 14. Modele pentru alocarea unei resurse unice Vom trata două cazuri: alocarea procesorului şi gestiunea schimburilor cu o memorie secundară paginată. 15. Alocarea procesorului. Prim sosit, prim servit. Cererea cea mai scurtă servită prima Algoritmii de alocare a procesorului pot fi clasificaţi în funcţie de mai multe caracteristici. 42

1) Algoritmi cu sau fără retragere Retragerea presupune alocarea procesorului unui alt proces înainte ca procesul curent să-şi termine execuţia. Ea permite să se ia în consideraţie: prioritatea cererilor nou sosite, timpul deja consumat de către procesul ales. 2) Noţiuni de prioritate şi modul de determinare a priorităţii  Prim sosit, prim servit Disciplina “Prim sosit, prim servit” (în engleză, “First In, First Out”, sau FIFO) utilizează un fir unic, fără prioritate şi fără retragere. Procesul ales este executat până la terminarea sa, iar cel care va urma este procesul din topul firului de aşteptare. Un proces nou intră în coada firului.  Cererea cea mai scurtă servită prima În acest caz cererile sunt ordonate în cadrul firului de aşteptare conform timpului lor de servire, presupus apriori cunoscut, cererile cu durata de servire cea mai scurtă aflându-se în top. 16. Caruselul şi modele derivate În modelul caruselului (“round robin”) procesorul este alocat succesiv proceselor eligibile pentru o perioadă constantă de timp τ, numită cuantă. Dacă un proces se termină sau se blochează înainte de sfârşitul cuantei, procesorul este imediat alocat procesului următor. Această disciplină de servire este implementată ordonând procesele într-un fir de aşteptare circular; un pointer de activare, care avansează cu o poziţie la fiecare realocare a procesorului, desemnează procesul ales 17. Disc de paginare Vom cerceta acum metodele de gestiune a schimburilor între memoria principală şi un disc cu dispozitive de citire-scriere (DCS, capuri) fixe. Astfel de discuri sunt organizate pe piste şi sectoare şi are câte un DCS per pistă. Schimburile sunt comandate de un server care primeşte cererile de transfer; fiecare cerere presupune transferul unui sector cu indicaţia direcţiei de transfer, o adresă în memorie şi una pe disc (pista şi sectorul) [17]. Vom cerceta două discipline de tratare a cererilor: Fir de aşteptare unic. Cererile de transfer sunt ordonate într-un fir unic şi tratate în ordinea sosirii lor, Un fir per sector. Un fir distinct este administrat pentru fiecare sector; se speră să poată fi redus timpul mediu de aşteptare, eliminând timpul mort.

18. Tratarea blocărilor. Enunţul problemei. Algoritmi de prevenire. Algoritmi de profilaxie Un exemplu de blocare reciprocă (impas) a fost prezentat în capitolul 4, când două secţiuni critice, corespunzătoare la două resurse distincte, sunt imbricate eronat, existând un risc de blocare pentru o perioadă de timp nedefinită. O atare situaţie poate fi generalizată pentru un număr oarecare de procese şi resurse, dacă sunt îndeplinite următoarele condiţii:  resursele sunt utilizate în excludere mutuală, 43

  

fiecare proces trebuie să utilizeze simultan mai multe resurse, şi acaparează fiecare resursă pe măsura necesităţilor sale, fără a le elibera pe cele pe care le posedă deja, cererile de resurse sunt blocante şi resursele nu pot fi retrase, există o mulţime de procese {p0,..., pn}, astfel încât p0 cere o resursă ocupată de p1, p1 cere o resursă ocupată de p2, ..., pn cere o resursă ocupată de p0.

 Algoritmi de profilaxie Atunci când nu se cunoaşte anticipat nimic despre cererile proceselor, metodele de prevenire constau în înlăturarea uneia din condiţiile 1) – 4) de mai sus. Metoda alocării globale vizează eliminarea condiţiei “2”: fiecare proces cere toate resursele de care are nevoie în bloc; el poate elibera o resursă dacă nu mai are nevoie de ea. Metoda dată conduce la imobilizarea unor resurse în mod neproductiv, şi aduce adesea în practică la suprimarea oricărui paralelism în execuţie; totuşi această metodă nu trebuie refuzată din start. Metoda claselor ordonate vizează eliminarea situaţiei unei aşteptări circulare (condiţia “4”). Resursele sunt divizate în clase C1, C2,..., Cm. Un proces poate primi o resursă din clasa Ci numai dacă el a primit deja toate resursele necesare în clasele Cj, j
20. Algoritmi de detectare şi tratare Pentru detectarea unei blocări putem utiliza testul de fiabilitate a unei stări, înlocuind pentru fiecare proces cererea maximă Anunt[i,*]-Aloc[i,*] cu cererea efectivă la instanţa considerată. Dacă în aceste condiţii este imposibil să se găsească o suită fiabilă completă, sistemul se află în blocare. Mai precis, procesele blocate sunt elementele mulţimii Rest, la terminarea algoritmului. Lecuirea blocării vizează reluarea execuţiei sistemului; aceasta poate fi făcut doar recuperând resursele deja alocate. O metodă mai dură constă în distrugerea proceselor blocate, începând cu cele pentru care preţul distrugerii este cel mai mic (conform unui criteriu definit), până la 44

procesele pentru care execuţia poate fi reluată. Această metodă nu este fără pericole, dacă procesele distruse au lăsat date într-o stare incoerentă. De asemenea este preferabil să se salveze periodic starea proceselor, definind puncte de reluare, corespunzătoare unor stări semnificative. În caz de retragere forţată a resurselor unui proces, acesta poate fi repus în starea corespunzătoare ultimului său punct de reluare. 21. ADMINISTRAREA MEMORIEI. CONCEPTE DE BAZĂ. Memorie virtuală Noţiunea de resurse virtuale a fost introdusă în capitolul 3 pentru a separa problemele utilizării unei resurse particulare de problemele alocării acestei resurse. Pentru un procesor virtual (sau pentru un proces) memoria virtuală este suportul mulţimii informaţiilor potenţial accesibile sau mai precis, mulţimea locaţiunilor adresa cărora poate fi generată de procesor. Alocarea memoriei constă în concretizarea acestei memorii virtuale prin suporturi fizice de informaţie, cum ar fi memoria operativă, memoria secundară, etc. Accesul unui proces la o informaţie este concretizat prin accesul unui procesor fizic la o locaţiune a memoriei principale, adresate de acest procesor. Informaţiile accesibile unui proces sunt definite de:  mulţimea informaţiilor desemnate în programul procesului, sau obiecte,  mulţimea informaţiilor de desemnare, sau nume,  punerea în corespondenţă a numelor şi a obiectelor. Pentru un utilizator, care scrie programe într-un limbaj de nivel înalt numele şi obiectele sunt definite de acest limbaj. Aceste nume şi obiecte diferă de cele manipulate de procesorul fizic. Programul este supus unei serii de transformări, numite legare. Legarea conţine o etapă de translatare (stabilirea unei corespondenţe între obiecte şi amplasamentele de memorie şi între identificatori şi adresele relative respective), o etapă de editare a legăturilor (legarea programelor translatate separat) şi, în sfârşit, o etapă de încărcare (stabilirea definitivă a adreselor). 22. Probleme de alocare a memoriei Alocarea memoriei trebuie să permită unui proces să acceseze un obiect definit în memoria virtuală, aducând în timp acceptabil acest obiect în memoria principală, unica care este direct adresabilă. Ca rezultat, o disciplină de alocare a memoriei trebuie să soluţioneze următoarelor două probleme:  stabilirea corespondenţei între adresele virtuale şi adresele fizice,  realizarea gestiunii memoriei fizice (alocarea locaţiunilor, transferul informaţiilor).  Dacă informaţiile aparţin mai multor utilizatori apar două restricţii suplimentare:  realizarea partajării informaţiilor între mai mulţi utilizatori,  asigurarea protecţiei reciproce a informaţiilor, care aparţin unor utilizatori distincţi.

23. Alocarea dinamică a memoriei Sunt utilizate două metode, în dependenţă de faptul cum este definită unitatea de alocare: prin decupare logică (zonă de memorie plată sau segment) sau prin decupare fizică (blocuri de lungime fixă sau pagini). În ambele cazuri un mecanism de realocare trebuie să permită încărcarea programului sau a unei părţi a programului într-o zonă sau o pagină oarecare. Scopul unei discipline de alocare dinamică a memoriei este să asigure, că la orice instanţă de timp informaţia necesară pentru execuţia instrucţiunii curente este accesibilă procesorului imediat, adică se află în memoria principală. Acest scop nu poate, în mod absolut, fi atins. Se 45

face tot posibilul pentru a reduce probabilitatea ca o informaţie să fie lipsă în memorie atunci când avem nevoie de ea (acest eveniment este numit absenţă a segmentului sau paginii – segment (pagină) absent). Vor fi utilizate mai multe criterii pentru evaluarea şi compararea algoritmilor de alocare a memoriei:  criterii legate de utilizarea memoriei, măsurată, de exemplu, prin rata spaţiului neutilizat,  criterii legate de accesarea informaţiei, cum ar fi timpul mediu de acces sau rata paginilor absente,  criterii mai globale, care caracterizează performanţe influenţate de alocarea memoriei: rata utilizării unităţii centrale sau timpul de răspuns al unui sistem interactiv. 24. Comportamentul într-o memorie virtuală liniară. Proprietăţile lanţurilor de referinţe Considerăm un program, executat într-o memorie virtuală liniară, care conţine toate instrucţiunile şi datele. Mai întâi câteva precizări:  Trecerea timpului este reperată prin execuţia unor instrucţiuni consecutive: executarea unei instrucţiuni defineşte o unitate de timp.  Cererea de memorie este evaluată împărţind memoria virtuală în blocuri adiacente de lungime fixă, care conţin un număr întreg np de amplasamente  Comportamentul programului, la nivelul de detaliere ales, este definit de secvenţa numerelor de pagini, care au fost obiectul referinţelor succesive în timpul execuţiei.  Proprietăţile lanţurilor de referinţe Experienţa arată, că lanţurile de referinţe posedă caracteristici comune, care vor fi descrise mai întâi într-o manieră calitativă.  Neuniformitate. Fie ni numărul total de referinţe la pagina pi. Repartiţia valorilor ni nu este uniformă: o parte mică a paginilor totalizează o parte importantă a numărului total de referiri. Pentru exemplificare: se constată frecvent, că un număr de peste 75% de referiri sunt generate de mai puţin de 25% de pagini.  Localizare. Pentru o perioadă suficient de mică de observare, repartiţia referinţelor prezintă o oarecare stabilitate: la un moment de timp dat, referinţele observate într-un trecut apropiat sunt o bună estimare a referinţelor viitoare.

25. Comportamentul într-o memorie cu capacitate limitată. Comportamentul programelor segmentate Un alt mod de caracterizare a comportamentului unui program este de a studia performanţele sale în funcţie de volumul de memorie alocat programului. Iniţial, programul se află în memoria secundară; la un moment dat de timp, doar o submulţime a paginilor sale sunt prezente în memoria operativă. Dacă referinţa următoare este făcută unei pagini absente, are loc evenimentul, numit pagină lipsă, şi pagina absentă este încărcată în memoria principală (se spune, că paginile sunt încărcate la cerere). Dacă nu există spaţiu disponibil suficient, pagina 46

încărcată trebuie să ia locul unei pagini deja prezente; aceasta se va stabili conform unui algoritm de reamplasare.  Comportamentul programelor segmentate Considerăm un program executat într-un spaţiu virtual segmentat. Noţiunea de lanţ de referinţe, introdusă pentru un spaţiu virtual liniar, se va extinde pentru un spaţiu segmentat, înlocuind referinţele la pagini prin referinţe la segmente. Putem studia repartiţia referinţelor diferitor segmente, ca şi performanţele pentru o memorie limitată în cazul unei politici de alocare “segment la cerere”. Noţiunea de mulţime de lucru (mulţimea segmentelor, care au făcut obiectul referinţelor celor mai recente) poate fi utilizată în mod analogic şi poate fi regăsită proprietatea localizării pentru referirea segmentelor. 26. PARTIŢIONAREA MEMORIEI FĂRĂ REAMPLASARE. Metoda du-te – vino simplă O zonă fixă a memoriei este rezervată programelor utilizatorilor, care o utilizează succesiv. De obicei, aceasta este zona neocupată de sistemul de operare. Programele sunt păstrate pe disc în cod absolut (încărcarea este realizată pentru fiecare program ca şi cum el ar fi unicul). Pentru a fi executat programul trebuie mai întâi adus în memoria principală în întregime. Transferul programului este determinat de modul de alocare a procesorului. În cazul retragerii procesorului, programul curent trebuie salvat pe disc înaintea încărcării programului următor. În scopul reducerii volumului informaţiilor transferate şi, drept rezultat, a timpului de inactivitate a procesorului, pot fi aduse următoarele ameliorări:  atunci când un program este salvat pe disc, va fi salvată doar partea modificată (în practică, zona datelor),  algoritmul “cojii de ceapă” (onion skin) permite minimizarea transferurilor, atunci când un program mai mare este acoperit de unul mai mic: este suficient pentru restabilirea programului să se reîncarce doar partea reacoperită. 27. Partiţionarea memoriei. Partiţionarea fixă. Partiţionarea variabilă Într-un sistem cu partiţionare fixă memoria este împărţită în mod static într-un număr fix de zone. Capacitatea şi limitele acestor zone sunt definite la generarea sistemului. Fiecare program poate ocupa doar un singur segment şi este asociat în mod constant unei zone de memorie. Programele sunt păstrate pe disc în cod absolut, iar adresele prezente în fiecare program sunt adresele fizice, care corespund adreselor de implantare din zona atribuită programului. Partiţionarea variabilă Într-un sistem cu partiţionare variabilă împărţirea în zone nu este fixată odată pentru totdeauna, ci este redefinită la terminarea execuţiei unui program, spaţiul de memorie eliberat fiind repartizat altor programe. Drept consecinţă, încărcarea unui program (fixarea adreselor) poate fi făcută în ultimul moment, doar atunci când spaţiul respectiv îi este atribuit. Un program, odată încărcat în memorie, rămâne aici până la terminarea execuţiei sale: nu este posibilă, deci, reamplasarea dinamică. Multiprogramarea permite menţinerea unităţii centrale în stare activă pentru perioada încărcării programelor sau operaţiilor de intrare-ieşire. Acest mod de funcţionare este adaptat tratării pe loturi pe un calculator, care nu dispune de un mecanism de reamplasare dinamică. 28. ALOCAREA DINAMICĂ A ZONELOR DE MEMORIE. Mecanisme de reamplasare dinamică Alocarea dinamică a memoriei, divizate în zone de capacităţi oarecare cere utilizarea unui mecanism de reamplasare dinamică a acestor zone. Să ne amintim de principiile descrise deja în capitolul 5.

47

1) Registre de bază (v.5.3.3.2). Amplasarea în memoria fizică a unui singur segment este definită de o pereche de registre, numite registrul de bază şi registrul limită. Registrul de bază RB conţine adresa fizică a originii segmentului; registrul limită RL joacă un rol de protecţie, interzicând accesul accidental la locaţiuni situate în afara segmentului. Pentru o adresă virtuală (RB, RL, d), la fiecare accesare este efectuat următorul calcul al adresei: a := RB+d; if a ≤ RL then adr.fiz.:= a else <eroare> endif

- deviere tratată de sistem

2) Segmentare (v. 5.4.1). Segmentarea poate fi considerată o extensie a adresării cu ajutorul registrelor de bază, care evită problemele realocării acestor registre, atunci când este necesară schimbarea segmentului. Fiecărui segment îi este asociat un descriptor, care conţine printre altele, adresa sa de origine şi capacitatea; descriptorii sunt aranjaţi într-un tabel, desemnat de un registru special. Calculul adresei fizice corespunzătoare adresei segmentate (s, d) este următorul: desc := tab_desc[s]; if d < desc.capacitate then adr.fiz.:= desc.orig+d else <eroare> - deviere tratată de sistem endif 29. ALOCAREA DINAMICĂ A ZONELOR DE MEMORIE. Algoritmi de alocare Specificarea unui algoritm de alocare dinamică a segmentelor trebuie să răspundă la întrebările generale, puse în 8.1.3. Încărcarea se face de obicei la cerere din cauza costului ridicat al spaţiului şi timpilor de execuţie, datorat unei preîncărcări eronate. Rămâne de rezolvat problema amplasării (alegerii unei zone libere) şi cea a reamplasării (alegerea zonelor, care vor fi eliberate, dacă nici una din zonele libere nu convin 30. ALOCAREA DINAMICĂ A ZONELOR DE MEMORIE. Amplasarea şi reamplasarea segmentelor Algoritmii sunt clasificaţi conform modului de reprezentare a zonelor libere. Cel mai frecvent sunt utilizate următoarele trei metode:   

Înlănţuirea zonelor libere într-o listă, Divizarea blocurilor (“buddy systems”), Zone de capacităţi predefinite.

1) Zone libere înlănţuite 2) Alocare prin divizare (“buddy systems”) 3) Rezerve de blocuri de capacitate predefinită 1. ALOCAREA DINAMICĂ A ZONELOR DE MEMORIE. Utilizarea algoritmilor de alocare Într-un sistem de operare algoritmii de alocare a memoriei sunt utilizaţi în două maniere: 1) De către sistemul de operare la alocarea memoriei pentru lucrări, atunci când sunt create procese sau când sunt formate zone-tampon de intrare-ieşire, etc. 48

2) De către utilizatori: sistemul pune la dispoziţie, sub forma unui apel supervizor, primitivele cerere alocare şi eliberare memorie. Aceste primitive sunt utilizate, de exemplu, de compilatoare pentru gestiunea variabilelor dinamice. Într-un sistem cu partiţionare variabilă şi reamplasare dinamică, o zonă de memorie este alocată de către sistem pentru a duce evidenţa fiecărei lucrări. 2. Paginarea unei memorii liniare. Paginare simplă Figura 8.11 reprezintă schema generală a unei memorii virtuale paginate. Rolul dreptunghiului marcat “funcţie de paginare” este de a stabili o corespondenţă între adresele paginilor memoriei virtuale npv şi adresele paginilor memoriei fizice npf, astfel încât o pagină virtuală să fie pusă într-o pagină fizică oarecare. Paginile fizice devin astfel resurse banalizate gestiunea cărora este mult mai simplă decât gestiunea zonelor de lungime variabilă.

npf

Funcţie de paginare pagină lipsă

npv Memorie fizică

Memorie virtuală

Fig.8.11. Memorie virtuală paginată Numărul de amplasamente dintr-o pagină este 2 la o putere întreagă. Introducem următoarele notaţii: L = 2l lungimea (numărul de amplasamente) unei pagini Npv = 2p numărul de pagini ale memoriei virtuale Npf = 2c numărul de pagini ale memoriei fizice.

3. Paginare la două niveleuri. Paginarea unei memorii segmentate Tendinţa sporirii capacităţii memoriei virtuale aduce la apariţia problemei creşterii volumului tabelelor de pagini, păstrate în memoria fizică. Paginarea în două niveluri vizează soluţionarea acestei probleme. În această schemă, memoria virtuală este divizată în hiperpagini, care la rândul lor sunt împărţite în pagini. O adresă virtuală este în acest caz de forma (nhip, npv, dep). Numărul nhip al hiperpaginii permite accesul la un tabel de hiperpagini, in care fiecare intrare conţine un pointer la tabelul de pagini ale hiperpaginii, care este limitat doar la paginile efectiv utilizate. Un câmp 49

“lungime” permite controlul acestei restricţii. Tabelele de pagini sunt utilizate ca şi în paginaţia simplă (fig.8.14). O memorie asociativă, în care sunt păstrate cele mai recente triplete (nhip, npv, npf) accelerează consultarea (care necesită două accesări suplimentare în caz de eşec).  Paginarea unei memorii segmentate Paginarea unei memorii segmentate are drept scop o alocare mai eficientă a segmentelor, ridicând restricţia de contiguitate pentru amplasarea unui segment. O intrare a tabelului segmentelor conţine, în afara informaţiilor proprii ale segmentului (lungime, protecţie, tip), un pointer la tabelul de pagini ale acestui segment. Ca şi în schemele precedente, o memorie asociativă păstrează ultimele referinţe (fig.8.15). 4. Implementarea paginării. Mecanismul de deviere “pagină lipsă” În afara traducerii propriu-zise a adreselor (corespondenţa npv – npf), mecanismul de accesare a unei memorii paginate realizează următoarele operaţii: actualizarea bitului de scriere şi a bitului de utilizare, dacă aceştia există, detectarea lipsei paginii necesare (prezent[npv]=0), care provoacă o deviere. Programul de tratare a devierii “pagină lipsă” trebuie: să găsească în memoria secundară pagina lipsă, să găsească în memoria principală o pagină fizică liberă; dacă aceasta nu există, va trebui eliberată una, eliminând din memoria principală în cea secundară pagina virtuală pe care o conţine, să încarce pagina virtuală necesară în pagina fizică. 5. Paginarea memoriei Partajarea şi protecţia informaţiei Partajarea informaţiilor între mai multe memorii virtuale generează apariţia următoarelor trei probleme: notarea: cum vor fi adresate într-un mod uniform informaţiile partajate, partajarea fizică: cum să se garanteze că informaţiile partajate există într-un singur exemplar, protecţia: cum să se garanteze respectarea regulilor de acces la informaţiile partajate. 1) Notarea informaţiilor partajate Vom face deosebire între o memorie virtuală liniară şi una segmentată. 2) Amplasarea fizică a informaţiilor partajate O pagină virtuală cu informaţii partajate poate fi încărcată într-o pagină fizică oarecare; tabelele paginilor memoriilor virtuale unde figurează aceste pagini vor conţine, la intrarea respectivă, acelaşi număr de pagină fizică (fig.8.16,a). 3) Protecţia informaţiilor partajate Dacă unitatea de partajare este pagina, unei pagini partajate îi pot fi atribuite drepturi de acces distincte pentru fiecare memorie virtuală în care aceasta figurează

6. GESTIUNEA MEMORIEI VIRTUALE PAGINATE. Parametrii unei discipline de alocare Disciplinele de alocare a unei memorii paginate pot fi clasificate în conformitate cu mai multe criterii. Vom presupune că sistemul este multiprogramat pentru mai multe procese, fiecare dintre acestea posedând memorie virtuală proprie. 1) Partiţie fixă sau variabilă. În cazul disciplinei de alocare cu partiţie fixă un număr fix de pagini fizice sunt atribuite fiecărui proces; notăm că acest număr este constant doar pentru perioadele în care numărul proceselor multiprogramate este el însuşi constant. Pentru o disciplină 50

cu partiţie variabilă, numărul de pagini fizice, atribuite fiecărui proces variază în timp. Paginile fizice fiind banalizate, anume numărul lor (şi nu identitatea) este un parametru semnificativ. 2) Paginare la cerere sau preîncărcare. Paginaţia la cerere a fost definită în 8.2.1.2: o pagină este încărcată în memorie drept rezultat a unei referinţe, care conduce la evenimentul pagină lipsă. Dacă o pagină este încărcată în avans, înainte de orice referire la o informaţie, care se conţine aici, se spune că are loc o preîncărcare. 3) Reacoperire locală sau globală. Dacă o pagină logică este încărcată într-o pagină fizică ocupată (v.8.2.1.2) are loc o înlocuire a paginii (pagina înlocuită este adesea numită “victima”). Algoritmul de reacoperire este zis local sau global conform principiului de alegere a victimei – dintre paginile alocate procesului care provoacă înlocuirea sau din mulţimea tuturor paginilor, prezente în memorie. 7. Algoritmi de reamplsare cu partiţie fixă. Descrierea algoritmilor În cazul partiţionării fixe ne vom limita la examinarea algoritmilor locali. Din acest motiv vom considera un singur proces căruia îi sunt alocate un număr fix N de pagini. Execuţia acestui proces este definită de un lanţ de referinţe. Descrierea algoritmilor Vom prezenta mai întâi doi algoritmi, care descriu două cazuri extreme: algoritmul optimal, care presupune cunoaşterea totală a viitorului comportament al programului şi algoritmul „neutru”, care nu utilizează nici un fel de informaţii iniţiale. Alţi doi algoritmi sunt situaţi undeva la mijloc. Algoritmul optimal (MIN). Alegere aleatoare Ordine cronologică de încărcare (FIFO - PSPS). Ordine cronologică de utilizare (LRU sau „Least recently Used”). Algoritmul celei de-a doua şanse” sau FINUFO („First In Not Used, First Out”). 8. Algoritmi de reamplsare cu partiţie fixă. Evaluare şi comparare Numeroase cercetări experimentale au permis evaluarea algoritmilor de reamplasare. Figura 8.17, preluată din [20], aduce prezentări sintetice ale rezultatelor obţinute. Putem constata: 1. că algoritmii pot fi clasificaţi în următoarea ordine de descreştere a performanţelor: MIN, LRU, Clock, FIFO (performanţele lui FIFO fiind aceleaşi ca şi ale alegerii aleatoare). 2. că influenţa capacităţii memoriei este net superioară influenţei algoritmului de reamplasare, altfel spus, performanţele unui program vor fi ameliorate mult mai semnificativ sporind numărul de pagini fizice puse la dispoziţie, decât alegând algoritmul de reamplasare.

9. Algoritmi cu partiţie variabilă. Reglarea şarjei Rezultatele prezentate în continuare arată, că pare a fi preferabil să se încerce alocarea unui volum de memorie bine adaptat comportamentului fiecărui program. Aceasta poate fi realizat în două moduri: utilizând un algoritm cu partiţie variabilă, utilizând un algoritm de reamplasare globală, ceea ce ar însemna să aplicăm mulţimii programelor prezente unul dintre algoritmii studiaţi pentru partiţiile fixe. 51

În ambele cazuri trebuie să se definească politica, care va fi aplicată în caz de suprasolicitare, adică atunci când cererea de memorie devine excesivă şi conduce la o degradare a performanţelor. Anume din această cauză vom începe cu studierea comportamentului unui sistem în condiţii extreme. Vom prezenta în continuare algoritmii cu partiţie variabilă bazaţi pe măsurări locale a comportamentului programelor, apoi algoritmii de reglare, care utilizează criterii globale. 10. Instabilitatea şi thrashing-ul unui sistem cu multiprogramare În primele sisteme cu memorie virtuală paginată s-a constatat, pornind de la o anumită şarjă (măsurată de exemplu, prin numărul de utilizatori interactivi), o degradare brutală a performanţelor. Acest fenomen, numit thrashing este caracterizat de căderea bruscă a ratei de utilizare a procesorului şi o creştere puternică a schimbului de pagini. Timpul de răspuns atinge valori inacceptabile. O explicaţie calitativă a thrashing-ului permite să punem în evidenţă cauzele sale şi să propunem unele remedii. Considerăm un sistem cu memorie paginată, multiprogramat pentru o mulţime de procese fiecare dintre care corespunde unui utilizator interactiv. Memoria fizică este partajată în mod echitabil între procese cu comportament în medie identic. Această partajare este realizată de un algoritm cu reamplasare globală. Începând cu un anumit număr de procese numărul mediu de pagini fizice alocate fiecărui proces cade până sub nivelul corespunzător „duratei de viaţă” (v.8.2.1). Probabilitatea globală a evenimentului pagină lipsă, invers proporţională duratei de viaţă, creşte extrem de rapid odată cu creşterea numărului de procese. 11. Algoritmii de reamplasare cu partiţie variabilă Dacă numărul de pagini fizice alocate unui program este variabil, performanţele unui algoritm sunt definite de două mărimi: numărul mediu M de pagini fizice ocupate de program şi numărul mediu F de pagini fizice lipsă într-o unitate de timp. Mediile sunt evaluate pentru toată execuţia programului; unitatea de timp este intervalul între două adresări succesive la memorie. Pe de altă parte este necesar să fie definit un criteriu care ar permite compararea algoritmilor. În acest scop introducem două costuri unitare:  un cost temporal R: costul lipsei unei pagini,  un cost în spaţiu U: costul ocupării unei pagini în memorie pe perioada unei unităţi de timp virtual. Vom defini costul unui algoritm cu ajutorul combinaţiei liniare ale acestor două costuri: C = R.F + U.M

12. Reglarea şarjei şi echilibrarea unei configuraţii. Exemple Reglarea globală a şarjei presupune modificarea gradului de multiprogramare pentru menţinerea performanţelor sistemului în limite acceptabile. La şarjă joasă sau moderată multiprogramarea sporeşte rata de utilizare a procesorului folosind timpul mort, datorat unor blocaje sau aşteptări de pagini; la şarjă înaltă – invers. Acest comportament sugerează existenţa unei valori optimale a gradului de multiprogramare, care maximizează rata utilizării procesorului pentru o configuraţie dată a resurselor tehnice şi o şarjă concretă, ceea ce este confirmat şi de practică. Un algoritm ideal de reglare a şarjei trebuie să menţină gradul de multiprogramare în vecinătatea acestei valori optimale 52

Exemple Toate sistemele actuale cu multiprogramare conţin un mecanism de ajustare dinamică a gradului de multiprogramare, care utilizează una din metodele descrise mai sus. Sisteme, care folosesc reglarea şarjei globale Reglarea şarjei globale a fost introdusă în sistemul experimental IBM M44 şi este pe larg folosită în sistemul IBM 370 VM. Principiul este acela descris mai sus: suprasolicitarea sistemului este detectată prin măsurări periodice ale activităţilor de paginaţie, iar regulatorul acţionează direct asupra gradului de multiprogramare. Sisteme, care folosesc o estimare aproximativă a mulţimii de lucru 13. Memorii ierarhice. Caracteristici generale. Noţiune de cache Informaţiile conţinute în memoria virtuală a unui sistem sunt repartizate pe o mulţime de suporturi fizice care formează ierarhia memoriei. Putem spune, că atunci când ne deplasăm de la procesor spre periferie caracteristicile suporţilor de memorie sunt ordonate prin capacităţi şi timp de acces crescătoare şi preţ de păstrare a unui bit – descrescător. Obiectivul principal al unui algoritm de administrare dinamică a unei memorii cu mai multe nivele este să se repartizeze informaţiile pe suporţi astfel încât la orice moment de timp informaţia imediat necesară să fie direct accesibilă procesorului. Pentru aceasta sunt combinate calităţile suporţilor de capacitate ridicată şi preţ scăzut cu cele ale suporţilor cu acces rapid. Noţiune de cache Fie două nivele adiacente ale unei ierarhii de memorie – unul superior şi altul inferior. Putem considera că informaţia este păstrată tot timpul la nivelul inferior, algoritmul de administrare aducând pentru fiecare moment de timp la nivelul superior submulţimea de informaţii pentru care probabilitatea estimată de accesare este cea mai înaltă. Estimarea acestei probabilităţi utilizează, de obicei, algoritmul LRU sau unul din variantele acestuia. Se spune atunci, că nivelul superior funcţionează ca un cache pentru nivelul inferior. Acest termen are la origine un dispozitiv fizic, situat la nivelul cel mai înalt (între procesor şi memoria centrală) şi este utilizat, prin analogie, în sensul de mai sus, deşi administrarea este cu ajutorul unor resurse logice 14. Migrarea fişierelor. Administrarea transferurilor Salvarea fişierelor într-o memorie de arhivare (bandă magnetică, etc.) este necesară din cauza limitării capacităţii discurilor. Această problemă este asemănătoare cu cea a administrării unei memorii paginate, însă pot fi notate două diferenţe: diferenţa în timpi de execuţie (milisecunde şi ore); restricţiile temporale pentru salvare nu sunt atât de stricte, administrarea este realizată cu ajutorul unor unităţi de lungime variabilă (fişierele) şi nu cu pagini de lungime fixă.

15. Disc de paginaţie. Disc cu braţ mobil Un disc cu capuri fixe conţine câte un dispozitiv de citire-scriere pentru fiecare pistă (v.7.3.2). Există anumite avantaje în folosirea discului de paginaţie, care constau în utilizarea unui fir distinct de cereri pentru fiecare sector. Indicăm două aspecte practice ale acestei organizări:  Durata intervalului de deplasare de la un sector la altul (dintre două sectoare consecutive) pe sub dispozitivul de citire-scriere trebuie să fie suficientă pentru a permite lansarea unui transfer. Folosind un canal de intrare-ieşire, această lansare poate fi accelerată datorită înlănţuirii instrucţiunilor.  Discul de paginaţie reordonează cererile, care nu sunt, deci, executate în ordinea apariţiei lor. Vor fi necesare precauţii suplimentare atunci când ordinea transferurilor este importantă. 53

Disc cu braţ mobil Un disc cu braţ mobil are un singur cap de citire-scriere pentru fiecare suprafaţă de disc. O deplasare radială a braţului portant permite să aducem capul de asupra pistei alese. La timpul de aşteptare a sectorului ales se mai adaugă timpul de deplasare radială a braţului din poziţia sa iniţială. Dacă unitatea de disc are mai multe suprafeţe, toate braţele portante sunt unite rigid; mulţime pistelor accesibile fără deplasarea braţelor formează un cilindru. Au fost propuşi următorii algoritmi: 1,Prim sosit, prim servit (FIFO 1) Cel mai apropiat servit primul (SSTF: Shortest Seek Time First) 2) Ascensor şi alte variante(Scan 1. Mijloacele de susţinere a segmentării memoriei i386. Spaţiul fizic de adrese a procesorului i386 este de 4 Go, ceea ce este determinat de magistrala de adrese pe 32 de biţi. Memoria fizică este liniară cu adrese de la 00000000 până la FFFFFFFF în cod hexazecimal. Adresa virtuală, utilizată în program este reprezentată de perechea (nr.segment, depl). Deplasarea este dată de câmpul respectiv al instrucţiunii, iar numărul segmentului – în unul din cele 6 registre de segment ale procesorului (CS, SS, DS, ES, FS şi GS), fiecare fiind de 16 biţi. Mijloacele de segmentare formează nivelul superior al dispozitivului de administrare a memoriei virtuale a procesorului i386, iar dispozitivele de organizare a paginaţiei – nivelul inferior. Mijloacele de paginaţie pot fi active sau dezactivate (cu ajutorul unui bit special în registrul de comandă al procesorului) şi în dependenţă de aceasta se modifică sensul transformării adresei virtuale, executate de mijloacele de segmentaţie. 2. Mecanismul segmentare cu paginaţie i386 Când sistemul de paginaţie este activat lucrează atât mecanismul de segmentare, descris mai sus, cât şi mecanismul de gestiune a paginilor, dar în acest caz sensul funcţionării mecanismului de segmentare se modifică. Spaţiul virtual de adrese al unei lucrări este de 4 Go în care se vor afla toate segmentele (fig.8.24). Ca şi mai înainte selectorul lucrării determină numărul segmentului virtual, iar deplasarea din instrucţiunea lucrării – deplasarea în interiorul acestui segment. Deoarece toate segmentele se află în acelaşi spaţiu de adrese, este posibilă intersecţia lor, procesorul necontrolând aceste situaţii, lasă problema în seama sistemului de operare. Prima etapă de transformare a adresei virtuale, legată de transformarea deplasării şi selectorului utilizând tabelele GDT şi LDT, care conţin descriptorii segmentelor, este exact la fel ca şi etapa de transformare a acestora atunci când mecanismul de gestiune a paginilor este dezactivat.

1. Mijloacele de apelare a subrutinelor şi lucrărilor Sistemul de operare trebuie să pună la dispoziţia lucrărilor mijloace de apelare a subrutinelor sistemului de operare şi din diferite biblioteci de programe, de asemenea să posede mijloace pentru lansarea lucrărilor, iar în cazul regimului multitasking – mijloace de comutare rapidă a lucrărilor la alta. Apelarea unei subrutine se deosebeşte de lansarea unei lucrări prin faptul, că în primul caz spaţiul de adrese rămâne acelaşi (tabelul LDT nu va fi schimbat), iar în al doilea caz – spaţiul de adrese este în totalitate schimbat. Apelarea unei subrutine fără schimbarea segmentului de cod în regimul protejat al procesorului i386 are loc analogic apelării în regim real cu ajutorul instrucţiunilor JMP şi CALL.

54

Pentru apelarea unei subrutine, codul căreia se află într-un alt segment (care poate aparţine unei biblioteci, unei alte lucrări sau sistemului de operare), procesorul i386 pune la dispoziţie două variante de apel, ambele garantând protecţia prin utilizarea drepturilor de acces. 2. Elaborarea unui sistem de operare. Decompoziţia ierarhică şi maşini abstracte Obiectivele acestui capitol sunt: Introducerea unor principii de structurare a sistemelor soft: decompoziţia ierarhică, nivele de abstractizare, obiecte şi interfeţe. Interesul pentru aceste noţiuni depăşeşte cadrul strict al softului de sistem; totuşi, aceste concepte au o importanţă particulară pentru sistemele de operare dat fiind complexitatea acestora, dimensiunile adesea foarte mari şi interacţiunile caracteristice dintre software şi hardware. Aplicarea acestor noţiuni la descrierea schemelor de organizare şi funcţionare a unui sistem de operare foarte simplu, ceea ce permite specificarea componentelor sale principale şi a interfeţelor interne. 3. Conceptul de descendenţă şi structuri cu nivele. Noţiunea de obiect O dificultate esenţială în elaborarea programelor este generată de distanţa mare, care separă limbajul de formulare a problemelor şi limbajul în care sunt exprimaţi algoritmii de rezolvare a acestora. Un limbaj defineşte obiecte şi mecanismele care permit crearea lor, acţiuni sau primitive (metode), care permit manipularea acestor obiecte şi reguli de compoziţie a acestor acţiuni. Altfel, orice limbaj defineşte, cel puţin conceptual, o "maşină" capabilă să interpreteze: setul de instrucţiuni al acestei maşini şi mulţimea primitivelor limbajului; memoria sa permite reprezentarea obiectelor definite de limbaj; mecanismul său de execuţie este cel definit de regulile de interpretare ale limbajului. Noţiunea de obiect Decompoziţia ierarhică în maşini abstracte, prezentată în 9.1.1, nu acoperă toate aspectele structurării sistemelor. În particular, pot apărea probleme atunci când unele situaţii sau elemente trebuiesc create ori distruse în mod dinamic, sau când vrem să descriem elemente, care posedă proprietăţi comune. Pentru a facilita luarea în consideraţie a acestor aspecte este introdus un nou instrument de structurare, numit obiect. Obiectele sunt caracterizate de o mulţime de proprietăţi şi mecanisme, această noţiune furnizând un cadru de exprimare comodă a unor concepte informatice diverse: desemnare, legare, tipuri, protecţie, etc. Un obiect este definit cu ajutorul următoarelor atribute: un nume, care permite desemnarea obiectului şi deosebirea lui de alte obiecte, o stare, care este definită în orice moment de timp şi poate evolua pe parcursul timpului, o mulţime de operaţii, funcţii de acces sau metode, care permit:

4. Interfeţe şi specificări Vom introduce noţiunea de interfaţă şi tehnicile utilizate pentru specificarea interfeţelor. Ne vom limita aici la interfeţele pentru care mecanismul de activare este apelarea. O interfaţă este asociată unei maşini abstracte sau unei clase de obiecte. Ea conţine doar trei tipuri de informaţii, accesibile utilizatorului maşinii sau obiectului: structuri de date, proceduri, o mulţime de reguli de utilizare a datelor şi a procedurilor. Regulile de utilizare constituie un mod de întrebuinţare a structurilor de date şi procedurilor. Ele exprimă restricţiile utilizării lor, şi pot lua diverse forme: 55

restricţii de accesare a datelor (numai citire, de exemplu), restricţii, legate de ordinea de execuţie a procedurilor, restricţii, care afectează execuţia simultană a procedurilor sau accesarea simultană a datelor. Problema formulării specificărilor unei interfeţe nu are încă o soluţie generală satisfăcătoare. Doar o parte a specificărilor poate fi exprimată in mod formal şi, deci, există posibilitatea unor validări automate: acestea sunt specificările tipurilor variabilelor şi a parametrilor procedurilor. Pentru a specifica efectul unui apel de procedură sunt utilizate două tipuri de tehnici: mecanismul pre- şi post-condiţiilor, echivalenţa cu o altă expresie a algoritmului procedurii. 5. Organizarea unui sistem mono-utilizator. Specificările şi organizarea generală Pentru a ilustra folosirea conceptului maşină ierarhică abstractă vom elabora un sistem de operare redus la forma cea mai primitivă (din considerente de simplitate). Trebuie proiectat un sistem minim, destinat să administreze un microcalculator individual, folosit de un singur utilizator (cum ar fi CP/M de la Digital Research). 6. Organizarea unui sistem mono-utilizator. Funcţiile sistemului. Limbajul de comandă Calculatorul administrat de sistemul nostru de operare constă dintr-un procesor, o memorie operativă şi următoarele echipamente periferice: un terminal (display şi tastatură), una sau două unităţi de dischetă, o imprimantă. Gestionarea perifericelor este asigurată de procesor (posibilitatea administrării prin ADM este propusă ca exerciţiu). Sistemul trebuie să permită: salvarea şi păstrarea informaţiilor în fişiere pe dischetă, transferarea informaţiilor între fişiere şi periferice, elaborarea, depanarea, salvarea şi executarea programelor. Este necesar ca structura sistemului de operare să permită adaptarea simplă la diferite configuraţii de calculatoare, în special, la diferite tipuri de memorie secundară şi echipamente periferice.

7. Organizarea unui sistem mono-utilizator. Decompoziţia sistemului. Interfeţe interne O primă versiune a sistemului de operare poate fi realizată utilizând direct interfaţa definită de maşina fizică. Vom arăta mai jos modul în care un sistem fizic monolit poate fi pas cu pas descompus pentru a ajunge la subansambluri logic coerente. 1) Gestionarea fişierelor şi a fluxurilor La prima etapă este necesar să izolăm componenta sistemului responsabilă de administrarea fişierelor. Pentru aceasta trebuie să precizăm structura fişierelor şi să specificăm funcţiile de acces. 2, Realizarea operaţiilor de intrare-ieşire

56

Realizarea maşinii SGF, care administrează fişierele şi fluxurile, poate de asemenea fi simplificată dacă avem la dispoziţie primitive de intrare-ieşire mai evoluate decât cele furnizate direct de maşina fizică. Vom defini o nouă maşină numită PIE (primitive intrări-ieşiri) cu următoarea interfaţă: 8. Organizarea unui sistem mono-utilizator. Primitive de intrare-ieşire Driverele dispozitivelor periferice urmează schema sincronă (v. 2.4.2.1). Vom descrie mai întâi administrarea unei unităţi de disc, apoi intrările-ieşirile în mod caracter. 9. Organizarea unui sistem mono-utilizator. Intrări-ieşiri pentru unitatea de disc Exemplul care urmează este pentru un disc cu un format particular, dischetă simplă densitate cu o singură suprafaţă de lucru. Principiul de parametrizare a sistemului în funcţie de formate va fi examinat mai târziu. Discheta are 77 piste de 27 sectoare fiecare; lungimea unui sector este de 128 octeţi. Sectorul este unitatea de transfer a informaţiei. Pentru a accelera transferurile secvenţiale, care-s mai frecvente, acestea sunt realizate printr-o zonă de memorie-tampon. La o operaţie de citire este recomandat să se citească o pistă întreagă, deoarece întârzierea introdusă de căutarea pistei intervine o singură dată pentru toată mulţimea sectoarelor. Din această cauză vor fi rezervate în permanenţă n zone-tampon de lungimea unei piste (27 sectoare de 128 caractere fiecare). Valoarea lui n de ordinul câtorva unităţi va fi fixată la generarea sistemului. Fie că este necesar să se citească un sector cu numărul nsect de pe pista np. Dacă unul din tampoane conţine pista np, citirea se va face fără a accesa discheta, din sectorul respectiv al zonei-tampon. În caz contrar, conţinutul pistei np va trebui încărcat în prealabil de pe dischetă în una din zonele-tampon. Alegerea zonei-tampon va fi tratată mai departe.

1. Organizarea unui sistem mono-utilizator. Introducere – extragere caractere În acest caz este utilizată schema sincronă de comandă descrisă în 2.4.2.1, pe care o vom relua pentru cazul scrierii unui simbol. Pentru a permite reasocierea perifericelor, adresa controlerului va fi specificată ca un parametru al driverului. procedura ieşire_car(c,p); transmite caracterul c controlerului p TEST(p); if nonpreg then endif; EXTRAGE(c,p); test: TEST(p);

57

if err then endif; if nonterm then go to test endif; O procedură analogică intrare_car(c,p) este definită pentru citire. Pentru realizarea schimburilor cu perifericele logice este definit un tabel de asociere cu trei intrări: tabel_perif[tastatură]=adresa controlerului asociat tastaturii logice tabel_perif[display]=adresa controlerului asociat ecranului logic tabel_perif[imprimantă]=adresa controlerului asociat imprimantei logice. 2. Organizarea unui sistem mono-utilizator. Sistemul de gestionare a fişierelor. Organizarea logică Pentru notarea unui fişier este utilizată o schemă pe două nivele, adică numele unui fişier este de forma :. Numele suportului identifică suportul fizic al fişierului, adică unitatea de disc utilizată şi este definit, de obicei, în mod implicit. În interiorul unei dischete schema de desemnare este “plată”; identificatorul tipului specifică natura fişierului (program translatabil, absolut, instrucţiuni, date, etc.). Fişierele sunt organizate secvenţial, sub forma unei suite de înregistări de lungime fixă (128 octeţi). Sistemul furnizează primitive de accesare secvenţială a înregistrărilor, specificate în 9.2.1.2. Orice funcţie de acces trebuie să fie construită plecând de le aceste primitive. 1.

Organizarea unui sistem mono-utilizator. Sistemul de gestionare a fişierelor. Organizarea fizică

În calitate de unitate de alocare sau bloc vom considera un set de 8 sectoare consecutive. Starea de alocare a dischetei este descrisă cu ajutorul unui tabel de ocupare, care conţine câte un bit pentru fiecare bloc (fie 250 biţi; în realitate un pic mai puţin, fiindcă primele două piste ale dischetei sunt rezervate în permanenţă). Găsirea unui bloc liber se reduce la găsirea primului bit egal cu 0 în acest tabel: numărul bitului este numărul blocului căutat. Datele despre un fişier sunt grupate într-un descriptor care conţine următoarele informaţii:  numele fişierului (.),  lungimea fişierului (numărul de înregistrări),  numărul înregistrării viitoare la citire sau scriere, tabelul implantării fişierului 2. Organizarea unui sistem mono-utilizator. Sistemul de gestionare a fişierelor. Operaţii cu fişierele Deschiderea unui fişier cere încărcarea descriptorului acestuia într-o zonă a memoriei centrale, rezervată în prealabil. Adresa acestui descriptor este transmisă ca parametru tuturor operaţiilor ulterioare asupra fişierului. La închiderea unui fişier deschis, descriptorul din memorie este recopiat pe disc şi locul lui este eliberat ca şi zona de memorie, ocupată de fişierul propriu-zis. Dacă rămân înregistrări modificate ale fişierului într-o zonă-tampon de I-E, ele la fel vor fi recopiate pe disc. Scrierea se face în mod imediat. Crearea unui fişier constă în alocarea unui descriptor (pe disc) acestui fişier; iniţial fişierul este vid şi tabelul său de implantare conţine doar zerouri. La distrugerea unui fişier vor fi eliberate toate unităţile de alocare ocupate de fişier, ca şi amplasamentul ocupat de către descriptorul acestuia. Catalogul şi tabelul de ocupare a discului sunt puşi la zi. 58

Vom descrie principiile de organizare a programelor de citire şi scriere secvenţială a unei înregistrări. Programele de creare, distrugere, deschidere şi închidere a unui fişier sunt propuse ca exerciţii. 3. Organizarea unui sistem mono-utilizator. Intrări-ieşiri logice şi gestiunea fluxurilor Trecem acum la realizarea operaţiilor pe perifericele logice (terminalul şi imprimanta). Pentru aceasta va fi utilizată interfaţa furnizată de PIE. Ieşirea pe imprimantă este foarte simplă: procedura scriere_linie(tampon); număr:= tampon[0]; for i:=1 to număr do imprimare_car(tampon[i]) endfor Procedura afişare_linie poate fi obţinută înlocuind imprimare_car prin afişare_car. Să ne amintim, că primul octet din tampon indică numărul de caractere pentru ieşire. Procedura citire_linie conţine unele funcţii de editare. Pentru aceasta unele caractere speciale înlocuiesc funcţii particulare: ŞTERGE_CAR : să fie şters ultimul caracter introdus ŞTERGE_LINIE : să fie ştearsă toată linia APELARE_SYS : întrerupere comandă curentă CR : terminare linie (retur car)

Organizarea unui sistem mono-utilizator. Interpretorul limbajului de comandă. Schema generală Schema generală a interpretorului limbajului de comandă poate fi reprezentată printr-o buclă infinită: iniţializare_sistem ciclu iniţializare_comandă citire comandă analizare comandă if comandă corectă then interpretare comandă: preparare mediu de execuţie lansare execuţie else diagnosticare eroare endif 4.

59

endciclu Comanda este citită într-un tampon de memorie cu ajutorul terminalului (logic) utilizând procedura cititre_linie, furnizată de interfaţa SGF. Analiza comenzii determină câmpurile distincte ale acesteia. Primul câmp este numele comenzii, mai departe urmează parametrii transmişi programului responsabil de interpretare. 5.

Organizarea unui sistem mono-utilizator. Interpretorul limbajului de comandă. Mediul de execuţie

Prima sarcină a unui interpretor, înainte de lansarea execuţiei unei comenzi, este de a pregăti mediul său, adică mulţimea obiectelor, care vor fi utilizate şi informaţiile, care vor permite accesarea obiectelor. În cazul executării unui program al utilizatorului acest mediu conţine (v.fig.9.3):  segmentele cu programul care trebuie executat şi datele acestuia,  stiva de execuţie,  o zonă de lucru de lungime fixă, numită “pagină de gardă”, care conţine:  pointeri, care punctează zonele cu segmentele program şi date, precum şi zona liberă,  descriptorii fişierelor, specificate în comandă,  un tampon destinat schimburilor cu fişierele.

Organizarea unui sistem mono-utilizator. Încărcarea unui program. Tratarea erorilor de execuţie  Deschiderea fişierului şi citirea antetului acestuia într-un tampon intern.  Determinarea dacă capacitatea memoriei disponibile permite încărcarea.  Crearea paginii de gardă în amplasamentul rezervat acestui efect.  Încărcarea segmentelor de cod şi de date în zonele indicate în antet; dacă are loc reimplantarea să se adauge adreselor realocate deplasarea necesară; să se pună la zi informaţiile, care descriu memoria disponibilă.  Iniţializarea stivei de execuţie şi plasarea în topul ei a unei adrese de retur în interpretorul limbajului de comandă.  Punerea la zi a pointerilor paginii de gardă; ordonanţarea în tamponul situat în această pagină a “cozii de comenzi”.  Deschiderea fişierelor (dacă există) numele cărora sunt specificate în comandă şi plasarea descriptorilor acestora în pagina de gardă.  Executarea unei ramificaţii spre punctul de intrare a segmentului de cod. Tratarea erorilor de execuţie 6.

60

Detectarea unei erori în cursul execuţiei provoacă un cod de eroare sau o deviere, chiar dacă ea a survenit sau nu în cursul executării unei primitive realizate prin intermediul unui apel al supervizorului. Pot fi evidenţiate două cazuri în dependenţă de gravitatea erorii: Eroare într-un program utilizator sau într-o componentă necritică a unui program de sistem, cum ar fi interpretorul limbajului de comandă. Exemplu: operaţie aritmetică care nu poate fi executată, memorie insuficientă pentru încărcarea unui program. Eroare în cursul unei operaţii critice, adică care pune în pericol integritatea datelor. Exemplu: eroare irecuperabilă la un transfer pe disc. 7.

Partajarea unei maşini: maşini virtuale

maşină virtuală, interfaţa căreia este identică cu interfaţa maşinii fizice partajate. O maşină virtuală nu există fizic în realitate, comportamentul ei fiind simulat pentru utilizator de către un program al sistemului de operare, care este executat pe maşina fizică. Modul obişnuit de partajare este multiplexarea, care constă în alocarea maşinii fizice utilizatorilor pentru tranşe succesive de timp, urmând principiul prezentat în 2.3.2.3 pentru gestionarea lucrărilor în timp partajat. Identitatea interfeţelor maşinii virtuale şi maşinii fizice poate fi doar aproximativă. Două observaţii, legate de aceasta, pot fi făcute: 1) Partajarea prin multiplexare provoacă o cădere a performanţelor maşinilor virtuale, cu atât mai substanţială cu cât mai mare este numărul utilizatorilor. 2) Punerea la dispoziţia utilizatorilor a tuturor resurselor unei maşini fizice ridică probleme delicate legate de protecţie atunci când se vorbeşte despre resursele care pot pune în pericol integritatea sistemului. Acesta este, de exemplu, cazul instrucţiunilor privilegiate. Iată din care cauză interfaţa unei maşini virtuale este cel mai des o submulţime a interfeţei maşinii fizice partajate, fiind excluse instrucţiunile privilegiate şi accesul direct la periferice sau la unele zone ale memoriei fizice. Unele sisteme realizează, totuşi, maşini virtuale complete.

8.

STRUCTURA SISTEMELOR MULTITASKING. Sistem cu partiţia memoriei. Specificaţii

9. Sistem cu partiţia memoriei. Organizarea sistemului 10. Sistem cu memorie virtuală. Organizare generală 11. Exemplu de elaborare a unui sistem de operare multitasking. Încărcarea sarcinii. În modul real avem 640 Ko de memorie operativă – 10 segmente a câte 64 Ko fiecare. Două segmente sunt rezervate sistemului de operare (unul pentru nucleu şi altul pentru variabilele sistemului), adică pentru lucrări rămân 8 segmente. Pentru simplitate vom presupune că fiecare lucrare a sistemului nostru este un fişier de tipul COM din DOS. Programele de tipul COM conţin un singur segment (sau cel puţin nu conţin referinţe explicite la alte segmente). Un fişier COM este citit de pe disc şi adus în memoria operativă începând cu PSP:0100. Programele de tipul COM pot utiliza mai multe segmente, dar în acest caz vor calcula singure adresele segmentelor, folosind PSP în calitate de bază. Programele COM au unele avantaje faţă de programele EXE atunci când sunt preconizate pentru utilite mici, scrise în limbajul de asamblare. Ele se încarcă mai repede, deoarece nu este necesară 61

deplasarea segmentelor, ocupă mai puţin loc pe disc, din cauza lipsei în modulul absolut a antetului EXE şi a segmentului de stivă. 12. Comutarea lucrărilor. Structura descriptorului lucrării. Presupunem, că fiecare program COM ocupă un segment în memorie, ceea ce poate fi ilustrat ca în figura 9.5: 0000H PSP

0100H

FFFFH FFFE Stiva

Programul

Fig.9.5. Structura unui program COM Pentru comutarea lucrării curente vom utiliza întreruperea 08h. Este cunoscut, că timer-ul trimite procesorului cu o frecvenţa de 18.2 Hz o întrerupere hardware şi procesorul îndeplineşte procedura asociată întreruperii a opta (int 08h), dacă aceasta este armată. În stivă sunt păstrate registrul indicatorilor (flagurilor, PUSHF) şi registrele care indică instrucţiunea curentă ((CS:IP) PUSH CS, PUSH IP), în total 6 octeţi. După terminarea prelucrării întreruperii hardware, aceste registre sunt restabilite şi continuă executarea programului principal. Problema noastră va fi rezolvată dacă în timpul tratării întreruperii vom înlocui stiva astfel încât atunci când registrele vor fi restabilite să fie executat un alt program, aflat în memorie Structura descriptorului lucrarii În modul real memoria operativă conţine 10 segmente fizice, fiecare segment având capacitatea de 64 Ko (640Ko/64Ko), însă doar 8 lucrări pot pretinde regimul multitasking, deoarece două segmente sunt ocupate de sistemul de operare (unul pentru nucleu şi altul pentru variabilele sistemului). Pentru fiecare dintre cele 8 lucrări şi pentru nucleu va fi folosită următoarea structură task8 DB ? ;¦ char id; (255 - no task) DD ? ;¦ void far * pointer; DW 255 DUP(?) ;- unsigned int stack[255]; } în care id este identificatorul lucrării: numărul lucrării, dacă lucrarea este încărcată, 255, dacă lucrarea nu este încărcată, 254, dacă procesorul a fost retras (starea eligibilă a lucrării, suspendare). pointer – punctul de intrare în program. stack[255] – aici vom păstra la comutare unele registre ale lucrării, de asemenea tot aici va fi păstrat indicatorul stivei lucrării, în care sunt salvate celelalte registre şi, la necesitate, alte informaţii.

13. Preluarea întreruperii 08h. Instalarea procedurii noi de tratare În DOS redefinirea unei întreruperi standard are loc în felul următor: obţinerea adresei procedurii standard de tratare, instalarea procedurii de tratare noi, executarea programului, restaurarea procedurii de tratare standard. Obţinerea adresei procedurii de tratare standard este bazată pe următoarele. Tabelul vectorilor întreruperilor se află în spaţiul de adrese începând cu 0000:0000 şi are 256 elemente (după numărul de întreruperi). Fiecare element al tabelului este un vector de 4 octeţi, care conţin adresa procedurii de tratare standard a întreruperii. Pentru obţinerea adresei procedurii de tratare standard poate fi utilizată funcţia MS DOS 35h – preluare vector întrerupere: 14. Încărcarea lucrării. Comutarea lucrării. Trecerea lucrării în starea eligibil. Este necesar să fie cunoscută structura TTASK. Unele comentarii pot fi găsite chiar în textul programului. doStart8: mov al,[tasknum] 62

inc al mov [tasknum],al Mărim numărul de lucrări mov [cs:di],al ; Salvăm punctul de intrare în descriptorul lucrărilor mov [Word Ptr cs:di+1],100h mov [cs:di+3],es Salvăm punctul de intrare în descriptorul lucrărilor ES:100h Comutarea lucrării Programele COM sub MS DOS pot fi terminate prin: a) int 20h b) mov ah,4Ch int 21h sau c) ret Trecerea lucrării în starea eligibil Trecerea unei lucrări în starea eligibil (retragerea temporară a procesorului) se va produce prin înscrierea valorii 254 în identificatorul (id) ei. doStop3: call _di mov al,254 mov [cs:di],al mov dx,[cs:di+3] call _ei ret

15. Crearea discului de încărcare Datele sectorului 1 al pistei 0, dispozitivul de citire-scriere 0 şi suportul de disc 0, pentru primul disc, care a răspuns (dischetă sau harddisc) sunt încărcate la adresa absolută 0000:7c00, iar controlul va fi transmis la această adresă. Dacă consultarea tuturor discurilor a fost fără succes, controlul este transmis întreruperii INT 18H. Pentru un harddisc, acest cod din „sectorul rădăcină” determină în realitate compartimentul activ al discului, după care încarcă şi execută sectorul rădăcină al acestui compartiment. Prin acesta controlul este transmis sistemului de operare activ al discului. Problema este să fie elaborată o procedură, care va începe lucrul de la adresa CS:07C00h şi care va încărca sistemul de operare. Pentru simplitate vom presupune că nucleul sistemului de operare este primul fişier nefragmentat pe dischetă cu dimensiunea mai mică sau egală cu 64 Ko. Primul fişier pe o dischetă de 1.44 Mo se află în sectorul 33. (Dacă ar exista o procedură de citire a unui sector (de tipul int 25h) nu ar fi probleme mari cu încărcarea din boot.) 16. SISTEME DE OPERARE DE REŢEA. Structura sistemelor de operare de reţea Un SO de reţea este baza oricărei reţele de calculatoare. Fiecare calculator din reţea este în mare măsură autonom din care cauză prin conceptul de sistem de operare de reţea în sens larg înţelegem totalitatea sistemelor de operare ale calculatoarelor, care formează reţeaua şi care interacţionează în scopul schimbului de mesaje şi partajării resurselor conform unor reguli unice, 63

numite protocoale. În sens îngust, un sistem de operare de reţea este considerat sistemul unui calculator distinct, care asigură calculatorului posibilitatea lucrului în reţea. Administrarea resurselor locale (Sistemul de operare local) Partea Server

Partea Client

Mecanismele, care pun la dispoziţia altor calculatoare resursele proprii

Mecanismele de accesare a resurselor şi serviciilor altor calculatoare

Mediul sistemului de operare

Componetele comunicaţionale Spre reţea

Fig. 10.1. Structura sistemului de operare de reţea

17. Tipuri de sisteme de operare de reţea Dacă un calculator pune la dipoziţia altor utilizatori din reţea serviciile sale, acesta joacă rol de server. Calculatorulu, care beneficiază de serviciile serverului se numeşte în acest caz client. Un calculator în reţea poate îndeplini ambele funcţii în acelaşi timp. Dacă îndeplinirea unor funcţii de server este destinaţia principală a calculatorului (de exemplu, organizarea folosirii în comun a fişierelor, a faxului, a imprimantei, sau asigurarea posibilităţii de lansare a aplicaţiilor la distanţă) acesta se va numi server dedicat. În dependenţă de tipul resursei partajate serverul se numeşte file-server, fax-server, print-server, server de aplicaţii, etc. Evident, este de dorit ca pe serverele dedicate să fie instalate sisteme de operare optimizate special pentru îndeplinirea funcţiilor de server specifice. Din această cauză în reţelele de calculatoare cu servere dedicate sunt de obicei utilizate sisteme de operare în componenţa cărora intră mai multe variante, care diferă prin posibilităţile părţii server. 18. Sisteme de operare pentru grupuri de lucru şi pentru reţele corporative Sisteme de operare de rețea au proprietati diferite, în funcție de faptul dacă acestea sunt destinate pentru rețele grup de lucru (diviziune) rețelele de campus scară sau rețele de întreprinderi. • Departamentele de rețea - sunt utilizate de către un mic grup de angajați, rezolvarea sarcinilor comune. Scopul principal al plăcii de rețea este o divizie a resurselor locale, cum ar fi aplicații, date, imprimante laser și modemuri. De obicei, departamente de rețea nu sunt împărțite în subrețele. • rețea campus - conecta mai multe rețele de departamente într-o singură clădire sau în aceeași incintă. Aceste rețele sunt încă rețele locale, deși acestea pot acoperi o suprafață de câțiva kilometri pătrați. Serviciile includ o interconectare de rețea între departamente, acces la bazele de 64

date ale companiilor, acces la fax servere, modemuri de mare viteză și imprimante de mare viteză. • Rețeaua Enterprise (rețele corporative) - conectați toate calculatoarele din zonele individuale ale companiei. Acestea pot acoperi un oraș, o regiune sau continent. În astfel de rețele, utilizatorii au acces la informații și aplicații în alte grupuri de lucru, alte departamente, birouri și sediul central.

65

More Documents from "Ana Toma"

Examen-somipp
March 2021 0
Jhon Xepoleas
February 2021 1
February 2021 0