Sunteți pe pagina 1din 76

Noiuni de baz i clasificri

Un calculator const dintr-un ansamblu de componente funcionale fizice i logice, care coopereaz pentru a
satisface cerinele utilizatorilor privind introducerea, stocarea, prelucrarea, transmisia i cutarea informaiilor.
Aceste componente funcionale sunt structurate pe niveluri, care interacioneaz prin interfee bine definite.
Suportul fizic (resurse tehnice, hardware) constituie nivelul inferior al sistemului de calcul construit pe baza unor
componente electronice, magnetice, optice, mecanice etc., mai mult sau mai puin sofisticate n funcie de stadiul de
dezvoltare a tehnologiilor respective.

Noiuni i termeni din domeniul resurselor tehnice


funciile de baz ale unui calculator. Pot fi evideniate cinci funcii eseniale [2]: iniializarea (bootup),
introducerea datelor, procesarea datelor, stocarea datelor i extragerea rezultatelor:
Iniializarea implic testarea prilor importante ale calculatorului, rularea fiierelor de pornire i ncrcarea
altor fiiere necesare, cum ar fi driverele de dispozitive;
Introducerea reprezint transferul datelor dintr-o surs extern n calculator. Surse externe pot fi dischetele,
tastatura, mouse-ul etc.;
Procesarea se refer la manipularea datelor introduse n scopul producerii unui rezultat (ieirea);
Stocarea constituie procesul salvrii informaiilor (date sau programe) ntr-un dispozitiv de pstrare, de
exemplu discul fix, pentru recuperarea ulterioar.
Prin structura unui calculator vom nelege componentele (dispozitivele) care formeaz calculatorul i legturile
dintre ele. Componentele principale sunt: procesorul, memoria, unitile de stocare pe termen lung, dispozitivele de
intrare-ieire (tastatura, display-ul, mouse-ul etc.).
Procesorul i memoria operativ formeaz nucleul calculatorului, toate celelalte dispozitive fiind cunoscute sub
denumirea de periferie (dispozitive periferice).
Mrimea magistralei interne de date - procesoarele pstreaz datele n locaii speciale, numite registre. Datele
sunt transferate ntre registre, CU, ALU i alte componente ale procesorului prin intermediul unei magistrale
realizate n circuitele procesorului. Numrul de linii n aceast magistral ofer o msur a cantitii de date pe care
procesorul o poate transfera ntr-o singur operaie. Valoarea ei poate varia ntre 8 i 32 de bii (n scopuri speciale
64, 128 sau chiar mai mult).
Mrimea magistralei externe de date msoar cte date pot fi transferate ntre procesor i dispozitivele
periferice ntr-o singur operaie. Magistrala este un sistem de conectri i cablri ce distribuie datele prin calculator.
Cu ct magistrala de date e mai mare, cu att performanele calculatorului se mbuntesc. Numrul de linii i aici
variaz ntre 8 i 32 de bii.
Mrimea adresei de memorie determin volumul de memorie care poate fi gestionat de calculator fr eforturi
speciale. Prin eforturi speciale nelegem resurse fizice sau logice, care permit gestionarea unei memorii cu
capacitate mai mare dect volumul obinut prin calcularea adresei reieind din numrul de linii fizice ale memoriei.
Un ceas electronic asigur coordonarea corespunztoare a numeroaselor elemente ale calculatorului.
Componentele calculatoarelor cu performane superioare pot opera la frecvene de ceas mai mari. Frecvena
ceasului indic viteza de operare a CPU i se msoar n milioane de impulsuri de ceas pe secund, adic n
megahertzi (MHz).

Noiuni i termeni din domeniul sistemelor de operare


Un sistem de operare este un ansamblu de programe de control i de serviciu care ghideaz un calculator n
executarea sarcinilor sale i asist programele de aplicaie i utilizatorul prin intermediul anumitor funciuni. Natura
funciilor i modul n care acestea sunt realizate determin atributele care caracterizeaz un sistem de operare:
timpul de rspuns, simultaneitatea utilizrii, eficiena, partajarea i protecia, generalitatea, flexibilitatea,
extensibilitatea, fiabilitatea i disponibilitatea, transparena i vizibilitatea [3].
Timpul de rspuns exprim durata intervalului delimitat de lansarea unei cereri de serviciu i achitarea acesteia
de ctre sistem. Are dou componente: timpul de ateptare pentru ca cererea respectiv s fie luat n consideraie i
timpul de execuie a acestei cereri.
Simultaneitatea utilizrii msoar gradul n care un sistem poate s execute n acelai timp mai multe lucrri.
Eficiena msoar proprietatea unui sistem de a folosi n mod optim resursele de care dispune.
Partajarea i protecia caracterizeaz nivelul la care utilizatorii au posibilitatea s utilizeze n comun informaia
prezent n sistem i nivelul la care pot s comunice ntre ei, n deplin siguran (n sensul evitrii accesului
neautorizat i/sau alterrii intenionate sau accidentale a informaiei).

Generalitatea, flexibilitatea, extensibilitatea msoar gradul n care un sistem poate fi folositor i adaptabil
unui context specific (exprimat prin nivelul de limitare impus programelor utilizatorului), precum i gradul n care
se pot include n sistem noi componente hardware i software fr eforturi de proiectare i programare suplimentare.
Fiabilitatea i disponibilitatea exprim proprietatea unui sistem de a cdea foarte rar n pan i de a evita goluri
n funcionare din cauza defectrii uneia sau mai multor componente ale sale.
Transparena i vizibilitatea exprim pe de o parte proprietatea unui sistem de a face invizibil utilizatorului
ceea ce se afl sub interfaa de utilizare care i se ofer i, pe de alt parte, capacitatea de a permite utilizatorilor si
s obin anumite informaii despre modul cum el lucreaz, informaii de care n mod teoretic ei nu au nevoie pentru
a beneficia de o utilizare complet, ns care ar putea s-i ajute la obinerea unei utilizri mai eficiente [3].
Resursele program reprezint seturi de programe i date utilizate pentru soluionarea anumitor probleme.
Programul este transcrierea ntr-un limbaj de programare a unui algoritm, altfel programul este o secven de
instruciuni sau simplu cod. Utilizatorul (user) este oricare doritor s ndeplineasc anumite lucrri la calculator.
Prin lucrare (sarcin, task) vom nelege un set de aciuni, necesare pentru ndeplinirea unui lucru anume. Sarcina
poate conine mai muli pai. Pai de task sunt uniti de lucru, care vor fi ndeplinite consecutiv, de exemplu trei
pai compilare, ncrcare i executare. Primind un task de la utilizator, sistemul de operare poate crea cteva
procese. Deci, procesul sunt calcule care pot fi efectuate paralel cu alte calcule.
User
Creat de utilizator sau
de mediul integrat
Task
Creat de sistem
Pas de task

Proces
Componente
standard ale
sistemului de
operare

Pas de task

. . . . .

Proces

. . . . .

Regulator

Regulator I/O

Planificator

Planificator I/O

...

Sistem de fiiere

Sistem de fiiere

...

Program de iniiere

Program Main
Componente
definite de utilizator

I/O
Subprogram A
Subprogram B
...

Spaiu de adresare (procesCPU)

Bufere date

...
Spaiu de adresare (proces I/O)

Fig.1.3. Relaia dintre utilizator, sarcin, pas de task, proces i spaiu de adrese
Procesul mai poate fi definit drept traiectoria procesorului, atunci cnd ultimul ndeplinete un set oarecare de
programe. Ansamblul programelor i datelor accesate n timpul procesului, formeaz spaiul de adrese. Fig.1.3
conine dou exemple de spaii de adresare unul pentru procesul de intrare/ieire (input/output, I/O) i altul pentru
procesul unitii centrale.
Una din destinaiile sistemului de operare este de a asigura proiectarea spaiului de adresare a unui proces n
memoria fizic. Pentru rezolvarea acestei probleme sunt utilizate att resurse tehnice (sisteme cu organizarea
memoriei pe segmente sau pe pagini), ct i resurse program speciale.
Multiprogramarea este un termen utilizat n cazul unui sistem n care pot exista simultan cteva procese n
stare de execuie. Un proces se consider n stare de execuie, dac calculele au nceput, dar la momentul considerat
nu au fost terminate sau ntrerupte (terminare din cauza unei erori sau din alte motive). Nu este obligatoriu ca un
proces care se afl n starea de execuie s fie i executat de procesor la un moment dat.
Resursele hardware de protecie sunt utilizate cel mai des pentru controlul accesrii memoriei. Resursele
hardware de ntrerupere permit sistemului de operare s coordoneze operaiile simultane; pot fi utilizate i pentru a
schimba ordinea de execuie a programelor. ntreruperea este un mecanism care impune procesorul s observe
anumite evenimente. Pot exista mecanisme care permit s nu se acorde atenie unei anume ntreruperi ntrerupere
mascat.

Tipuri de sisteme de operare, obiective i funcii


pot fi evideniate sisteme de operare [3]:
secveniale
cu multiprogramare
cu prelucrare multipl
n timp real, etc.
Un sistem secvenial (tratare pe loturi, engl. batch processing, fr. traitement par lots) execut la un moment dat
un singur program, care trebuie terminat nainte de a lua ncepe execuia unui alt program.
Sistemele cu multiprogramare accept la un moment dat mai multe programe n memoria central, acestea
aflndu-se n diferite stadii de execuie.
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 funcioneaz, 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.
La capitolul obiective vom aminti, n primul rnd, de maximizarea eficienei sistemului de calcul i a satisfaciei
utilizatorilor. Tot la acest capitol poate fi trecut i cererea de minimizare a posibilitii de apariie a unor erori i de
maximizare a transparenei sistemului de operare, garantarea securitii datelor, optimizarea controlului
comunicaiilor n cazul unei reele de calculatoare.
Un obiectiv foarte important este necesitatea de minimizare a efortului concepie - realizare a sistemului, ultim n
enumerare, dar poate cel mai important pentru specialiti.
Toate aceste obiective sunt consecine ale dezideratului principal: un sistem de operare este destinat s
administreze resursele fizice i logice ale sistemului de calcul i anume, memoria, procesorul (procesoarele),
dispozitivele periferice i informaia.
Un sistem de operare este obligat:
s pstreze informaia despre starea fiecrei resurse,
s ia decizia crui proces s i se aloce resursa, n ce cantitate, cnd, cum i unde,
s aloce resursa i, la momentul oportun, s o retrag.

Exemple de sisteme de operare


Cazul calculatoarelor personale
Configuraie a unui calculator personal (PC) include o unitate central, o memorie principal, un display, o
tastatur i un mouse. Aceast configuraie, de regul, este completat de o memorie secundar i o imprimant.
Utilizatorul unui astfel de sistem va cere minimum urmtoarele dou tipuri de servicii:
identificarea i crearea unor fiiere sau mulimi structurate de informaii; stocarea acestor fiiere n
memoria secundar; transferarea informaiilor ntre fiiere i dispozitivele de intrare/ieire;
execuia unor programe existente sau introduse sub form de fiiere n PC; introducerea datelor necesare
pentru execuia programului (de la tastatur, dintr-un fiier sau de la alte surse periferice); listarea rezultatelor la
display, imprimant sau copierea lor ntr-un fiier.
Sistemul de operare va acorda aceste servicii prin intermediul unui limbaj special, numit limbaj de comand,
introducndu-se de la tastatur instruciuni de forma <aciune> <parametri> sau utiliznd mouse-ul i o interfa
grafic a utilizatorului, acionrile mouse-lui fiind imediat interpretate de sistem.
Pentru acest tip de sisteme cele mai importante caracteristici sunt:

fiabilitatea;

eficacitatea;

simplitatea utilizrii;

facilitatea extensibilitii.
Gestionarea unor procese industriale
Procesul de producere este comandat de un calculator care ndeplinete urmtoarele funcii:
Reglare. Pentru o derulare bun a procesului de fabricaie parametrii de funcionare (temperatura,
presiunea, concentraia, etc.) trebuie s se afle ntr-o plaj de valori predefinite. Pentru aceasta va fi acionat
debitul de intrare a materiilor prime A sau B. Parametrii de funcionare sunt msurai cu ajutorul unor

captoare. Calculatorul preia aceste msurri i, n dependen de algoritmul de comand, acioneaz


robinetele de intrare.
nregistrare. Rezultatele msurrilor sunt periodic nregistrate; valorile lor sunt afiate pe un tablou de bord
i recopiate ntr-un fiier ("jurnal de bord") n scopul unor prelucrri ulterioare (date statistice).
Securitate. n cazul n care unul dintre parametrii msurai depete o valoare critic predefinit reactorul
trebuie oprit imediat.

Funciile principale ale sistemului de operare sunt:


acionarea organelor externe (citirea semnalelor captoarelor, comanda robinetelor);
evidena timpului real (declanarea periodic a ciclului de calculare a semnalelor de comand);
reacia la evenimentele exterioare (oprire de urgen);
gestiunea informaiilor (pstrarea i ntreinerea fiierului jurnalului de bord).
Sisteme de operare n timp real
Proiectarea sistemelor de operare de timp real este mult mai complicat dect proiectarea sistemelor de operare
clasice datorit numeroaselor condiionri ce trebuie rezolvate n timpul execuiei (engl., runtime) i care impun
schimbarea n mod dinamic a comportrii unui element de execuie (proces, task, thread).
O definiie simplist a software-ului de timp real ar fi: este acel software care trebuie s opereze n cadrul unor
constrngeri specifice de timp.
Sisteme tranzacionale
Caracteristicile principale:
sistemul gestioneaz un set de informaii sau baze de date, care pot atinge volume importante de informaie;
asupra acestor informaii pot fi executate un anumit numr de operaii predefinite sau tranzacii, adesea interactive;
sistemul este dotat cu un mare numr de puncte de acces i un mare numr de tranzacii se pot derula simultan.
Restriciile sunt n primul rnd legate de integritatea i coerena intern a informaiilor, care formeaz bazele de date.
Aceste restricii depind, evident de aplicaie.
Sisteme n timp partajat
Destinaia principal a unor astfel de sisteme este furnizarea serviciilor necesare unei mulimi de utilizatori,
fiecare dintre ei beneficiind:
de servicii echivalente serviciilor unui calculator individual;
de servicii legate de existena unei comuniti de utilizatori: partajarea informaiilor, comunicaii ntre
utilizatori.
Problemele care apar datorit conceptului de partajare a timpului sunt o combinaie a problemelor existente n
cazul unui calculator individual cu cele din sistemele tranzacionale i pot fi clasificate dup cum urmeaz:
definirea mainii virtuale oferite fiecrui utilizator;
partajarea i alocarea resurselor fizice comune: procesoare, memorii, organe de comunicaie;
gestionarea informaiilor partajate i a comunicaiilor

Sistemul de operare i procesele


Noiunea de proces este asociat conceptului de lucrare i poate fi definit ca o suit temporal de execuii de
instruciuni, considerat ca fiind o entitate de baz n descrierea sau analiza funcionrii unui sistem.
Orice utilizare a unei resurse este asociat, la un moment dat, unui proces i procesul respectiv i asum
rspunderea de utilizare a acestei resurse.
Procesul 1
Procesul 2
Procesul 3
Sistemul
de operare
Fig.1.6. Trei procese ntr-un sistem cu multiprogramare
Vom evidenia trei stri elementare ale unui proces: proces ales (sau exe) procesului i s-a alocat un procesor,
este n curs de execuie, proces blocat procesul ateapt s se produc un anumit eveniment, a crui apariie este
indispensabil, proces eligibil procesul are la dispoziie toate resursele necesare lips fiind doar procesorul, adic

este pregtit s se execute din momentul alocrii unitii centrale. Sistemul de operare este acea component, care va
ghida procesul prin toate aceste stri

Main ierarhic i main extins


Setul de instruciuni realizat hardware mpreun cu instruciunile suplimentare ale sistemului de operare
formeaz sistemul de comenzi al mainii extinse. n fig.1.10. este reprezentat (n mod grafic) conceptul de main
extins.
Procesul 1

Procesul 2
Maina extins

Programele
Maina goal

utilizatorului
(procese)
Sistemul de operare
Procesul 4

Procesul 3

Fig.1.9. Maina extins


Nucleul sistemului de operare va fi executat pe maina goal, iar programele utilizatorului pe maina extins.
Primele sisteme de operare erau formate dintr-un singur program mare. Dar, odat cu sporirea complexitii
sistemelor, aceast abordare liniar conducea la dificulti serioase i s-a propus s se utilizeze i n acest domeniu
conceptul de main extins. Acest concept, n cazul sistemelor de operare, poate fi utilizat n dou nivele (fig.1.10.)
i conduce la noiunea de main ierarhic :
Primul nivel - funciile cheie, utilizate de majoritatea modulelor de sistem, pot fi realizate n cadrul unei maini
extinse interne i
Nivelul doi - unele module pot fi executate n cadrul unei maini extinse externe, analogic proceselor
utilizatorului.
Componente ale S.O.
Sistemul de operare

Sistemul de operare

Procesul A

Procesul B

Procesul 1

Procesul 2
Maina extins extern
Maina extins
intern

Maina
goal

Programele
utilizatorului
(procese)

Funcii cheie ale


S.O.
Procesul 4

Alte funcii
ale S.O.

Fig.1.10. Ilustrarea conceptului de main ierarhic

Procesul 3

Taskuri

Planificator taskuri

Procesul 2
Procesul 1

Procesul 3

I/O de sistem

Procese de I/O care


deservesc procesul 3 al
utilizatorului

Proces creat
de utilizator

Stratul 2

Proces de I/O
Nivelul 5
Stratul 1
Nivelul 4
Nivelul 3
Nivelul 2

Stratul 0

Nivelul
1
Maina
goal
Administrare
procesoare (P,V),
planificare procese
Administrare memorie
Administrare procesoare (nivel
superior, mesaje, creare i distrugere
procese)
Administrare dispozitive
Administrare informaie

Fig.1.11. Structura ierarhic a sistemului de operare

Alte puncte de vedere asupra sistemelor de operare


Sistemele de operare pot fi abordate din diferite puncte de vedere, cum ar fi SO i procesele,
SO i maina extins sau SO i maina ierarhic. Exist i alte puncte de vedere asupra
sistemelor de operare pe care un specialist ar trebui s le cunoasc.
Abordare funcional
Pentru un utilizator obinuit, convins c un calculator este doar un instrument care l ajut n
soluionarea unor probleme din domeniul su de activitate, noiunile, cum ar fi administrarea
memoriei cu paginaie sau driverele dispozitivelor, nu semnific prea multe. Destinaia
principal a unui sistem de operare pentru aceast categorie de utilizatori este punerea la
dispoziie a unui set de programe care l-ar ajuta n formularea i soluionare problemelor
concrete ce in de domeniul su de activitate.
Abordare din punctul de vedere al interfeei cu utilizatorul
Progresul n acest domeniu este spectaculos, dac vom lua n consideraie c n primele sisteme de operare
utilizatorul era obligat s indice n mod explicit i manual (n regim textual) fiecare pas, orict de nesemnificativ ar
fi prut. Formularea pailor cu ajutorul unui limbaj specializat, cum ar fi Job Control Language (JCL), nu a schimbat
substanial situaia. Conform JCL utilizatorul trebuie s ncorporeze programul propriu ntr-un set de instruciuni,
care indicau nceputul, sfritul programului i al datelor de intrare, paii i coninutul concret al pailor. JCL n

principiu era un metalimbaj de programare (programare la nivel macro). Pentru mijloacele tehnice de la acea
perioad JCL a sporit substanial eficiena sistemelor de calcul, dei au existat multe inconveniente, principalul fiind
lipsa posibilitii lucrului interactiv.
Un sistem de operare nu este, n principiu, obligat s posede o interfa sofisticat, totul este determinat de baza
tehnic utilizat i de necesitile concrete. Oricum, un specialist trebuie s disting aceste dou noiuni sistemul
de operare i interfaa utilizatorului.

EVOLUIA SISTEMELOR DE OPERARE


Primele sisteme erau caracterizate prin prelucrarea secvenial a taskurilor. Timpul de execuie a programelor
era relativ mare, instrumentele de depanare primitive, fiecare programator i ncrca n mod individual programul
(pachetul de cartele perforate), apsa butoane, controla coninutul locaiunilor de memorie, etc. (1950 1956).
Nu putea fi tolerat situaia ca un calculator s nu fac nimic, atunci cnd utilizatorul i ncarc n mod
manual programul. Au fost propuse programe de monitorizare (monitoare), care treceau de la o lucrare la alta n
mod automat, utilizatorul fiind responsabil de organizarea corect a programelor n cadrul unui pachet primele
ncercri de prelucrare pe loturi (1956 1959).
Au fost propuse sisteme supervizoare (executive), care se aflau n memoria calculatorului n mod constant i
acordau utilizatorilor servicii n gestiunea operaiilor de intrare/ieire (1959 1963). n aceste sisteme mai erau
realizate i o serie de faciliti noi, cum ar fi controlul unor posibile ncercri din partea programului de a nclca
restriciile existente n sistem, culegerea informaiilor de eviden, etc.
Au urmat apoi sistemele cu multiprogramare, menite la nceput s rezolve problema concordrii vitezei de
calcul a unitii centrale i a perifericelor. Drept consecin, au aprut o mulime de limbaje de control a lucrrilor, a
fost realizat o standardizare substanial a operaiilor de intrare-ieire.
Dup 1965 au aprut primele sisteme cu partajare a timpului (time sharing), au fost propuse sisteme sofisticate
de administrare a informaiei (sisteme de gestiune a datelor sau sisteme de fiiere, File Systems).
Memoria virtual i mainile virtuale sunt nite principii care nici pn astzi nu au fost exploatate pn la
capt. 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. Specificaiile sistemelor de operare au fost n
mare msur standardizate, diversitatea SO devine tot mai mic, muli specialiti exprimndu-i ngrijorarea de o
posibil monopolizare a domeniului n viitorul apropiat.

De la "poart deschis " la tratarea pe loturi


Primele calculatoare nu dispuneau de sisteme de operare. Fiecrui utilizator i se rezerva pentru un timp
determinat calculatorul cu toate resursele acestuia. Interaciunea era direct, programul i datele fiind introduse n
mod manual sub form de zerouri i uniti. Utilitele care au aprut aveau destinaia de a asista elaborarea
programelor (asambloare, compilatoare, etc.) sau de a facilitata operaiile de intrare-ieire.
Acest mod de exploatare, numit "poart deschis" [6], era de o eficacitate minim, dispozitive foarte costisitoare
fiind utilizate ineficient. Din aceast cauz la sfritul anilor '50 au aprut primele "monitoare de nlnuire" programe care permiteau executarea secvenial a unui set de lucrri, pregtite anticipat, trecerea de la o lucrare la
alta fiind automatizat.
Funcia principal a unui atare sistem era gestiunea resurselor: memoria, procesorul, intrarea-ieirea.
Automatismul acestei gestionri implic o funcie de protecie a setului de lucrri contra unor riscuri perturbatorii in
caz de eroare:
limitarea timpului de ocupare a procesorului pentru a evita blocarea sistemului atunci cnd un program
conine o bucl infinit;
administrarea corect a intrrilor-ieirilor pentru a evita buclele n utilizarea perifericelor;
protecia zonei de memorie rezervate monitorului pentru a mpiedica modificarea accidental a acestuia.

Multiprogramarea i partajarea timpului


Progresul tehnologic i conceptual al anilor '60 - '70 a permis excluderea unor limitri caracteristice sistemelor
de prelucrare pe loturi. Astfel, au fost introduse procesoare specializate pentru operaiile de intrare-ieire (unitile
de schimb sau canalele), care permiteau eliberarea procesorului central de gestionarea dispozitivelor de intrareieire. Utilizarea principiului multiprogramrii sau partajarea memoriei ntre mai muli utilizatori a permis o utilizare
i mai bun a procesorului central. Exploatarea unui calculator conform principiului timpului partajat ofer
utilizatorilor posibiliti analogice unui calculator individual, permind beneficiul unor servicii comune la un pre
redus.

Organizarea intrrilor - ieirilor n memorii tampon


Un canal este un procesor specializat n executarea autonom a operaiilor de intrare-ieire, paralel cu procesul
de prelucrare a informaiilorPentru excluderea influenei perifericelor asupra vitezei de lucru a sistemului de calcul
s-a propus s se pstreze n memorie n anumite zone tampon datele de intrare (care vor fi utilizate la necesitate) i
rezultatele (care vor fi imprimate n mod autonom) mai multor lucrri. Aceast situaie este prezentat n fig.1.12.
Debit
nalt

Lucrri
la intrare

Debit

Intrr

Debit

Prelucrarea informaiilor

mic

Rezultat
e la ieire

Ieire

mic

Fig.1.12. Buferizarea intrrilor-ieirilor

Pentru a exclude utilizarea ineficient a memoriei operative prin formarea zonelor-tampon, acestea erau
organizate n memoria secundar de capacitate nalt, transferurile ntre aceste dou nivele ale memorie fiind de
asemenea comandate de un canal.
Dei utilizarea memoriilor tampon prezint o serie de avantaje n vederea sporirii randamentului dispozitivelor
calculatorului, totui dou momente negative pot fi menionate:
atunci cnd lucrarea n curs de execuie are nevoie de nite date unitatea central rmne inactiv pe toat
perioada citirii acestora;
o lucrare de scurt durat, sosit n timpul execuiei unei lucrri "lungi", trebuie s atepte terminarea
acesteia din urm.
Multiprogramarea
Ultimele dou momente au condus la ideea utilizrii unui mod de funcionare a SO n care:
o lucrare aflat n starea eligibil ar putea folosi unitatea central, eliberat de o lucrare care trece n
ateptarea datelor,
unitatea central ar putea schimba timpul su de alocare nainte de terminarea unei lucrri n scopul
satisfacerii cerinelor legate de timpul de rspuns.
multiprogramare este prezentat n fig.1.13.
Unitat
ea central
Execu
ie
Citire

Imprimant
a
Memoria operativ
Canal

Canal

Citire

Imprimare

Memori
a secundar

Fig.1.13. Fluxul informaional ntr-un sistem cu multiprogramare

Principalele avantaje i restricii ale multiprogramrii pot fi prezentate n rezumat dup cum urmeaz:
un sistem cu multiprogramare este mai complicat pentru c el trebuie s asigure partajarea memoriei i
protecia reciproc a programelor;
multiprogramarea necesit dispozitive speciale pentru reactivarea programelor i protecia memoriei;

un sistem cu multiprogramare asigur o utilizare mai uniform a diferitor resurse: unitatea central,
memoria, organele de intrare-ieire;
multiprogramarea permite reducerea timpului de rspuns n cazul lucrrilor de durat mic ntr-un sistem cu
prelucrare secvenial.

Sisteme cu timp partajat


Un sistem de operare cu partajarea timpului trebuie s garanteze fiecrui utilizator un timp acceptabil de rspuns.
Acest rezultat este obinut prin alocarea succesiv a procesorului pentru trane de timp foarte mici (cuante)
programelor utilizatorilor.
Viabilitatea unei asemenea tehnici este legat de caracteristicile lucrului interactiv. Activitatea unui utilizator
conine dou componente: timpul de reflecie (gndire), n care utilizatorul elaboreaz, propune subiecte de lucru,
introducnd n calculator informaii i timpul de ateptare, cnd ateapt executarea de ctre sistem a serviciului
cerut. Prima component este de o durat medie mult mai mare dect a doua i sistemul poate s serveasc simultan
ai muli utilizatori, folosind timpul mort, datorat perioadei de reflecie.

Windows, Unix i alte sisteme


Problema definirii informaiei a fost pus iniial n seama limbajelor de programare: fiecare limbaj definea
universul su de obiecte accesibile i mijloacele efective de accesare. Sistemul de operare trebuia doar s
implementeze obiectele definite de limbajul de programare in memoria fizic, direct adresabil.
Restriciile de capacitate i pre a memoriei principale a condus foarte repede la apariia necesitii unei memorii
secundare i a unor mecanisme de schimb de informaii ntre aceste dou nivele ale memoriei.
Problemele partajrii i proteciei informaiei, alocrii resurselor conduc la noiunea de memorie virtual, care
permite izolarea mecanismelor de gestionare a ansamblului memorie principal - memorie secundar, lsnd
utilizatorilor simpli impresia unui spaiu de adresare uniform (contiguu). Au fost introduse noiunile de modularitate
i structurare ierarhic, obiect, etc.
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 aplicaie, este fundamentul practic de elaborare a sistemelor fizico-logice deschise. Implementarea larg a
sistemului de operare UNIX a permis trecerea de la declararea sistemelor deschise la dezvoltarea practic a acestui
concept. Este greu de supraestimat i influena activitilor de standardizare a interfeelor SO UNIX asupra
dezvoltrii domeniului sistemelor deschise. , versiunea SVR 4.2, pentru prima oar n istoria sistemelor de operare
UNIX a fost realizat mecanismul proceselor legere (thread, fire), care erau executate n baza unei memorii virtuale
comune i permitea utilizarea posibilitilor dispozitivelor fizice, numite arhitectura multiprocesoral simetric n
care mai multe procesoare au drepturi egale de accesare a memoriei centrale comune. La nceputul anului 1995
compania Novell a anunat o variant nou a SO UixWare 2.0 bazat pe System V 4.2. Era un sistem de operare cu
un sistem de fiiere foarte fiabil, fiind admis accesul la fiierele pstrate pe serverele NetWare, administratorul avea
la dispoziie o interfa grafic bine pus la punct, etc.
OSF-1 i alte variante UNIX
Open Software Foundation (OSF) a fost prima companie comercial, care a ncercat elaborarea SO UNIX n
baza micronucleului Mach. A fost creat sistemul de operare OSF-1, care nu era n sens de liceniere curat,
deoarece folosea o parte a modulelor iniiale din SVR 4.0.
Variantele SO UNIX, propuse de Universitatea din California, sunt o alternativ real pentru UNIX AT&T. De
exemplu, UNIX BSD 4.2 era pus la dispoziie n module iniiale i folosit chiar n fosta URSS pe calculatoarele de
tip DEC. Grupul BSD a influenat enorm dezvoltarea sistemelor de operare UNIX, printre realizri amintim mult
controversatul SO UNIX BSD 4.4, construit n baza principiilor micronucleare, sistemul FreeBSD i altele.
Nu putem s nu amintim aici i de realizarea original a SO UNIX pentru platformele Intel, propus de Torvald
Linus LINUX. Este un sistem de operare foarte popular n mediul studenesc, care are i una din cele mai populare
teleconferine n Internet.
Odat cu ieirea SO UNIX pe pia i creterea substanial nu numai a numrului de utilizatori, ci i a
numrului de specialiti din toate colurile lumii, care propuneau modificri i chiar variante proprii, a aprut
necesitate elaborrii unor standarde, care ar conduce la sisteme compatibile. Prin standard al unei interfee al SO
subnelegem un set de proprieti, mai mult sau mai puin 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). Majoritatea variantelor comerciale respectau standardul SVID. Evident,
SVID fiind un document de firm, publicat fr discuii publice nu putea fi adoptat standard oficial.

Paralel exista direcia BSD (Berkeley Standard Distribution), susinut de comunitatea universitar. Dei
majoritatea realizrilor comerciale se bazau pe Sistem V, UNIX BSD era foarte popular n universiti din care
cauz a fost elaborat un standard, care a unit practic AT&T cu BSD.
Organizaia internaional X/Open, care activeaz n domeniul elaborrii i propagrii ideilor sistemelor
deschise, culege i sistematizeaz standardele de-jure i de-facto de importan industrial n aa numitul X/Open
Common Application Environment (CAE). Specificaiile interfeelor resurselor, care formeaz CAE, sunt publicate
n X/Open Portability Guide (XPG).
Pentru lumea UNIX este foarte important i standardul limbajului de programare C, adoptat mai nti 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 apariie limbajul C i sistemele de programare respective erau strns legate de UNIX,
componentele bibliotecilor standard corespundeau exact mediului standard al SO UNIX.
Mai menionm standardul de-facto SPARC Complience Definition, propus de organizaia SPARC International,
propunerea organizaiei 88/Open pentru procesoarele RISC Motorola, standardul sistemului de ferestre, susinut de
X Consorium (Institutul de Tehnologie din Massachussets) i OSF/Motif, elaborat de Open Software Foundation.

Sisteme de operare cu micronucleu


