Documente Academic
Documente Profesional
Documente Cultură
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.
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
...
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.
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
este pregtit s se execute din momentul alocrii unitii centrale. Sistemul de operare este acea component, care va
ghida procesul prin toate aceste stri
Procesul 2
Maina extins
Programele
Maina goal
utilizatorului
(procese)
Sistemul de operare
Procesul 4
Procesul 3
Sistemul de operare
Procesul A
Procesul B
Procesul 1
Procesul 2
Maina extins extern
Maina extins
intern
Maina
goal
Programele
utilizatorului
(procese)
Alte funcii
ale S.O.
Procesul 3
Taskuri
Planificator taskuri
Procesul 2
Procesul 1
Procesul 3
I/O de sistem
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
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.
Lucrri
la intrare
Debit
Intrr
Debit
Prelucrarea informaiilor
mic
Rezultat
e la ieire
Ieire
mic
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
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.
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.
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
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
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.
2.
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.
2.
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.
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.
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.
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.
instruciune inexistent:
cod_op:=Mp[dev_vechi.co].cod_operaie;
case cod_op of
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
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.
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:
preg
: perifericul este pregtit (gata) de funcionare, detaliile legate de stabilirea indicatorului depind de
periferic,
term
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)
OUT(adr_mem, adr_perif)
TEST(adr_perif)
indicatorii.
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.
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.
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,
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).
1.1.
1.1.1.
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
SD
SD
scriere n td
td nu este plin
CD
citire din td
td nu este vid
CD
scriere n tm2
IF
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.
2)
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.1.
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)
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.
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.
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.
+----------+
+--+--+
1.2.2.12.
+-----+---------+
b1
1.2.2.13.
b2
a1 a2
1.2.2.14. +---+
+---+-----------------+------+
1.2.2.15.
+--+----+
1.2.2.16.
b1
+---+---------+
b2
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
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.
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.
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.
if e = non_sosit then
1.2.13.
starea(p) := blocat
1.2.14.
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.
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.
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
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.
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
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.
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.
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;
introducere(e,f);
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);
-- iniializare
nlibere:=N;
f:=<vid>
end
end resurse
1.3.2.13.
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
-- 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;
aut(citire) :
scr=false
aut(scriere):
scr=false i nc=0 (nici scrieri nici citiri n curs, nici cititori n ateptarea)
: boolean;
: integer;
c_scr.semnalizare
endif
end
procedura debut_scriere;
begin
if scr or nc>0 then
c_scr.ateptare
endif;
scr:=true
end
procedura terminare_scriere;
begin
scr:=false;
if nc>0 then
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.
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.
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
aut(preluare) : n > 0
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);
: 0..N;
non_plin, non_vid
: condiie;
begin
n:=0;
end
end tampon
: 0..N-1;
: array[ptr] of mesaj;
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.
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:
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.
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.
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.
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
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>
procedura intrare(l:linie);
procedura intrare(l:linie);
tm1[coad] := l;
tm2[coad] := l;
l := tm1[top];
l := tm2[top];
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
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
pentru a decrementa n mod automat coninutul unui registru contor, o ntrerupere este declanat
atunci cnd coninutul acestui registru atinge valoarea 0.
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.
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.1.
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.
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.
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).
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.
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.
/
/
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.
// Contorul de utilizri
}
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.
Funcia DWORD
dwSpinCount)
SetCriticalSectionSpinCount(LPCRITICAL_SECTION
lpCriticalSection,
DWORD
{
}
{
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.
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.
ciclu
-- intrare n seciunea critic
<prolog>
<seciunea critic>
<epilog>
<restul programului>
endciclu
: 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:
c[0]:=c[1]:=false;
tur:=0;
prolog
:
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
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
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.
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
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),
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
control;
<corpul programului>
alocare_procesor;
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
Reg
Stare
Prio
: prioritatea procesului,
Drepturi
: drepturile procesului,
Fire, etc.
Suc, etc.
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)
.
.
.
Csp[i]
Reg[i]
Bloc de
context
Stare[i]
Drepturi[i]
Prio[i]
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
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
if nonM.c.ntr_sosit then
c.ateptare;
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.).
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)
ntrerupere(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:
-- 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:
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;
-- retragere
endif;
ncrcare_registre(Reg[proc_al[k]];
ncrcare_csp(Csp[proc_al[k]];
-- demascarea ntreruperilor
-- verificarea drepturilor
alocare_context(p);
if p nil then
iniializare_context(i);
intrare(p, f_eligibil)
endif;
intrare(proces apelant, f_eligibil);
alocare_procesor;
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.
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>
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
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.
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)
ntrerupere(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:
-- 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:
ieire(proces_ales[k], f_eligibil);
pr1:=Prio[primul(f_eligibil)];
pr2:=Prio[proc_al[kmin]];
if Prio[proc_al[k]] < pr2 then
kmin:=k
endif;
disp_de_blocare:=0;
-- 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;
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:
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.
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
1.15.
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
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.
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.
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.
Condiii
Caracteristici
Devre
Eficien n execuie
ra
me
Trzie
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)
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)
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.
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.
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
..
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.
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
pe
rif
descript
or de
periferic
tampo
n
procedur
de acces
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
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.
1.17.
1.17.1.
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
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:
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>
...
...
cod
: n octei ai programului.
Parametrii de apel
-- <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>
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.
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.
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,...>
...
<identificator extern>
...
...
<adr, n, r, cod>
...
...
cod
: informaie absolut
<0
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)
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.
repeat
citire(en-tte);
-- (id_modul,lungime)
<tratare en-tte>;
repeat
citire(id_ref);
<tratare ref_externe>;
until tabel de referine epuizat
trece(corpul modulului);
-- pas de tratare
repeat
citire(id_def,adr_def);
<tratare_def_externe>
until tabel def epuizat
until mai exist module de tratat;
-- numele modulului
-- referin nou
intrare(id_modul,adr_init)
else
eroare(definiie dubl)
endif;
-- nceputul modulului curent
baza:=adr_init;
adr_init:=adr_init+lungime
else
eroare(definiie dubl)
endif
<tratare_ref_externe> :
cutare(id_ref,val);
if eec or val=0 then
intrare(id_ref,val)
endif
<sfrit pas 1>:
pentru toate(id_ref,val) pentru care val=0
-- referin nesatisfcut
repeat
citire(en-tte);
cutare(id_modul,val);
baza:=val;
citire(tabel de referine externe);
repeat
<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)>
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)
else
adr_exe:=val
endif;
<imprimarea coninutului tabelului externilor>
<adres absolut>
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.
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:
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)
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.
eroa
adres segmentat
s
d re
L
d<
L
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