Micronucleul este partea minim principal a unui sistem de operare, folosit pentru asigurarea modularitii i
transportabilitii. Noiunea de micronucleu a fost introdus de compania Next prin sistemul de operare cu
micronucleul Mach. Nucleul acestui sistem de operare, de dimensiuni mici, n jurul cruia se situau subsistemele
executate n regim user, trebuia s asigure o flexibilitate i modularitate foarte nalt. Dar n realitate acestea au fost
umbrite de prezena serverului monolit, care realiza sistemul de operare UNIX BSD 4.3, ales de compania Next n
calitate de nivel superior pentru micronucleul Mach.
Urmtorul SO cu micronucleu a fost MS Windows NT, n care momentul principal declarat era, n afara
modularitii, transportabilitatea. Acest sistem de operare poate fi utilizat n sistemele mono- i miltiprocesor, bazate
pe procesoarele Intel, Mips, i Alpha. Mai mult, deoarece NT trebuia s execute i programele scrise pentru DOS,
Windows, OS/2 i SO, compatibile cu standardele Posix, compania Microsoft a folosit modularitatea abordrii
micronucleare pentru crearea unei structuri generalizate, care nu repet sistemele de operare existente, fiecare SO
fiind emulat printr-un modul separat sau printr-un subsistem.
Au aderat la tehnologia micronuclear i companiile Novell/USL, Open Software Foundation (OSF), IBM,
Apple i altele. Unul din concurenii 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.

Modul secvenial de execuie a unui program


Nucleul: memoria + procesorul. Instruciunile i datele se afl n segmente distincte.
Execuia instruciunilor, care formeaz un program secvenial, conduce la evoluia strii calculatorului. Evoluia
strii calculatorului poart un caracter discret, starea este observabil doar n momente de timp numite puncte de
observare.
Starea calculatorului este definit de starea procesorului i starea memoriei. Starea memoriei este determinat de
coninutul locaiunilor segmentelor ncrcate n memorie. Starea procesorului este definit de coninutul setului de
registre, ataate procesorului.
Noiuni fundamentale
Un program secvenial = o mulime de proceduri, care se pot apela reciproc. Fiecrei 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 execuia nentrerupt a unei proceduri unice. !!Execuia unui
program secvenial const dintr-un lan de activiti!!!!
Numim context al unei activiti mulimea informaiilor accesibile procesorului n cursul acestei activiti.
Contextul activitii 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 instruciuni
speciale: apelarea i returul din procedur, care realizeaz comutarea contextului.
Mecanisme de execuie secvenial
Vom descrie un mecanism general pentru execuia programelor secveniale, formate dintr-o suit de activiti,
rezultate din execuia unei proceduri sau corutine. Acest mecanism realizeaz funciile urmtoare:

Salvarea i restabilirea contextului la apelare i retur,


Transmiterea parametrilor ntre procedurile apelant i apelat,

Administrarea unei zone de lucru proprii fiecrei proceduri, cu


permisiunea apelurilor recursive.

Cazul procedurilor.
Structura de date utilizat n acest caz este o stiv de execuie. Descriem o organizare foarte apropiat schemei
de execuie din limbajul de programare C, presupunnd respectarea urmtoarelor ipoteze:
Parametrii unei proceduri sunt transmii prin valori; la retur un singur rezultat este returnat,
Procedurile pot fi apelate recursiv (direct sau indirect).
La fiecare apelare a procedurii o structur de date numit regiune a mediului (sau simplu mediul procedurii) este
creat n vrful stivei de execuie, care va dispare la returul respectiv. O procedur apelat recursiv are n stiv attea
medii cte execuii neterminate exist pentru aceast procedur.
La un moment concret de timp mediul din top-ul stivei corespunde procedurii q n curs de execuie (procedura
activ), mediul imediat urmtor este al procedurii p, care a apelat procedura q, etc. Stiva este administrat prin
intermediul a doi pointeri (fig.2.1.):
baza

pointerul care indic baza mediului procedurii active,

top

pointerul care indic primul amplasament liber pentru a crea un nou mediu.
top
q

top

baz
a

p
baz
a
nainte de apelarea
procedurii q de ctre
procedura p

Stiv

Mediul
procedurii
Fig.2.1. Stiva de execuie

Stiv
Dup apelarea
procedurii q

Mediul procedurii conine urmtoarele informaii:


informaii de salvare i legturile de retur
un pointer la baza contextului procedurii apelante
adresa returului
un amplasament pentru rezultat
parametri
n+1 amplasamente, primul coninnd numrul de parametri,
variabilele locale i spaiul de lucru al procedurii.
Operaiile executate la apelarea i returul procedurii sunt urmtoarele:
Apelare
alocarea unei zone n stiva de execuie pentru mediul procedurii apelate
temp:=baza
baza:=top
top:=top+dimensiunea mediului
salvarea informaiilor de retur
baza_veche:=temp
memorizarea adresei de retur
ordonarea parametrilor
executarea unei ramificaii la procedura apelat.
Retur

salvarea rezultatului ntr-un amplasament stabilit


restabilirea informaiilor de retur i eliberarea mediului
temp:=adresa de retur
top:=baza
baza:=baza_veche
returul
ramificare *temp

ramificare indirect

Rezumat: contextul memoriei unei activiti la un moment curent de timp conine, n afara segmentului
procedurii n curs de execuie i segmentele de date, zona mediului curent din stiva de execuie.
Starea i contextul procesorului
Starea procesorului este determinat de coninutul registrelor acestuia. Registrele pot fi:
adresabile, numite registre generale, manipulate de programe,
registre speciale - cuvnt de stare program (program status word, PSW).
PSW conine informaii:
Referitoare la starea procesorului:
Starea de execuie. Procesorul se poate afla n starea activ n care ndeplinete instrucii, sau n starea de ateptare,
cnd execuia este suspendat. Tranziia activ ateptare se realizeaz prin ncrcarea cuvntului de stare sau prin
executarea unei instruciuni speciale; trecerea invers ateptare activ este n mod obligator rezultatul unei
ntreruperi.
Modul de funcionare:
Protecie - se permite doar programelor SO executarea unor instruciuni anumite (speciale), programele utilizatorilor
neavnd acces la aceste instruciuni. Aceasta poate fi realizat definind dou moduri de funcionare a calculatorului,
care se deosebesc printr-un bit indicator n cuvntul de stare: modul supervizor i modul program.
Masca ntreruperilor.
Referitoare la contextul accesibil al memoriei i drepturile de acces asociate: tabele de segmente, indicatori de
protecie a memoriei, etc.
Referitoare la derularea activitii curente: codul condiiei, contorul operaiei urmtoare (contor ordinal). Pentru
unele calculatoare contorul, care conine adresa operaiei urmtoare, poate fi un registru distinct al cuvntului de
stare, pentru altele el este un cmp al acestui cuvnt.

ntreruperi, devieri, apelarea supervizorului


Activiti asincrone
Modelul descris mai sus poate fi folosit doar pentru un singur program, reprezentat printr-o secven de
activiti, executate pe un singur procesor. Unicele mecanisme necesare pentru organizarea comunicrilor ntre
activiti sunt operaiile de apelare i retur pentru proceduri sau reluare pentru corutine.
Pentru cazuri mai generale sunt necesare mecanisme suplimentare, cum ar fi conceptele de asincronism sau de
protecie reciproc ntre activiti.
Prin asincronism nelegem efectul care l pot avea asupra derulrii unei activiti anumite evenimente
exterioare.
Numim protecie reciproc ntre activiti o modificare mai profund a contextului, atunci cnd se trece de la o
activitate la alta, n comparaie cu ceea ce are loc n cazul unei simple apelri de procedur.
Mecanisme de comutare a contextului
Comutarea contextului unui procesor permite executarea ntr-o manier indivizibil (atomar) a urmtoarelor dou
operaii:
1.

trecerea cuvntului de stare ntr-un amplasament specificat al memoriei,

2.

ncrcarea n cuvntul de stare a coninutului unui alt amplasament specificat al memoriei.

Comutarea contextului poate fi necesar din mai multe cauze distincte. Presupunem c fiecrei cauze i-a fost asociat
un numr de ordine. Pot fi ntlnite dou scheme de comutare a contextului.

1.

Salvare n amplasamente fixe.

2.

Salvare ntr-o stiv.

ntreruperi
ntreruperea - comutarea contextului procesorului declanat de o cauz extern derulrii instruciunii curente.
Fizic = trimiterea unui semnal procesorului, acest semnal provocnd schimbarea strii unuia dintre indicatorii,
consultai n cursul executrii fiecrei instruciuni. O ntrerupere permite s cerem procesorului s suspende
executarea programului curent, din primul punct ntreruptibil, i s treac la execuia unui program predefinit.
Nivele de prioritate. Cauzele care duc la necesitatea ntreruperii unui procesor sunt diferite, drept rezultat i
programele predefinite, care trateaz ntreruperile difer. Mecanismul ntreruperilor trebuie s poat deosebi aceste
cauze. Dou scheme de baz sunt utilizate n acest scop:
1.

Exist un indicator unic pentru toate ntreruperile. Acestui indicator i este asociat un program
de tratare a ntreruperilor. Codul ntreruperii, care se conine n PSW sau ntr-un amplasament
de memorie, d posibilitatea deosebirii cauzelor. Programul de tratare a ntreruperilor consult
mai nti codul ntreruperii pentru a stabili originea acesteia, apoi se va trece la tratarea
propriu-zis.

2.

Fiecrei cauze este ataat un indicator, se mai spune c fiecare cauz este ataat unui nivel de
ntrerupere. Fiecrui nivel i corespunde un program distinct de tratare a ntreruperii, activat n
mod automat de ctre mecanismul de comutare a contextului.

Prioriti i mascarea ntreruperilor.


Protejarea contra unor ntreruperi anume a execuiei unei suite de instruciuni .Aceasta ar nsemna ntrzierea
comutrii contextului. Se zice atunci, c nivelul este mascat sau inhibat (ntrerupere mascat). Ridicarea
inhibrii ("demascarea") va autoriza schimbarea ulterioar a contextului. Informaiile asociate mascrii
ntreruperilor se afl n cuvntul de stare a procesorului.
Pentru unele nivele de ntrerupere efectul sosirii semnalului de ntrerupere poate fi suprimat de parc nsi
cauza ntreruperii a fost suprimat: nivelul ntreruperii este dezarmat.
Declanare programat. Pentru unele calculatoare, ndeosebi cele utilizate n controlul proceselor, exist o
instruciune de declanare programat care permite modificarea indicatorului, asociat unui nivel de ntrerupere,
din interiorul unui program. n acest fel este posibil simularea apariiei unei cauze externe de ntrerupere.
Operaiile de armare-dezarmare, mascare-demascare i declanare a ntreruperilor sunt totdeauna realizate prin
intermediul unor instruciuni privilegiate.

Devieri i apelarea supervizorului


Spre deosebire de o ntrerupere, o deviere sau un apel al supervizorului sunt provocate de o cauz legat direct
de derularea instruciunii curente.
O deviere (trap, eng., droutement, fr.) semnalizeaz o anomalie n derularea unei instruciuni, care prohibiteaz
executarea instruciunii.
Originile pot fi diverse:
date incorecte, care conduc la imposibilitatea execuiei corecte a instruciunii (mprirea la zero, de exemplu),
tentativa executrii unei operaii interzise de mecanismul de protecie (violarea proteciei memoriei, executarea
unei instruciuni privilegiate n modul program, etc.), instruciune neexecutabil (cod neautorizat de operaie,
adres n afara memoriei existente, utilizarea unui dispozitiv opional, care este lips n configuraia dat, etc.).
Devierile pot fi clasificate, ca i ntreruperile, conform cauzelor care le genereaz. Important! Natura unei
devieri nu permite aplicarea noiunii de masc. O deviere poate fi suprimat, dar nici intr-un caz retardat.
Un apel al supervizorului este o instruciune chemat s provoace o comutare a contextului procesorului.
Destinaia unui apel al supervizorului este de a permite apelarea unei proceduri a sistemului de operare,
pretinznd la drepturi mai mari (modul master, ntreruperi mascate, drepturi de acces, etc.), direct din programul
utilizatorului.
Alegerea procedurii accesibile n cazul unui apel al supervizorului este determinat de un parametru
suplimentar.
Operaiile de accesare a fiierelor i de intrare-ieire sunt disponibile utilizatorilor sub forma apelrii
supervizorului.

Exemple de sisteme de ntreruperi


Funcionarea sistemelor de ntrerupere este ilustrat prin dou exemple reprezentative, unul pentru un calculator
mare, altul pentru calculatoarele personale.
Exemplul 2.6. IBM 370.
Cuvntul de stare (64 bii) conine urmtoarele cmpuri:
<0-7>

masca ntreruperii

<16-31>

codul ntreruperii

<8-11>

cheie de protecie

<32-33>

lungimea instruciunii

<12>

codul caracterelor

<34-35>

codul condiiei

<13>

masca ntreruperii

<36-39>

suprimarea devierii

<14>

1 - ateptare, 0 - activ

<40-63>

contor ordinal

<15>

0 - stpn, 1 - sclav.

Implementarea mecanismelor de comutare a contextului


Implementarea mecanismelor descrise mai sus este ilustrat printr-o serie de exemple, legate de utilizarea lor.
Vom preciza notaia utilizat n schemele programelor:

coninutul unui cuvnt de stare este reprezentat prin notaia <activitate, mod, mascare, contor ordinal>.
Primele trei cmpuri pot lua, respectiv, valorile: ateptare/activ, master/slave, mascat/demascat. Dac csp
desemneaz un cuvnt de stare, cmpurile 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 instruciune a procedurii,
notaia Mp[adr] desemneaz coninutul amplasamentului cu adresa adr.
Notaiile svc_vechi, dev_vechi, intr_x_vechi, svc_nou, dev_nou, intr_x_nou desemneaz
amplasamentele unde sunt plasate i de unde sunt ncrcate cuvintele de stare.

Vom mai presupune c

apelarea supervizorului este de forma SVC <cod>, unde <cod> reprezint un numr care permite
identificarea funciei cerute,
un indicator <cauz> permite stabilirea cauzei care provoac o deviere.

Utilizarea devierilor i apelrii supervizorului


Simularea instruciunilor lips. Unele instruciuni din setul de baz de instruciuni ale procesorului pot fi
opionale i, deci, pot lipsi n unele configuraii ale calculatorului. Tentativa executrii unei instruciuni opionale
lips genereaz o drivere de tipul instruciune inexistent. Mecanismul devierilor poate fi utilizat pentru a realiza
prin program instruciunea inexistent n setul de baz.
Realizarea prin program:
procedura iniializare;
dev_nou:=<activ,master,mascat, adr tratare_deviere>;
csp[ADD_FL]:= <activ,slave,demascat, adr ADD_FL>;

csp [DIV_FL]:= <activ,slave,demascat, adr DIV_FL>;


procedura tratare deviere;
begin
save(zon);
case cauz of

instruciune inexistent:
cod_op:=Mp[dev_vechi.co].cod_operaie;
case cod_op of

ADD_FL: determinarea operanzilor;


introdu_n_stiv(stiv_utilizator,dev_vechi.co+1);
ncarc_csp(csp[ADD_FL])

else
-- caz de eroare
<tratarea erorii>

end;
end;
restabilire(zon);
ncarc_csp(dev_vechi)
end
Msurarea capacitii memoriei. Un sistem de operare presupune a fi utilizat pentru diverse configuraii ale
calculatorului. Capacitatea memoriei, numrul i natura dispozitivelor periferice, etc., pot fi diferite. Sistemul de
operare trebuie s se adapteze configuraiei concrete, ca i condiiilor particulare de utilizare (numr de utilizatori,
prioriti, etc.). Crearea unei asemenea versiuni specifice se numete generarea sistemului de operare. Pentru a
reduce frecvena generrilor S.O. unii parametri de configurare pot fi determinai n mod automat la iniializare.
Realizarea prin program:
program principal:
begin
dev_nou:= <activ,master,mascat, adr msurare>;
i:=1;
ciclu
<accesare cuvnt cu adresa i.p>;
i:=i+1;
endciclu;
ieire ciclu: nbloc:=i;
dev_nou := <activ,master,mascat, adr tratare_deviere>;
end
procedura msurare;
-- apelare prin deviere
if cauz = adres n afara memoriei then
csplucrare:= <activ,master,mascat, adr ieire ciclu>;
ncarc_csp(csplucrare)
endif
Gestionarea devierilor de ctre utilizatorul sistemului.
Realizarea prin program:
const ndev=<numrul de cauze de deviere>;
var C: array[0..ndev-1] of boolean;
adrtratare: array[0..ndev-1] of adres;
procedura iniializare;
begin
svc_nou:=<activ,master,mascat, adr tratare_svc >;
for i:=0 to ndev-1 do
-- tratare standard
C[i]:=false;
endfor;
dev_nou:=<activ,master,mascat, adr tratare_dev >;
end
procedura tratare_svc;
begin
save(zon);
case cod of

asociere_deviere:
-- parametrii i, proc
C[i]:=true;
adrtratare[i]:=adr proc;
restabilire(zon);
ncarc_csp(svc_vechi)

endcase
end
procedura tratare_dev(i);
begin
save(zon);
if C[i] then
C[i]:=false;
-- restabilire tratare standard
introdu_n_stiv(stiv_utilizator,dev_vechi.co); -- pentru retur
dev_vechi.co:= adrtratare[i];
restabilire(zon);

ncarc_csp(dev_vechi);
else
<tratare standard[i]>;
ncarc_csp(schimbare);
endif
end

-- programul urmtor

Exemple de utilizare a ntreruperilor


Principala utilizare a ntreruperilor este msurarea timpului i administrarea operaiilor de intrare-ieire.
Prezentm mai jos cteva exemple de utilizare a ceasului calculatorului.
Limitarea timpului de execuie a unei proceduri. Este necesar s fie executat o procedur p astfel, nct dac
dup un interval de timp prestabilit q, numit timeout, executarea nu se va termina, ea va fi ntrerupt i o procedur
specificat tratare_eroare este apelat.
Realizarea prin program:
procedura iniializare;
intr_ceas_nou:=<activ,master,mascat,adr intr_ceas>;
svc_nou
:=<activ,master,mascat,adr tratare_svc >;
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:= <activ,slave,demascat,adr p>;
csperoare:= <activ,slave,demascat,adr tratare_eroare>;
armare(intr_ceas);
restabilete(zon);
ncarc_csp(csplucrare);

retur:
-- datorat terminrii procedurii p
dezarmare(intr_ceas);
ncarc_csp(cspretur);

endcase
procedura intr_ceas;
-- expirarea timpului limit
dezarmare(intr_ceas);
ncarc_csp(csperoare);
Culegerea unor date de msurare. Un calculator are obligaiunea s preia periodic datele unor msurri legate
de o instalaie industrial. Perioada ceasului este de 5 s. Datele trebuie culese fiecare 100 ms (perioada de
eantionare). Deoarece timpul necesar culegerii datelor este cu mult inferior perioadei de eantionare, calculatorul
poate executa alte lucrri n regim de fond.
Realizarea prin program:
const q = 20000
-- 100ms/5s
procedura iniializare;
begin
intr_ceas_nou:=<activ,master,mascat,adr intr_ceas>;
csplucrare:= <activ,slave,demascat,adr fond>;
cspmsurare:= <activ,slave,demascat,adr msurare>;
ceas:=q;
ncarc_csp(cspdev)
end
procedura intr_ceas;
begin
save(zon);
salvarea contextului de fond
cspsave:=intr_ceas_vechi;
salvarea cuvntului de stare pentru fundal
ceas:=q;
ncarc_csp(cspmsurare)
programul de culegere a datelor
end

Concluzii
Exemplele precedente ilustreaz modurile elementare de comunicare dintre programele unui sistem de operare i
mediul exterior. Programele sistemului sunt activate:
1.

de un program al utilizatorului, care semnaleaz o anomalie sau cere achitarea unui serviciu,

2.

de un dispozitiv extern (ceas, proces comandat, organ periferic sau linie de comunicaii), care
semnaleaz producerea unui eveniment i care cere o reacie imediat a sistemului.

Important! Comunicaia intern ntre programele unui sistem folosete apelarea supervizorului dac un anumit tip
de protecie trebuie s fie activat (program executat n modul slave, de exemplu) i apelarea unei proceduri
obinuite n caz contrar.
O secven de execuie a unui program de sistem se termin prin ncrcarea unui cuvnt de stare a procesorului care
permite controlul total al contextului restabilit.

Programarea operaiilor de intrare-ieire


Prin noiunea de intrare-ieire (prescurtat I/E; eng. input/output, I/O; fr. entre-sortie, E/S) numim orice
transfer de informaii din sau spre nucleul calculatorului. Operaiile de I/E semnific:

transferurile de informaii dintre diferite nivele ierarhice ale memoriei,


transferurile de informaii din sau spre mediul exterior (organe periferice locale sau la distan, captoare sau
dispozitive de acionare, alte calculatoare, etc.).

Organizarea general
Periferice, controlere, canale
Un organ de intrare-ieire este un dispozitiv capabil s transfere informaii ntre procesorul sau memoria
calculatorului i un suport extern de informaie. Acest transfer este comandat de ctre procesorul central. n cel mai
simplu caz, o instruciune special a procesorului permite transferarea informaiei ntre suportul extern i un registru
al procesorului, care va fi deci ocupat pe toat perioad transferului informaiei
Un canal (sau unitate de schimb) este un procesor specializat n operaiile de intrare-ieire. El poate fi lansat
doar de un procesor central, nu posed ntreruperi, dar poate ntrerupe un procesor central.
Un contrler este un dispozitiv de comand adaptat la un tip concret de echipament periferic. Autonomia sa este
limitat de operaii foarte elementare. Destinaia principal a unui controler este de a permite conectarea a mai
multor periferice de acelai tip la un singur controler. n programarea intrrilor-ieirilor nu este necesar, de obicei, s
se fac o deosebire ntre un controler i un periferic.
Un periferic este un organ capabil s transfere informaii din sau spre un suport extern. Controlerul este legat de
periferic printr-o interfa, care conine un set de funcii (intrare, ieire, semnalizri de comand i de accident) i o
linie de comunicaie, care servete la transferul informaiilor.
Adresarea dispozitivelor periferice
Diferite organe sunt desemnate, la fiecare nivel, printr-o adres care permite s evideniem:

canale legate de memorie,


controlere ataate fiecrui canal,
dispozitive periferice ataate fiecrui controler.

Metode de comand a perifericelor


Programul, care controleaz funcionarea elementar a unui dispozitiv periferic se numete driver. Driverul
gestioneaz n mod direct interfaa controlerului perifericului, trateaz ntreruperile generate de acesta, detecteaz i
trateaz cazurile de eroare.
Intrri-ieiri sincrone
1) Specificarea mecanismului
Operaia de baz const n transferarea unor informaii elementare de volum fix ntre un amplasament de
memorie i un dispozitiv periferic. Presupunem c volumul informaiei transmise, care depinde de perifericul
considerat, este un octet. Starea ansamblului controler-periferic este definit printr-un cuvnt de stare, aflat n
controler. Acest cuvnt de stare conine o mulime de indicatori booleeni, dintre care doar 3 ne vor interesa aici:

preg

: perifericul este pregtit (gata) de funcionare, detaliile legate de stabilirea indicatorului depind de
periferic,

term

: transferul este terminat; perifericul este gata s transfere un nou caracter,

err

: n cursul transferului a avut loc o eroare; natura ei este precizat de un cod care face parte din
cuvntul de stare.

Controlerul este comandat de unitatea central cu ajutorul a trei instruciuni de intrare-ieire, efectul crora
este descris mai jos:
IN(adr_mem, adr_perif)

: cerere de transfer tip intoducere a unui octet,

OUT(adr_mem, adr_perif)

: cerere de transfer tip extragere a unui octet,

TEST(adr_perif)
indicatorii.

: copie cuvntul de stare ntr-un registru cu scopul de a consulta

Prin adr_mem i adr_perif sunt desemnate adresele amplasamentului memoriei i perifericului.


2) Programul driver-ului
Intrri-ieiri asincrone cu ntreruperi
1) Specificarea mecanismului.
Terminarea procesului de transferare a caracterului T[i] este semnalizat printr-o ntrerupere. Dac acest
caracter nu este ultimul (i<n-1), urmtorul caracter poate fi transmis. Procesul este declanat de transferul
primului caracter. Acest transfer este cerut de ctre programul principal prin intermediul unui apel a
supervizorului (SVC intrare sau ieire), care are drept parametri:

adresa perifericului,
numrul de caractere care vor fi transferate,
adresa de origine sau de destinaie a primului caracter,
un boolean term, valoarea TRUE a cruia semnalizeaz sfritul transferului.

Intrri-ieiri programate pe canal sau acces direct la memorie


Un canal este un procesor capabil s execute o secven de operaii de intrare-ieire, definite de un program din
memorie, pentru un periferic conectat la acest canal. El conine un cuvnt de stare n care este inclus un contor
ordinal ca i un set de indicatori despre starea operaiei curente.
1) Un canal poate fi lansat doar de un procesor central cu ajutorul unei instruciuni SIO (Start Input-Output,
eng.). Aceasta iniializeaz cuvntul de stare a canalului, specificnd adresa primei instruciuni care trebuie
executat i adresa perifericului origine sau destinaie a transferului. Dup aceasta, activitatea canalului i a
procesorului central decurg n mod paralel.
2) Odat lansat, canalul execut programul su. Aceast execuie se poate termina n trei moduri:
a)

terminarea execuiei programului,

b) terminare cauzat de o eroare (pan hardware, program incorect, etc.),


c)

la comanda unui procesor central, care poate n orice moment stopa execuia programului canalului cu
ajutorul unei instruciuni speciale stop_canal (HIO, Halt Input-Output, eng.).

3) Procesorul central, la orice moment de timp, poate consulta cu ajutorul instruciunii testare_canal starea
canalului. Aceast consultare nu mpiedic executarea programului procesorului central.
O instruciune a canalului specific urmtoarele:
natura operaiei care va fi executat (citire, scriere, deplasarea braului unui disc, etc.),
adresa de nceput a zonei de memorie origine sau destinaie,
numrul caracterelor care urmeaz a fi transmise.

Intrri-ieiri buferizate n memorie


Specificarea problemei
Diferena considerabil dintre viteza de lucru a unitii centrale i cea a organelor periferice impune
"buferizarea" intrrilor-ieirilor, adic introducerea unei zone-tampon de memorie ntre periferic i programul
utilizatorului. Scopul este de a reduce timpul de inactivitate a unitii centrale, dezlegnd funcionarea acesteia de
periferice.
Programul utilizatorului va transfera informaiile din sau spre zona-tampon, iar aceast zon-tampon va servi, n
mod paralel, drept surs sau destinaie la schimbul de date cu perifericul. Pentru descrierea modelului sunt necesare
urmtoarele specificaii:

schimburile de informaii cu perifericele se va face prin nregistrri de lungime fix,

zona-tampon este de volum fix egal cu N nregistrri,

pentru un program utilizator, schimbul de informaii cu zona-tampon trebuie s simuleze schimbul


cu perifericul, drept consecin, ordinea de depozitare sau de extragere a informaiilor trebuie s
fie bine stabilit i nici o nregistrare s nu fie pierdut,

ateptrile inutile trebuie reduse la minimum, att n cazul unitii centrale, ct i a perifericului,

capacitatea suporturilor nu este limitat: n cazul unei operaii de citire organul de intrare va fi
totdeauna alimentat; n cazul unei operaii de scriere, organul de ieire poate accepta ntotdeauna o
nregistrare,

transferul se va efectua fr eroare


Descrierea algoritmilor
Citire
Un program de citire este o procedur citire(nregistrare), care prezint drept rezultat valoarea nregistrrii
citite. Aceast procedur, realizat printr-o apelare a supervizorului, are ca efect citirea din zona-tampon a
nregistrrii urmtoare. Citirea este posibil doar dac zona-tampon conine cel puin o nregistrare, care nu a
fost nc citit
Terminarea transferului unei nregistrri n zona-tampon provoac o ntrerupere. Pentru
Scriere
Schema care corespunde unei scrieri se obine din precedenta, nlocuind dup cum urmeaz:

citire
extragere
tampon_vid

prin
prin
prin

scriere
introducere
tampon_plin

ncrcarea iniial
Pentru a ncepe lucrul maina "goal" trebuie s aib ncrcat n memoria operativ programul sistemului de
operare i s execute un salt la prima instruciune a acestui program.
Aceasta presupune prezena n memorie a unui program de citire, care el nsui trebuie ncrcat n prealabil. La
primele calculatoare, un program de cteva instruciuni, introdus manual n memorie cu ajutorul unor
comutatoare ale pupitrului de comand la o adres fix, permitea ncrcarea unui program de citire mai elevat
capabil s citeasc versiunea complet a sistemului de operare. Acest proces era numit ncrcare
(bootstrapping, eng.).
n calculatoarele contemporane, programul de iniializare se afl permanent ntr-o memorie constant (BIOS).
Execuia acestui program este declanat odat cu punerea sub tensiune a calculatorului (autoncrcare).

Gestionarea activitilor paralele


Una din caracteristicile principale ale sistemelor de calcul este existena activitilor simultane. Acest capitol
prezint conceptele i utilitarele, care permit descrierea i coordonarea acestor activiti.

1.1.

42. Exemple de activiti paralele

1.1.1.

43. Administrarea tamponat a intrrilor-ieirelor


scriere_lin
S

ie

tm1

tm2

(memorie)

td

(memorie)

1)

(di
sc)
Fig.3.1. Gestionarea buferizat a unei
imprimante
primitiva scriere_linie
SL
(unitatea central)

2)

scriere pe disc

SD

3)

citire de pe disc CD

(canal 2)

4)

imprimare fizic IF

(canal 3)

(canal 1)

Aceste patru activiti sunt n mare msur autonome - ele sunt executate pe procesoare distincte, cu programe
diferite.
Ele nu sunt totui independente, deoarece acceseaz obiecte comune: dou tampoane n memorie, tm1 i tm2 i
un tampon pe disc, td.
1) Condiii, care stabilesc posibilitatea existenei unor activiti
O nregistrare nu poate fi preluat dintr-un tampon nainte de a nu fi depozitat aici. Tampoanele au capaciti
limitate; dac un tampon este ocupat cu nregistrri, care nu au fost nc preluate, este imposibil depozitarea fr a
pierde informaii.
Activitate

Aciune

Condiie

SL

scriere n tm1

tm1 nu este plin

SD

citire din tm1

tm1 nu este vid

SD

scriere n td

td nu este plin

CD

citire din td

td nu este vid

CD

scriere n tm2

tm2 nu este plin

IF

citire din tm2

tm2 nu este vid

Execuia activitilor modific veridicitatea acestor condiii: astfel, imprimarea unei linii
pune n TRUE condiia tm2 nu este plin.O activitate, care nu poate executa o aciune, deoarece condiia
asociat are valoare FALSE, trebuie s atepte, adic execuia unei aciuni este retardat pn cnd valoarea logic a
condiiei devine TRUE. n capitolul 2 a fost discutat realizarea acestui mecanism de ateptare i continuare cu
ajutorul ntreruperilor.
2)Condiii de validitate a informaiilor partajateDac vom examina procesul de accesare a tampoanelor, vom
descoperi o alt form de interaciune, cauzat de posibilitatea de accesare simultan de ctre dou activiti a unui
amplsament de memorie. Astfel, dac SD citete coninutul unei nregistrri din tm1 pe care SL este n curs de a o
modifica, rezultatul acestei citiri risc s fie incoerent, dac nu au fost luate msuri speciale de precauie. Problema
poate fi rezolvat impunnd una din activiti, aflate n conflict, s atepte pn cnd cealalt va termina
accesarea.
Concluzii:
Lucrarea imprimare tamponat este realizat prin patru activiti simultane, n mare msur autonome, care
coopereaz pentru atingerea scopului final.Executarea corect a lucrrii impune restricii logice n vederea derulrii
acestor activiti. Aceste restricii pot conduce la ntrzierea execuiei unei activiti, care este obligat s atepte
producerea unui eveniment, provocat de o alt activitate.

1.1.2.

44. Comanda unui proces industrial

R1 i R2 funcioneaz n paralel. Vom examina dou soluii posibile:


1)

utilizarea a dou calculatoare (cte unul pentru fiecare reactor),

2)

folosirea unui singur calculator pentru comanda ambelor reactoare.

Implementarea variantei doi impune verificarea posibilitii apariiei unor condiii suplimentare. Fie P1, P2, D1,
D2 segmentele procedurilor i datelor pentru comanda celor dou reactoare R1 i R2, memoria principal avnd
capacitatea necesar pentru pstrarea acestor segmente. Programele P1 i P2 sunt executate pe rnd de procesor.
Relaia 2t<T trebuie s fie respectat. Dac acesta va fi cazul, funcionarea reactoarelor pentru un observator extern
pare identic pentru ambele soluii. Trebuie, totui s subliniem, c soluia doi impune restricii mai severe n ceea
ce privete performanele calculatorului
Modalitile de implementare a soluiei doi.
1)

Partajarea procesorului

2)

Partajarea programului

Programele P1 i P2, fiind identice, putem pstra doar o singur copie, s-i zicem P, pentru economisirea
memoriei. Condiiile necesare pentru partajarea programului P:
nu este permis modificarea codului programului de execuia sa,
atunci cnd P este executat pentru reactorul Ri, el va accesa segmentul de date Di; aceast adresare
selectiv a datelor va fi realizat de un mecanism care nu modific textul programului.
1. Au fost evideniate dou activiti logic independente: comanda reactoarelor R1 i R2. Aceste dou
activiti pot fi puse pe dou maini distincte fr s existe vre-o legtur ntre ele.
2. Considerente de economie pot impune ca aceste activiti s partajeze resurse fizice i resurse program
comune. Buna funcionare a acestei partajri restricioneaz execuia activitilor i modul de utilizare a obiectelor
partajate.
Ca i concluzie pentru ambele exemple putem evidenia dou momente:
existena unor activiti evolutive, care pot derula simultan,
existena unor relaii ntre aceste activiti: cooperare pentru executarea unor sarcini comune,
concuren n utilizarea resurselor partajate.

1.2. 45. Noiune de proces secvenial


Noiunea de proces este mai nti introdus ntr-un mod concret pentru cazul unui calculator care conine un procesor unic i o memorie
adresabil. Vom trece mai apoi la definiia abstract a unui proces independent de suportul su fizic, ceea ce ne va permite introducerea
problemei sincronizrii.

1.2.1.

46. Proces unic. Context

Executarea unui program se traduce ntr-o suit de aciuni a1, a2,..., ai,..., cu nceput(ai)<sfrit(ai) **
O astfel de suit este numit proces secvenial sau simplu proces.
Un proces poate, deci, fi descris cu ajutorul succesiunii evenimentelor nceput(a 1), sfrit(a1), nceput(a2),
sfrit(a2),...
Aceast suit de stri datate ale mainii se numete traiectorie temporal (sau istorie) a procesului. Mulimea
informaiilor pe care aciunile unui proces le pot consulta sau modifica se numete contextul procesului.
Contextul unui proces rezultant din executarea unui program conine:
1)Contextul procesorului (cuvntul de stare i registrele),
2)Un context n memorie, sau spaiul de lucru (segmente procedur, date, stiv de execuie),
3) O mulime de atribute ataate procesului i care specific diferite proprieti:
a)
Nume. Numele unui proces, care servete pentru identificarea lui, este de regul, un numr intern
atribuit la crearea procesului i care permite s se ajung la reprezentarea contextului su.
b)

Prioritate. Prioritatea proceselor permite ordonarea lor pentru alocarea procesorului.

c) Drepturi. Drepturile unui proces specific operaiile care i sunt permise, n scopul asigurrii proteciei
informaiei.Traiectoria temporal a unui proces este definit de irul strilor contextului su.

47. Relaii ntre procese

1.2.2.

Vom cerceta n continuare execuia unei mulimi de procese i interaciunea reciproc a acestora. Noiunile,
introduse n 3.2.1 pot fi extinse pentru o mulime de procese:
traiectoria temporal a unei mulimi de procese este irul evenimentelor formate de nceputurile i
sfriturile aciunilor rezultante din executarea programelor acestor procese.
contextele unor procese diferite pot avea pri comune. Dou procese, contextele crora sunt disjuncte, se
numesc independente; ele nu pot avea interaciuni reciproce. Partea contextului, care aparine unui singur
proces, se numete context privat al procesului dat.
Exemplul 3.1.

Fie dou procese care partajeaz o procedur reentrant. Segmentul executabil, care conine aceast procedur aparine
contextului comun. Segmentul de date i stiva fiecrui proces formeaz contextul lor privat.

48. Mulimi de procese. Paralelism

1.2.2.1.

S considerm dou programe distincte P i Q, fiecare avnd 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. Aceste
traiectorii sunt reprezentate n figura 3.2.
p

1)

2)

3)
Fig. 3.2. Executarea unei mulimi de procese
1.2.2.2.

Comment:
schema 1: este executat mai nti tot procesul p, apoi procesul q la fel n ntregime,
schema 2: sunt executate iruri de instruciuni ale procesului p n mod alternativ cu iruri de
instruciuni ale procesului q, i tot aa pn la terminarea ambelor procese,
schema 3: executarea proceselor p i q este simultan; n acest caz sunt necesare dou procesoare.
Nivelul de observare cel mai fin (cel al instruciunilor) este numit nivel de baz.
S ne situm mai nti la nivelul de observare la care, prin convenie, executarea complet a
fiecrei dintre programele P i Q reprezint o aciune unic. Definiiile care urmeaz sunt
pentru acest nivel.
a)
schema de tip 1 este a unei execuii secveniale a lui p i q. Ea este caracterizat de relaiile:
sfrit(q) < nceput(p) sau sfrit(p) < nceput(q)
b)
schemele de tip 2 sau 3 sunt scheme de execuie paralel. Ele sunt caracterizate de
sfrit(p) > nceput(q) sau sfrit(q) > nceput(p).
Nivelul de baz. Putem face o distincie ntre schemele 2 i 3. ntr-adevr, n schema 2, din considerente de
existen a unui singur procesor, la un moment de timp dat doar o singur aciune poate fi executat,
contrar schemei 3. Se va spune c n schema 3 are loc un paralelism real, iar n schema 2 un pseudoparalelism. Paralelismul real necesit dou procesoare distincte. Dou observaii importante sunt necesare:
1)
Diferena acestor scheme de execuie este legat de alegerea nivelului de observare. Astfel, la
nivelul de baz, diferena dintre schemele 1 i 2 dispare: ambele sunt secveniale.
2)
Alegerea nivelului de baz depinde de fineea fenomenelor, care dorim s le considerm
elementare. Dac trebuie s studiem executarea instruciunilor n pipe-line pe un procesor
microprogramat, n calitate de nivel de baz va fi ales nivelul microinstruciunilor, iar contextul va fi
completat cu memoria microprogramelor i registrele interne.
49. Concurena proceselor. Resurse virtuale

Situaia descris de schemele 1 i 2 nu rezult dintr-o legtur logic ntre p i q, ci doar din existena unui
singur procesor. Ea poate fi generalizat astfel: fie o mulime de procese contextele crora au un obiect comun,
care poate fi utilizat la un moment de timp dat de un singur proces. Se va spune n acest caz, c obiectul
constituie o resurs critic pentru procesele date sau c procesele sunt n excludere mutual (excludere reciproc

sau concuren) pentru utilizarea unei resurse. Excluderea mutual a unei resurse conduce la serializarea
execuiei proceselor concurente, n cazul unor aciuni, care cer aceast resurs. Schemele 1 i 2 difer doar prin
nivelul de finee la care este executat serializarea.Funcionarea corect a unei mulimi de procese, care
particip la ndeplinirea unei lucrri comune, implic relaii logice de cooperare. Este comod s se separe
aceast cooperare de concurena pentru resursele fizice cu scopul de a simplifica nelegerea i aplicarea celor
dou tipuri de relaii. Pentru aceasta este folosit noiunea de resurse virtuale:
fiecrei resurse fizice critice
i se asociaz tot attea copii imaginare (sau virtuale) ale acestei resurse cte procese concurente solicit
utilizarea ei. Trebuie s tratm dou probleme distincte:1)
respectarea relaiilor de cooperare ntre
procesele, care, fiecare posed (conceptual) resursele fizice solicitate i pentru care paralelismul n execuie nu
este restricionat de competiia pentru resurse,2) reglarea problemei de concuren pentru resursele fizice printro serializare convenabil a execuiei proceselor n cauz. Se va spune n acest caz, c realizm o alocare a
resurselor fizice.
1.2.2.3.

Conceptual, totul va avea loc ca i cum procesele s-ar derula paralel, conform unei scheme, numite logice
sau virtuale, analogice schemei 3 din fig.3.2. Cu toate acestea, trebuie de menionat, c aceast schem
logic reprezint doar o notaie compact pentru mulimea schemelor reale posibile i c ele sunt
obligatoriu de forma 1 sau 2 din considerentele unicitii procesorului. Pentru o schem real i una
virtual a unui proces dat este pstrat doar ordinea de succesiune a evenimentelor (nceputul i sfritul
aciunii) i nu sunt pstrate valorile absolute ale intervalelor de timp, care le separ.

1.2.2.4.

Timpul folosit la reperarea evenimentelor n schema logic este numit timp logic.

1.2.2.5.
1.2.2.6.

a1

a2

+------+-----------------+------+

1.2.2.7.

b1 b2

procesul p

(timp logic)

1.2.2.8.

+--+-------+---------+

1.2.2.9.

a1

procesul q
a2

1.2.2.10. +------+---+
1.2.2.11.

+----+------+ p (timp real, execuia 1)

+----------+
+--+--+

1.2.2.12.

+-----+---------+

b1

1.2.2.13.

b2
a1 a2

1.2.2.14. +---+

p (timp real, execuia 2)

+---+-----------------+------+

1.2.2.15.

+--+----+

1.2.2.16.

b1

+---+---------+

b2

1.2.2.17. n toate cazurile a1 precede a2, b1 precede b2.


1.2.2.18. Fig.3.3. Timpul logic i timpul real
1.2.2.19. 50. Excludere mutual
Introducerea resurselor virtuale ne permite s tratm problema excluderii mutuale la accesarea resurselor fizice
corespunztoare n cadrul mecanismelor de alocare. Aceast problem poate fi pus ntr-un alt mod cum o
demonstreaz exemplul urmtor.
Exemplu 3.3.

Dou procese p i q trebuie fiecare s actualizeze valoarea unei variabile comune n (de exemplu, n este starea unui cont bancar
pentru care p i q efectueaz o depozitare). Aciunile respective se vor scrie n programele lui p i q:
procesul p:

Ap : n=n+np

procesul q:Aq : n=n+nq

S realizm decompoziia acestor aciuni n instrucii, notnd prin Rp i Rq registrele locale ale proceselor p i q respectiv:
procesul p
1. load Rp, n
2. add Rp, np
3. sto Rp, n

procesul q
1. load Rq, n
2. add Rq, nq
3. sto Rq, n

Dac aceste aciuni sunt executate n ordinea 1, 1 , 2, 2, 3, 3, efectul lor global este de executat n:=n+nq i nu
n:=n+np+nq: una din actualizri a fost pierdut i valoarea final a variabilei n este incorect. Pentru evitarea acestei
incoerene aciunile Ap i Aq trebuie s fie executate n excludere reciproc; se zice de asemenea c ele constituie pentru p i q
seciuni critice. Este necesar s se respecte condiia
sfrit(Ap) < nceput(Aq) sau sfrit(Aq) < nceput(Ap).
Aceast condiie de serializare, care are efectul de a face Ap i Aq s devin atomare, este identic condiiei deja ntlnite n
3.2.2.2 la accesarea unei resurse fizice critice.

Excluderea mutual const n extinderea pentru secvena de aciuni a proprietii de indivizibilitate a


aciunilor nivelului de baz (aciuni atomare). Posibilitatea executrii unor aciuni atomare se afl la baza
mecanismelor care realizeaz sincronizarea.
51. Sincronizarea proceselor
52. Exprimarea i implementarea restriciilor de succesiune
Exemplul 3.4. Procesul p transmite informaii procesului q scriind ntr-un segment a, consultat de q (aceast
transmitere are loc o singur dat). Este necesar s se ndeplineasc condiia:sfrit(scriere(a)) <
nceput(citire(a))Aceast relaie exprim restricia, c citirea lui a de ctre q nu poate ncepe nainte de
terminarea scrierii lui a de ctre p. Exemplul 3.5. Rendez-vous. Fie N procese p1,..., pN. Definim n
programul fiecrui proces un punct, numit rendez-vous, pe care procesul nu-l poate trece nainte ca alte
procese s ajung la punctul lor propriu de rendez-vous.Dac programul procesului pi are forma

1.2.3.

<debut_i>;

1.2.4.

<rendez-vous>

1.2.5.

<continuare_i>;

1.2.6.

atunci restriciile de sincronizare se vor exprima dup cum urmeaz:" pentru orice i, j din [1..N]:
sfrit(debut_i) < nceput(continuare_j)

1.2.7.

Restriciile de sincronizare pot fi exprimate prin urmtoarele dou forme echivalente:

1.2.8.

1. Se va impune o ordine de succesiune n timp logic pentru unele puncte ale traiectoriei temporale ale
procesului,

1.2.9.

2. Se va impune unor procese o condiie de autorizare a depirii acestor puncte ale traiectoriei lor
temporale.

1.2.10. Punctele privilegiate astfel se vor numi puncte de sincronizare.


Vom utiliza noiunea de ateptare pentru specificarea sincronizrii proceselor. Aceast specificare se va produce
n dou etape:
definirea punctelor de sincronizare pentru fiecare proces,
asocierea unei condiii de depire fiecrui punct de sincronizare, condiie
exprimat prin intermediul variabilelor de stare a sistemului.
Vom ilustra acest mod de specificare pentru cele dou exemple precedente. Notm un punct de sincronizare prin
ps, iar condiia de depire asociat prin aut(ps). Dac aceast condiie are valoare TRUE, procesul n cauz este
autorizat s execute instruciunea etichetat cu ps.
Variabila de stare n este n acest caz numrul procesului sosit n punctul de rendez-vous.
53. Probleme de realizare a sincronizrii
Vom ncerca s implementm sincronizarea specificat de condiiile de depire. Pentru aceasta trebuie s
definim un mecanism de ateptare i s introducem noiunea de evenimente memorizate. Un eveniment memorizat
(e) este o variabil, care poate lua dou valori: sosit i non_sosit, valoarea iniial este non-sosit. Asupra
evenimentului memorizat sunt posibile dou operaii, care sunt aciuni indivizibile:e:=<valoare>
-atribuirea imediat a unei valori ateptare(e).

1.2.11. Operaia ateptare(e), executat de un proces p, are urmtoarea specificaie:


1.2.12.

if e = non_sosit then

1.2.13.

starea(p) := blocat

1.2.14.

-- p este trecut n ateptarea lui e

endif

1.2.15. Cnd e ia valoarea sosit, toate procesele care ateptau e trec n starea activ.
1.2.16. Vom ncerca acum s realizm cu ajutorul acestui mecanism sincronizarea pentru cele dou exemple.
1.2.17. Exemplul 3.8. var e : eveniment memorizat;
1.2.18.

procesul p procesul q

1.2.19.

scriere(a); <debut_q>;

1.2.20.

e:=sosit;

1.2.21.

<continuare_p>

ateptare(e);
citire(a)

1.2.22. Analiza acestui sistem (care nu conine alte variabile de stare, dect evenimentul memorizat e) poate fi
fcut enumernd traiectoriile temporale posibile. Aceast analiz arat, c sincronizarea este corect
atunci cnd operaiile asupra evenimentului memorizat sunt indivizibile.

Exemplul 3.9.

var e : eveniment memorizat;


n : integer init 0;
procesul pi
<debut i>;

n:=n+1;

if n<N then
ateptare(e)
else
e:=sosit
endif
<continuare i>

O analiz mai atent, analogic celei din exemplul din 3.2.2.3, ne arat c acest program este incorect. Notnd un
registru local al procesului i prin Ri, aciunile (A) i (B) pot fi descompuse dup cum urmeaz:
load

Ri, n

ai

Ri, 1

-- adunare imediat

ci

Ri, N

--comparare imediat

br () etichet

-- salt dac Ri N

<ateptare (e)>
...
etichet :

...

Presupunem, c toate proceselor sunt n ateptarea punctelor lor de rendez-vous, cu excepia a dou, notate prin
pj i pk. Dac pj i pk vor fi executate pe traiectoria temporal (1 j, 1k, 2j,...), atunci fiecare va atribui lui n valoarea
final N-1 i se va bloca, drept rezultat toate procesele se vor bloca pentru un timp indefinit.

1.2.23.

54. Monitorul mecanism de sincronizare

1.2.23.1. Un monitor este constituit dintr-o mulime de variabile de stare i o mulime 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
specificaiilor problemei. Condiiile de blocare sau deblocare sunt exprimate ca funcie ale variabilelor de
stare, iar mecanismul de execuie a monitorului garanteaz manipularea acestor variabile n regim de
excludere mutual. Un monitor conine un fragment de cod de iniializare, executat o singur dat la
crearea monitorului.
1.2.23.2. Blocarea i deblocarea proceselor se exprim, n procedurile monitorului, prin intermediul unor condiii.
O condiie este declarat ca i o variabil, dar nu are valoare: o condiie c poate fi utilizat doar prin
intermediul a trei operaii sau primitive, efectul crora este descris mai jos (prin p am notat procesul, care
le execut)
1.2.23.3. c.ateptare

: blocheaz procesul p i l plaseaz n ateptarea lui c


: fn bool (true, dac nu exist nici un proces n ateptarea lui c, altfel false)

1.2.23.4. c.vid

1.2.23.5. c.semnalizare : if non c.vid then <deblocarea proceselor care sunt n ateptarea lui c> endif
1.2.23.6. Procesele, care sunt n ateptarea unei condiii c, sunt grupate ntr-un fir de ateptare asociat lui c. Putem
spune, c o condiie furnizeaz proceselor un instrument de desemnare a unui astfel fir de ateptare.
1.2.23.7. Un proces deblocat de c.semnalizare i reia execuia de la instruciunea, care urmeaz imediat primitivei
c.ateptare, care-l blocase.
1.2.23.8.

55. Exemple de utilizare

Exemplul 3.10.

sinc: monitor;
var fact: boolean;
term: condiie;
procedura terminare_scriere;
begin
fact:=true;
term.semnalizare
end
procedura debut_citire;
if non fact then
term.ateptare
endif
begin

-- iniializare

fact := false
end
end sinc
Monitorul este utilizat dup cum urmeaz:

Exemplul 3.11.

procesul p

procesul q

scriere(a);

<debut_q>

sinc.terminare_scriere;

sinc.debut_citire;

<continuare_p>

citire(a);

rendez-vous : monitor;
var n

: integer;

toi_sosii

: condiie;

procedura sosire;
begin
n := n+1;
if n < N then

toi_sosii.ateptare

--nu au sosit toate procesele

endif
toi_sosii.semnalizare

-- a sosit i ultimul

end
begin

-- iniializare

n:=0
end
end rendez_vous
Programul procesului pi va fi de forma:
procesul pi
<debut i>
rendez_vous.sosire;
<continuare i>
Este foarte important s nelegem funcionarea sincronizrii: procesul, care sosete ultimul la rendez_vous,
execut toi_sosii.semnalizare i deblocheaz unul dintre procesele, care sunt n starea ateptare. Acesta, la rndul
su, execut toi_sosii.semnalizare, deblocnd urmtorul proces i aa mai departe.

1.3.
1.3.1.

56. Implementarea sincronizrii


57. Probleme-tip

Experiena demonstreaz, c problemele de sincronizare logic ntlnite n practic pot fi reduse, n marea lor
majoritate, la combinaia unui numr mic de situaii elementare, schemele de soluionare ale crora sunt cunoscute.
Seciunile 3.4.2 3.4.5 sunt consacrate studierii acestor probleme-tip, utiliznd instrumentarul de baz, pus la
dispoziie de monitoare. Problemele-tip sunt urmtoarele:

1.3.2.

accesarea de ctre o mulime de procese a unei resurse partajate comune,


comunicarea ntre procese,
gestionarea perifericelor i intrrilor-ieirilor tamponate,
sincronizare temporal.

58. Administrarea unei resurse partajate

Considerm o resurs (fizic sau logic) partajat de o mulime de procese. Utilizarea acestei resurse trebuie s
respecte nite reguli de utilizare, destinaia crora const n garantarea unor proprieti specificate sau restricii de
integritate. Aceste restricii sunt specificate pentru fiecare resurs. O modalitate de garantare a respectrii regulilor
de utilizare a unei resurse const n adoptarea urmtoarei 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 cruia impune respectarea
restriciilor de integritate.

Cel mai simplu caz este acela al unei resurse pentru care singura restricie de integritate este de a fi utilizat n
excludere reciproc. Simpla grupare a procedurilor sale de acces ntr-un monitor unic garanteaz respectarea acestor
restricii.
59. Alocarea resurselor banalizate
Considerm o resurs pentru care exist un numr fix de N exemplare. Un proces poate accesa la cerere n uniti
din cele N, le poate utiliza i apoi elibera. Toate unitile 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 uniti
-ateptare n caz de eec
<utilizarea unitilor primite>
resurse.eliberare(n)
-- eliberarea resurselorCondiia de sincronizare se va scrie pentru orice proces:
aut(ps) :
n nlibere Monitorul resurse va utiliza direct condiia de sincronizare:
resurse: monitor;
var
nlibere : integer;

1.3.2.1.

disp

1.3.2.2.

procedura cerere(n);

procedura eliberare(n);

1.3.2.3.

begin

begin

1.3.2.4.

while n>nlibere do

1.3.2.5.

disp.ateptare;

1.3.2.6.

endwhile;

1.3.2.7.

nlibere:=nlibere-n

1.3.2.8.

: condiie;

nlibere:=nlibere+n;
disp.semnalizare

-- deblocare n lan

end;

end;

1.3.2.9.

-- iniializare

begin

1.3.2.10.

nlibere:=N

1.3.2.11.

end

1.3.2.12.

end resurse

resurse : monitor
type element : struct
lungime : integer
proc

: proces

end;
var nlibere : integer;
disp

: array[proces] of condiie;

<declaraia f.de at. f i procedurilor sale de accesare: introducere, extragere, primul>


procedura cerere(n);
begin
var e: element;
if n>nlibere then
e.lungime:=n;
e.proc:=p;

-- p este procesul apelant

introducere(e,f);

-- n ordinea de cretere a lungimii

disp[p].ateptare
endif;
nlibere:=nlibere-n
end;
procedura eliberare(n);
var e: element;
begin
nlibere:=nlibere+n;
while primul(f).lungime nlibere do
extragere(e,f);

-- elementul extras = primul (f)

disp[e.proc].semnalizare -- e.proc = procesul deblocat


endwhile;
end;
begin

-- iniializare

nlibere:=N;
f:=<vid>
end
end resurse

1.3.2.13.

60. Modelul cititorului i scriitorului

S considerm un fiier manipulat de procese din dou clase diferite: cititori, care consult fiierul fr a
modifica coninutul lui i scriitori, care pot modifica acest coninut. Fie pentru un moment arbitrar de timp ncit i
nscr numrul de cititori i de scriitori, respectiv, care folosesc o procedur de acces la fiier. Cererea de asigurare a
coerenei fiierului ne impune s respectm urmtoarele restricii:

sau

(nscr=0) i (ncit0)

-- fiier n citire

(nscr =1) i (ncit=0)

-- fiier n scriere

Fie fich un monitor care asigur respectarea acestor restricii. Vom impune urmtoarea form a acceselor la
fiier:
proces cititor

proces scriitor

fich.debut_citire;

fich.debut_scriere;

<acces citire>

<acces scriere>

fich.terminare_citire;

fich.terminare_scriere;

Procedurile debut_citire, terminare_citire, debut_scriere, terminare_scriere trebuie s asigure respectarea


restriciilor de mai sus. Vom implementa aceste restricii autoriznd depirile; pentru aceasta este necesar s fie
precizate prioritile ntre cititori i scriitori.
Cu titlu de exemplu, presupunem c cititorii au prioritate n faa redactorilor (o scriere nu va fi autorizat,
dac exist cititori n ateptare). Definim urmtoarele variabile de stare:
scr = o scriere este n curs (valoare boolean)
nc = numrul de cititori n ateptare sau n curs de citire
n acest caz, condiiile de depire se vor exprima dup cum urmeaz:
(nu exist scrieri curente)

aut(citire) :

scr=false

aut(scriere):

scr=false i nc=0 (nici scrieri nici citiri n curs, nici cititori n ateptarea)

Monitorul, care urmeaz traduce direct aceste condiii.


fich : monitor;
var scr
nc

: boolean;
: integer;

c_scr, c_cit : condiie;


procedura debut_citire;
begin
nc:=nc+1;
if scr then
c_cit.ateptare;
endif
end
procedura terminare_citire;
begin
nc:=nc-1;
if nc=0 then

-- ultimul cititor a terminat

c_scr.semnalizare
endif
end
procedura debut_scriere;
begin
if scr or nc>0 then

-- scriere sau citire n curs

c_scr.ateptare
endif;
scr:=true
end
procedura terminare_scriere;
begin
scr:=false;
if nc>0 then

-- prioritate cititorilor care ateapt

c_cit.semnalizare
else
c_scr.semnalizare
endif
end
begin

-- iniializare

scr:=false;
nc:=0
end
end fich
Pot fi definite i programate i alte reguli de prioritate.

1.3.3.

61. Comunicarea ntre procese

Procesele pot comunica prin accesarea unei mulimi de variabile comune. Acest mod de comunicare este slab
structurat i ineficace, deoarece el trebuie s asigure excluderea reciproc a variabilelor. Este utilizat doar n cazuri
speciale, cum ar fi un nucleu de sincronizare, unde excluderea mutual global este redus la secvene scurte i bine
protejate. Pentru cazuri generale sunt utilizate alte moduri de comunicare. Vom prezenta mai nti o schem de baz
pentru comunicarea prin mesaje - modelul productorului i consumatorului, realizat cu ajutorul monitoarelor
(3.4.3.1). O alt posibilitate, descris n 3.4.3.2, const n a considera operaiile de comunicare ca un fel de
mecanisme primitive de sincronizare. n 3.4.3.3 prezentm o aplicaie frecvent de comunicare modelul clientserver.
1.3.3.1.

62. Modelul productorului i consumatorului

O schem uzual de comunicare este cea n care un proces (productorul) trimite mesaje unui alt proces
(consumatorul), utiliznd un tampon n memoria comun. Mesajele sunt de lungime fix i capacitatea tamponului
este de N mesaje.
Specificaiile comunicaiei sunt urmtoarele:
un mesaj dat poate fi preluat doar o singur dat dup ce a fost depozitat n tampon,
un mesaj nu trebuie s poat fi pierdut; dac tamponul conine N mesaje nepreluate, nu pot fi depozitate aici
mesaje suplimentare,
o operaie imposibil (depozitare ntr-un tampon plin sau preluare dintr-un tampon vid) blocheaz
procesul, care ncearc s o execute.
Condiiile de depire pot fi exprimate dup cum urmeaz, notnd prin n numrul de mesaje din tampon, care nu
au fost nc preluate:

aut(depozitare) : n < N

-- tamponul nu este plin

aut(preluare) : n > 0

-- tamponul nu este vid

Respectarea acestor restricii este asigurat de un monitor tampon, utilizat dup cum urmeaz:
proces productor

proces consumator

...

...

produce(mesaj_emis);

tampon.preluare(mesaj_recepionat);

tampon.depozitare(mesaj_emis);

consumator(mesaj_recepionat);

Monitorul tampon poate fi elaborat, transcriind n mod direct autorizrile de depire:


tampon : monitor;
var n

: 0..N;

non_plin, non_vid

: condiie;

<declaraii ale procedurilor depozitare i preluare>


procedura depozitare(m:mesaj);
begin
if n=N then
non_plin.ateptare
endif;
n:=n+1;
introducere(m);
non_vid.semnalizare
end
procedura preluare(var m:mesaj);
begin
if n=0 then
non_vid.ateptare
endif;
preluare(m);
n:=n-1;
non_plin.semnalizare
end;
-- iniializare

begin
n:=0;
end
end tampon

Procedurile introducere(m) i preluare(m) definesc politica de gestionare a tamponului i reprezentarea intern a


mesajelor. Un caz frecvent este acela n care mesajele sunt reprezentate de elementele succesive ale unui tablou,
administrat n mod circular. n acest caz mesajele sunt preluate n ordinea depozitrii. Procedurile de gestionare a
tamponului se vor scrie astfel:
type mesaj : <descrierea formatului mesajelor>
ptr
var fa

: 0..N-1;
: array[ptr] of mesaj;

top, coad: ptr;

procedura intrare(m:mesaj);
begin
fa[coad]:=m;
coad:=coad+1 mod N
end;
procedura ieire(var m:mesaj);
begin
m:= fa[top];
top:=top+1 mod N
end;
<iniializarea se va completa cu top:=0; coad:=0;>
Aceast schem poate fi extins pentru mai muli productori i consumatori. Drept efect, procedurile
monitorului asigur accesarea exclusiv la mesaje ntre productori i consumtori. Totui, n cazul a mai muli
consumatori schema nu permite direcionarea unui mesaj ctre un consumator anumit: putem doar garanta, c un
mesaj va fi preluat de un consumator (i numai de unul singur) fr a specifica concret de care.
1.3.3.2.

63. Primitive de comunicare

Schimbul de mesaje ntre procese, n afar de funcia de transmitere a informaiei, poate fi utilizat i pentru
ordonarea evenimentelor n cadrul unor procese distincte, deoarece emiterea unui mesaj precede ntotdeauna
recepia sa. Operaiile de schimb de mesaje pot fi definite ca nite mecanisme primitive i s le utilizm pentru
sincronizarea proceselor.
Primitivele de baz n comunicarea prin mesaje sunt:
emitere(mesaj,destinaie)
recepie(mesaj,origine)
Specificrile acestor primitive trebuie s precizeze:

natura i forma mesajelor,


modul de adresare a proceselor emitoare i destinatare,
modul de sincronizare a acestor procese,
tratarea erorilor.

1) Natura mesajelor
n conformitate cu nivelul de exprimare la care este definit mecanismul de comunicare, mesajele pot fi
specificate de un tip, analogic obiectelor unui limbaj sau prin lungimea fizic a lor. Lungimea poate fi constant sau
variabil. Mai frecvent sunt utilizate mesajele de lungime constant, care pot fi create mai simplu, mesajele de
lungime variabil vor fi transmise prin referin, pasnd adresa fizic sau identificatorul informaiei transmise.
2) Modul de adresare
Procesele, care fac schimb de mesaje, se pot desemna reciproc prin numele lor (desemnare direct) sau pot
utiliza numele unui obiect intermediar ori cutie potal (desemnare indirect). Aceste nume sunt folosite ca
parametri origine i destinaie. Schema a doua faciliteaz modificarea dinamic a interconexiunilor proceselor sau
chiar componentele unei mulimi de procese, care comunic.
n cazul desemnrii directe parametrul origine a primitivei recepie poate fi interpretat n dou moduri:

fie ca dat: receptorul specific explicit c ateapt un mesaj de la un destinatar special (recepie selectiv),
fie ca rezultat: receptorul primete un mesaj care i-a fost adresat mpreun cu identitatea emitorului.

n cazul desemnrii indirecte asocierea proceselor cutiilor potale poate fi static sau dinamic. n ultimul caz,
sunt utilizate dou primitive conectare i deconectare pentru ataarea procesului la o cutie potal (n calitate de
receptor) i de abrogare a acestei atari, respectiv. n unele sisteme un receptor sau mai multe pot fi ataate unei
cutii potale date; cutiile potale supuse unor asemenea restricii sunt adesea numite pori. Este posibil i situaia
invers cnd un proces poate fi asociat la mai multe pori distincte. Dac asocierea ntre procesul receptor i poart
este static, un nume de poart specific fr ambiguitate un proces receptor ca i n metoda desemnrii directe.
3) Moduri de sincronizare

Pentru primitivele de comunicare pot fi specificate mai multe moduri de sincronizare. n caz general, operaia de
recepie blocheaz, n absena mesajului, receptorul. Unele sisteme pun la dispoziie primitive care dau posibilitatea
s se determine dac o cutie potal este vid, ceea ce permite evitarea blocrii. Pentru emitere sunt utilizate dou
moduri de sincronizare:

Schema productor-consumator, n care cutia potal este realizat printr-o zon tampon. Emiterea nu este
blocant, cu excepia cazului n care tamponul este plin. Folosirea tampoanelor de lungime variabil cu
alocarea dinamic a locaiunilor reduce probabilitatea blocrii emitorului.

Schema rendez-vous, n care emitorul este blocat pn la preluarea mesajului de ctre receptor. Aceast
schem poate fi considerat caz limit a precedentei cu lungimea nul a tamponului.

n fine, atunci cnd un proces este asociat n recepie la mai multe pori, poate fi definit un mod de sincronizare,
zis ateptare multipl, n care sosirea unui mesaj la o oarecare din aceste pori deblocheaz receptorul.
4) Tratarea erorilor
Scopul tratrii erorilor este de a evita blocrile infinite ale proceselor, care se pot produce n diverse
circumstane:

Emiterea unui mesaj cu o destinaie (proces sau poart) inexistent. n acest caz primitiva nu este blocant;
eroarea este tratat prin emiterea unui cod de eroare sau printr-o deviere.

Distrugerea unui proces de la care alte procese ateapt un mesaj sau un rspuns: procesele n ateptare sunt
blocate i recepioneaz un cod de eroare.

Ultima situaie nu este totdeauna detectabil. O tehnic uzual const n stabilirea unui interval de timp maxim
de ateptare a unui mesaj i deblocarea procesului care ateapt la expirarea acestui interval (v. 3.4.5).
Vom ilustra prin cteva exemple reprezentative utilizarea acestor mecanisme de comunicare.
Exemplul 3.12. Sistemul de operare Thoth [8]. n acest sistem comunicarea folosete desemnarea direct i sincronizarea prin rendez-vous.
Mesajele sunt de lungime constant. Sunt utilizate patru primitive:
id:=send(message, id_dest)
emite procesului id_dest un mesaj; blocheaz emitorul pn la primirea unui rspuns, transmis n message. Aceast
primitiv indic identitatea procesului care a transmis rspunsul (sau nil, dac destinatarul nu exist).
id:=receive(message, id_orig)
recepioneaz un mesaj; procesul origine poate s nu fie specificat. Valoarea transmis este identitatea emitorului.
reply(message, id_orig, id_dest)
trimite un rspuns destinatarului specificat (care trebuie s-l atepte); nu este blocant; fr consecine, dac rspunsul nu
era ateptat.
forward(message, id_orig, id_dest)
aceast operaie non blocant este utilizat de un proces dup recepionarea unui mesaj trimis de ctre id_orig, pentru ca s
impun mesajul s ajung la id_dest, care are acum obligaia de a rspunde lui id_orig.
Exemplul 3.13. Sistemul de operare Unix [9]. n sistemul Unix comunicarea ntre procese utilizeaz tampoane, numite pipes (tuburi),
administrate conform schemei productor-consumator. Mesajele transmise sunt caractere. Un pipe (tub) leag un emitor i un
receptor, conexiunea fiind stabilit dinamic.
Exemplul 3.14. Rendez-vous n limbajul de programare Ada [10, 11]. Limbajul Ada permite definirea proceselor. Forma sintactic a
comunicrilor ntre procese este apelarea procedurii, ns transmiterea parametrilor i a rezultatelor are loc conform principiului
de transmitere a mesajelor cu rendez-vous. Recepionarea poate fi condiionat (un apel este acceptat doar dac o condiie
specificat este satisfcut) i exist posibilitatea de ateptare multipl.

1.3.3.3.

64. Aplicaii : relaia client-server

O aplicaie curent a comunicrilor ntre procese este relaia client-server. Un proces server are n arj
ndeplinirea unor servicii (executarea unui program predefinit) proceselor client. Pentru aceasta poate fi utilizat
urmtoarea schem:
procesul server

procesul client

ciclu

poart_serviciu.emitere(cerere)

poart_serviciu.recepionare(cerere)

<executare serviciu>

...

[poart_client.emitere(rezultat)]

...

endciclu
Secvenele din parantezele ptrate sunt facultative.

[poart_client.recepionarere(rezultat)]

Procesul server este asociat unei pori, unde clienii i depun cererile, trimind cereri; el este blocat atta timp
ct nu exist cereri de servicii n ateptare.
Serviciul cerut poate conine trimiterea la client a rezultatului. n acest caz clientul trebuie s trimit serverului n
cererea sa numrul unei pori la care el se va bloca n ateptarea rezultatului.
Fr a modifica schema de mai sus putem introduce mai multe procese server echivalente, oricare dintre ele fiind
n stare s satisfac o cerere a unui serviciu. Aceste servere n recepie vor fi asociate la una i aceeai cutie potal.
Modelul din 3.4.2.1 (alocarea resurselor banalizate) i modelul client-server de mai sus sunt reprezentative
pentru dou scheme de obinere a unui serviciu cu ajutorul proceselor ntr-un sistem de operare: apelarea de
procedur ntr-un monitor sau activarea uni proces server ciclic prin emiterea mesajelor. Alegerea ntre
aceste dou scheme este dictat de considerente de eficacitate (schema serverului este preferat, atunci cnd
exist paralelism real ntre client i server) sau de uniformitate a structurii.

65. Administrarea intrrilor-ieirilor

1.3.4.

Vom arta cum poate fi integrat administrarea intrrilor-ieirilor n mecanismul monitoarelor. Prezentm mai
nti gestionarea unui periferic izolat, apoi, ca exemplu de aplicaie, principiul unei gestionri tamponate a intrrilorieirilor.
1.3.4.1.

66. Administrarea unui periferic

Fiecrui periferic i este asociat un monitor procedurile externe ale cruia permit executarea intrrilor-ieirilor la
acest periferic. Acest monitor are urmtoarea form general (pentru un sistem mono-utilizator):
perif:

monitor;
var ..., sfr_schimb_i,...: condiie;
<declaraiile variabilelor de stare ale perifericului>
...
procedura schimb_i(<parametri>);
begin
<mascarea ntreruperilor>;
if starea preg then
<tratare eroare(perifericul nu este gata)>
endif;
lansare_transfer_i(parametri);
sfr_schimb_i.ateptare;

-- ntrerupere demascat

if starea ok then

-- n timpul ateptrii

<tratare eroare(incident de transfer)>


endif;
<demascare ntreruperi>
end;
...
begin
<iniializare>
end
end perif
Procedura lansare_transfer_i pregtete programul pentru schimbul cerut (construirea programului canalului
sau al ADM - Acces Direct la Memorie, innd cont de parametrii schimbului) i lanseaz execuia sa (instruciunea
SIO Start Input Output). Procesele apelante ateapt sfritul transferului datorit condiiei sfr_schimb_i. Sosirea
unei ntreruperi, care marcheaz sfritul schimbului de tip i provoac n mod automat executarea urmtoarei
secvene:
if sfr_schimb_i.vid then <tratarea eroare ntrerupere care nu este ateptat>

else sfr_schimb_i.semnalizare
endif
Pentru un proces care execut o intrare-ieire apelnd o procedur de schimb a acestui monitor, totul se petrece
ca i cum schimbul este sincron: la returul din procedur, informaia a fost efectiv transferat (sau o eroare a fost
detectat i semnalizat). Mecanismul de blocare evit ateptarea activ i procesorul poate fi utilizat n timpul
transferului de un alt proces.
67. Buferizarea imprimrii

1.3.4.2.

Putem elabora acum programul administrrii tamponate a imprimrii, descrise n 3.1. Avem nevoie de trei
tampoane 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 tampon este comandat de
un monitor cu aceeai structur care are rolul de a asigura excluderea mutual i sincronizarea condiiilor tampon
plin i tampon vid.
Aceste tampoane, numite tampon1, tampon2 i tampon_disc au aceeai structur cu tamponul descris n 3.4.3,
nlocuind N cu N1, N2 i Ndisc, respectiv. Definind tm1, tm2 i td ca tablouri de elemente de lungimea unei linii i
pointerii top i coad locali fiecrui monitor, procedurile de depozitare i preluare pot fi:
<pentru tamponul 1>

<pentru tamponul 2>

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 ieire(var l:linie);

procedura ieire(var l:linie);

l := tm1[top];

l := tm2[top];

top := top+1 mod N1

top := top+1 mod N2

n monitorul tampon_disc operaiile de depozitare i preluare sunt intrri-ieiri, care utilizeaz monitorul de
gestionare a discului:
procedura intrare(l:linie);
disc.scriere(l,td[coad]);
coad := coad+1 mod Ndisc
procedura ieire(var l:linie);
disc.scriere(l,td[top]);
top := top+1 mod Ndisc
Programul de intrare-ieire este realizat prin cooperarea a patru procese programul crora este prezentat
schematic mai jos (trei procese ale sistemului de operare i procesul utilizator). Pentru a simplifica expunerea au fost
omise secvenele de tratare a erorilor i am admis, c sistemul funcioneaz n regim permanent fr limitarea
numrului de linii la imprimare. Programele folosesc trei monitoare de gestionare a perifericelor (tampon1, tampon2
i tampon_disc) i dou monitoare de gestionare a perifericelor (impr i disc), construite n baza modelului perif,
prezentat n 3.4.4.1
proces imprimare linie

proces scriere_disc

proces citire_disc

ciclu

ciclu

ciclu

tampon2.preluare(l);

tampon1.preluare(l);

tampon_disc.citire(l);

impr.scriere(l);

tampon_disc.scriere(l);

tampon2.depozitare(l);

endciclu

endciclu

endciclu

Imprimarea unei linii este cerut de procedura:


procedura scriere_linie(l:linie);
tampon1.depozitare(l)
Putem constata, c programele de mai sus sunt mult mai simple dect cele care folosesc direct ntreruperile.
Structura modular, introdus de monitoare permite separarea total a gestionrii tampoanelor de cea a perifericelor.
Schimbarea capacitii unui tampon modific doar monitorul care comand acest tampon; nlocuirea unui periferic
cu un altul implic rescrierea doar a monitorului, care comand acest periferic.

68. Sincronizare temporal

1.3.5.
1.4.

Sincronizarea temporal face ca timpul s intervin nu numai ca mijloc de ordonare a evenimentelor, dar i
ca msur de durat absolut. Acest mod de sincronizare este utilizat n aplicaiile de timp real, care conin
interaciuni cu organe externe (comanda proceselor industriale, de exemplu).

1.5.

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 declana o ntrerupere

la fiecare impuls sau

pentru a decrementa n mod automat coninutul unui registru contor, o ntrerupere este declanat
atunci cnd coninutul acestui registru atinge valoarea 0.

69. Gestionarea dinamic a proceselor

1.6.
1.7.

n sistemele cele mai simple procesele sunt n numr constant i create odat pentru totdeauna la generarea
sistemului de operare. n sistemele performante, mai ales n cele interactive, procesele sunt comandate
dinamic. Astfel, n Multics, un proces nou este creat odat cu admiterea unui nou utilizator; n Unix, la
executarea fiecrei comenzi.

1.8.

Primitivele de creare i distrugere a proceselor pot fi puse n arja sistemului de operare sau la dispoziia
utilizatorilor. Crearea unui proces presupune alocarea resurselor i iniializarea contextului. Distrugerea unui
proces elibereaz toate resursele care i-au fost alocate.

1.9.

Primele primitive, propuse pentru gestionarea dinamic a proceselor, au fost fork i join. Istoric i cronologic,
aceste operaii au fost introduse pentru organizarea executrii paralele a programelor pe un sistem
multiprocesoral, noiunea de proces nefiind nc clar.

1.10. Fie P o procedur. Instruciunea


1.11.

id := fork(p),

1.12. executat de procesul p (printe), creeaz un proces nou q (fiul), care va fi executat paralel cu p. Primitiva
fork prezint ca rezultat identificatorul lui q (sau nil, dac imposibil). Contextul iniial al lui q este o copie a
lui p, nu i contorul ordinal, care este fixat la prima instruciune a lui p. Procesul fiu se termin cu o
primitiv, numit exit sau quit, care provoac dispariia sa.
1.13. Dup ce fork creaz un proces fiu q, primitiva join q permite procesului printe s fixeze un punct de rendezvous cu acest fiu. Executarea lui join q blocheaz procesul printe pn cnd q nu va executa exit. Primitivele
fork i join au avantajele i dezavantajele instruciunii go to din programarea secvenial.

1.14. 70. Sincronizarea n Windows


Platforma pe 32 de bii pune la dispoziia programatorului instrumente evoluate pentru multiprogramare, att la nivelul unei mulimi de
lucrri, ct i a unei lucrri singulare. Poate s apar ntrebarea CND s fie utilizat multiprogramarea n cadrul unei singure aplicaii.
Rspunsul este foarte simplu: atunci cnd dorim ca mai multe fragmente de cod s fie executate simultan (pseudosimultan, dac exist mai
multe fragmente dect procesoare). De exemplu, dac dorim ca unele activiti s fie ndeplinite n regim de fond sau programul s continue
s reacioneze la unele evenimente exterioare n timpul ndeplinirii unor calcule foarte costisitoare. Pot fi aduse i alte exemple.

1.14.1.

71. Procese i fire

Numim proces n Windows o instan (un exemplar) a programului, ncrcat n memoria operativ. Aceast
instan poate crea fire (thread) - secvene de instruciuni, care urmeaz a fi executate. Este important s se neleag
c n Windows anume firele sunt executate (nu procesele!), fiecrui proces fiindu-i asociat minimum un fir, numit
firul principal al aplicaiei.
Deoarece n realitate exist mult mai multe fire dect procesoare fizice, firele vor fi executate secvenial, timpul
de procesor repartizndu-se ntre fire. Dar viteza mare de execuie i frecvena mare de comutare a firelor las
impresia unei execuii paralele a acestora.
Fr comentarii suplimentare subliniem, c strile elementare ale unui fir sunt aceleai ca i n cazul proceselor:
ales (exe), eligibil (ready) i blocat (wait). Starea blocat este asociat ateptrii unui anume eveniment. Cnd
evenimentul se produce firul este trecut n mod automat n starea eligibil. De exemplu, dac un fir execut anumite
calcule, iar un alt fir este obligat s atepte rezultatele pentru a le salva pe disc, al doilea fir ar putea utiliza un ciclu
de tipul "while(!isCalcFinished ) continue;". Este ns simplu s ne convingem, c n timpul execuiei acestui ciclu
procesorul este ocupat 100% - este cazul ateptrii active. Astfel de cicluri trebuie evitate prin utilizarea
mecanismelor de sincronizare.
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 aplicaii) i fire de lucru, care sunt funcii
simple. n ultimul caz execuia firului se ncheie atunci cnd calculele, generate de funcia respectiv, iau sfrit.

Merit atenie i modalitatea organizrii ordinii de execuie a firelor. Algoritmul FIFO este departe de a fi cel mai optimal. n Windows
toate firele sunt ordonate conform prioritilor. Prioritatea unui fir este un numr ntreg de la 0 la 31 i este determinat de prioritatea
procesului, care a generat firul i prioritatea relativ a firului. n acest mod se ajunge la o flexibilitate maxim, fiecrui fir punndu-i-se la
dispoziie n caz ideal exact atta timp de procesor, ct are nevoie.

Prioritatea firului poate fi modificat dinamic. Firele interactive, care au prioritatea Normal, sunt executate n
mod deosebit de ctre sistem, prioritatea acestor fire fiind majorat, atunci cnd procesul, care le-a generat, se afl n
planul central (foreground). n rezultat, aplicaia curent reacioneaz mai repede la cererile utilizatorului.

1.14.2.

72. Necesitatea sincronizrii

Cnd un proces este creat n mod automat este creat firul principal al acestuia. Acest fir poate crea n timpul
execuiei alte fire, care la fel pot crea fire noi i aa mai departe. Timpul de procesor fiind repartizat ntre fire,
fiecare fir lucreaz n mod independent.
Toate firele unui proces mpart resursele comune, de exemplu, spaiul de adrese al memoriei operative sau
fiierele deschise. Aceste resurse aparin ntregului proces, deci i fiecrui fir. Fiecare fir poate s utilizeze aceste
resurse fr nici un fel de restricii. n realitate, din cauza multitaskingului controlat (preemptive multitasking - la
orice moment de timp sistemul poate ntrerupe execuia unui fir i transmite controlul unui alt fir), se poate ntmpla
ca un fir s nu fi terminat nc lucrul cu o resurs comun oarecare, iar sistemul s treac la un alt fir, care utilizeaz
aceeai resurs. Rezultatele pot fi imprevizibile. Asemenea conflicte se pot produce i n cazul unor fire, care aparin
chiar unor procese diferite. Problema poate s apar ntotdeauna cnd dou sau mai multe fire folosesc o resurs
comun. Este necesar un mecanism de coordonare a lucrului firelor cu resurse comune. n Windows acest mecanism
se numete sincronizarea firelor (thread synchronization).

1.14.3.

73. 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 (unele pentru firele unui singur proces) 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 fiier pe disc, un port, un articol al unei baze de date, o variabil global a unui program, accesibil
firelor unui singur procesor, un obiect al dispozitivului interfeei grafice (Graphic Device Interface), etc.
De obicei, sunt utilizate mecanismele (obiectele) de sincronizare, introduse mai sus: excluderea mutual (mutex),
secia critic (critical section), eveniment memorizat (event) i semaforul (semaphore), fiecare realiznd metoda
proprie de sincronizare. n calitate de obiecte sincronizate pot fi chiar procesele sau firele (cnd un fir ateapt
terminarea execuiei unui proces sau a unui alt fir), fiierele, dispozitivele de comunicaie, etc.
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 atepte modificarea acestei stri, coordonndu-i n acest fel aciunile proprii.
Este foarte important s se sublinieze, c atunci cnd un fir lucreaz cu mecanismele de sincronizare (le creeaz, le
modific starea) sistemul nu ntrerupe execuia firului, pn nu va fi terminat aceast aciune, adic toate operaiile
finite din mecanismele de sincronizare sunt atomare (nu pot fi ntrerupte).
Menionm de asemenea, c nu exist nici o legtur real ntre mecanismele de sincronizare i resurse.
Mecanismele de sincronizare nu pot interzice accesul nedorit la o resurs, ele doar indic firului momentul cnd
acesta poate accesa resursa, sau cnd acesta trebuie s atepte (de exemplu, un semafor la o intersecie doar indic
cnd este permis trecerea. Cineva poate trece pe rou, dar consecinele pot fi grave).

1.14.4. 74. Excluderea mutual (3.6.4.1)


Cum a fost menionat deja, mecanismele de excludere mutual (mutex-ele, de la MUTual EXclusion) permit
coordonarea accesului la o resurs partajat (processor de ex.). Starea set a obiectului corespunde momentului de
timp n care obiectul nu aparine nici unui fir i poate fi utilizat, iar starea reset momentului cnd 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 funciile de ateptare. Firul, cruia i aparine
mutex-ul, l poate ocupa de mai multe ori, fr autoblocare, ns mai apoi acesta va trebui eliberat tot de attea ori
cu ajutorul funciei ReleaseMutex.

75. Evenimentele (3.6.4.2) Obiectele-evenimente sunt utilizate pentru a informa firele, care sunt n ateptare, despre
producerea unui eveniment. n Windows exist dou tipuri de evenimente cu resetare manual i automat.
Resetarea manual se execut cu funcia ResetEvent. Aceste evenimente sunt folosite pentru informarea mai multor
fire, iar evenimentele cu resetare automat sunt utilizate pentru informarea unui anumit fir, celelalte rmnnd n
ateptare.
Funcia CreateEvent creaz un obiect-eveniment, funcia SetEvent seteaz evenimentul n starea set, iar funcia
ResetEvent reseteaz evenimentul. Funcia PulseEvent seteaz evenimentul, iar dup semnalizarea firelor, care erau
n ateptare (toate n cazul resetrii manuale i doar unul la resetarea automat), reseteaz obiectul. Dac nu exist
fire n ateptare, PulseEvent doar reseteaz obiectul, fr semnalizare.

1.14.5. 76. Semafoarele


Un obiect-semafor este n ultim instan un mutex cu contor. Acest obiect permite s fie ocupat de un numr
anume de fire, dup care ocuparea va fi posibil numai dac unul din fire va elibera semaforul. Semafoarele
sunt utilizate pentru a limita numrul de fire, care lucreaz simultan cu resursa. La iniializare se specific numrul
maxim de fire, la fiecare ocupare valoarea contorului semaforului scade.

1.14.6. 77. Seciunile critice


Obiectul-seciune critic permite programatorului s evidenieze un fragment de cod n care firul obine acces la
o resurs partajat, prentmpinnd utilizarea resursei de mai muli utilizatori. Pentru a utiliza resursa firul va intra
mai nti n seciunea critic (apelarea funciei EnterCriticalSection). Dac intrarea a avut loc, nici un alt fir nu va
avea acces la aceeai seciune critic, execuia acestuia fiind suspendat. Reluarea se va produce n momentul n
care primul fir prsete seciunea critic (funcia LeaveCriticalSection). Diferena de mutex const n faptul c
seciunea critic este utilizat numai pentru firele unui singur proces.
Cu ajutorul funciei TryEnterCriticalSection se poate stabili, dac seciunea critic este liber. Utiliznd aceast
funcie,
un proces, fiind n ateptarea resursei, poate s nu se blocheze, ndeplinind operaii utile.

1.14.7. 78. Protejarea accesrii variabilelor


Exist o serie de funcii, care permit lucrul cu variabilele globale ale tuturor firelor, fr a ne preocupa de
sincronizare, deoarece aceste funcii singure rezolv problema sincronizrii. Aceste funcii sunt
InterlockedIncrement,
InterlockedDecrement, InterlockedExchange, InterlockedExchangeAdd i InterlockedCompareExchange. De
exemplu, funcia InterlockedIncrement incrementeaz valoarea unei variabile pe 32 bii cu o unitate.

79. Sincronizarea n MFC(Microsoft Fundation Classes)


Biblioteca MFC conine clase speciale pentru sincronizarea firelor (CMutex, CEvent, CCriticalSection i
CSemaphore).

Pentru utilizarea acestor clase trebuie consultai constructorii i metodele lor Lock i Unlock. n principiu, aceste
clase sunt doar un fel de ambalaj pentru obiectele de sincronizare.
O alt modalitate de utilizare a acestor clase const n crearea aa numitelor clase thread-safe. O clas threadsafe reprezint o anumit resurs n program. Tot lucrul cu resursa este realizat numai prin intermediul acestei clase,
care conine toate metodele necesare. Clasa este proiectat n aa mod, ca metodele ei s rezolve problema
sincronizrii, adic n cadrul aplicaiei s apar ca o simpl clas. Obiectul de sincronizare MFC este inclus n
aceast clas n calitate de membru privat i toate funciile clasei, care realizeaz accesarea resursei, i coordoneaz
lucrul cu acest membru.

1.14.8. 80. Exemplu de sincronizare n Windows


Prezentm un exemplu simplu de lucru cu obiectul de sincronizare mutex [22].
#include
<windows.h>
#include
<iostream.h>
void main()
{
DWORD res;
// crem obiectul excludere mutual
HANDLE mutex = CreateMutex(NULL, FALSE,
"NUME_APLICATIE-MUTEX01");
// dac obiectul exist deja, CreateMutex va returna
descriptorul obiectul existent,
// iar GetLastError va returna ERROR_ALREADY_EXISTS
// timp de 20 s ncercm s ocupm
obiectul
cout<<"ncerc s ocup
obiectul...\n"; cout.flush();
res =
WaitForSingleObject(mutex,20000);
if (res == WAIT_OBJECT_0) // dac ocupare s-a terminat cu
succes
{
// ateptm 10 s
cout<<"L-am prins! Ateptare 10 secunde...\n";
cout.flush();
Sleep(10000);
// eliberm obiectul
cout<<"Acum eliberm obiectul\n"; cout.flush();
ReleaseMutex(mutex);
}
// nchidem descriptorul
CloseHandle(mutex);
}
Pentru a controla modul de funcionare a mecanismului de excludere mutual se vor lansa dou instane ale acestei
aplicaii. Prima instan va ocupa obiectul imediat i-l va elibera doar peste 10 secunde. Numai dup aceasta
instana a doua va reui s ocupe obiectul. n acest exemplu obiectul de sincronizare este folosit pentru
sincronizarea proceselor, din care cauz n mod obligatoriu trebuie s aib nume.

1.14.9. 81. Utilizarea seciunilor critice n Windows


Exemplu: fie variabila m_pObject i cteva fire, care apeleaz metodele obiectului referit de m_pObject.
Presupunem
c aceast variabil din timp n timp i poate schimba valoarea, valoarea 0 nu este interzis. Fie urmtorul fragment
de cod:

/
/
F
i
r
u
l
#
1
v
o
i
d
P
r
o
c
1
(
)
{
if (m_pObject)
m_pObject->SomeMethod();
}
// Firul #2
void Proc2(IObject *pNewObject)
{
if (m_pObject)
delete
m_pObject;
m_pObject =
pNewObject;
}

n acest exemplu exist pericolul potenial de apelare m_pObject->SomeMethod() dup ce obiectul a fost distrus
cu ajutorul delete m_pObject, deoarece n sistemele de operare cu multitasking controlat execuia oricrui fir poate
fi ntrerupt n cel mai neconvenabil moment i s nceap execuia unui alt fir. Pentru exemplul nostru momentul
nedorit este atunci cnd firul #1 a testat deja m_pObject, dar nu a reuit s apeleze SomeMethod(). Execuia firului
#1 a fost ntrerupt i a nceput execuia firului #2. Iar firul #2 reuise deja s apeleze destructorul obiectului. Ce se
va ntmpla atunci cnd firului #1 i se va acorda din nou timp de procesor i va fi apelat SomeMethod() al unui
obiect deja inexistent? Greu de presupus. Aici ne vin n ajutor seciunile critice. S modificm exemplul de mai sus.

/
/
F
i
r
u
l
#
1
v
o
i
d
P
r
o
c
1
(
)
{
::EnterCriticalSection(&m_l
ockObject);
if
(m_pObject)
m_pObject->SomeMethod();
::LeaveCriticalSection(&m_lockObject);
}
// Firul #2
void Proc2(IObject *pNewObject)
{
::EnterCriticalSection(&m
_lockObject); if
(m_pObject)
delete
m_pObject; m_pObject
= pNewObject;
::LeaveCriticalSection(&m_lockObject);

}
Fragmentul de cod inclus ntre ::EnterCriticalSection() i ::LeaveCriticalSection() cu una i aceeai seciune
critic n calitate de parametru nu va fi executat nici o dat n mod paralel. Aceasta nseamn, c dac firul #1 a
reuit s acapareze seciunea critic m_lockObject, ncercarea firului #2 s intre n aceeai seciune critic va
conduce la blocarea acestuia pn n momentul cnd firul #1 va elibera m_lockObject prin apelul
::LeaveCriticalSection(). Invers, dac firul #2 a accesat seciunea critic naintea firului #1, acesta din urm va fi
nevoit s atepte, nainte de a ncepe lucrul cu m_pObject.
Menionm, c seciunile critice nu sunt obiecte ale nucleului sistemului de operare. Practic, tot lucrul cu
seciunile critice are loc in procesul care le-a creat. Din aceasta rezult, c seciunile critice pot fi utilizate numai
pentru sincronizare n cadrul unui proces.

1.14.10. 82. Structura RTL_CRITICAL_SECTION


Este definit dup cum urmeaz:
typedef struct _RTL_CRITICAL_SECTION
{
PRTL_CRITICAL_SECTION_DEBUG DebugInfo; // Folosit de sistemul de operare
LONG LockCount;

// Contorul de utilizri

LONG RecursionCount; // Contorul accesrii repetate din firul utilizatorului


HANDLE OwningThread; // ID firului utilizatorului (unic)
HANDLE LockSemaphore;
ULONG_PTR SpinCount;

// Obiectul nucleului folosit pentru ateptare


// Numrul de cicluri goale naintea apelrii nucleului

}
RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;

Cmpul LockCount este incrementat cu o unitate la fiecare apelare ::EnterCriticalSection() i decrementat cu unu
la fiecare apel ::LeaveCriticalSection().
n cmpul RecursionCount este pstrat numrul de apeluri repetate ::EnterCriticalSection() din unul i acelai
fir.
Cmpul OwningThread conine 0 n cazul seciunilor critice libere sau identificatorul unic al firului-posesor.
Cmpul LockSemaphore este folosit, dac este necesar s se atepte pn seciunea critic este
eliberat. Dac dup un numr de SpinCount ori seciunea critic nu a fost eliberat, trecem n starea
blocat.

1.14.11. 83. Funcii API pentru seciunile critice


Funciile BOOL InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection) i BOOL
InitializeCriticalSectionAndSpinCount(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount). Dup
apelare seciunea critic este gata de lucru.

Funcia DWORD
dwSpinCount)

SetCriticalSectionSpinCount(LPCRITICAL_SECTION

seteaz valoarea cmpului SpinCount i returneaz valoarea precedent a acestuia.

lpCriticalSection,

DWORD

VOID DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection) elibereaz resursele, ocupate de


seciunea critic.

VOID EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection), BOOL


TryEnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection) permit intrarea n seciunea critic. Dac
seciunea critic este ocupat de un alt fir, atunci ::EnterCriticalSection() va atepta pn aceasta va fi eliberat, iar
::TryEnterCriticalSection() va returna valoarea FALSE.
VOID LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection) elibereaz seciunea critic.

1.14.12. 84. Clase de seciuni critice


Pentru o utilizare corect a seciunilor critice voi prezenta mai jos codul claselor seciunilor critice:
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); } };

class CAutoLock : public CLock


{
p
u
b
l
i
c
:
CAutoLock() { Init(); }
~CAutoLock() { Term(); }
};

class CScopeLock

{
LPCRITICAL_SECTION
m_pCS; public:
CScopeLock(LPCRITICAL_SECTION pCS) : m_pCS(pCS) { Lock(); }
CScopeLock(CLock& lock) : m_pCS(&lock.m_CS) { Lock(); }
~CScopeLock() { Unlock(); }
void Lock() {
::EnterCriticalSection(m_pCS); }
void Unlock() {
::LeaveCriticalSection(m_pCS); } };
Clasele CLock i CAutoLock sunt utilizate, de obicei, pentru sincronizarea accesrii variabilelor clasei, iar
CScopeLock
este destinat, n special, pentru a fi utilizat n proceduri.

1.14.13. 85. Depanarea seciunilor critice


Depanarea seciunilor critice este o ocupaie foarte interesant, dar i dificil. Poi cuta ore i chiar zile n ir
cauza apariiei unei probleme. Erorile, legate de seciunile critice sunt de dou tipuri: de realizare i de arhitectur.
Erorile de realizare pot fi depistate relativ uor i, de regul, sunt generate de utilizarea incorect (lipsa perechii)
a apelurilor ::EnterCriticalSection() i ::LeaveCriticalSection().
Dintre erorile de arhitectur cea mai frecvent este mbriarea fatal (deadlock, v.5.1.3.3), cnd dou fire
ncearc s
acceseze dou i mai multe seciuni
critice. Retine studentule:
Seciunile critice sunt executate relativ repede i nu cer multe resurse de sistem;
Pentru sincronizarea accesrii a mai multor variabile independente este mai bine s fie utilizate cteva seciuni
critice (nu una pentru toate variabilele);
Codul unei seciuni critice va fi redus la minimum;
Nu este recomandat s fie apelate metode ale unor obiecte strine dintr-o seciune critic.
85Depanarea seciunilor critice

Depanarea seciunilor critice este o ocupaie foarte interesant, dar i dificil. Poi cuta ore i chiar zile n ir
cauza apariiei unei probleme. Erorile, legate de seciunile critice sunt de dou tipuri: de realizare i de arhitectur.
Erorile de realizare pot fi depistate relativ uor i, de regul, sunt generate de utilizarea incorect (lipsa perechii) a
apelurilor ::EnterCriticalSection() i ::LeaveCriticalSection(). Urmeaz un fragment de cod n care este omis
apelul ::EnterCriticalSection().
// n procedur se presupune, c m_lockObject.Lock(); a fost deja apelat
void Pool()
{
for (int i = 0; i < m_vectSinks.size(); i++)
{
m_lockObject.Unlock();
m_vectSinks[i]->DoSomething();

m_lockObject.Lock();
}
}
Apelul ::LeaveCriticalSection() fr ::EnterCriticalSection() va conduce la faptul c chiar primul
apel ::EnterCriticalSection() va stopa execuia firului pentru totdeauna.
n fragmentul de cod de mai jos lipsete apelul ::LeaveCriticalSection():
void Proc()
{
m_lockObject.Lock();
if (!m_pObject)
return;
// ...
m_lockObject.Unlock();
}
n acest exemplu are sens s fie utilizat o clas de tipul CSopeLock. Se mai poate ntmpla ca
::EnterCriticalSection() s fie apelat fr iniializarea seciunii critice cu ajutorul ::InitializeCriticalSection() (de
exemplu, n proiectele scrise cu ajutorul lui ATL). n versiunea debug totul poate lucra foarte bine, iar n versiunea
release moare. Aceasta are loc din cauza aa-zisului CRT (_ATL_MIN_CRT) minimal, care nu apeleaz
constructorii obiectelor statice (Q166480, Q165076). n versiunea ATL 7.0 aceast problem a fost rezolvat.
Pot s apar probleme, dac atunci cnd este folosit o clas de tipul CScopeLock a fost omis identificatorul
variabilei, de exemplu, CScopeLock (m_lock). Compilatorul apeleaz constructorul CScopeLock i imediat
distruge acest obiect fr nume (n conformitate cu standardul!). Adic, imediat dup apelarea metodei Lock() are
loc apelarea metodei Unlock() i sincronizarea nu se produce.
88 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 coerena acestor variabile trebuie ea nsi s fie garantat. La
nivelul de baz (cel al resurselor fizice) exist dou mecanisme elementare: excluderea mutual la accesarea unui
amplasament de memorie i masca ntreruperilor. Aceste dou mecanisme sunt, n principiu, suficiente pentru toate
necesitile. Dar, din considerente de eficacitate, la nivelul resurselor fizice sau microprogramelor exist dispozitive
mai sofisticate, cum ar fi instruciunea Test and Set sau semafoarele.
89. Specificarea problemei
Vom preciza mai nti problema excluderii mutuale. Fie {p1, p2,...,pn} o mulime de procese pe care le vom
considera ciclice; programul fiecrui proces conine o seciune critic. Excluderea mutual este asigurat prin dou
fragmente de program (prolog i epilog), care ncadreaz seciunea critic a fiecrui proces. Presupunem, c fiecare
proces, care intr n seciunea critic o prsete ntr-un interval de timp finit.
Soluia trebuie s posede urmtoarele proprieti:
a)

excludere mutual: la fiecare moment de timp cel mult un proces execut seciunea critic,

b) absena blocajelor intempestive (care nu sunt la timpul lor): dac n seciunea critic nu se afl vreun proces,
nici un proces nu trebuie s fie blocat de mecanismul excluderii mutuale,
c)

toleran la defecte: soluia trebuie s rmn valid i n cazul unor defecte n unul sau n mai multe
procese, care se afl n afara seciunii critice,

d) absena privaiunilor: un proces, care a cerut intrarea ntr-o seciune critic nu trebuie s atepte un timp
infinit (presupunnd, c toate procesele au aceeai prioritate),
e)

simetrie: prologul i epilogul trebuie s fie identice pentru toate procesele i independente de numrul lor.

innd cont de aceste specificaii vom construi o soluie de forma:


<iniializare>
<programul procesului pi>:

-- comun tuturor proceselor

ciclu
-- intrare n seciunea critic

<prolog>
<seciunea critic>

-- ieire din seciunea critic

<epilog>
<restul programului>
endciclu

Trebuie s elaborm fragmentele iniializare, prolog i epilog.


91. Algoritmul lui Dekker
Pentru nceput considerm cazul a dou procese p0 i p1. O prim abordare const n reprezentarea condiiei de
ateptare (care este complementar condiiei de depire) printr-o variabil boolean c; vom avea atunci:
c = un proces este n seciunea critic.
Putem propune urmtorul program:
iniializare: c := false;
prolog

: test: if c then
go to test
else
c := true
endif;
<seciunea critic>

epilog

: c := false;

La o analiz mai atent observm (v.3.2.2.3), c dac nu vom face nite ipoteze suplimentare, acest program nu
rezolv problema pus. Iat secvena de intrare n seciunea critic, descompus n instruciuni:
procesul p0
load R0
test0
c

1) test0:
2)
br (R0=0)
3)
stz

c
21)
31)

procesul p1
11) test1: load R1
br (R1=0)
stz
c

c
test1

(am reprezentat true prin 0, false prin 1, br este operaia de salt condiionat iar stz pune n 0 un amplasament de
memorie). Dac ordinea de execuie este 1, 11, 2, 21, 3, 31 vedem c excluderea mutual este greit. Problema
provine de la faptul c procesul p1 poate consulta c ntre momentul cnd p0 a consultat c (gsindu-l false) i
momentul n care p0 l-a pus pe c n true. Altfel spus, este necesar ca secvenele de aciuni (1, 2, 3) i (11, 21, 31) s
fie executate n mod atomar. Anume acest principiu st la baza instruciunii Test and Set.
O soluie (algoritmul lui Dekker) poate totui fi construit fr a folosi alte mecanisme de excludere mutual, n
afar de indivizibilitatea accesrii n citire sau actualizarea unui amplasament de memorie. Prezentm algoritmul
pentru dou procese, dei el poate fi extins pentru un numr arbitrar de procese.
Programul folosete trei variabile comune celor dou procese:
var c

tur :
iniializare:

array [0..1] of boolean;


0..1;

c[0]:=c[1]:=false;
tur:=0;

prolog

-- pentru procesul i; se va pune j=1-i (cellalt 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;
Aceast soluie, demonstrarea validitii creia este propus ca exerciiu, prezint un interes pur teoretic. n
practic sunt utilizate instruciuni speciale care asigur indivizibilitatea secvenelor de testare i modificare.

Ateptarea activ poate fi n egal msur utilizat ca mecanism elementar de sincronizare n cazul unor alte
probleme, diferite de excluderea mutual.
Exemplul 4.1.

Relum problema exemplului din 3.3.1 (comunicarea a dou procese printr-un segment comun). Reprezentm printr-o variabil
boolean c condiia de ateptare:
c=procesul p a terminat scrierea n segmentul a
Valoarea iniial c=false. Programele se vor scrie astfel:
procesul p

procesul q
...

scriere(a);

test: if

c:=true

...

c then
go to test
endif;
citire(a)

Putem verifica, c soluia este corect: oricare ar fi ordinea de executare a acestor dou procese, deblocarea lui q este, n cel
mai ru caz, retardat cu un ciclu de ateptare activ. Printre altele, aceast proprietate rmne adevrat dac vom presupune,
c mai multe procese q1, q2,,..., qn ateapt terminarea operaiei de scriere.

Proprietatea, care asigur validitatea schemei de mai sus, const n faptul c modificarea variabilei c este
efectuat de ctre un singur proces. Notm, c aceast schem a fost deja ntlnit n capitolul 2 la administrarea
intrrilor-ieirilor la CDC 6600: un cuplu de procese comunic prin intermediul unei perechi de indicatori, fiecare
dintre care este actualizat de un proces i consultat de altul. Pentru aceasta este necesar s se poat executa n
excludere mutual instruciunile de testare i modificare.
92.Ateptarea activ n sisteme multiprocesorale: Test & Set

Pentru tratarea cu ajutorul ateptrii active a cazului n care mai multe procese actualizeaz i consult variabile
comune, unele maini au o instruciune, care realizeaz ntr-o manier indivizibil consultarea i actualizarea unui
amplasament de memorie. Aceast instruciune, adesea numit Test And Set (tas), este utilizat n sistemele
multiprocesorale (n sistemele monoprocesor mascarea ntreruperilor este suficient pentru asigurarea excluderii
mutuale).
Fie m adresa amplasamentului de memorie considerat, sau lactul, iar R un registru al procesorului. Prin
convenie, dac lactul este n 0, seciunea critic este liber, iar dac este 1 ea este ocupat. Efectul lui Test And
Set este descris mai jos (Mp[m] desemneaz amplasamentul de memorie cu adresa m):
tas R, m : <blocare acces la Mp[m]>
R:=Mp[m]
Mp[m]:=1
<eliberare acces la Mp[m]>
Excluderea mutual prin ateptare activ poate fi programat cu ajutorul urmtoarelor secvene:
iniializare : stz

prolog

R, m

: tas
br(R0)

epilog

: stz

$-1

-- Mp[m]:=0

-- test iterat

93.Semaforul instrument elementar pentru excluderea mutual. Definiii. Proprieti

Un semafor s este constituit prin asocierea unui contor cu valori ntregi, notat s.c., i a unui fir de ateptare, notat
s.f. La crearea semaforului contorului i se atribuie o valoare iniial s0 (s00), i firul de ateptare s.f. este vid. Un
semafor servete la blocarea proceselor ateptnd s se produc o condiie pentru deblocarea lor; procesele blocate
sunt plasate n s.f. Mai multe procese pot fi sincronizate prin semafoare, care aparin prii comune a contextului lor.
Un procesor poate fi manipulat doar cu ajutorul a dou operaii P(s) i V(s), numite primitive. Valoarea contorului i
starea firului de ateptare sunt inaccesibile, chiar i pentru citire. Fie p un proces care execut P(s) sau V(s), iar q un
proces care se afl n firul de ateptare s.f. Algoritmul primitivelor este urmtorul:

P(s):

V(s):

s.c.:=s.c.-1;

s.c.:=s.c.+1;

if s.c.<0 then

if s.c.0 then

stare(p):=blocat;

extragere(q,s.f.);

introducere(p,s.f.)

stare(q):=activ

endif
endif
Aceste operaii sunt executate n excludere mutual. Modalitatea de realizare efectiv a semafoarelor i a
primitivelor P i V este descris n 4.3. Operaiile introducere i extragere permit inserarea unui proces
ntr-un fir de ateptare sau, respectiv, extragerea. Nu facem aici nici un fel de ipoteze despre politica de
gestionare a firului de ateptare: algoritmii de sincronizare trebuie s fie independeni. Politica aleas n
cazul alocrii unui procesor este discutat n 4.3, la fel i detaliile legate de operaiile de blocare i
deblocare.

Exemplul 4.2.

Funcionarea unui semafor poate fi comparat cu lucrul unui magazin accesul n care este admis doar dac la intrare exist
couri libere (sau crucioare) n care cumprtorii i duc marfa (intrarea fr co este interzis). La deschiderea magazinului un
anumit numr de couri libere sunt puse la dispoziia cumprtorilor la intrare. Un cumprtor ia un co liber, intr n magazin
i i alege marfa, iar dac la intrare nu exist un co liber, cumprtorul este obligat s atepte ntr-un fir de ateptare (operaia
P). La ieire cumprtorul pune coul de unde l-a luat (operaia V).

Doar executarea primitivei P poate bloca un proces, acesta va putea fi deblocat doar de un alt proces, care a
executat primitiva V pe acelai semafor. Executarea operaiei V nu este blocant.
94.Realizarea excluderii mutuale cu ajutorul semafoarelor

Prezentm o schem, care rezolv problema excluderii mutuale pentru n procese. n cazul n care nu se fac
ipoteze speciale despre gestionarea firului de ateptare, nu se garanteaz lipsa privaiunilor (blocrilor indefinite).
iniializare : semafor mutex init 1
prolog

: P(mutex),

epilog

: V(mutex).

S ne convingem, c soluia prezentat este n conformitate cu specificaiile din 4.1.1. Trebuie s verificm
proprietile a, b i c au loc.
Fie nc numrul de procese, care se afl n seciunea critic la un moment concret de timp. Avem:
nc = nf(mutex) nv(mutex)

(4)

Proprietile n cauz pot fi verificate aplicnd semaforului mutex relaia (3) din 4.1.3.2:
nf(mutex) = min(np(mutex), 1+nv(mutex))
a)

(5)

Excluderea mutual

Din (5) avem:


nf(mutex) 1+nv(mutex)
i, utiliznd (4), obinem nc 1: excluderea mutual este asigurat.
b) Absena blocajelor
Presupunem, c nici un proces nu se afl n seciunea critic. Vom avea n acest caz nc = 0, sau
nf(mutex) = nv(mutex) sau nc
nf(mutex) 1+nv(mutex)
Vom avea conform relaiei (5):
nf(mutex) = np(mutex) sau
nbloc(mutex) = 0
Deci, proprietatea b este prezent, ca i proprietatea c, deoarece nu s-a fcut nici o ipotez despre starea
proceselor, dac ele nu se afl n seciunea lor critic.
1). Seciuni critice incorporate. Blocaje
Vom considera dou procese p i q pentru care programul conine dou seciuni critice distincte, corespunztoare
utilizrii a dou resurse critice distincte.
procesul p

procesul q

...
(1) P(mutex1)

...
1

(1 ) P(mutex2)

...
(2) P(mutex2)

...
1

(2 ) P(mutex1)

...

...

V(mutex2)

V(mutex1)

...

...

V(mutex1)

V(mutex2)

Dac traiectoria temporal de execuie a proceselor p i q ncepe cu (1, 11, 2, 21), se va ajunge la o situaie n care
ambele procese sunt blocate pentru un timp infinit, deoarece fiecare dintre procese poate fi deblocat doar de ctre
cellalt. Aceast situaie este numit blocare sau mbriare fatal (eng. deadlock, fr. treinte fatale).
2). Ateptare infinit n seciunea critic sau impas
Validitatea soluiei propuse se bazeaz pe presupunerea, c toate procesele prsesc seciunea critic n timp
finit. Numai ce am stabilit, c aceast ipotez poate fi infirmat dac seciunile critice se intersecteaz. Pot fi i alte
cauze, care conduc la o ateptare infinit. Astfel, blocarea, incorectitudini sau ciclri infinite ntr-un proces, care se
afl n seciunea critic, pot paraliza toate procesele concurente cu procesul dat. n cazul unor seciuni critice globale
(care prezint interes pentru toi utilizatorii), realizate pentru un sistem de operare, pot fi propuse urmtoarele
soluii:
oricrui proces, care execut o seciune critic global, i se atribuie, pe toat durata acestei execuii, un statut
special, care i confer anumite drepturi particulare: prioritate nalt, protecie contra distrugerii, etc.
un orologiu de gard este armat la intrarea unui proces n seciunea critic; dac procesul nu prsete
seciunea critic dup un interval de timp predefinit, sistemul de operare foreaz ieirea procesului i
elibereaz astfel seciunea critic. Aceast soluie nu este cea mai bun, or datele globale, manipulate n
seciunea critic, pot s devin incoerente. Este necesar s se ofere posibilitatea restabilirii acestor date la o
stare anterioar, considerat valid, ceea ce implic salvri periodice.
3). Privaiune
Algoritmul excluderii mutuale garanteaz intrarea exact a unui proces n seciunea critic, dac mai multe
procese ncearc acest lucru, cnd seciunea critic este liber. Se poate ntmpla ca un proces particular s fie
reinut pentru un interval de timp nedefinit: acest fenomen se numete privaiune, pe care o vom rentlni atunci
cnd vom studia alocarea resurselor. ntradevr, procesele candidate la intrare, ateapt n firul de ateptare mutex.f
i ordinea lor de deblocare (prin V(mutex)) depinde de politica de gestionare a acestui fir, despre care nu s-a fcut
nici o ipotez.
Pentru cazul cel mai frecvent, cnd firele de ateptare a semafoarelor sunt gestionate conform ordinii prim sosit
prim servit fr prioritate, riscul de privaiune este eliminat. ntradevr, dac presupunem c execuia unei
seciuni critice dureaz totdeauna un interval finit de timp, orice proces, dup o perioad finit de timp, va deveni cel
mai vechi n firul su de ateptare.
95FUNCIONAREA I STRUCTURA UNUI NUCLEU DE SINCRONIZARE

Noiunea de proces i operaiile asociate nu fac, de obicei, parte din setul de baz al calculatorului. Ele vor fi
implementate cu ajutorul unor programe i/sau microprograme, care formeaz nucleul de administrare a proceselor.
n cadrul descrierii unui sistem de operare cu ajutorul mainilor abstracte ierarhice (v. cap.9), nucleul constituie
nivelul cel mai inferior, realizat direct pe maina fizic. Maina abstract, realizat astfel poate fi numit o main a
proceselor, care posed, n afara setului de instruciuni de baz, primitivele care permit crearea, distrugerea i
sincronizarea proceselor. Ca i orice main abstract, maina realizat n acest mod ascunde unele proprieti ale
mainii fizice. Astfel:
noiunea de proces, care este echivalent cu cea de proces virtual, ascunde utilizatorilor nucleului
mecanismul de alocare a procesoarelor fizice. La un nivel superior nivelului nucleului chiar i numrul
procesoarelor nu intervine dect doar asupra performanelor sistemului i nici ntr-un fel asupra structurii
sale logice,
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 specificaiile mainii fizice (gestiunea
ntreruperilor, structura cuvntului de stare, sistem mono- sau multiprocesoral, etc.) i de specificaiile
mainii abstracte care trebuie realizate, ndeosebi de mecanismul de sincronizare ales. Este, totui, posibil de
evideniat cteva caracteristici comune ale acestei structuri, pe care le vom prezenta nainte de a descrie o
realizare concret.

96Strile unui proces. Fire de ateptare

Am considerat pn acuma c un proces se poate afla n dou stri: activ sau blocat. Luarea n consideraie a
alocrii fizice a unui procesor ne impune s descompunem starea activ n dou stri noi. Un proces activ se
numete ales, dac el este n curs de execuie pe un procesor fizic; el se numete eligibil dac nu poate fi executat
din cauza lipsei unui procesor disponibil. Aceast evideniere este legat doar de disponibilitatea procesorului i nu
are vre-un suport logic. Figura 4.1 descrie strile unui proces i tranziiile lui.
Tranziiile 3 i 4 (blocare i deblocare) sunt tranziiile interne, datorate sincronizrii proceselor. Tranziiile
tehnologice 1 i 2 sunt datorate alocrii procesoarelor fizice proceselor. n particular, tranziia 2 se produce atunci
cnd algoritmul de alocare ia procesorul de la un proces, care nc mai are nevoie de el. Aceast operaie este numit
retragere (eng. preemption, fr. rquisition) a procesorului.
Administrarea proceselor face apel la fire de ateptare. Astfel, fiecrei cauze distincte de blocare (semafor,
condiie ntr-un monitor, etc.) i se asociaz un fir de ateptare pentru a stabili o ordine a proceselor blocate. Mai
mult, procesele eligibile sunt meninute ntr-un fir special de ateptare, gestionarea cruia permite implementarea
unei politici de alocare a procesoarelor fizice. Dac presupunem, c viitorul proces ales este totdeauna primul din
firul proceselor eligibile, algoritmul de alocare poate fi definit
cu ajutorul algoritmului de inserare n firul proceselor eligibile,
cu ajutorul algoritmului care determin retragerea procesoarelor fizice.
(

elig
ibil

1)

(rea
dy)

2)

ales

(ex
e)

4)

3)
blo
cat
(wa
it)
Fig.4.1. Strile unui proces

Mulimea programelor, care realizeaz aceti algoritmi se numete planificator (eng. scheduler, fr.
ordonnanceur). Programul, care realizeaz alegerea propriu-zis se numete dispecer (eng. dispatcher, fr.
distributeur). Schema general a firelor de ateptare ale proceselor este prezentat n fig.4.2. Deplasarea proceselor
ntre aceste fire corespunde schimbrii strii.

planificato
r
fire de procese
blocate
firul proceselor eligibile

dispec
er

proces
ales

Fig.4.2. Fire de ateptare ale proceselor, administrate de nucleul sistemului de operare


97Administrarea contextelor i schemele primitivelor

1) Coninutul contextului
Operaia de alocare a procesorului fizic impune pstrarea pentru fiecare proces a unei copii a contextului.
Aceast copie a contextului descrie starea procesorului pentru procesul considerat. n acest scop fiecrui proces i se
asociaz o mulime de informaii rezidente n memorie i numit vector de stare, bloc de control al procesului sau
blocul contextului, care conine:
informaiile despre starea procesorului, necesare la realocarea lui (coninutul cuvntului de stare,
registrelor),
valorile atributelor procesului (prioritate, drept de acces),

pointeri la spaiul de lucru al procesului (segmentele procedur i date, stiva de execuie),


informaii de gestiune (starea, legturile de nlnuire).

O descriere mai detaliat a blocului contextului unui proces este dat n 4.3.
2) Organizarea nucleului
Execuia programelor nucleului este declanat n dou moduri (fig.4.3):
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 operaii de sincronizare i sunt invizibile la nivelurile superioare.
n ambele cazuri, mecanismul de intrare n nucleu conine salvarea automat a cuvntului de stare i,
eventual, a registrelor procesorului, care execut apelul supervizorului sau care trateaz ntreruperea. n
dependen de organizarea calculatorului, aceste informaii sunt salvate ntr-un amplasament fix (legat de
nivelul ntreruperii sau de apelul supervizorului) sau ntr-o stiv (ndeosebi n cazul sistemelor
multiprocesorale). Prile contextului, salvate n acest fel, sunt cele ale proceselor alese pentru procesorul n
cauz, n momentul ntreruperii sau apelrii supervizorului.
Programele primitivelor i cele de tratare a ntreruperilor manipuleaz blocurile contextului i firele proceselor.
Pentru asigurarea coerenei informaiilor aceste programe trebuie executate n excludere mutual. Executarea unui
program al nucleului se termin n toate cazurile prin realocarea procesorului sau procesoarelor, adic prin apelarea
dispecerului. Deoarece este posibil ca firul de ateptare a proceselor alese s fi fost modificat de execuia
primitivelor, noul proces ales poate s difere de ultimul proces ales pentru procesorul ntrerupt.
alocare procesor

proces

apelare supervizor

programul
nucleului

periferice,
ceasul

lansare

ntreruperi

Fig.4.3. Comunicarea cu un nucleu de sincronizare

Programul unei primitive a nucleului are urmtoarea schem general:


prolog;

-- salvarea contextului i intrarea n seciunea critic

control;

-- verificarea drepturilor i a parametrilor

<corpul programului>
alocare_procesor;

-- manipuleaz firele proceselor


-- programul dispecer i ieirea din seciunea critic

Secvena prolog, comun tuturor operaiilor, salveaz contextul procesului, care execut operaia, i asigur
intrarea n seciunea critic. Secvena control verific drepturile procesului apelant de a executa primitiva i
validitatea parametrilor transmii. Detaliile depind de primitiv. Secvena alocare_procesor este programul
dispecerului: ea realizeaz realocarea procesorului i ieirea din seciunea critic.
Diferena ntre sistemele mono- i multiprocesorale se manifest n mod esenial la realizarea excluderii mutuale
i alocrii procesorului (secvenele prolog i alocare_procesor).
Tratarea ntreruperilor de ctre nucleu trebuie s fie coordonat cu mecanismele de sincronizare alese. De obicei
sunt considerate dou scheme de baz:
1) Asocierea unui proces, care trateaz fiecare ntrerupere. Doar acest proces se va afla n ateptarea unei
ntreruperi anume, existnd pentru aceasta o instruciune special.
2) Asocierea unei operaii de deblocare (semnalizare asociat unei condiii, V la un semafor, etc.) la o
ntrerupere.
Problemele de mascare i de prioritate a ntreruperilor sunt, de obicei, tratate asociind prioriti proceselor.
98REALIZAREA UNUI NUCLEU DE SINCRONIZARE. Organizarea general
99REALIZAREA UNUI NUCLEU DE SINCRONIZARE. Interfeele

Interfeele
a) Gestionarea proceselor

Procesele pot fi create i distruse n mod dinamic, i sunt organizate ierarhic conform relaiei de legtur (v.3.5).
Un proces este creat cu ajutorul primitivei:
creare(p, context iniial, atribute)
Atributele unui proces conin prioritatea (exprimat printr-un ntreg) i drepturile de a executa anumite operaii.
Contextul iniial specific starea iniial a cuvntului de stare i a registrelor procesorului, i a spaiului de lucru
asociat procesului (stiva, date proprii). Procesul este creat n starea eligibil. Numrul su p (numele) este returnat ca
rezultat (valoarea nil, dac crearea este imposibil). O funcie determin_numr_propriu permite unui proces s afle
numrul su propriu.
Primitivele care urmeaz pot fi aplicate unui proces existent i pot fi executate doar de procesul-printe.
Procedura distrugere poate fi utilizat de ctre un proces pentru a se autodistruge. Deci, distrugere(p) va distruge
toate procesele desemnate de procesul p i toi descendenii acestora.
Procedura suspendare(p) ntrerupe execuia unui proces p, plasndu-l ntr-un fir de ateptare special. Execuia lui
p poate fi reluat doar cu ajutorul primitivei reluare(p). Primitivele suspendare i reluare sunt introduse din
considerente de securitate, n special pentru a permite monitorizarea unui proces de ctre procesul-printe.
Utilizarea primitivelor creare, distrugere, suspendare i reluare este condiionat de un drept, care figureaz n
atributul drepturi al procesului.
b) Sincronizarea
Procesele sunt sincronizate cu ajutorul monitoarelor. Gestiunea ntreruperilor este integrat n mecanismul
monitoarelor: o ntrerupere este asociat unei condiii. Specificarea primitivelor, care difer un pic de cea din
3.3, este precizat n 4.3.2. 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 (care nu este aici specificat).
100REALIZAREA UNUI NUCLEU DE SINCRONIZARE. Structuri i algoritmi

Din momentul crerii sale unui proces i se asociaz un numr fix (process handler), care servete la desemnarea
lui i permite accesarea blocului su de context. Blocul de context conine urmtoarele cmpuri:
Csp

: zona de salvare a cuvntului de stare a procesorului,

Reg

: zona de salvare a registrelor generale ale procesorului,

Stare

: valoarea strii procesului (eligibil, blocat, ...),

Prio

: prioritatea procesului,

Drepturi

: drepturile procesului,

Fire, etc.

: legturi de nlnuire n ierarhia proceselor,

Suc, etc.

: legturi de nlnuire n firele de ateptare (FA).

Administrarea proceselor utilizeaz fire de ateptare, ordonate n ordinea de descretere a prioritilor i


comandate de un set de proceduri de accesare, specificate mai jos (p specific un proces, f un fir de ateptare):
introducere(p, f) Introduce p n f, n elementul lui f care corespunde prioritii procesului i n ordinea sosirii pentru
procesele cu aceeai prioritate.
primul(f)

ntoarce numrul (numele) procesului din vrful lui f (nil dac f este vid); nu modific f.

ieire(p, f)

Extrage din firul f primul proces, numrul acestuia fiind pus n p (nil dac f este vid).
Extrage din firul f procesul cu numrul p specificat, oricare ar fi elementul n care acesta se afl;
pune n p valoare nil, dac procesul nu exist n firul f.

extragere(p, f)

Funcie boolean cu valoarea adevrat, dac firul f este vid, fals n caz contrar.

vid(f)

Figura 4.4 prezint schematic organizarea unui fir de ateptare a proceselor.


legtur de
nlnuire

.
.
.
Csp[i]
Reg[i]
Bloc de
context

Stare[i]
Drepturi[i]
Prio[i]

101REALIZAREA UNUI NUCLEU DE SINCRONIZARE. Realizarea monitoarelor

Monitorul, descris mai jos, este inspirat de realizarea folosit n limbajul Mesa [12], care a fost validat de o
vast experien de utilizare. n raport cu noiunea clasic de monitor (3.3.3), aceast realizare prezint urmtoarele
diferene:
1) Semantica primitivei semnalizare. Specificarea iniial a primitivei c.semnalizare precizeaz c unul din
procesele care sunt n ateptarea condiiei c (dac exist) este imediat deblocat, ceea ce implic trecerea temporar n
starea blocat a procesului care execut semnalizare. n specificarea prezent procesul deblocat este simplu trecut n
starea eligibil i trebuie s intre n monitor; el se afl, deci, n competiie cu alte procese, care ateapt s intre n
monitor, i nu este garantat c va fi imediat ales. Condiia, care provocase deblocarea, poate fi modificat nainte ca
procesul deblocat s-i reia execuia n monitor. Pentru aceast nou interpretare trebuie s fie modificat forma
punerii n ateptare. O construcie de forma
if continuare_non_posibil then
c.ateptare
endif
devine n acest caz
while continuare_non_posibil do
c.ateptare
endwhile
Dei aceast construcie introduce un risc de privaiune, ea prezint o serie de avantaje de ordin practic. Ea evit
o comutare a contextului, cu preul unei evaluri suplimentare a condiiei. Dar principalul este c ea permite
definirea simpl a unor posibiliti suplimentare utile (deblocare multipl, ntrzieri de control sau de gard),
precizate mai jos. n fine, trebuie s notm, c verificarea validitii monitorului este simplificat, deoarece condiia
de depire (continuare_posibil) este consultat n timpul deblocrii: procesul care execut semnalizare poate s se
mulumeasc cu garantarea unei condiii mai slabe dect condiia de depire.
2) Deblocare multipl. Problema deblocrii multiple poate fi rezolvat uor introducnd o primitiv nou
c.difuzare_semnal efectul creia se exprim astfel:
while c.non_vid do
c.semnalizare
endwhile
Fiind dat, c toate procesele deblocate vor testa din nou condiia i cer din nou acces la monitor, aceast
primitiv va avea evident efectul ateptat.
3) ntrziere de gard. Din probleme de securitate, n special pentru tratarea blocajelor, poate fi util s se
asocieze o ntrziere de gard condiiei unui monitor. Aceast ntrziere este egal cu durata maxim de blocare a
unui proces ntr-un fir de ateptare asociat condiiei date. La expirarea ntrzierii de gard va fi efectuat o tratare
specificat. Aceast tratare poate consta n simpla deblocare a procesului (care va testa din nou condiia de depire)
sau transferul su ntr-un fir de ateptare special (v.4.3.2.3).
Fie M.c.ntrziere ntrzierea de gard asociat unei condiii c n monitorul M. Se presupune disponibil un ceas
habs, care pune la dispoziie timpul absolut. Trebuie s adugm n programul primitivei c.semnalizare instruciunea
urmtoare:
hdeblocare[p]:=habs+M.c.ntrziere

unde hdeblocare[p] este un cmp nou al blocului de context al procesului p. Un proces, numit gardian, deblocat
la intervale regulate de timp parcurge mulimea contextelor i efectueaz tratamentul specificat proceselor pentru
care hdeblocare[p]>habs.
102.REALIZAREA UNUI NUCLEU DE SINCRONIZARE. Algoritmi de baz

Programul monitorului trebuie s asigure dou funcii:


excluderea mutual pentru procedurile monitorului,
blocarea i deblocarea asociate primitivelor ateptare i semnalizare.
Fiecrui monitor M i sunt asociate urmtoarele structuri de date:
un dispozitiv de excludere mutual M.disp (lact), care poate lua dou valori liber i ocupat, i un fir de
ateptare M.fir asociat acestui dispozitiv. Iniial M.disp=liber, M.fir=<vid>.
fiecrei condiii c de M i este asociat un fir M.c.fir, un contor de gard M.c.ntrziere i, pentru condiiile
asociate unei ntreruperi, un indicator boolean M.c.ntr_sosit.
Firul proceselor eligibile este determinat de f_eligibil.
Pentru un monitor M vom cerceta programul a patru secvene intrare, ieire, c.ateptare i c.semnalizare
(secvenele intrare i ieire sunt inserate de compilator i ncadreaz execuia procedurilor externe ale monitorului).
S definim mai nti procedurile de gestiune a dispozitivului:
cerere_disp(M, p):

eliberare_disp(M):

if M.disp=ocupat then

if vid(M.fir) then

intrare(p, M.fir);

M.disp:=liber

stare[p]:=blocat

else
ieire(q, M.fir);

else
M.disp := ocupat;

intrare(q, f_eligibil);

intrare(p, f_eligibil);

stare[q]:=eligibil

stare[p]:=eligibil

endif

endif
Cele patru secvene se vor scrie utiliznd urmtoarele proceduri:
intrare(M):

ieire(M):

prolog;

prolog;

p:=<proces apelant>;

p:=<proces apelant>;

cerere_disp(M, p);

eliberare_disp(M);

alocare_procesor;

intrare(p, f_eligibil);
alocare_procesor;

c.ateptare:

c.semnalizare:

prolog;

prolog;

p:=<proces apelant>;

p:=<proces apelant>;

intrare(p, M.c.fir);

if non_vid(M.c.fir) then

stare[p]:=blocat;

ieire(q, M.c.fir);

eliberare_disp(M);

cerere_disp(M, p);

alocare_procesor;

cerere_disp(M, q);
eliberare_disp(M)
else
intrare(p, f_eligibil)
endif
alocare_procesor;

S ne amintim, c secvena prolog asigur salvarea contextului i intrarea n seciunea critic, iar secvena
alocare_procesor asigur alocarea procesorului i prsirea seciunii critice (v.4.3.4).
Notm, c n primitiva semnalizare, procesul apelant p i procesul deblocat q sunt introduse (cu ajutorul
primitivei cerere_disp) n firul de ateptare pentru a intra n monitor. Procesul activat prin intermediul primitivei
este primul proces din acest fir. Nu am ncercat s reducem numrul transferurilor ntre fire pentru a realiza o
implementare optimal.
103 REALIZAREA UNUI NUCLEU DE SINCRONIZARE. Tratarea ntreruperilor

Pentru asigurarea uniformitii mecanismelor de sincronizare fiecrei ntreruperi i se asociaz:


o condiie ntr-un monitor,
un proces ciclic care realizeaz tratarea ntreruperilor, n stare de repaus acest proces este n ateptarea
condiiei.
O condiie poate fi asociat unui singur nivel de ntrerupere. Sosirea unei ntreruperi provoac executarea
funciei semnalizare pentru condiia asociat. Prioritatea relativ a ntreruperilor este tradus n prioritatea
proceselor, care trateaz ntreruperile.
Mecanismul descris mai sus nu este absolut perfect. De exemplu, excluderea procedurilor monitorului nu poate fi
aplicat ntreruperilor. Se poate ntmpla ca o ntrerupere s fie cerut atunci cnd procesul, care trateaz
ntreruperile, este nc activ, din care cauz ntreruperea va fi pierdut. Evitarea acestui fenomen se va face cu
ajutorul unui indicator boolean, care memorizeaz sosirea unei ntreruperi. Vom avea:
<proces de prelucrare a ntreruperii>
ciclu
test

if nonM.c.ntr_sosit then
c.ateptare;

-- evitarea pierderii unei ntreruperi

go to test
endif;
<tratarea ntreruperii>
endciclu
<sosirea unei ntreruperi asociate lui M.c>
M.c.ntr_sosit := true;
c.semnalizare;
104 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 printe, care va putea lua msurile necesare (corectarea erorii i relansarea sau distrugerea procesului,
care a generat eroare). Pentru aceasta este folosit un fir special f_eroare (n conformitate cu organizarea sistemului,
poate fi prevzut un fir unic sau un fir pentru fiecare utilizator, pentru fiecare subsistem, etc.).

Presupunem c o eroare care are loc n cursul execuiei unui proces provoac o deviere, tratarea creia se va
scrie astfel:
prolog;
p:=<proces apelant>;
intrare(p, f_eroare);
<tratare specific>;
stare[p]:=suspendat;
alocare_procesor;
Am definit o stare nou (suspendat), care se aplic unui proces activitatea cruia a fost ntrerupt de un
eveniment, considerat anormal (eroare de execuie sau aciunea primitivei suspendare, v.4.3.3).

Cu excepia dac se va utiliza pentru asigurarea blocrii mascarea ntreruperilor. Aceast soluie (folosit n Modula-2) este aplicabil doar
pentru cazul monoprocesor i nu poate fi acceptat, dac exist restricii la ntrzierea unei ntreruperi.

Nu detaliem aici <tratare specific>, care trebuie s fie specificat de ctre procesul printe la momentul crerii
procesului descendent. Acest program conine, evident, codul de diagnosticare (identitatea procesului generator de
eroare, natura erorii), care trebuie transmis procesului printe ntr-un mod special, conform gradului de urgen
(actualizarea unui indicator, deblocare, etc.).

110Realizarea pentru cazul unui sistem multiprocesoral

Descrierea, care urmeaz este inspirat din [13]. Vom specifica mai nti organizarea fizic a sistemului. Avem n
procesoare identice, care acceseaz o memorie comun. Fiecare procesor, desemnat printr-un numr (de la 0 la n-1),
i cunoate numrul propriu. Regimului de funcionare multiprocesor i sunt specifice dou instruciuni:
Test and Set(R, m)

asigur excluderea mutual (4.1.1.2)

ntrerupere(k)

provoac o ntrerupere a procesorului k.

O ntrerupere sau un apel de supervizor provoac introducerea cuvntului de stare i a registrelor procesorului n
cauz ntr-o stiv n memorie, proprie acestui procesor.
Orice primitiv a nucleului poate fi executat de oricare din procesoare. Vom mpri ntreruperile n ntreruperi,
destinate unui procesor specific (ceasul procesorului, instrucia ntrerupere(k)) i ntreruperi banalizate (intrriieiri, de exemplu), care sunt tratate de orice procesor. n acest caz pentru a fi retras se va alege procesorul, care
execut procesul cu cea mai mic prioritate. Numrul acestui proces se afl ntr-un amplasament rezervat de
memorie kmin i vom considera, c un dispozitiv fizic ndreapt ntreruperile banalizate spre procesorul cu numrul
kmin. Vom utiliza acelai principiu de alegere i n cazul unei alocri a procesoarelor.
Pentru ca firul proceselor eligibile s nu fie vid vom aduga aici n procese de prioritate joas. Numrul
procesului ales pentru a fi executat de procesorul k vom nota proc_al[k].
Excluderea mutual a primitivelor nucleului utilizeaz un dispozitiv de blocare, consultat i actualizat cu ajutorul
instruciunii Test And Set.
prolog:

-- procesorul k
<mascare ntreruperi>;
Csp[proc_al[k]]:=top(stiv_csp);
Reg[proc_al[k]]:=top(stiv_reg);

test:

Test And Set(R, dispozitiv de blocare);


if R 0 then
go to test

-- ateptare activ

endif
Dispecerul va asigura ca cele n procese alese s fie la orice moment de timp cu prioritatea cea mai nalt printre
procesele eligibile. Deoarece executarea primitivei curente poate modifica firul proceselor eligibile, prioritatea
primului proces eligibil este comparat cu prioritatea procesului ales pentru procesorul kmin. Dac aceasta este
superioar procesorul dat este retras cu ajutorul instruciunii ntrerupere.
alocare_procesor:

-- pentru procesorul cu numrul k

ieire(proces_ales[k], f_eligibil);
pr1:=Prio[primul(f_eligibil)];
pr2:=Prio[proc_al[kmin]];
if Prio[proc_al[k]] < pr2 then -- actualizarea lui kmin
kmin:=k
endif;
disp_de_blocare:=0;

-- terminarea seciunii critice

if pr1 > pr2 then


ntrerupere(kmin)

-- retragere

endif;
ncrcare_registre(Reg[proc_al[k]];

ncrcare_csp(Csp[proc_al[k]];

-- demascarea ntreruperilor

Tratarea ntreruperii de retragere (instruciunea ntrerupere) a procesorului se reduce la realocarea procesorului


ntrerupt:
<tratarea ntreruperii de retragere a procesorului k>
prolog;
intrare(proc_al[k], f_eligibil);
alocare_procesor;

106. REALIZAREA UNUI NUCLEU DE SINCRONIZARE. Crearea i distrugerea proceselor


1.14.13.1.
Problema principal, condiionat de gestiunea dinamic a proceselor, este alocarea contextelor i numelor proceselor. Pentru aceasta sunt
utilizate dou metode principale:
pentru blocurile contextelor sunt rezervate un numr fix de amplasamente; amplasamentele neutilizate sunt determinate de o valoare
special (nil) a cmpului stare al lor; fiecare bloc este desemnat printr-un numr, care este numrul 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 numrului fiecrui proces adresa n memorie a blocului su de context.
n ambele cazuri vom presupune disponibil o procedur alocare_context(p), care realizeaz alocarea contextului (blocul de context i spaiul
de lucru) i ntoarce ca rezultat un numr p al procesului (nil, dac crearea este imposibil, de exemplu, din cauza lipsei de spaiu suficient n
memorie). Metodele de alocare a spaiului de lucru nu sunt precizate aici. Numrul procesului creat este ntors drept rezultat al primitivei:
creare(p, context iniial):
prolog;
control;

-- verificarea drepturilor

alocare_context(p);
if p nil then
iniializare_context(i);
intrare(p, f_eligibil)
endif;
intrare(proces apelant, f_eligibil);
alocare_procesor;

-- este ntors p drept rezultat

Contextul iniial este specificat de ctre procesul creator: el trebuie s defineasc valoarea iniial a registrelor i a cuvntului de stare a
procesului creat, starea iniial a spaiului de lucru, atributele, cum ar fi prioritatea i drepturile. Unele cmpuri ale cuvntului de stare sunt
predefinite i nu pot fi modificate (modul, mascarea ntreruperilor, etc.). Pentru elementele legate de protecie (drepturile de acces), procesul creat
nu poate avea drepturi superioare drepturilor procesului creator; n caz contrar atributele de protecie sunt declarate defecte.
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 fiierele, sunt preluate de mecanisme specifice.
Distrugerea unui proces, care se afl n seciunea critic poate conduce la o blocare. Seciunile critice ale monitoarelor sunt gestionate direct
de nucleu. Este posibil s se asocieze unui proces numrul dispozitivului de blocare, care se afl n posesia procesului dat (el poate fi angajat n
mai multe apeluri incorporate), i s difereniem distrugerea procesului pn cnd valoarea acestui numr nu va fi 0. O alt soluie const n
examinarea periodic a fiecrui dispozitiv de blocare i s eliberm dispozitivul de blocare, dac procesul care l posed a fost distrus.
Principiul primitivei distrugere este dat n schema de mai jos:
distrugere (p):
prolog;
control;

-- verificarea drepturilor

eliberare_context(p);
intrare(proces apelant, f_eligibil);
alocare_procesor;
Procedura eliberare_context trebuie s asigure eliberarea resurselor ocupate de procesul distrus i de descendenii acestuia:
eliberare_context(p):
list:=<lista firelor procesului p>;
restituire_bloc_context(p);
restituire_memorie(p);
for q list do
eliberare_context(q)
endfor;
1.14.13.2.
107. REALIZAREA UNUI NUCLEU DE SINCRONIZARE. Suspendarea i reluarea
Primitiva suspendare permite procesului-printe s controleze activitatea unui proces descendent, ntrerupnd n mod forat execuia
acestuia. O utilizare curent este suspendarea unui proces, angajat ntr-o bucl infinit. Procesul ntrerupt n acest mod este transferat ntrun fir de ateptare special, care poate fi firul f_eroare, utilizat pentru devieri.
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, dac procesul se afl n seciunea critic ntr-un monitor.
suspendare(p):
prolog;
control;
< tratare seciune critic>;
f:=<fir care conine p>;
extragere(p, f);
intrare(p, f_eroare);
stare[p]:=suspendat;
intrare(proces apelant, f_eligibil);
alocare_procesor;
Primitiva reluare permite unui proces s deblocheze un fir suspendat, dup modificarea eventual a contextului su.
reluare(p):
prolog;
control;
extragere(p, f_eroare);
stare[p]:=eligibil;
intrare(proces apelant, f_eligibil);
intrare(p, f_eligibil);
alocare_procesor;
108. REALIZAREA UNUI NUCLEU DE SINCRONIZARE. Excluderea mutual i alocarea procesorului
1.14.13.3.

109. Realizarea pentru cazul monoprocesor

n acest caz excluderea mutual este realizat prin mascarea ntreruperilor. Pentru aceasta trebuie pregtit masca ntreruperii n cuvntul de
stare, care ar specifica programele asociate primitivelor de tratare a ntreruperilor. Dac notm prin proces_ales o variabil global, care conine
numrul procesului ales, iar prin salv_csp locaiunea n care a fost salvat cuvntul de stare a procesorului la apelarea supervizorului sau la
ntrerupere, prologul va fi de forma:
prolog:
<mascarea ntreruperilor>

-- masca n cuvntul de stare

csp[proces_ales] := salv_csp;
salv_registre(Reg[proc_al]);
Programul dispecerului, care de asemenea realizeaz ieirea din seciunea critic, are grij s aloce procesorul primului proces din firul de
procese eligibile. Pentru simplificarea manipulrii acestui fir este binevenit s fie introdus aici un proces special cu prioritate joas, care rmne
tot timpul n coada firului i nu poate fi blocat. Acest proces, care poate fi ales doar atunci cnd el este unicul eligibil, execut o activitate de
fond, care nu este urgent sau o simpl bucl de ateptare. El garanteaz, deci, c firul proceselor eligibile nu este niciodat vid.

f_eli
gibil

Cuvnt de
stare
Registre

proc
_al

Csp
Reg
Programul dispecerului este de forma:
Prio=
5
alocare_procesor:
6
p
p
1

Csp
Reg
2

3
p
3

p
4

c.fi
ier

(a) nceputul executrii


c.ateptare

Procesor

ieire(proces_ales, f_eligibil);
ncrcare_registre(Reg[proc_al]);
ncrcare_csp(csp[proces_ales]);
Figura 4.5 ilustreaz principiul de funcionare a nucleului, exemplificnd efectul global al unei realocri a procesorului dup blocarea
procesului ales.

1.14.13.4.
1.14.13.5.
1.14.13.6.
1.14.13.7.

110. Realizarea pentru cazul unui sistem multiprocesoral

Descrierea, care urmeaz este inspirat din [13]. Vom specifica mai nti organizarea fizic a sistemului. Avem n procesoare identice, care
acceseaz o memorie comun. Fiecare procesor, desemnat printr-un numr (de la 0 la n-1), i cunoate numrul propriu. Regimului de
funcionare multiprocesor i sunt specifice dou instruciuni:
Test and Set(R, m)

asigur excluderea mutual (4.1.1.2)

ntrerupere(k)

provoac o ntrerupere a procesorului k.

O ntrerupere sau un apel de supervizor provoac introducerea cuvntului de stare i a registrelor procesorului n cauz ntr-o stiv n
memorie, proprie acestui procesor.
Orice primitiv a nucleului poate fi executat de oricare din procesoare. Vom mpri ntreruperile n ntreruperi, destinate unui procesor
specific (ceasul procesorului, instrucia ntrerupere(k)) i ntreruperi banalizate (intrri-ieiri, de exemplu), care sunt tratate de orice procesor. n
acest caz pentru a fi retras se va alege procesorul, care execut procesul cu cea mai mic prioritate. Numrul acestui proces se afl ntr-un
amplasament rezervat de memorie kmin i vom considera, c un dispozitiv fizic ndreapt ntreruperile banalizate spre procesorul cu numrul kmin.
Vom utiliza acelai principiu de alegere i n cazul unei alocri a procesoarelor.
Pentru ca firul proceselor eligibile s nu fie vid vom aduga aici n procese de prioritate joas. Numrul procesului ales pentru a fi executat de
procesorul k vom nota proc_al[k].
Excluderea mutual a primitivelor nucleului utilizeaz un dispozitiv de blocare, consultat i actualizat cu ajutorul instruciunii Test And Set.
prolog:

-- procesorul k
<mascare ntreruperi>;
Csp[proc_al[k]]:=top(stiv_csp);
Reg[proc_al[k]]:=top(stiv_reg);

test:

Test And Set(R, dispozitiv de blocare);


if R 0 then
go to test

-- ateptare activ

endif
Dispecerul va asigura ca cele n procese alese s fie la orice moment de timp cu prioritatea cea mai nalt printre procesele eligibile. Deoarece
executarea primitivei curente poate modifica firul proceselor eligibile, prioritatea primului proces eligibil este comparat cu prioritatea procesului
ales pentru procesorul kmin. Dac aceasta este superioar procesorul dat este retras cu ajutorul instruciunii ntrerupere.
alocare_procesor:

-- pentru procesorul cu numrul k

ieire(proces_ales[k], f_eligibil);
pr1:=Prio[primul(f_eligibil)];
pr2:=Prio[proc_al[kmin]];
if Prio[proc_al[k]] < pr2 then

-- actualizarea lui kmin

kmin:=k
endif;
disp_de_blocare:=0;

-- terminarea seciunii critice

if pr1 > pr2 then


ntrerupere(kmin)

-- retragere

endif;
ncrcare_registre(Reg[proc_al[k]];
ncrcare_csp(Csp[proc_al[k]];

-- demascarea ntreruperilor

Tratarea ntreruperii de retragere (instruciunea ntrerupere) a procesorului se reduce la realocarea procesorului ntrerupt:
<tratarea ntreruperii de retragere a procesorului k>
prolog;
intrare(proc_al[k], f_eligibil);

alocare_procesor;

111. Procese si fire in Linux:


1.14.13.8.

Crearea proceselor

n Linux procesele se nmulesc prin clonare: apelul de sistem, care creaz un proces nou, se numete clone, iar procesul fiu este o copie
aproape exact a procesului printe, doar c mai departe va executa codul su, iar procesul printe ceea ce este scris dup apelarea lui clone.
Diferenele pot deveni foarte mari i dac dorim s evitm diferenierea, apelarea lui clone permite s definim urmtorii indicatori (flags), care
vor specifica momentele comune ale fiului i printelui:

Spaiul de adrese (Clone_VM);


Informaiile despre sistemul de fiiere (Clone_FS);
Tabelul fiierelor deschise (Clone_FILES);
Tabelul programelor de tratare a semnalelor (Clone_SIGHAND);
Printele (Clone_PARENT) n acest caz, evident, va fi creat un proces frate.

Firele sunt realizate n biblioteca standard de susinere a programelor cu mai multe fire ca i procesele, generate cu indicatorul Clone_VM,
i, din punctul de vedere al nucleului sistemului, nu se deosebesc de alte procese. ns n unele biblioteci de alternativ pot exista diferene.
Mai exist fire, numite handicapate, generate de funcia kernel_thread pentru necesiti interne ale sistemului. Acestea nu au parametri
pentru linia de comand, de obicei nu au fiiere deschise, etc. Deoarece aceste fire (procese) de asemenea figureaz n lista lucrrilor, adesea n
literatur poate fi ntlnit noiunea de proces propriu-zis, creat din spaiul utilizatorului (userspace), i noiunea de lucrare, prin aceasta
nelegndu-se toate procesele, inclusiv procesele interne ale nucleului.
Procesele sunt create prin utilizarea funciilor din familia exec ale bibliotecii Linux standard: execl, execlp, execle, execv, execve,
execvp. Dei formatul de apelare este diferit, n ultim instan execut acelai lucru: nlocuiesc codul din procesul curent cu codul, care se afl
n fiierul indicat. Fiierul poate fi un fiier binar executabil Linux, un script al interpretorului limbajului de comand, un fiier binar de un alt
format (de exemplu, o clas java, un fiier executabil DOS). n ultimul caz modalitatea de prelucrare va fi determinat de modulul de adaptare a
nucleului binfmt_misc. Din aceast cauz, operaia de lansare a unui program, care n DOS i Windows formeaz un tot ntreg, n Linux (i n
Unix, n general) este mprit n dou: mai nti are loc lansarea propriu-zis, iar apoi se va determina care program va fi executat. Are oare
aceasta sens i care sunt cheltuielile suplimentare? Doar crearea copiei unui proces presupune copierea unui volum semnificativ de informaii!
n mod sigur putem afirma c are sens aceast abordare. Foarte frecvent un program trebuie s ndeplineasc unele aciuni nainte de
nceperea propriu-zis a execuiei lui. De exemplu, lansm dou programe, care-i transmit reciproc date prin intermediul unui canal fr nume.
Astfel de canale sunt create prin apelarea de sistem pipe, care returneaz o pereche de descriptori de fiiere de care pot fi legate, de exemplu,
fluxul standard de intrare (stdin) al unui program i de ieire (stdout) al celuilalt program. Aceasta este posibil deoarece mai nti sunt create
procesele, apoi vor fi executate manipulrile necesare cu descriptorii fiierelor i doar dup toate acestea este apelat funcia exec.
Aceleai rezultate pot fi obinute n Windows NT ntr-un singur pas, dar ntr-un mod mult mai complicat. Ct despre cheltuielile
suplimentare ele sunt n majoritatea cazurilor minime, deoarece dac este creat copia unui proces datele proprii ale acestuia nu sunt fizic copiate.
i aceasta din cauza c este utilizat procedeul copy-on-write: paginile datelor ambelor procese sunt marcate ntr-un anumit mod i doar atunci
cnd un proces va ncerca s modifice coninutul uneia din paginile sale aceasta va fi duplicat.
Primul proces este lansat n sistem la iniializarea nucleului. Fragmentul de cod de mai jos este partea de ncheiere a procedurii de iniializare
a nucleului sistemului de operare Linux:
if (execute_command)
execve(execute_command,argv_init, envp_init);
execve("/sbin/init",argv_init,envp_init);
execve("/etc/init",argv_init,envp_init);
execve("/bin/init",argv_init,envp_init);
execve("/bin/sh",argv_init,envp_init);
panic("No init found. Try passing init= option to kernel.");}
Este fcut ncercarea de comutare a procesului la fiierul, indicat n linia de comand a nucleului, apoi la fiierele
/sbin/init, /etc/init, /bin/init i, n sfrit, la fiierele din /bin/sh.
1.14.13.9.

Distrugerea proceselor

La terminarea execuieia unui proces (normal, forat sau accidental), el este distrus elibernd toate resursele, care fusese alocate anterior.
Dac procesul printe se termin naintea procesului descendent, ultimul devine orfan (orphaned process). Toi orfanii sunt nfiai n mod
automat de programul init, executat de procesul cu numrul 1, care duce evidena terminrii execuiei lor.
Dac a fost terminat deja execuia procesului descendent, iar procesul printe nu este gata s recepioneze de la sistem semnalul despre acest
eveniment, descendentul nu dispare total, ci este transformat n Zombie; n cmpul Stat aceste procese sunt notate cu litera Z. Procesele Zombi
nu cer timp de procesor, dar n tabelul proceselor este pstrat linia lor i structurile respective ale nucleului nu sunt eliberate. Dup terminarea
execuiei procesului printe, procesul Zombi orfan devine pentru o perioad scurt de timp descendentul lui init, ca mai apoi s moar
definitiv.
Un process poate s cad n hibernare, fr a putea fi scos din aceast stare: n cmpul Stat acest eveniment se va nota prin litera D.
Procesele aflate n hibernare nu reacioneaz la cererile de sistem i pot fi distruse doar prin rencrcarea sistemului.
1.14.13.10. Obinerea informaiilor despre procese
Pentru obinerea informaiilor despre procese, vizualizate de programele ps i top, Linux-ul utilizeaz un sistem special de fiiere, numit
procfs. n majoritatea distributivelor el este iniializat la lansarea sistemului de operare cu titlul de catalog /proc. Datele despre procesul cu
numrul 1 (de obicei /sbin/init) se afl n subcatalogul /proc/1, despre procesul cu numrul 182 - n /proc/182, etc. Toate fiierele, deschise de
un proces, sunt reprezentate sub forma unor referine simbolice n catalogul /proc/<pid>/fd, iar referina la catalogul rdcin este pstrat ca
/proc/<pid>/root.
Sistemului de gestiune a fiierelor procfs i sunt asociate i alte funcii. De exemplu, cu ajutorul comenzii echo 100000>/proc/sys/fs/filemax un superuser poate indica, c se permite deschiderea unui numr de pn la 100000 de fiiere, iar comanda echo
0>/proc/sys/kernel/cap-bound va retrage proceselor din sistem toate drepturile suplimentare, adic va priva sistemul de noiunea superuser.

Informaii utile pune la dispoziie programul lsof. Acesta returneaz lista tuturor fiierelor, utilizate la momentul curent de ctre procese,
inclusiv cataloagele folosite de ctre unele procese n calitate de catalog curent sau catalog rdcin, bibliotecile dinamice, ncrcate n memorie,
etc.

112. Unix. Crearea proceselor


Reamintim ca un proces este "un program in executie". Un program este o secventa de instructiuni. Daca lansam in executie programul
spunem ca creem un proces care executa acel program. Starea unui proces la un moment dat este definita prin:

programul executat
instructiunea curenta
valorile variabilelor programului
fisierele deschise, etc

In UNIX, fiecare proces este identificat printr-un numar intreg pozitiv numit identificator de proces, sau PID (Process ID).
La crearea unui nou proces, trebuie sa stabilim starea initiala a acelui proces. Ne-am putea imagina o functie, definita ca mai jos:
int creaza_proces(const char* nume_exe, const char* arg[]);
Aceasta functie ar lansa in executie programul continut in fisierul dat prin argumentul nume_exe, pasandu-i in plus argumentele date
prin arg. Functia ar returna identificatorul procesului creat

113. Unix. Distrugerea proceselor.


Crearea unui proces presupune alocarea resurselor i iniializarea contextului. Distrugerea unui proces elibereaz toate resursele care i-au fost
alocate.
Comanda kill se utilizeaza pentru a trimite semnale proceselor. Un proces se poate afla in diferite stari pe parcursul executiei. Daca dorim sa
scoatem un proces din lista proceselor care se ruleaza trebuie sa-i trimitem semnalul de distrugere SIGKILL.
Sintaxa.: kill <semnal> <identificator proces>
In loc de SIGKILL putem utiliza optiunea -9. Toate procesele fundal pot fi distruse cu comanda kill 0.
Daca se inchide terminalul automat se distrug si toate procesele noastre atat cele normale cat si cele care se executa in fundal. Daca avem de
executat un proces foarte lung si nu are voie sa fie oprit atunci procesul trebuie lansat cu comanda nohup (No Hang-Up). Procesele care se
executa asa vor continua sa se execute si dupa inchiderea sesiunii de lucru. Neavand la dispozitie terminalul, rezultatele vor fi scrise in
fisierul nohup.out.

1.14.13.11. 114. Demoni n Linux


Demon (daemon) n Linux este numit procesul predestinat s lucreze n regim de fond fr terminal i care execut anumite operaii pentru
alte procese (nu obligator pe calculatorul Dumneavoastr). De obicei, demonii i ndeplinesc n linite lucrul i ne amintim de ei doar n cazul
unor situaii ieite din comun: spaiu insuficient demonul singur informnd utilizatorul despre aceasta, sau refuz s lucreze i suntei ntrebat de
ef cnd se vor termina problemele cu imprimant .
Pentru multe calculatoare demonii, care servesc procesele altor calculatoare, sunt rar utilizai din care cauz nu trebuiesc pstrai constant n
memorie cu cheltuieli neraionale ale resurselor sistemului. Pentru coordonarea lucrului acestora a fost creat un superdemon inetd (Internet
daemon).
n fiierul de configurare inetd (/etc/inetd.conf) este indicat care demon acceseaz un serviciu anume de Internet. De obicei, cu ajutorul lui
inetd sunt apelate programele pop3d, imap4d, ftpd, telnetd (exerciiu - determinai serviciul pus la dispoziie), etc. Aceste programe nu sunt n
mod constant active, n rezultat, ele nu pot fi considerate demoni n adevratul sens al cuvntului, dar, deoarece ele sunt create de un demon
adevrat, sunt numite demoni.
115. Unix. Obtinerea informatiei despre procese.
Lista proceselor active se poate afisa cu comanda ps. Fara nici o optiune afiseaza procesele proprii utilizatorului.
Sintaxa: ps <optiuni>
Optiuni:
-a: toate procesele
-l: forma lunga

1.15.

116. Principiile gestiunii informaiei


Noiunile de identificator, valoare, tip, desemnare, reprezentare sunt utilizate n informatic n forme extrem de diverse. Elaborarea unui
model general pentru aceste noiuni mai este nc o problem deschis. Ne vom limita aici cu prezentarea unui model simplificat, care
se contureaz n cadrul limbajelor de programare i care permite s inem cont de cele mai frecvente situaii.
Definiii generale

Programul unui sistem informatic descrie acest sistem ca o mulime de obiecte, obiectele sistemului i operaiile asociate sunt cele specificate
de limbajul utilizat. Pentru implementarea sistemului descris ntr-un sistem informatic va trebui s definim pentru fiecare obiect o reprezentare
concret, care are forma unei mulimi de informaii n memorie, pentru unitile periferice, etc. Implementarea sistemului se traduce prin aciuni,
care modific starea acestor reprezentri.
Procesul de reprezentare utilizeaz dou scheme de baz. n schema compilrii obiectele abstracte, specificate de program, sunt nlocuite, n
faza preliminar de translatare, prin reprezentrile lor. Aceste reprezentri sunt obiecte executabile direct interpretate de un dispozitiv fizic. n
schema interpretrii un sistem logic (interpretorul) este alimentat direct de program; el asociaz (n mod static sau dinamic) o reprezentare
intern fiecrui obiect i stabilete corespondena ntre obiectul abstract i reprezentarea la fiecare accesare. Schema interpretrii este de regul
mai puin eficace n comparaie cu schema compilrii, deoarece corespondena obiectelor trebuie realizat la fiecare accesare, ns ea convine mai
mult n cazul unei gestionri dinamice a obiectelor (nlocuirea unui obiect prin altul, modificarea reprezentrii unui obiect). n practic, este bine
de combinat aceste dou scheme n funcie de restriciile specifice concrete.
Programul unui sistem utilizeaz nume pentru a desemna obiectele acestui sistem. Numele unui obiect este o informaie cu funcie dubl: pe
de o parte permite s se fac distincia obiectului dat de alte obiecte; pe de alt parte, el servete ca i cale de acces la obiect, adic el poate fi
interpretat n scopul efecturii unor aciuni asupra obiectului. Numele respect anumite reguli proprii limbajului de programare. Nume sunt
identificatorii, care desemneaz variabilele i procedurile ntr-un limbaj de programare sau fiierele ntr-un limbaj de comand.
n cazul reprezentrii externe un identificator desemneaz un anumit obiect, care poate fi o constant sau o informaie ce permite accesul la
un alt obiect (obiectul permite referirea unui alt obiect, fig.5.1).

Program
.
.
.
identificat
or
.
.
.

obiect/
reper

Ri
obiect

Fig.5.1. Relaia identificator obiect

Trecerea de la identificator la obiectul propriu-zis se realizeaz prin compunerea funciilor de acces D i Ri, obinnd calea de acces la un
obiect.

Suportul fizic al informaiei este memoria. La acest nivel memoria poate fi considerat un ir de amplasamente caracterizate printr-un
coninut. Un proces desemneaz un amplasament printr-un nume folosit de unitatea central pentru a citi i la necesitate a modifica
coninutul acestui amplasament. Coninutul unui amplasament poate fi interpretat ca un ntreg, o instruciune etc., sau ca un nume care
desemneaz alt amplasament.
Reprezentarea extern este convertit n cuplul (amplasament, coninut), numele amplasamentului devenind numele obiectului. De exemplu,
o constant devine un cuplu (amplasament, coninut invariabil), iar un obiect care repereaz altul - (amplasament, coninut variabil):
amplasamentul conine reprezentarea unui obiect care este fie reprezentarea intern a unei constante, fie un nume.
Vom face o deosebire ntre celulele memoriei fizice i amplasamente prin utilizarea noiunii de adres pentru primele i nume pentru
amplasamente. Obiectele definite de perechea (amplasament, coninut) pot fi deplasate n memoria fizic, schimbarea adresei fizice a unui
amplasament nu afecteaz, n general, numele lui.
Acestea au fost obiectele simple. Obiectele constituite din mai multe obiecte de acelai tip sau de tip diferit (masive, fiiere, structuri) se
numesc obiecte compuse. Numele obiectului compus se afl ntr-un amplasament al crui coninut este un descriptor. Descriptorul, fiind
reprezentarea intern a unui obiect compus, definete tipul, numrul componentelor obiectului, o eventual ordine a acestora, precum i
amplasamentele n care se afl aceste componente. Funcia de acces asociat descriptorului are parametri i furnizeaz un coninut sau un nume
de amplasament.
Numim obiect accesibil un obiect cruia i s-a asociat o cale de acces. Numim obiect partajat orice obiect care este accesibil mai multor
utilizatori (eventual cu drepturi de acces difereniate). Folosirea numelor care iniiaz calea de acces la un obiect partajat poate fi imaginat n mai
multe feluri: fie utilizarea aceluiai nume sau a unor nume diferite pentru a avea acces la acelai obiect, fie folosirea aceluiai nume pentru a
desemna reprezentri diferite.
Partajarea obiectelor la nivelul aceluiai nume (fig.5.2, a) presupune rezervarea numelor tuturor obiectelor partajabile n mod potenial.
Rezervarea acestor nume rmne efectiv chiar dac obiectele n cauz nu mai sunt folosite, ansamblul obiectelor accesibile unui proces
mprindu-se n dou pri disjuncte: obiectele private ale procesului i cele potenial partajabile.
n cazul partajrii unui obiect folosind nume diferite (fig.5.2, b), fiecare proces posed un nume care, dup stabilirea cii de acces, i permite
accesul la o reprezentare unic.

n unele situaii acelai nume permite accesul la reprezentri diferite; este cazul procedurilor reenterabile n care un nume fixat la
compilare conduce n timpul execuiei la reprezentri diferite, proprii proceselor care utilizeaz aceast procedur (fig.5.2, c).

proce
si
a)
nume

proce
sj
nume

b)
nume i

nume
j

c
)
obiect i

obiect j
.
.
nume
Fig.5.2. Accesarea .obiectelor partajate
.
.

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. Un masiv creat de un program ntr-un limbaj de programare este distrus la terminarea execuiei
programului, amplasamentele pe care le ocup putnd fi reutilizate pentru reprezentarea altor obiecte, n timp ce un fiier poate supravieui
programul care l-a creat.

1.15.1.

117. Interpretarea numelor

La nivelul sistemului de operare obiectele sunt memorate n amplasamente, iar procesele le pot accesa prin nume. Stabilirea cii de acces la
un obiect prin compunerea funciilor de acces ataate se numete legare. Se spune c un obiect este legat atunci cnd pentru el este stabilit calea
de acces. n cazul operaiilor aritmetice calea de acces asociat unui obiect conduce la o constant; n cazul listelor sau parametrilor - la un nume.
Legarea se traduce, n ultim instan, prin stabilirea corespondenei ntre identificatori i adrese. Aceast coresponden este stabilit parcurgnd
un ir de etape consecutive: se trece de la identificator la adres conform unui set de relaii, care se numete cale de acces (avem, deci, nc o
definiie a noiunii cale de acces, care este echivalent celei introduse anterior).
1.15.1.1.118. Construirea cii de acces
Fie F1 i F2 doua funcii de acces, F1 permind 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 funcii. Calea de acces de la o1 la o3 poate fi construit prin metoda substituiei sau prin metoda nlnuirii.
Metoda substituiei stabilete o nou funcie 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 nlnuirii cere ca la fiecare accesare a obiectului o3 pornind de la o1 s fie parcurs calea o1F1o2F2o3. Nu se pierde nici o informaie,
dar accesul este mai lent.
Unele obiecte pot fi legate la faza de compilare (de exemplu, obiectele private ale unui program), pentru altele calea de acces este stabilit
ntr-o faz ulterioar (obiectele externe i parametrii sunt obiecte libere dup compilare). Pentru un obiect extern compilatorul creeaz un obiect
legtur al crui coninut este un ir de caractere ce alctuiesc identificatorul sau i o informaie ce permite regsirea tuturor numelor ce
desemneaz aceast legtur. Operaia de legare a externilor se numete editare de legturi. Ea poate fi realizat ntr-o faz distinct,
premergtoare fazei de execuie (static), sau n faza de execuie (dinamic), cnd se face prima referin la obiectul extern. Editarea legturilor se
face prin nlnuire sau prin metoda substituiei. n primul caz numele externului este la legtura prevzut de compilator i aceast legtur este
pstrat n continuare, iar n cel de-al doilea - numele externului este plasat n toate amplasamentele indicate de legtur, dup care aceasta este
distrus.
La acest nivel prin segment subnelegem un ansamblu de amplasamente consecutive n care se reprezint obiecte de acelai tip, cu aceeai
durat de existen i cu acelai grad de protecie. Segmentul este cea mai mic unitate care poate fi partajat i poate conine obiecte compuse un masiv, un fiier, o stiv sau o procedur - accesibile unui proces la un anumit moment. Un descriptor, reprezentat ntr-un amplasament,
definete segmentul, iar numele amplasamentului care conine descriptorul este chiar numele segmentului.
Obiectului procedur i sunt asociate mai multe noiuni: modul surs, modul obiect sau modul executabil. Modulul surs al unei proceduri
este textul acesteia scris de ctre programator ntr-un limbaj de programare i care va fi tratat de ctre compilator. Modulul obiect al procedurii
este obinut la ieirea compilatorului, deci este un produs al compilatorului. Modulul obiect este reprezentat ntr-un segment sau ntr-un fiier,
destinat interpretrii (dup editarea legturilor, la necesitate) de ctre procesor ca instruciuni, valori etc., fiind manipulat n consecin. Pentru a
separa gestiunea resurselor de administrarea informaiei, interferen ce are loc din mai multe motive (memorii limitate din punctul de vedere al
capacitii, timpi de acces foarte variai, execuia instruciunilor numai atunci cnd se afl n memoria operativ, ceea ce impune un grad de

mobilitate al obiectelor pe suporturile fizice etc.), s-a introdus noiunea de memorie fictiv: memorie operativ ipotetic suficient de mare pentru
a conine toate obiectele sistemului. Memoria fictiv este asociat sistemului, iar memoria virtual este proprie procesului.
119. Structura reprezentrilor. Descriptori

Schema de mai jos poate fi utilizat doar pentru obiecte elementare, cum ar fi valori ntregi, reale sau caractere, reprezentarea crora
cere un singur amplasament i pentru care funciile de acces sunt reprezentate direct prin instruciunile mainii fizice. Se va mai ine
cont de urmtoarele dou aspecte:
1) pot exista obiecte compuse, structura intern a crora poate fi complex, lungimea poate varia pe perioada timpului de existen
a obiectului,
2) poate fi necesar s se realizeze unele funcii complexe de accesare a obiectelor compuse.
Dup cum a fost menionat, numele obiectului compus se afl ntr-un amplasament al crui coninut 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 urmtoarele
avantaje:
1) 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 informaii de volum fix i cunoscut,
2) descriptorul constituie un punct de trecere impus pentru accesarea reperat a obiectului i, ca rezultat, poate servi la
implementarea unor controale ale accesrii, de msurare, etc.,
3) descriptorul asigur un acces indirect la obiectul reperat, ceea ce permite modificarea dinamic a cii de acces (substituirea unui
obiect printr-un alt obiect) sau deplasarea unui obiect n memorie fr recompilarea modulului surs,
4) partajarea obiectelor ntre mai muli utilizatori cu drepturi sau proceduri de accesare diferite poate fi realizat construind tot
atia descriptori, ci utilizatori exist; aceti descriptori repereaz acelai obiect i au aceleai informaii de localizare fizic.
Noiunea de descriptor este larg folosit n sistemele de gestiune a fiierelor (v.5.2 i cap.7). O alt utilizare este realizarea mecanismului de
adresare segmentat. Segmentarea este o tehnic elementar de structurare a softului. Putem spune, c segmentul este un obiect compus, de
lungime variabil, reprezentarea n memorie a cruia ocup o suit de amplasamente consecutive; el permite ordonarea obiectelor, care se afl
ntr-o relaie logic. Segmentarea permite utilizatorului s-i organizeze programele i datele sub forma unui ansamblu de segmente, fr s se
preocupe de implantarea lor fizic. De exemplu, fiecare procedur a unui program complex poate ocupa un segment distinct. n calculatoarele cu
adresare segmentat fiecare segment este reperat de un descriptor, numele acestor descriptori fiind direct interpretate de procesor.
1.15.1.2.

120. Contexte i medii

Enumerm mai jos considerentele din care mulimea obiectelor accesibile unui proces variaz n timp:
1. Decompoziia aplicaiilor. Metodele de decompoziie, utilizate pentru structurarea unei aplicaii complexe, definesc componentele
(module, proceduri, etc.). Fiecrei componente i se asociaz o mulime distinct de obiecte accesibile.
2. Gestiunea dinamic. Mulimea obiectelor accesibile unui proces i poate modifica compoziia din considerente, legate chiar de
natura aplicaiei: obiectele pot fi create sau distruse n timpul execuiei.
3. Protecia. O modalitate simpl de a mpiedica un proces s atepte un obiect, accesul la care i este interzis, este de a suprima
toate cile de acces ale procesului spre acest obiect pentru durata interdiciei. Vor fi evitate n acest fel cheltuieli exagerate la
execuie.
4. Eficacitatea. Dac un obiect este cutat ntr-o mulime de alte obiecte, cutarea este cu att mai eficace cu ct mulimea are mai
puine elemente.

Trebuie, deci, s lum n consideraie att posibilitatea evoluiei dinamice a mulimii obiectelor, ct i a cilor de acces la aceste obiecte.
Introducem pentru aceasta noiunile care urmeaz.
Vom numi lexic o mulime de identificatori. Mulimea obiectelor, desemnate de identificatorii lexicii la un moment de timp dat, se numete
context asociat la aceast lexic (adic mulimea obiectelor pentru care exist o cale de acces pornind de la unul dintre aceti identificatori).
Starea de execuie a unui context este starea mulimii 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. Vom numi mediu mulimea format dintr-o lexic i informaiile (programe, date, reguli de interpretare) necesare la utilizarea
acestei lexici. Aceste informaii pot lua diferite forme n dependen de limbajul utilizat (limbaj de comand, limbaj de programare).
Vom numi accesibilitate a unui identificator ntr-un program regiunea programului n care acest identificator este valid, adic poate fi
utilizat ca origine a unei ci de acces. Altfel spus, un proces poate utiliza acest identificator pentru a desemna un obiect atunci cnd el execut
partea n cauz a programului.
Noiunea de durat de existen sau de via a unui obiect poate fi extins i pentru cile de acces, nelegnd prin aceasta perioada de timp
n care acestea exist (intervalul de timp care separ crearea de distrugere).
Atunci cnd un proces execut un program, mulimea obiectelor la care procesul are acces este definit pentru orice moment de timp,
aplicnd identificatorilor valizi n aceste momente de timp regulile de interpretare, specificate de mediul curent: regsim noiunea de context
pentru execuia unui proces, introdus n capitolul 3.

ident.

con
text

lexica

reguli
de
interpretare

obiec
t
cale de
acces
me
Conform specificaiilor sistemului de operare, identificatorii
fiierelor
pot sau nu pot continua a fi utilizabili (conform
diul
regulilor proprii de interpretare). Fig.5.3. Contextul de execuie a unui proces

Starea de execuie a unui proces (valoarea obiectelor contextului su) se poate modifica la execuia fiecrei instruciuni, ns coninutul
contextului su (identitatea obiectelor care-l formeaz), se schimb cu o frecven mai mic. Iat evenimentele principale care pot modifica
coninutul contextului unui proces:
1) Schimbarea mediului, implicnd o modificare a compoziiei lexicii i, eventual, aplicarea unor reguli de interpretare noi: apel de
procedur, intrarea ntr-un bloc nou (ntr-un limbaj cu structur de blocuri), schimbarea catalogului curent (ntr-un limbaj de
comand).
2) Modificarea explicit a cii de acces, pornind de la un identificator al lexicii: asocierea unui fiier sau unui periferic unui flux de
intrare-ieire.
3) Crearea sau distrugerea explicit a unui obiect desemnat de un identificator din lexic: crearea sau distrugerea unui fiier, alocarea
sau eliberarea unei variabile administrate dinamic.
Examinnd aceste cazuri putem diferenia durata de via a unui obiect, a unui identificator, care desemneaz acest obiect i cea a unei ci de
acces, care conduce la obiectul n cauz. Sunt posibile diferite situaii: un identificator poate fi legat succesiv de diferite obiecte; reciproc, un
obiect poate succesiv (sau simultan) s fie desemnat de mai muli identificatori diferii; un obiect poate deveni inaccesibil (nici o cale de acces nu
conduce la el). Existena obiectelor inaccesibile pune problema recuperrii spaiului ocupat de acestea: tehnici speciale de adunare a
frmiturilor, permit rezolvarea acestei probleme.
1) Obiecte interne: acestea sunt instruciunile, care compun textul procedurii. Ele sunt desemnate de etichetele, utilizate pentru
instruciunile de ramificare. Durat lor de via coincide cu durat de via a procedurii.
2) Obiecte locale: acestea sunt variabilele, declarate n interiorul procedurii. Aceste obiecte sunt create la fiecare apel al
procedurii i distruse la retur. n cazul unui apel recursiv, un exemplar nou al fiecrui obiect local este creat la fiecare apel i
identificatorul su desemneaz ultimul exemplar creat (celelalte rmnnd inaccesibile pn la returul la nivelul
corespunztor).
3) Obiecte remanente i obiecte globale: acestea sunt obiectele care existau deja la apelul procedurii i care vor supravieui la
retur; durata lor de via este fie cea a procesului (obiecte remanente), fie cea a unei proceduri, care nglobeaz procedura
dat (obiecte globale).
4) Obiecte externe: sunt obiectele construite i pstrate independent de procedura i procesul considerat (alte proceduri, fiiere,
etc.). Durata lor de via nu depinde de cea a procedurii sau a procesului; ele pot fi create sau distruse n mod dinamic n
timpul execuiei procedurii.
5) Parametri: parametrii formali sunt identificatori, utilizai n interiorul procedurii i care sunt legai doar n momentul
apelrii. Obiectele legate de acestea sunt numite parametri efectivi sau activi; parametrii efectivi sunt furnizai de ctre
procedura apelant sau sunt obiecte externe. Legtura dintre parametrii formali i cei efectivi poate lua diferite forme n
dependen de regulile definite n limbajul de programare: apelare prin nume, prin valoare, prin referin. Aceste forme
difer prin momentul stabilirii i permanenei legturii. Legtura dispare la returul din procedur.
n cazul n care mai multe procese partajeaz o procedur, fiecare proces posed un set propriu de obiecte locale, remanente, globale.
Obiectele externe sunt n exemplar unic, ca i textul (invariant) al procedurii.

1.15.2.

121. Legarea

Numim legare procesul construirii unei ci de acces. Acest proces acoper o varietate mare de situaii, care vor fi analizate din mai multe
puncte de vedere: natura relaiei de desemnare, momentul legrii, permanena legturii. Vom prezenta mai jos i tehnicile principale utilizate.

Legarea obiectelor unui program poate fi efectuat la diferite momente de via a programului n sistem:
1) n momentul scrierii programului. Este cazul unui program scris direct n cod binar cnd fiecare obiect este desemnat prin adresa
absolut a amplasamentului, care-l conine. Un atare program poate fi imediat executat, dar orice modificare este dificil i conine un risc ridicat
de eroare. n practic, unicele obiecte legate la etapa scrierii programului sunt notaiile universale, care desemneaz constantele.
2) La una din fazele de translatare (asamblare sau compilare). Legtura este definitiv i identificatorii sunt nlocuii prin adrese absolute.
Dezavantajul este c programul nu poate fi deplasat n memorie fr a fi recompilat (dac nu exist mecanisme de translatare a adreselor). De
asemenea, legtura stabilit la translatare nu este dect parial : identificatorii nu sunt nlocuii de adrese absolute, ci relative ncepnd cu
originea programului (deplasare).
3) La o faz de ncrcare i editare a legturilor. Faza ncrcrii are drept scop nlocuirea adreselor relative prin adrese absolute, fixnd
originea programelor n memorie. Faza editrii legturilor are ca scop stabilirea legturii referinelor externe (s ne amintim, c vorbim despre
identificatorii, care desemneaz obiecte construite sau pstrate independent de programul n cauz). ncrcarea i editarea legturilor pot fi
combinate ntr-o singur operaie sau realizate separat. Algoritmii utilizai sunt descrii n 5.3.

O operaie analogic editrii legturilor este cea a legrii fluxurilor de intrare-ieire cu fiierele sau perifericele. Ca i editarea
legturilor, aceast operaie, descris n 5.2.3.2 poate fi realizat n prealabil sau n timpul execuiei.
4) n timpul execuiei; legtura este numit n acest caz dinamic. Exist mai multe considerente de retardare a legturii pn la faza de
execuie:
informaiile necesare pot fi cunoscute doar la aceast faz, n particular dac obiectele desemnate sunt create dinamic, fiind, deci
necunoscute la momentul compilrii,
calea de acces trebuie modificat n timpul execuiei: este cazul cnd un identificator este reutilizat pentru a desemna succesiv mai
multe obiecte (de exemplu, flux de intrare-ieire reasociat mai multor fiiere diferite),
mecanismul interpretrii impune o legtur dinamic: poate fi cazul, de exemplu, al variabilelor locale a unei proceduri recursive,
adresa crora poate fi stabilit doar n cursul execuiei.

Legarea dinamic const, cel mai frecvent, n completarea unei ci de acces existente deja parial.

Tabelul, care urmeaz, aduce un rezumat al caracteristicilor legturii n dependen de momentul stabilirii acesteia.

Tabelul 5.1. Caracteristicile legturilor


Legtu

Condiii

Caracteristici

Devre

Informaiile sunt cunoscute din timp

Eficien n execuie

Condiii de execuie invariante

Cale de acces nemodificabil

Informaii cunoscute parial

Necesitatea pstrrii informaiilor de legtur

ra
me
Trzie

Condiii de execuie variabile

Timp mare de execuie, programe adaptabile

Dac criteriul principal este comoditatea utilizrii unui sistem i adaptabilitatea lui la condiii diverse de execuie (ceea ce este cazul
sistemelor interactive), vom fi cointeresai s ntrziem momentul stabilirii legturii (delay binding time). Motivaia principal a unei legturi,
stabilite la etapa iniial de elaborare a programului, este eficacitatea execuiei.

1.15.3.

122. Protecia

Vom nelege prin termenul protecie mulimea metodelor i mecanismelor, care vizeaz specificarea regulilor de utilizare a obiectelor i
garanteaz respectarea acestor reguli. Protecia este asigurat de o combinaie de dispozitive fizice i logice.
Exist legturi strnse ntre desemnarea obiectelor i protecia lor. S ne reamintim trei observaii, legate de protecie:
1) O modalitate simpl de a interzice unui proces orice acces la un obiect const n suprimarea tuturor cilor de acces la acest obiect, altfel
spus, de a le retrage din contextul procesului,
2) Atunci cnd operaiile permise asupra unui obiect sunt specificate prin apartenena la o clas sau un tip, este posibil verificarea
prealabil execuiei (adic n momentul compilrii sau editrii legturilor) dac obiectul este utilizat conform regulilor specificate,
3) n cazul n care verificarea este fcut n momentul execuiei, o procedur de acces faciliteaz implementarea verificrii i reduce riscul
unor erori. Aceast procedur poate fi la nivel logic (un interpretor, de exemplu) sau fizic (un dispozitiv va aproba trecerea mai
departe).

Prezentm mai nti un model simplu, care va permite s introducem noiunile principale, necesare studierii proteciei. Mecanismele,
care permit implementarea proteciei ntr-un sistem informatic, sunt descrise n 5.4.
123. Domenii i drepturi de acces

1.15.3.1.

Printre obiectele, care formeaz un sistem informatic cele care pot aciona asupra altor obiecte, modificndu-le starea, vor fi numite active.
Regulile de utilizare pot fi exprimate specificnd drepturile de acces ale fiecrui obiect activ, adic mulimea de operaii pe care obiectele active
sunt autorizate s le execute asupra altor obiecte.
S precizm acum noiunea de obiect activ, adic s definim entitile crora sunt ataate drepturile. Am putea s legm drepturile direct de
procese, ns aceast alegere nu permite exprimarea simpl:
1) a posibilitii evoluiei dinamice a drepturilor unui proces,
2) a faptului, c mai multe procese pot avea, n aceleai circumstane, acelai set de drepturi.
Pentru a ine cont de aceste dou aspecte a fost introdus noiunea de domeniu de protecie. Aceast noiune este un caz particular al noiunii
de mediu - un domeniu definete:
o mulime de obiecte accesibile sau context,
pentru fiecare dintre aceste obiecte, o mulime de operaii permise (drepturi),
un mecanism, care asigur accesul la aceste obiecte, respectnd restriciile de mai sus.
Un proces este ntotdeauna executat ntr-un domeniu bine definit; contextul su este cel ataat domeniului, procesul posednd drepturile
specificate asupra tuturor obiectelor acestui context. Un proces poate schimba domeniul cu ajutorul unei operaii particulare (apelare domeniu).
Un domeniu este el nsui un obiect asupra cruia poate fi executat operaia de apel; alte operaii sunt definite mai departe.
Domeniile de protecie pot fi definite prin mai multe modaliti; exemplificm cteva mai jos.
un domeniu pentru sistemul de operare, unul pentru fiecare utilizator,
un domeniu pentru fiecare subsistem, care realizeaz o funcie particular,
un domeniu pentru fiecare mediu (definit, de exemplu, de cuplul (procedur, catalog curent)).

Alegerea depinde de funciile cerute i, cel mai important, de mecanismele disponibile (v. 5.4).
Presupunem pentru nceput, c exist un numr constant de obiecte. Regulile de protecie pot fi reprezentate sub forma unui tablou
bidimensional, numit matricea drepturilor. Acest tablou conine cte o linie pentru fiecare domeniu Di i cte o coloan pentru fiecare obiect Oj
(notm, c domeniile, fiind obiecte particulare, apar de asemenea i n coloane). Caseta (i, j) conine drepturile pe care le are un proces, care se
execut n domeniul Di, asupra unui obiect Oj.
Tabelul 5.2. Exemplu de matrice de drepturi
fiierul 1

fiierul 2

periferic

D1

D2

<citire, scriere,
executare>

<citire, scriere,
executare>

<alocare,
retragere>

<>

<apelare
>

<schimbare
drepturi>

<citire, scriere,
executare>

<citire, scriere,
executare>

<cerere,
eliberare>

<apelare
>

<>

<apelare>

<citire, scriere,
executare>

<citire, scriere,
executare>

<nil>

<apelare
>

<>

<>

D3

Notaia nil semnific faptul, c obiectul Oj nu figureaz n contextul domeniului Di, iar notaia <> definete o list vid. n ambele cazuri Oj
este inaccesibil n Di; diferena apare dac s vrea s se ofere lui Di drepturi asupra lui Oj: n primul caz este necesar s se introduc Oj n
contextul lui Di, adic s-l legm; n cel de-al doilea caz este suficient s extindem lista existent.
n practic, matricea drepturilor este foarte rarefiat, adic foarte multe casete conin nil sau <>. Din aceast cauz sunt utilizate alte forme de
reprezentare a matricei drepturilor:
1) Reprezentarea coloanelor: lista de acces
Lista de acces, asociat unui obiect este o list (Di, <di>), unde Di este un domeniu, care conine obiectul, iar <di> este mulimea drepturilor
acestui domeniu asupra lui. De exemplu, dac un domeniu este asociat fiecrui utilizator al unui sistem n timp partajat, lista de acces a unui fiier
conine pentru fiecare utilizator lista operaiilor pe care el este autorizat s le ntreprind asupra fiierului.
O metod frecvent utilizat pentru a reprezenta mai compact listele de acces const n specificarea pentru un obiect a unor drepturi implicite
(default) pe care le posed fiecare domeniu. De exemplu, putem specifica implicit, c orice fiier este accesibil doar pentru lectur fiecrui
utilizator. Lista de acces va conine doar cuplurile (Di, <di>) pentru care drepturile difer de cele implicite.

2)

Reprezentarea liniilor: lista de drepturi i capaciti

Lista drepturilor asociat unui domeniu este o list (Oj, <dj>) n care Oj desemneaz un obiect, care figureaz n contextul domeniului, iar
<dj> este mulimea drepturilor domeniului asupra lui Oj. Un proces, care este executat n domeniul considerat, primete aceast list de drepturi;
la fiecare accesare a unui obiect mecanismul de accesare trebuie s verifice c operaia curent este licit, adic este n <dj>. Din considerente de
eficacitate, este de dorit ca acest mecanism s fie cablat. Forma cea mai primitiv n acest sens este bitul supervizor-sclave a cuvntului de stare a
unui procesor. O form mai evoluat este capacitatea (v. 5.4.3), care reunete ntr-o structur unic de date, interpretat la fiecare accesare,
adresa unui obiect i mulimea drepturilor permise. n acest fel, lista drepturilor unui domeniu este lista capacitilor.
O operaie important este cea de schimbare a domeniului, care permite unui proces s-i modifice mediul i drepturile asupra obiectelor.
Aceast schimbare a domeniului ia adesea forma unui apel de procedur, atunci cnd procesul trebuie s revin n domeniul su iniial. Pentru a
garanta respectarea regulilor de protecie, trebuie luate msuri de precauie de fiecare dat, cnd are loc extinderea drepturilor. Aceast
circumstan se poate produce n egal msur att la apel, ct i la retur. Pentru controlarea operaiei de schimbare, se cere ca apelul i returul
domeniului s se fac n mod exclusiv prin execuia unor proceduri speciale (ghieu de apel sau de retur), programele crora garanteaz
respectarea regulilor specificate. Schimbarea domeniului pe o alt cale dect cea a ghieului este interzis de mecanismele de protecie a
domeniului.

1)

1.15.3.2.124. Problemele proteciei


Prezentm succint cteva probleme, legate de implementarea proteciei n sistemele informatice.
Protecie ierarhizat

n aceast situaie simpl vrem s protejm un subsistem A contra erorilor sau aciunilor prohibitive, provenite dintr-un subsistem B, care
utilizeaz serviciile subsistemului A, dar nu are vre-un drept asupra lui A. n acelai timp A poate accesa fr restricii toate informaiile lui B.
Subsistemul A este, de exemplu, un sistem de operare, iar B - o aplicaie. Aceast problem este rezolvat prin mecanisme ierarhice cum ar fi
regimurile supervizor/sclav, cu trecere obligatorie printr-un apel la regimul supervizor pentru comunicarea ntre A i B. Schema inelelor de
protecie (v.5.4.2.5) este o generalizare a acestui principiu.
2) Subsisteme reciproc suspicioase
Exist o suspiciune reciproc ntre dou subsisteme n cazul n care fiecare specific, c unele din informaiile sale trebuie s fie protejate
contra erorilor sau aciunilor prohibitive ale celuilalt subsistem. Aceast situaie nu poate fi tratat cu ajutorul unui mecanism de protecie
ierarhic.
3) Acordarea i retragerea drepturilor de acces
Problema pus aici este problema modificrii dinamice a drepturilor de acces. n particular, este posibil s se doreasc s avem posibilitatea
de a extinde sau restrnge drepturile unui domeniu. Cnd transmiterea drepturilor este tranzitiv (extinderea drepturilor unui domeniu
permindu-i la rndul su s transmit drepturi), poate fi foarte dificil s se cunoasc la un moment de timp dat mulimea drepturilor ataate unui
obiect anume. Apare o problem, dac se va decide restrngerea sau suprimarea acestor drepturi pentru toate domeniile sau doar pentru o parte a
lor, care pot accede obiectul. O soluie posibil const n introducerea unui pasaj unic (descriptor) la traversarea cruia se vor permite accesrile
obiectului. ns aceast metod nu permite tratarea cazului unei retrageri selective, pentru care poate fi necesar s fie parcurse legturile inverse
ntre obiect i domeniile, care au acces la obiect.
1.16.

125. Desemnarea i legarea fiierelor i intrrilor-ieirilor

Organizarea fiierelor i realizarea funciilor lor de acces vor face obiectul de studiu al capitolului 6. Vom examina aici modul de desemnare
a fiierelor, legarea lor cu programele, care le utilizeaz i relaiile lor cu intrrile-ieirile. Nu avem nevoie pentru aceasta s cunoatem
organizarea intern a unui fiier, interesndu-ne doar organizarea lui ca un tot ntreg n cazul unui limbaj de comand sau al unui progra
126. Ci de acces la un fiier
Un fiier este un obiect compus: el posed un descriptor, care conine informaiile, necesare localizrii sale fizice i realizrii funciilor de
acces. Pentru sistemul de operare, numele descriptorului unei fiier (adresa fizic sau indicile ntr-un tabel de descriptori) permite accesul la
fiier. Acest nume al descriptorului, de obicei necunoscut de utilizatori i rezervat doar pentru sistemul de operare, este numit nume intern al
fiierului. Descriptorul i numele intern al fiierului sunt unice. Coninutul unui descriptor de fiier este detaliat n 6.4.
Un fiier este desemnat de ctre 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 cii de acces la un fiier pornind de la unul din numele sale
externe, sunt numite cataloage sau directorii (eng., directory). Structura cataloagelor i interpretarea numelor externe sunt descrise n 5.2.2.
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 (de exemplu, durata de execuie a unui program). Necesitatea unui asemenea nume rezid
n urmtoarele:
Eficacitate: numele locale sunt definite ntr-un mediu mai restrns dect numele externe i interpretarea lor este, deci mai rapid
(cataloagele nu sunt parcurse la fiecare accesare a fiierului),
Comoditatea utilizrii i adaptabilitatea programelor: acelai nume poate fi refolosit pentru a desemna fiiere diferite pentru instane de
timp distincte, ceea ce permite reutilizarea unui program cu fiiere diferite fr a fi necesar s se modifice textul programului,
Acces selectiv: interpretarea numelor locale permite introducerea unui acces selectiv la un fiier n dependen de utilizator (funcii de
acces sau drepturi de acces diferite).
Legarea numelor locale este realizat prin nlnuire: un nume local desemneaz un descriptor local, care la rndul su, direct sau indirect,
repereaz descriptorul unic al fiierului.

Mediul
global

Mediul
local

Mediul
SGF

nume
externe

nume local

nume
intern

(Catalo
age)

descriptor
local
Fig.5.4. Ci de acces la un fiier

Descriptor

fi
ier

1.16.1.

127. Desemnarea extern a fiierelor. Cataloage

Vom examina modul n care un utilizator poate nota fiierele cu ajutorul identificatorilor sau nume externe, i structurile de date sau
cataloagele, care permit determinarea descriptorului fiierului, pornind de la un nume extern, Pentru simplificarea expunerii vom presupune, c
descriptorii se conin direct n catalog; n realitate doar o parte a descriptorului se poate afla n catalog, acompaniat de un nume intern, care
permite determinarea restului.
1.16.1.1.Introducere
Un catalog definete n sensul 5.1.2, un mediu, adic o mulime de identificatori (sau o lexic) i regulile de interpretare a acestor
identificatori. Organizarea cea mai simpl poate fi schematic reprezentat de un tabel, care asociaz unui identificator descriptorul fiierului pe
care acesta l desemneaz. Acest tabel este administrat prin una din tehnicile cunoscute (organizare secvenial, adresare dispersat, etc.). O astfel
de organizare a fost descris n 3.3. Ea trateaz la acelai nivel toate numele, ceea ce implic urmtoarele inconveniente:
ntr-un sistem mono-utilizator ar fi bine s avem la dispoziie posibilitatea de a clasifica fiierele pe rubrici,
ntr-un sistem multi-utilizator conflictele datorate omonimiei a dou fiiere de utilizatori diferii, restricioneaz libera alegere a
numelor,
n toate cazurile, cutarea unui fiier cu numele dat, se efectueaz pe toat mulimea numelor, n timp ce informaii referitoare la natura
sau apartenena fiierului ar putea accelera aceast cutare.
Reieind din aceste considerente, organizarea pe un singur nivel (fig.5.5, (a)) nu este folosit, cu excepia unor sisteme mono-utilizator foarte
mici. Este preferat cea ierarhic n care fiierele i cataloagele sunt organizate conform unei structuri arborescente. Aceast structur se reflect
n structura identificatorilor. Adncimea arborescenei poate fi limitat: de exemplu, o structur cu dou nivele (fig.5.5 (b)) permite definirea a
cte un catalog pentru fiecare utilizator a unui sistem, aceste cataloage fiind i ele grupate ntr-un catalog general.

catalogul
utilizatorilor

a)
catalog

b)
Victor

.
..

Christ
y

Eugen

.
..

.
.
..
..
test
d
progr
d
progr
fiier
am multe
ocsisteme s-au
aminspirat de acest model.
Modelul general al organizrii ierarhice, prezentat mai jos, a fost propus noc
sistemul Multics;
Fig. 5.5. Organizarea fiierelor pe
1.16.1.2.
Organizarea arborescent
niveluri
fiier

progr
am

d
oc

..

O organizare arborescent este definit dup cum urmeaz:


Unui catalog i se asociaz o mulime (care poate fi vid) de alte cataloage i fiiere; aceste obiecte se numesc incluse n catalog; ele
sunt desemnate aici printr-un identificator zis nume simple. Relaia ntre un catalog i un alt catalog, inclus n primul, se numete
relaie de legtur; ea permite s se defineasc un fiu (catalogul inclus) i un tat.
Exist un catalog, i numai unul singur, numit rdcin, care nu are tat. Orice alt catalog are un tat, i doar unul singur.

Relaia de legtur definete o arborescen de cataloage cu rdcina n catalogul rdcin. Sunt utilizai termenii de predecesori sau
descendeni pentru a desemna cataloagele la care poate ajunge de la un catalog dat prin intermediul unei suite de relaii tat sau fiu.
Plecnd de la un catalog dat, exist o cale unic ntr-o arborescen pentru a ajunge la oricare din descendenii si. Aceast proprietate este
utilizat pentru desemnare: numele unui catalog este construit prin concatenarea numelor simple succesive, care desemneaz predecesorii si,
ncepnd cu catalogul iniial; numele unui fiier este concatenarea catalogului, care l include i a numelui su simplu. n identificatorii construii
astfel (zise nume calificate sau compuse) este utilizat un simbol special (> n Multics, / n Unix sau / n MS DOS) pentru separarea
numelor simple succesive.
n acest mod putem asocia un mediu fiecrui catalog; lexica acestui mediu este mulimea numelor, simple sau compuse, construite cum a fost
indicat; contextul este mulimea format din catalogul considerat, descendenii si i toate fiierele, incluse n aceste cataloage. Mediul i numele
asociate catalogului rdcin se numesc universale.

De exemplu, n sistemul Multics, simbolul > este utilizat ca separator pentru construirea numelor compuse; utilizarea separat a
acestui simbol desemneaz prin convenie, catalogul rdcin. La orice moment de timp un catalog curent este asociat fiecrui
utilizator. Prin convenie, mediul utilizatorului este reuniunea mediului definit de catalogul curent i de mediul universal. Utilizatorul
poate desemna orice obiect, utiliznd numele universal (care ncepe cu >); cu numele simplu, dar numai obiectele din catalogul
curent, sau cu un nume calificat obiectele incluse n descendenii acestui catalog.

Acest mod de desemnare permite determinarea oricrui fiier; totui, numele universal poate fi prea lung pentru obiectele situate la o
mare adncime n ierarhie. Pentru a permite o desemnare mai simpl a obiectelor, care nu sunt incluse n relaia de descenden a
catalogului curent, sunt definite dou extensii pentru construcia numelor:

rdcina
.

utilizatori

lib_sistem

..
SYS

Aplicaii

.
..

Corina

Alex

Victor

..

Eugen

..
do
c

catal
og

test
de

..
do
c

.
..

cataloagel
.e utilizatorilor

fi_ex
e

1)

2)

Desemnarea printelui. Prin convenie, un simbol special (< n Multics, .. n Unix) desemneaz n orice catalog diferit de rdcin,
tatl catalogului dat. Utilizarea poate fi iterat (<< desemneaz bunelul, etc.). Pot fi de asemenea desemnate simplu obiecte incluse n
cataloagele frate sau verior ai catalogului curent.
Creare de legturi. Numim legtur asocierea unui nume simplu (numele legturii) i a unui alt nume (nume obiectiv sau scop).
Crearea unei legturi ntr-un catalog introduce aici numele simplu (numele legturii), care trebuie s fie unic n cadrul catalogului dat.
Aceast operaie este o legare prin nlnuire: cnd numele legturii este interpretat, n mediul catalogului unde a fost creat, el este
nlocuit prin numele obiectiv.
Posibilitatea crerii legturilor modific caracterul pur arborescent al desemnrii, ceea ce poate crea probleme delicate necesitii de a
avea mai multe ci de acces la un obiect.

1.16.2.

128. Legarea fiierelor cu fluxurile de intrare-ieire

Un program schimb informaii cu mediul exterior prin intermediul unor operaii de intrare-ieire. care permit comunicarea cu un fiier sau
un periferic. n momentul elaborrii programului nu este nc cunoscut cu care fiier sau periferic se vor produce intrrile-ieirile; adesea este
necesar s se utilizeze fiiere sau periferice, care difer de la o execuie la alt. Din aceste considerente este util s se poat ntrzia legtura unui
program cu fiierele sau perifericele pe care acesta le utilizeaz. n acest scop se introduce noiunea de flux de intrare-ieire.
Un flux de intrare-ieire este un obiect, care posed toate caracteristicile unui periferic de intrare-ieire (nume, operaii de acces), dar care nu
are o existen real. Pentru a fi efectiv utilizat n transferul informaiilor, un flux trebuie s fie n prealabil legat, cu ajutorul unei operaii, numite
asociere, cu un fiier sau periferic. Transferul informaiei, descris de operaiile asupra fluxului, vor fi executate asupra fiierului sau perifericului,
asociat fluxului. Asocierea poate fi modificat de la o execuie la alta, ns textul programului, care face referin doar la numele fluxului, rmne
invariant.

nume de
flux

nume de
flux
nil

(a) pn la
asociere

descrip
tor de flux

nume de
flux
fi
ier

descript
or de fiier

tampo
n

procedur
de acces

(b) dup asociere la un

pe
rif

descript
or de
periferic

tampo
n

procedur
de acces

(c) dup asociere la un

La realizarea asocierii este folosit legarea prin nlnuire. Fiecrui flux i se asociaz un descriptor. Operaia de asociere cere ca acest
periferic
descriptor s conin un pointer
spre fiier
descriptorul
sau perifericului,
pe care l asociaz
fluxului. La execuia unei operaii de
Fig.5.7.
Asociereafiierului
unui flux
de intrare-ieire
intrare-ieire asupra fluxului, o direcionare permite obinerea suportului corespunztor (fig.5.7).

n schema, prezentat n fig.5.7 am presupus, c descriptorul fluxului permite s se ajung pn la procedura i zona tampoanelor, utilizate
pentru intrri-ieiri. Legtura respectiv poate fi realizat, n dependen de sistem, la asocierea fluxului sau la o faz ulterioar deschiderii.
Asemeni editrii legturilor, asocierea fluxurilor utilizate de un program poate fi realizat la dou dintre etapele de derulare:
naintea execuiei programului, cu ajutorul unei instruciuni a limbajului de comand,
n timpul execuiei, cu ajutorul unei primitive de sistem, implementat printr-un apel de supervizor.
Sistemele de operare ofer utilizatorilor un set de fluxuri predefinite i asociate iniial, n mod implicit, la periferice determinate. De
exemplu, un sistem interactiv utilizeaz un flux standard de intrare i un flux standard de ieire; n momentul n care un utilizator este admis n
sistem aceste fluxuri sunt asociate, implicit, la tastatur i ecran. Ele pot fi temporar reasociate fiierelor; n caz de eroare, asocierea implicit este
n mod automat restabilit pentru a permite utilizatorului s intervin.
Sistemele ofer de asemenea de obicei posibilitatea de a crea fluxuri noi, care se adaug celor predefinite. Ca i asocierea, aceast creare
poate fi cerut de o instruciune sau de un apel al regimului supervizor.
Numele locale sunt utilizate i pentru desemnarea fluxurilor. Prin convenie, numele locale 0, 1 i 2 desemneaz fluxul
standard de intrare, fluxul standard de ieire i fluxul mesajelor de eroare, respectiv. Orice instruciune este executat de un proces
creat n acest scop i care folosete aceste trei fluxuri. Iniial, fluxurile 0 i 1 sunt n mod implicit asociate respectiv la claviatura i
ecranul utilizatorului, care a creat procesul.
Sistemul pune la dispoziie urmtoarele operaii asupra fluxurilor:
1)
Reasocierea fluxurilor. Dac flux_in i flux_out desemneaz, respectiv, un flux de intrare i un flux de ieire, iar id_fiier
este un identificator de fiier, instruciunile
flux_in < id_fiier
i

flux_out > id_fiier

reasociaz, respectiv, flux_in i flux_out la id_fiier. Dac


flux_in i flux_out nu sunt specificate n instruciune, ele
iau n mod implicit valorile 0 i 1 respectiv, adic cele corespunztoare fluxurilor standard. Astfel, instruciunea:
a < surs > destinaie
provoac execuia instruciunii a, dup ce n prealabil au fost reasociate fluxurile standard de intrare i ieire la fiierele
surs i destinaie.

2)

Crearea mecanismelor pipe. Un tub (pipe n Unix) este un tampon, care permite ca dou procese s comunice conform
schemei productor-consumator. El conine un flux de intrare (depozit) i unul de ieire (retragere) i poate fi creat n dou
feluri:
a) n mod implicit, prin intermediul limbajului de comand. O instruciune de forma
a|b
n care a i b sunt instruciuni elementare cu urmtorul efect:
i) s se creeze dou procese, fie proc_a i proc_b, mputernicite s execute a i b, respectiv,
ii) s se creeze un tub,
iii) s se reasocieze fluxul standard a proc_a la intrarea tubului, iar fluxul standard de ieire la ieirea tubului.
Cele dou procese vor funciona acum n modul productor-consumator. Pot fi create mai multe tuburi n serie
(a|b|c...); este de asemenea posibil nlnuirea unei suite de instruciuni n pipe-line. Aceast construcie poate fi
combinat cu reasocierea fluxurilor (exemplu: <surs a|b...>destinaie).
b) n mod explicit, prin apelarea regimului supervizor. Un apel al supervizorului permite crearea unui tub i obinerea
numelor locale pentru intrarea i ieirea sa; aceste nume pot apoi fi asociate fiierelor. Aceste nume locale sunt
cunoscute procesului apelant i tuturor descendenilor lui.

129. Legarea programelor i datelor

1.17.

1.17.1.

130. Etapele de via a unui program

Am prezentat mai sus diferite momente n care poate fi stabilit legtura dintre instruciunile i datele unui program. Vom prezenta n
rezumat cele mai frecvente scheme nainte de a trece la realizarea lor. Aceast prezentare vizeaz, n principal, expunerea folosirii noiunii de
legare, fr a detalia aspectele tehnice ale funcionrii unui ncrctor sau editor de legturi.
1) Program interpretat

2)

Program compilat
a) program unic

dat
e
program surs

progr
am surs

transla
tor

program
interpretat
program
obiect
(adrese
relative)

ncrct
or
dat
e

rezulta
t
program
obiect
(adrese
absolute)
calculato
rul

Compararea acestor dou scheme pune n eviden diferena important ntre interpretare i compilare: modificarea unui program interpretat
are efect imediat, n timp ce n cazul compilrii suntem nevoii s parcurgem toate etapele, ncepnd cu translatarea. rezultatu

b) program compus

Constituirea unui program unic, pornind de la programe construite independent, se realizeaz pornind de la programe obiect n adrese relative
(deplasabile), adic obinute dup translatare, prin legarea referinelor externe. Aceast operaie poate fi combinat cu ncrcarea (ceea ce nu este
obligator). O condiie este ca formatul modulelor obiect n adrese relative s respecte o convenie comun la care trebuie s se conformeze
translatoarele; anume sub aceast form programele comune se vor pstra n memorie.

program
obiect n adrese
relative
program
obiect n adrese
relative
1.17.2. program
obiect n adrese
1.17.3.
relative

1.17.4.

ncrct
or, editor de
legturi

program
obiect n adrese
absolute

131. Funcionarea unui ncrctor

Un ncrctor este destinat s pun n form absolut un program (sau modul) obiect n adrese relative. Aceast operaie const n nlocuirea
tuturor adreselor relative la originea modulului prin adrese absolute. Pentru aceasta se va efectua un lucru preliminar n faza de translatare:
nregistrrilor modulului obiect, care conin o adres translatabil, li se va ataa un indicator, care va fixa poziia acestei adrese n interiorul
nregistrrii (dac poziia nu este specificat n mod implicit). Adresele translatabile pot s apar:

sau n cmpul de adres al instruciunii,


sau n cazul datelor, n expresii pentru calcularea adresei, destinate a fi utilizate ca relaii de direcionare sau s fie ncrcate n
registrele de baz.

ncrctorul utilizeaz metoda substituiei: orice adres relativ a este nlocuit prin adresa absolut a+originea, unde originea este adresa
absolut ncepnd cu care este ncrcat modulul. Pentru un calculator cu registre de baz acest lucru este simplificat considerabil; reamplasarea
este realizat la execuie prin calcularea adresei, cu condiia c registrele de baz sunt ncrcate corect.
Dac programul ncrcat trebuie imediat executat, o funcie suplimentar a ncrctorului va determina adresa absolut de la care trebuie s
nceap execuia. Aceast adres este adesea fixat prin convenie (de exemplu, se va porni de la primul amplasament al modulului). Pentru
cazuri mai generale, modulul poate avea mai multe puncte de intrare, desemnate cu ajutorul identificatorilor; el va conine n acest caz un tabel al
punctelor de intrare, construit de translator, care asociaz o adres relativ fiecrui identificator. Aceste adrese sunt transformate n adrese
absolute; adresa punctului de intrare este determinat pornind de la identificator prin intermediul unei cutri n tabel.

Pentru a ilustra prezentm un format posibil al unui modul obiect translatabil i programul corespunztor al ncrctorului.
en-tte

<id_modul, lungime,...>
...

corpul modulului

<adr, n, r, cod>
...
...

tabelul punctelor de intrare

<identificator, adres relativ>


...

O nregistrare a corpului modulului este de forma <adr, n, r, cod> cu


adr

: adresa relativ a codului <cod> n modul

: lungimea lui <cod> n octei

: 1 sau 0 (cod translatabil sau nu)

cod

: n octei ai programului.

Algoritmul ncrctorului poate fi urmtorul:


: identitatea modulului (numele fiierului)

Parametrii de apel

: adr_ncrcare (adresa absolut de ncrcare)


: id_nceput (identificatorul punctului de intrare)
citire(en-tte);
<verificare dac lungimea permite ncrcarea>
repeat
citire nregistrare;

-- <adr, n, r, cod>

if r = 1 then
translatare(cod)
endif;
adr_implantare := adr + adr_ncrcare;
<ordonarea codului pornind de la adr_implantare>
until corp de modul epuizat
citire(tabel de puncte de intrare);
cutare(id_nceput,adr_exe);
if eec then
<ieire eroare>

-- sau alegerea unei adrese implicite

else -- implicit
adr_exe := adr_exe + adr_ncrcare
endif;
<ramificaie la adresa adr_exe>
Procedura translatare(cod) modific <cod>-ul, translatnd adresele relative ale acestuia: fiecare adres relativ este incrementat cu
adr_ncrcare. Poziia acestor adrese n interiorul nregistrrii trebuie, deci, s fie cunoscut (cel mai des, fiecare nregistrare conine o
instruciune unic n care adresa ocup o poziie fix).
Utilizarea unei adresri cu registre de baz simplific lucrul ncrctorului, translatarea fiind realizat automat, naintea execuiei, ncrcnd
ntr-un registru de baz adresa de implantare a programului. Folosirea a mai multor registre de baz permite reimplantarea independent a mai
multor fragmente de program (de exemplu, procedurile de o parte, datele de alta). Unicele informaii care trebuie s fie translatate de ctre
ncrctor sunt expresiile adreselor, utilizate pentru ncrcarea registrelor de baz.

1.17.5.

132. Funcionarea unui editor de legturi

Vom descrie mai jos principiile de funcionare a unui editor de legturi presupunnd, c el mai ndeplinete i ncrcarea. Editorul de legturi
primete la intrare un set de module obiect translatabile i construiete la ieire un modul obiect absolut. El este obligat, deci, pentru fiecare
modul obiect:
1)
2)
3)
1.17.5.1.

s determine adresa de implantare a acestuia,


s ndeplineasc modificrile informaiilor translatabile,
s realizeze legarea referinelor externe.
Legarea prin substituie

n cazul editrii legturilor prin substituie fiecare referin la un obiect extern n cadrul unui modul este nlocuit prin adresa absolut a
acestui obiect.

Prin definiie, un modul A utilizeaz un modul B dac programul lui A face referine la obiecte, coninute n B. Deoarece graful relaiei
utilizeaz poate conine circuite, editarea legturilor folosete un algoritm n doi pai. Primul pas construiete planul implantrii modulelor i
determin adresa absolut a tuturor obiectelor externe; al doilea pas soluioneaz referinele la aceste obiecte.
Formatul modulelor obiect, indicate n 5.3.2, este completat de un tabel de referine externe, care conine identificatorii tuturor obiectelor
externe, folosite de modul; o referin extern din program este nlocuit printr-o referin la intrarea corespunztoare a tabelului. Aceast
ordonare permite s fie pstrat doar un exemplar a fiecrui identificator extern i evit dispersarea acestor identificatori n corpul modulului.
Pentru prezentarea unui algoritm al editorului de legturi indicm un format posibil al modulelor translatabile.
en-tte

<id_modul, lungime,...>
...

tabelul referinelor externe

<identificator extern>
...
...

corpul modulului (program)

<adr, n, r, cod>
...
...

tabelul definiiilor externe

<identificator, adres relativ>


...

O nregistrare din corpul modulului are acum urmtoarea semnificaie:


adr

: adresa relativ a codului <cod>

: lungimea lui <cod> n octei

: indicator de reimplantare a adresei

cod

: fragment de program sau date

: informaie absolut

: informaie translatabil (intern)

<0

: informaie extern, referina n0-r n tabelul referinelor externe.

Comunicarea ntre cei doi pai ai editorului de legturi este asigurat de un tabel global de identificatori externi, construit la primul pas, i
care pentru un obiect extern conine cuplul
(identificator, adres absolut)
Specificm dou proceduri de acces la acest tabel:
intrare(id, val)

-- introduce cuplul (id, val) n tabel

cutare(id, val)

-- caut un cuplu cu identificatorul id; n caz de eec (nu a fost gsit) val
este fr semnificaie, altfel returneaz valoarea asociat lui val.

Parametrii de intrare ai unui editor de legturi sunt:

adresa de ncrcare a modulului executabil (adr_ncrcare),


numele fiierelor modulelor, care se vor lega,
bibliotecile n care vor fi cutate referinele nesatisfcute.

Programul primului pas va fi de forma:


adr_init := adr_ncrcare

-- adresa nceputului modulului

repeat

-- iteraii asupra modulului

citire(en-tte);

-- (id_modul,lungime)

<tratare en-tte>;
repeat

-- iteraii asupra referinelor externe

citire(id_ref);
<tratare ref_externe>;
until tabel de referine epuizat
trece(corpul modulului);

-- pas de tratare

repeat

-- iteraii asupra definiiilor externe

citire(id_def,adr_def);
<tratare_def_externe>
until tabel def epuizat
until mai exist module de tratat;

<sfrit pas 1>


n timpul constituirii tabelului externilor valoarea val=0, asociat unui identificator semnific, prin convenie, c aceasta a fost ntlnit n cel
puin o referin, dar nu nc i ntr-o definiie. Avem, deci, o referin (provizoriu) nesatisfcut. Precizm procedurile:
<tratare_ en-tte>:
cutare(id_modul,val);

-- numele modulului

if eec or val=0 then

-- referin nou

intrare(id_modul,adr_init)
else
eroare(definiie dubl)
endif;
-- nceputul modulului curent

baza:=adr_init;

-- nceputul modulului urmtor

adr_init:=adr_init+lungime

<verificare dac lungimea permite ncrcare>


<tratare_def_externe> :
cutare(id_def,val);
if eec or val=0 then
intrare(id_def,baza+adr_def)

-- adres absolut a definiiei externe

else
eroare(definiie dubl)
endif
<tratare_ref_externe> :
cutare(id_ref,val);
if eec or val=0 then
intrare(id_ref,val)

-- aciune vid, dac referina este deja prezent

endif
<sfrit pas 1>:
pentru toate(id_ref,val) pentru care val=0

-- referin nesatisfcut

<s se caute n biblioteca specificat modulul, care conine id_ref i s se determine


adresa sa de implantare (acest modul va fi ncrcat n memorie cu programul)>
<s se calculeze val i intrare(id_ref,val)
La trecerea pasului 1 tabelul global al externilor este construit. Cu excepia cazurilor de eroare, orice identificator al acestui tabel este asociat
unei adrese absolute de implantare.
Rolul pasului 2 este de a efectua translatarea adreselor i ncrcarea n memorie, utiliznd informaiile gsite n tabelul externilor.
<pasul 2>:
-- iteraii asupra modulului

repeat
citire(en-tte);
cutare(id_modul,val);
baza:=val;
citire(tabel de referine externe);
repeat

-- iteraii asupra tabelului de referine

<tratare_nregistrare>
until corpul mudulului epuizat
until mai exist module de tratat;
<sfrit pas 2>;
Precizm procedurile fazei a doua:
<tratare_nregistrare>:
adr_implantare:=adr+baza;
if r=1 then
<translatare_nregistrare(baza)>

-- referin intern translatabil

else
-- referin extern

if r<0 then
id_ref:=<intrarea n r n tabelul referinelor externe>;
0

cutare(id_ref,val);
translatare_nregistrare(val);
endif
-- terminat, dac r=0

endif;
<ncrcare nregistrare de la adr_implantare>
<sfrit pas 2>:
cutare(id_intrare,val);
if eec or val=0 then
eroare(adres necunoscut de execuie)

-- sau alegere implicit (default)

else
adr_exe:=val
endif;
<imprimarea coninutului tabelului externilor>

-- diagrama implantrii map

<ramificaie la adresa adr_exe>


Imprimarea tabelului externilor sub forma diagramei de implantare (eng. map) permite semnalizarea erorilor (definiii duble, referine
nesatisfcute) i facilitarea punerii la punct i localizrii informaiilor n memorie. Diagrama de implantare este o secven de linii de forma:
<identificator extern>

<adres absolut>

<o diagnoz eventual>

5.3.3.2. Legare prin nlnuire

1.17.5.2.

1) Vector de transfer
Metoda vectorului de transfer este relativ puin utilizat pentru programele compilate, totui descriem principiile acestei tehnici, deoarece:
ea este aplicabil n cazul programelor interpretate sau celor combinate,
ea permite introducerea ntr-o form primitiv a noiunii de segment de legtur, noiune dezvoltat n continuare.
Fiecare modul conine un tabel, numit vector de transfer, care are cte 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. Prima trecere a editrii
legturilor are loc ca i n 5.3.3.1; a doua trecere const n asocierea intrrilor vectorilor de transfer din diferite module cu adresele
corespunztoare a obiectelor externe. La execuie, accesul la un obiect extern este, deci, realizat prin direcionarea via un cuvnt al vectorului de
transfer. Aceast metod este costisitoare n spaiu (vectorii de transfer trebuie pstrai) i n timp (referire indirect). Ea convine pentru cazul
nlocuirii unui modul ntr-un program deja legat; anume din aceast cauz metoda vectorilor de transfer prezint interes pentru programele
interpretate sau pentru sistemele de depanare.
2)

Registre de baz

Ca i n cazul ncrctorului, adresarea cu ajutorul registrelor de baz simplific lucrul editorului de legturi. Exist dou moduri distincte de
utilizare a acestor registre:
1.

Registrele de baz sunt accesibile utilizatorilor: n acest caz sunt definite convenii de utilizare care permit, de exemplu, folosirea
registrelor de baz specificai pentru a adresa un subprogram, o zon de date, un bloc de parametri etc. Aceste convenii sunt
implementate de ctre translatoare sau direct de ctre utilizatori, dac acetia programeaz n limbaj de asamblare.

2.

Registrele de baz sunt administrate de sistemul de operare i sunt inaccesibili utilizatorilor. n acest caz, sistemul asociaz un registru
de baz fiecrui fragment independent (program sau zon de date) i asigur realocarea acestor registre, dac numrul lor este
insuficient.

n ambele cazuri, lucrul unui editor de legturi const n calcularea expresiilor adreselor, care vor fi ncrcate n registrele de baz. n al
doilea caz, printre altele, este necesar s fie introduse instruciunile de ncrcare a acestor registre (sub form de apel al regimului supervizor) n
modulele obiect.

1.18.

133 Mecanisme de gestiune a obiectelor

1.18.1.

Segmentarea

Utilizarea registrelor de baz permite reimplantarea independent n memorie a procedurilor i datelor unui program. Totui, acest mecanism
are dou restricii:

pentru utilizator: necesitatea de a se conforma conveniilor de folosire a registrelor de baz,


pentru sistemul de operare: necesitatea gestiunii alocrii registrelor de baz, dac acestea sunt n numr insuficient.

Aceste restricii vor fi eliminate, dac utilizatorul ar putea numi cu un nume la alegere proprie elementele de informaie i dac sistemul ar
dispune de un mecanism de plasare n memorie i de legare pentru a administra astfel de elemente. Anume la aceste dou ntrebri ncearc s
rspund segmentarea.

Un segment este p mulime de informaii considerat ca o unitate logic i desemnat de un nume; reprezentarea sa ocup o mulime de
amplasamente adiacente (contigue). Un segment poate fi de lungime variabil. n interiorul unui segment informaiile sunt desemnate cu ajutorul
unei deplasri, care este o adres relativ n raport cu nceputul segmentului. O informaie este desemnat de un cuplu (nume de segment,
deplasare), care se numete adres segmentat (fig. 5.8).

Este important s se noteze, c segmentele sunt reciproc independente att din punct de vedere fizic, ct i logic. Fizic, un segment
poate fi implantat la o adres oarecare, cu condiia s fie ocupate adrese adiacente. Logic, diferite segmente, administrate de un sistem
de operare, sunt independente i trebuie considerate ca tot attea spaii de adresare liniare distincte. Chiar dac numele segmentelor sunt
frecvent reprezentate de numere ntregi consecutive, nu exist o relaie de adiacen ntre ultimul amplasament al segmentului i i
primul amplasament al segmentului i+1. Folosirea unei deplasri negative sau mai mare dect lungimea segmentului utilizat este o
eroare de adresare.

segmentul
1

segmentul
i

segmentul
n

d
(seg_i,
d)

Segmentele sunt utilizate:

Fig. 5.8. Adresare segmentat

ca uniti de secionare logic a unui program, pentru reprezentarea, de exemplu, a diferitor proceduri, module, date legate logic (tabele,
structuri),
ca unitate de partajare ntre mai muli utilizatori,
ca unitate de protecie (consecin a partajrii): segmentul este entitatea la care sunt ataate drepturile de acces.

Realizarea adresrii segmentate utilizeaz principiul, descris n figura 5.9.

eroa

adres segmentat
s

d re
L

d<
L

Registru baz al tabelului


segmentelor

Memoria
fizic
s

L
La
Fiecrui segment i este asociat un descriptor;
el conine
(cel puin) adresa de implantare a segmentului, lungimea sa i drepturile de acces.
Tabelul
segmentelor
Descriptorii se afl n tabelul segmentelor; un segment este desemnat de indicele descriptorului su n acest tabel. Exist mai multe posibiliti de
Fig.5.9.
Realizarea adresrii segmentate
realizare, care sunt dictate de organizarea tabelelor
descriptorilor:
1) Tabel unic. Toi descriptorii sunt pstrai ntr-un singur tabel; numele unic al unui segment este indicile descriptorului su din acest
tabel. Descriptorul conine o list de acces, care definete drepturile fiecrui utilizator al segmentului. Aceast metod permite partajarea
segmentelor, ns toi utilizatorii sunt obligai s utilizeze unul i acelai nume unic, ceea ce adesea nu este comod.
2) Tabele multiple. Exist un tabel distinct pentru fiecare mediu; ntr-un mediu oarecare numele segmentului (dac este accesibil n acest
mediu) este indicele descriptorului su n acest tabel local. Un tabel accesibil n mai multe medii are mai muli descriptori i mai multe
nume distincte.
3) Organizare mixt. Fiecare segment posed un descriptor central, care conine caracteristicile sale de implantare fizic (lungimea, adresa).
El mai posed un descriptor local n fiecare mediu n care este accesibil; acest descriptor conine informaiile proprii mediului (subliniem
drepturile de acces) i puncteaz pe descriptorul central. Un segment are n acest mod un nume distinct pentru fiecare mediu, iar
caracteristicile fizice sunt situate ntr-un loc unic, descriptorul central.
Figura 5.10 prezint aceste moduri de organizare.

nume
local

nu
me
global

a) Tabel
unic

b) Tabele
Fig.5.10. locale
Moduri de organizare ale tabelelor
segmentelor

c) Tabele
locale + tabel
central

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

  • Baze de Date SQL
    Baze de Date SQL
    Document90 pagini
    Baze de Date SQL
    bettymihai
    Încă nu există evaluări
  • Baze de Date SQL
    Baze de Date SQL
    Document90 pagini
    Baze de Date SQL
    bettymihai
    Încă nu există evaluări
  • Analiza
    Analiza
    Document251 pagini
    Analiza
    Luminita Serban
    100% (16)
  • Managementul Financiar Al Firmei
    Managementul Financiar Al Firmei
    Document8 pagini
    Managementul Financiar Al Firmei
    Mariana Shuba
    100% (1)
  • Management Financiar Curs
    Management Financiar Curs
    Document66 pagini
    Management Financiar Curs
    Angela_i
    83% (6)
  • Managementul Interprinderii
    Managementul Interprinderii
    Document173 pagini
    Managementul Interprinderii
    CazacliuIon
    100% (8)
  • PSI ParteI V 30 09 2017
    PSI ParteI V 30 09 2017
    Document200 pagini
    PSI ParteI V 30 09 2017
    Chicu Roman
    Încă nu există evaluări
  • Et 0115040 Ron
    Et 0115040 Ron
    Document60 pagini
    Et 0115040 Ron
    Chicu Roman
    Încă nu există evaluări
  • Tot Tabele
    Tot Tabele
    Document2 pagini
    Tot Tabele
    Chicu Roman
    Încă nu există evaluări
  • Raportul Practica
    Raportul Practica
    Document40 pagini
    Raportul Practica
    Chicu Roman
    Încă nu există evaluări
  • AMSI Lab8
    AMSI Lab8
    Document7 pagini
    AMSI Lab8
    Chicu Roman
    Încă nu există evaluări
  • Et 0115040 Ron
    Et 0115040 Ron
    Document60 pagini
    Et 0115040 Ron
    Chicu Roman
    Încă nu există evaluări
  • Biletele 11-12
    Biletele 11-12
    Document13 pagini
    Biletele 11-12
    Chicu Roman
    Încă nu există evaluări
  • ManFin 2 Teme Macul
    ManFin 2 Teme Macul
    Document4 pagini
    ManFin 2 Teme Macul
    Mariana Rotaru
    Încă nu există evaluări
  • Ministerul Educației A Republicii Moldova
    Ministerul Educației A Republicii Moldova
    Document12 pagini
    Ministerul Educației A Republicii Moldova
    Chicu Roman
    Încă nu există evaluări
  • Tema 2 - Bilantul Bancar
    Tema 2 - Bilantul Bancar
    Document4 pagini
    Tema 2 - Bilantul Bancar
    Chicu Roman
    Încă nu există evaluări
  • Lab 9
    Lab 9
    Document5 pagini
    Lab 9
    Chicu Roman
    Încă nu există evaluări
  • AMSI Lab 5
    AMSI Lab 5
    Document9 pagini
    AMSI Lab 5
    Chicu Roman
    Încă nu există evaluări
  • AMSI Lab6
    AMSI Lab6
    Document12 pagini
    AMSI Lab6
    Chicu Roman
    Încă nu există evaluări
  • AMSI Lab4
    AMSI Lab4
    Document12 pagini
    AMSI Lab4
    Chicu Roman
    Încă nu există evaluări
  • TVPP Laborator NR 2
    TVPP Laborator NR 2
    Document7 pagini
    TVPP Laborator NR 2
    Chicu Roman
    Încă nu există evaluări
  • BDC Lab 2
    BDC Lab 2
    Document11 pagini
    BDC Lab 2
    Chicu Roman
    Încă nu există evaluări
  • AMSI Lab4
    AMSI Lab4
    Document12 pagini
    AMSI Lab4
    Chicu Roman
    Încă nu există evaluări
  • Exemplu de Bilet SDA
    Exemplu de Bilet SDA
    Document2 pagini
    Exemplu de Bilet SDA
    Chicu Roman
    Încă nu există evaluări
  • Management Financiar Fin
    Management Financiar Fin
    Document96 pagini
    Management Financiar Fin
    mishto
    Încă nu există evaluări
  • AMSI - Lab3
    AMSI - Lab3
    Document4 pagini
    AMSI - Lab3
    Adrian Solomon
    Încă nu există evaluări
  • AMSI - Lab3
    AMSI - Lab3
    Document4 pagini
    AMSI - Lab3
    Adrian Solomon
    Încă nu există evaluări
  • AMSI Lab4
    AMSI Lab4
    Document6 pagini
    AMSI Lab4
    Chicu Roman
    Încă nu există evaluări
  • AMSI Lab3
    AMSI Lab3
    Document6 pagini
    AMSI Lab3
    Chicu Roman
    Încă nu există evaluări