Professional Documents
Culture Documents
Capitolul 1
INTRODUCERE
Informatica este o tiin recent i nu a avut nc timp s se
structureze pe capitole strict delimitate i bine definite. Dezvoltarea
exploziv din ultimele dou decenii a fcut ca ordonarea materialului s
urmreasc cu greu abundena de noi informaii att n domeniul tehnicii de
calcul ct i n privina numeroaselor probleme n rezolvarea crora aceasta
poate fi utilizat.
Nu exist o teorie unic a informaticii ci multe teorii care se
suprapun parial: arhitectura ordinatoarelor i evaluarea performanelor lor,
conceperea i verificarea circuitelor, algoritmic i analiza algoritmilor,
concepia i semantica limbajelor de programare, structuri i baze de date,
principiile sistemelor de operare, limbaje formale i compilare, calcul
formal, coduri i criptografie, demonstraie automatic, verificarea i
validarea programelor, timp real i logici temporale, tratarea imaginilor,
sinteza imaginilor, robotica etc. Fiecare dintre aceste domenii are
problemele sale deschise, unele celebre, de exemplu gsirea unei semantici
pentru limbajele de programare obiectual.
Pe plan didactic, ns, s-au conturat anumite discipline care s
asigure studenilor posibilitatea de a accede la problematica vast a
informaticii. Printre altele se studiaz i SISTEMELE DE OPERARE care
intervin ntr-un sistem de calcul.
Durata de
ateptare
1 10 0
2 29 10
3 3 39
4 7 42
5 12 49
Durata medie de ateptare va fi :
DMA=(0+10+39+42+47)/5=140/5 =28
Dezavantaje : DMA nu este minimal i poate varia n limite foarte
largi n funcie de caracteristicile procesului. n plus DMA depinde de
ordinea proceselor.
2.3.2. Algoritmul SJF (Shortest Job First)
Aa cum arat denumirea, se execut mai nti cel mai scurt job. La
egalitate, se aplic regula FCFS (First Come First Served).
Exemplu:
Proces Durata
UC
Proces Durata
UC
Durata
de
ateptare
1 10 3 3 0
2 29 4 7 3
3 3 1 10 10
4 7 5 12 20
5 12 2 29 32
Sorin Adrian Ciureanu 18
Durata medie de ateptare va fi :
DMA =(3+10+20+32)/5=65/5=13
Dac se cunosc cu precizie ciclurile UC (ca timp), SJF este optimal.
Problema principal este cunoaterea duratei ciclului UC.
2.3.3. Algoritmi bazai pe prioritate
n cadrul unui astfel de algoritm, fiecrui proces i se asociaz o
prioritate, UC fiind alocat procesului cu cea mai mare prioritate din irul
READY. Se poate defini o prioritate intern i o prioritate extern.
Prioritatea intern se calculeaz pe baza unei entiti msurabile :
-limita de timp ;
-necesarul de memorie ;
-numrul fiierelor deschise ;
-raportul dintre numrul de cicluri rafal I/O i numrul de
cicluri rafal UC.
Pentru prioritatea extern, criteriile folosite sunt din afara sistemului
de operare :
-departamentul care sponsorizeaz lucrrile ;
-factori politici ;
-factori financiari.
Principala problem a algoritmilor bazai pe prioriti este
posibilitatea blocrii la infinit ( a nfometrii) proceselor care sunt gata de
execuie, dar deoarece au prioritate redus, nu reuesc s obin accesul la
UC. O astfel de situaie poate s apar ntr-un sistem cu ncrcare mare, n
care se execut un numr considerabil de procese cu prioritate ridicat ;
acestea vor obine accesul la UC n detrimentul proceselor cu prioritate
redus care pot s nu fie executate niciodat. O soluie a acestei probleme
este mbtrnirea proceselor, o tehnic prin care se mrete treptat
prioritatea proceselor remanente timp ndelungat n sistem.
2.3.4. Algoritmi preemptivi
Un algoritm preemptiv permite ntreruperea execuiei unui proces n
momentul cnd n irul READY apare un alt proces cu drept prioritar de
execuie. Dintre algoritmii prezentai anterior :
-FCFS este prin definiie nepreemptiv ;
-SJF poate fi realizat preemptiv; dac n irul READY sosete un
proces al crui ciclu rafal UC urmtor este mai scurt dect ce a mai rmas
Sisteme de operare 19
de executat din ciclul curent, se ntrerupe execuia ciclului curent i se aloc
UC noului proces;
-algoritmii bazai pe prioritate, de asemenea, pot fi realizai
preemptiv ; la fel ca la SJF, timpul rmas poate fi nlocuit cu mrimea
prioritii.
Exemplu:
Proces Momentul sosirii n
irul READY
Durata ciclului
rafal
1 0 12
2 3 3
3 4 6
n SJF fr preempie :
Ordine Ateptare
P1(12) 0
P2(3) 9
P3(6) 8+3
DMA = (9+8+3 )/3=6,67
n SJF cu preempie :
Ordine Ateptare
P1 3 P1 ateapt 3+6=9
P2 3 P2 ateapt 0
P3 6 P3 ateapt 3-1
P1 9
DMA = (9+0+2)/3 =3,67
2.3.5. Algoritmul Round-Robin
Este un algoritm de tip time-sharing. Fiecrui proces i se aloc
numai o cuant de timp (10ms 100ms) iar irul READY se trateaz ca
FIFO circular.
Exemplu:
Proces Durata ciclului rafal
1 10 P1 ateapt
2 29
3 3
4 7
5 12
Dac cuanta de timp este de 10 ms, atunci ordinea n UC este
urmtoarea:
Sorin Adrian Ciureanu 20
P1(0) P2(19) P3(0) P4(0) P5(2) P2(9) P5(0) P2(0)
n parantez este dat timpul care a mai rmas.
Observaii :
-planificatorul aloc UC fiecrui proces pe durata a cel mult o
cuant ; dac durata procesului este mai mic dect aceast cuant, procesul
elibereaz UC prin comunicarea ncheierii execuiei ;
-mrime cuantei afecteaz performanele algoritmului Round-
Robin ; dac cuanta este foarte mare, comportarea este asemntoare FCFS ;
dac cuanta este foarte mic, frecvena comutrii se mrete foarte mult i
performanele scad deoarece se consum mult timp pentru salvare/restaurare
registre ;
-se poate spune c algoritmul Round-Robin este un algoritm
preemptiv care asigur un timp aproape egal de ateptare pentru toate
procesele din sistem.
2.3.6. Ali algoritmi de planificare
Exist unii algoritmi cu iruri de procese multinivel. irul READY
este format din mai multe subiruri. Fiecare susbir are propriul algoritm de
planificare. n schema de planificare apar iruri READY multiple :
P1 P2..Pn
P1
P2
..Pn
P1
(n)
P2
(n)
Pn
(n)
(
..Pn
UC
Sisteme de operare 21
Capitolul 3
GESTIUNEA PROCESELOR
3.1. NOIUNI GENERALE DE PROCESE I THREADURI
3.1.1. Definiia procesului
ntr-un sistem de calcul, un proces este un program n execuie; este
deci o entitate activ (dinamic) a sistemului de operare i constituie
unitatea de lucru a sistemului.
nelegerea diferenei ntre un program i un proces este important.
Andrew Tannenbaum, al crui tratat este baza documentrii pentru
specialitii n SO, folosete o analogie pentru sesizarea acestei diferene. S
considerm un savant care coace un tort pentru aniversarea fiicei sale. Are
reeta tortului i o buctrie utilat i aprovizionat cu tot ce trebuie s intre
n tort: ou, zahr, vanilie etc.
n aceast analogie, savantul este procesorul (CPU=Central
Processing Unit), reeta este programul ( ex. un algoritm exprimat ntr-o
notaie potrivit), ingredientele sunt datele de intrare. Procesul este
activitatea savantului de a citi reeta, de a introduce ingredientele , de a
coace tortul.
S ne nchipuim acum c fiul savantului vine plngnd c l-a nepat
o albin. Savantul ntrerupe coacerea tortului nregistrnd repede unde a
ajuns n reet (starea procesului curent este salvat), caut o carte de prim
ajutor (trece la un proces prioritar cu alt program) i aplic instruciunile
gsite n ea. Cnd primul ajutor a fost dat, savantul se ntoarce la coacerea
tortului i o continu de unde a ntrerupt-o.
Ideea este c un proces este o activitate de un anumit fel, cu un
program, intrare, ieire, stare etc. Este posibil ca un singur procesor s fie
mprit la mai multe procese, cu ajutorul unui algoritm care s determine
cnd s fie oprit procesul curent i s fie derulat altul.
Sorin Adrian Ciureanu 22
Un proces este instana de execuie a unui cod. Se utilizeaz i
denumirea englez de task (sarcin).
Spaiul de adres a unui proces cuprinde:
-segmentul de cod care conine imaginea executabil a programului
i este de tip RO (Read Only) i partajat de mai multe procese;
-segmentul de date care conine date alocate dinamic sau static de
ctre proces; nu este partajat i nici accesibil altor procese; const din:
-zona de date
-zona de rezervri (date neiniializate)
-zona de alocare dinamic;
-segmentul de stiv care nu este partajat i crete antrenat n
momentul epuizrii cantitii de memorie pe care o are la dispoziie.
Threadul, numit i fir de execuie, este o subunitate a procesului,
utilizat n unele SO.
3.1.2. Starea procesului
ntr-un sistem de calcul, un proces poate fi n diferite stri: pregtit,
rulare, blocat, terminat
Fig. 3.1. Diagrama strilor unui proces.
n sistem
Pregtit
Planificatorul pe
termen lung
Blocat Rulare
Terminat
Planificatorul pe
termen scurt (UC)
1
2
3
5
4
6
Sisteme de operare 23
Cnd procesul este introdus n calculator, este n SISTEM (de obicei
fiier sau un grup de fiiere pe un disc). Apoi planificatorul pe termen lung
l ia i-l introduce n coada de ateptare READY i atunci procesul este
PREGTIT.
Planificatorul pe termen scurt UC, conform unui algoritm de
planificare , l introduce n UC. Procesul este n RULARE. De aici, exist
trei posibiliti:
-procesul s-a sfrit i, dup rularea n UC, trece n starea
TERMINAT;
-dac algoritmul folosit este preemptiv (de exemplu time-sharing =
cu timp partajat), dac dup o cuant de timp el mai are de rulat, este trecut
din nou n coada de ateptare READY n starea PREGTIT;
-dac n timpul rulrii are nevoie de o resurs extern (de obicei I/O),
procesul este trecut n starea BLOCAT. Dup ce i s-a alocat resursa, trece
din nou n starea PREGTIT.
Dac un proces este blocat temporar, el va trebui repornit mai trziu
din exact aceeai stare n care se gsea cnd a fost oprit. n acest scop, toate
informaiile despre proces trebuiesc salvate.
Unui proces i se asociaz de obicei o structur numit BCP (Bloc
Control Proces), un descriptor de proces.
Fig 3.2. Structura BCP a unui proces.
Identificator al procesului (PID)
Program Counter
Stack Pointer
Registri UC
Prioritate
Zon pentru salvarea strii la prelevarea resursei procesor
Pointer spre lista procselor aflate n aceeai stare
HARD
Sorin Adrian Ciureanu 24
n mod frecvent, descriptorii tuturor proceselor aflate n aceeai stare
sunt nlnuii n cte o list. Vom avea o list de procese n starea
PREGTIT, una n starea BLOCAT etc.
3.1.3. Comutarea proceselor
Tranziia ntre dou procese active ntr-un SO multitasking se
numete comutarea proceselor (proces switch) i are loc ca rspuns la un
eveniment din sistem. Comutarea proceselor implic un cost (overhead)
important datorit frecvenei cu care are loc n sistem i poate influena
performanele acestuia.
Fig.3.3 Schem de comutare a proceselor.
Eficiena operaiei de comutare a proceselor poate fi crescut prin
prevederea unor faciliti hard (seturi de registre multiple) sau printr-o
modalitate de structurare a procesului (thread). Un thread (fir de execuie)
este o subunitate a procesului, o diviziunea a sa. Fiecare thread reprezint un
Mod de comutare
Spaiu utilizator
Execuie proces Px
Eveniment ce
duce la comutare
Salvarea strii hard n BCPx i
actualizarea strii procesului Px n BCPx
[ SCRIEREA EVENIMENTULUI ]
Planificarea urmtorului proces, Py .
Restaurarea strii hard din BCPy .
Execuie proces Py
Mod de comutare
Sisteme de operare 25
flux separat de execuie i este caracterizat prin propria sa stiv i prin stri
hard (registre, flaguri).
Scopul principal al crerii threadului este reducerea costului de
comutare a proceselor. De vreme ce toate celelalte resurse, cu excepia
procesorului, sunt gestionate de procesul care le nglobeaz, comutarea
ntre threadurile care aparin aceluiai proces implic doar salvarea strii
hard i restaurarea stivei. Bineneles, comutarea ntre threadurile care
aparin unor procese diferite implic acelai cost de comutare.
Threadurile sunt un mecanism eficient de exploatare a concurenei
programelor.
Un program poate fi mprit n mai multe pri.
3.1.4. Crearea i terminarea proceselor
n marea majoritate a sistemelor de operare un proces poate fi creat,
n mod dinamic, de ctre alt proces. De obicei un proces printe creeaz un
proces fiu. n aceast modalitate de creare, exist mai multe posibiliti n
dualitatea printe-fiu:
-cele dou procese execut, n mod independent, nesincronizat,
acelai cod, avnd aceeai stiv i acelai segment de date;
-fiul execut alt segment de cod dect cel al printelui, nesincronizat;
-printele i fiul i sincronizeaz activitatea n sensul ei ori se
execut nti printele i apoi fiul sau invers.
3.2. PROCESE I THREADURI N UNIX
3.2.1. Procese n UNIX
n sistemul de operare UNIX fiecare proces are un identificator
numeric, numit identificator de proces PID. Acest identificator este folosit
atunci cnd se face referire la procesul respectiv, din interiorul programelor
sau prin intermediul interpretorului de comenzi.
Dou apeluri simple permit aflarea PID-ului procesului curent i al
printelui acestuia:
getpid(void) pentru procesul curent;
getppid(void) pentru procesul printe.
Crearea unui proces se face prin apelul sistem:
fork()
Sorin Adrian Ciureanu 26
Prin aceast funcie sistem, procesul apelant, numit printe, creeaz
un nou proces, numit fiu, care va fi o copie fidel a printelui. Procesul fiu
va avea:
-propria lui zon de date,
-propria lui stiv,
-propriul su cod executabil,
toate fiind copiate de la printe, n cele mai mici detalii.
O modalitate de utilizare a apelului fork() este de a mpri
codul unui proces n dou sau mai multe procese care se vor executa n
paralel. Acest lucru este utilizat n proiectarea i rularea proceselor i
programelor paralele.
Exemplul 1.
Proces printe
i
1
i
2
i
3
.
.
i
k
momentul
apelului fork() Proces fiu
i
k+1
i
k+1
i
k+2
i
k+2
. .
. .
i
n
i
n
Exemplul 2
Se d urmtoarea secven de program:
fork();printf(A\n);
fork();printf(B\n);
fork();printf(C\n);
Presupunnd c toate apelurile funciei fork() se execut cu
succes, se cere:
-Cte procese sunt create ?
-S se traseze arborele printe - fiu al proceselor create.
-Cte linii de text vor fi afiate la ieirea standard ?
-Este posibil ca linia cu textul B s fie afiat naintea liniei cu
textul A ?
Sisteme de operare 27
Sunt create 7 procese, plus procesul iniial, vor fi 8 procese. Cifrele
arat dup al ctelea fork() au fost create. Dup primul fork()se
creeaz procesul cu cifra 1. Se va scrie A att n procesul iniial ct i n cel
final. Dup al doilea fork(), se creeaz procesul fiu notat cu cifra 2,
adic fiecare proces creat pn acum va avea cte un fiu, notat cu 2. Dup al
treilea fork(), fiecare proces creat pn acum va crea cte un nou fiu,
notat cu 3. n general dup n fork() ,se produc 2
n-1
fii.
A
B
C
A B
B C C
C
B C C
C
C
Fig.3.4. Structura arborescent a proceselor.
Fiecare proces afieaz liniile de text care urmeaz momentului
crerii sale:
linia care scrie A este afiat de 2
1
ori;
linia care scrie B este afiat de 2
2
ori;
linia care scrie C este afiat de 2
3
ori.
Numrul total de linii afiate este 2
1
+2
2
+2
3
=14
n ceea ce privete ordinea de afiare a celor 14 linii, intervine
nedeterminarea provenit din faptul c nu se tie cine va fi executat primul,
printele sau noul fiu creat. Valoarea returnat de fork() este:
-1, eroare, operaia nu s-a putut executa;
0, n codul fiului;
pidf, n codul printelui, unde pidf este identificatorul de
proces al fiului nou creat.
Proces
iniial
1 2 3
2 3 3
3
Sorin Adrian Ciureanu 28
Pn acum am vzut c prin simplul apel al funciei fork() se
creeaz un proces identic cu procesul printe. Pentru a crea un nou proces
care s ruleze un program diferit de cel al printelui, se vor folosi funciile
de tipul exec(), execl(), execlp(), execv(), execvp(),
execll(), execvl(). Toate aceste funcii primesc ca parametru un
nume de fiier care reprezint un program executabil i recicleaz lansarea
n execuie a programului. Programul va fi lansat astfel nct se va
suprascrie codul, datele i stiva procesului care apeleaz exec(), aa ca,
imediat dup acest apel, programul iniial s nu mai existe n memorie.
Procesul va rmne, ns, identificat prin acelai PID i va moteni toate
eventualele redirectri fcute n prealabil asupra descriptorilor de fiier.
n concluzie, lansarea ntr-un proces separat a unui program se face
apelnd fork()pentru crearea noului proces, dup care, n poriunea de
cod executat de fiu, se va apela una din funciile exec().
n UNIX un proces se poate termina n mod normal sau anormal.
Terminarea normal poate fi realizat prin:
-revenire natural;
-apelul sistem de tip exit().
Terminarea anormal se produce cnd:
-se apeleaz abort();
-procesul primete un semnal.
n marea majoritate a versiunilor UNIX, exist dou apeluri de
terminare normal: exit(), _exit().Principalul rol al apelului
exit() este s asigure la terminarea procesului tratarea corespunztoare a
operaiilor de introducere /extragere , golirea tampoanelor utilizate pentru
acest proces i nchiderea tuturor fiierelor deschise. _exit() produce
direct revenirea n nucleu, fr operaiile de la funcia exit().
Din cele prezentate pn acum, nu se poate spune nimic despre
sincronizarea printe-fiu, adic despre cine termin primul sau cine se
execut primul. Apelurile wait() i waitpid() vin n
ntmpinarea acestui neajuns. wait() este folosit pentru ateptarea de
ctre printe a fiului, deci se execut mai nti fiul i apoi printele.
waitpid() este folosit pentru ateptarea unui proces oarecare.
n UNIX procesele au un caracter dinamic. Ele se nasc, evolueaz n
sistem putnd da natere altor sisteme, i dispar. n felul acesta se creeaz o
ierarhie dinamic de procese n sistem, care ncepe cu procesul 0 (swapper),
continu cu procesul 1 (init), proces ce d natere unor procese fiu. Procesul
cu identificatorul 2, proces sistem, apare la unele implementri sub
denumirea de pagedaemon i este responsabil de suportul pentru memorie
Sisteme de operare 29
virtual. Terminarea forat a execuiei unui proces se realizeaz cu
comanda kill(opiuni)(pid).
n general, n execuia printe fiu, exist dou situaii:
-a) fiul se termin naintea printelui;
-b) printele se termin naintea fiului.
n primul caz, ntre momentul n care se termin fiul i momentul n
care el este distrus, procesul fiu este n starea zombie. De obicei, dup
terminarea execuiei fiului, printele execut un wait() i scoate fiul din
starea zombie.
n al doilea caz, n momentul terminrii printelui, nucleul SO este
acela care examineaz dac printele a avut copii. Dac da, printele nou al
acestor fii va fi procesul init(), nelsnd fiii n starea zombie.
Revenind la strile unui proces, sistemul de operare UNIX distruge
urmtoarele stri de baz:
-execuie n mod utilizator (USER);
-execuie n mod nucleu (KERNEL);
-gata de execuie (READY);
-n ateptare (BLOCAT)
-zombie.
3.2.2. Threaduri n UNIX
n UNIX-ul tradiional nu sunt definite threadurile. Ele au aprut
odat cu standardul POSIX care asigur portabilitatea ntre platforme hard
diferite. Iat o comparaie ntre procesele UNIX i threadurile POSIX
(pthread):
Caracteristica Procese UNIX Pthreaduri POSIX
portabilitate fork()standard interfa standard
portabilitate
Cost de creare Mare Relativ mic
Cost de comutare Mare Foarte mic
Spaiu de aches Separat Partajat
Memorie partajat Partajare explicit Partajare implicit
Obiecte de excludere
mutual
Semafoare, mutexuri
UNIX
Semafoare, mutexuri
POSIX
Fiiere i stringuri de I/O Tabele de fiiere separate Tabele de fiiere unice
Un pthread se creeaz cu ajutorul funciei
int pthread create (list de parametri).
Sorin Adrian Ciureanu 30
3.3. PROCESE I THREADURI N WINDOWS
n sistemele WINDOWS, entitatea de alocare a timpului
procesoarelor este threadul. Fiecare proces conine cel puin un thread de
execuie, numit i threadul principal, i poate crea threaduri noi. Un proces
WINDOWS are o dualitate de identificare i anume are dou entiti de
identificare:
-handle, care este o intrare n tabelul de resurse al sistemului;
-identificator (id), un numr unic atribuit unui proces (asemntor
PID-ului din UNIX).
Aceast dualitate de identificare ngreuneaz lucrul cu procesele
WINDOWS, n sensul c unele funcii cer ca parametru handle-ul
procesului , altele identificatorul acestuia.
3.3.1. Procese n WINDOWS
Accesul programatorului la funciile SO este posibil prin intermediul
unei interfee, numit API (Aplication Programming Interface) care conine
definiia tipurilor de date i funciile de apel ale sistemului.
Un proces tat creeaz un proces fiu prin intermediul apelului
funciei bool create process(lista parametri). Se poate
considera c, n mare, aceast funcie are funcionalitatea combinaiei de
apeluri fork exec din UNIX. Se creeaz un proces nou, mpreun
cu threadul primar, care execut un segment de cod specificat prin numele
fiierului ce conine acest segment. Valoarea returnat de funcia
createprocess este de tip booleean i nseamn TRUE (succes) i
FALSE (eroare).
Crearea threadurilor WINDOWS. Crearea unui thread nou ntr-un
proces necesit definirea unei funcii pe care threadul s o execute, urmat
de apelul unei funcii createthread cu sintaxa handle create
thread (lista de parametri). Aceast funcie returneaz
handle-ul threadului nou creat.
Sisteme de operare 31
Capitolul 4
COMUNICAIA I SINCRONIZAREA
NTRE PROCESE
Procesele dintr-un SO pot fi:
-a) procese independente;
-b) procese cooperante.
a) Dac execuia unui proces nu poate afecta sau nu este afectat de
ctre execuia altor procese din sistem, atunci procesul este independent.
Procesele independente au urmtoarele caracteristici:
-pot fi oprite i repornite fr a genera efecte nedorite;
-sunt deterministe, adic rezultatele depind numai de starea de
intrare;
-nu se afl niciodat n aceeai stare ca i alte procese din sistem;
-nu folosesc date, variabile, n comun cu alte procese;
-sunt reproductibile, rezultatele sunt aceleai pentru aceleai condiii
de intrare.
b) n caz contrar, procesele sunt cooperante; au toate caracteristicile
de mai sus negate.
4.1. PROBLEMA SECIUNII CRITICE I A
EXCLUDERII MUTUALE
Cazul cel mai frecvent n care mai multe procese comunic ntre ele
este acela prin intermediul variabilelor partajate. Dar accesul nerestricionat
a dou sau mai multe procese la resurse partajate poate produce erori de
execuie.
Exemplu:
Un proces execut o operaie de incrementare a variabilei partajate x
dup secvena cod:
LOAD R x /ncrcarea lui x n registrul R;
Sorin Adrian Ciureanu 32
INC R /incrementarea lui R;
STORE x R /memorarea valorii n X.
Presupunem c arhitectura calculatorului este cea de
load/store, specific procesoarelor de mare vitez cum sunt i cele din
arhitectura RISC.
Variabila local x, n arhitecturi paralele, se numete temporar
inconsistent, ntre variabila local i variabila global corespunztoare.
Acest tip de inconsisten temporar este frecvent ntlnit n execuia
programelor la arhitecturi secveniale (Neumann), dar nu prezint nici un
pericol pentru execuia programelor secveniale normale ale cror variabile
nu sunt partajate ntre procese concurente.
Este important de observat c inconsistena temporar ntre o
variabil global i copia ei local reprezint una din principalele cauze care
produce erori atunci cnd o astfel de variabil este accesat concurent de
procese concurente.
Din acest exemplu reies dou condiii necesare pentru eliminarea
erorilor datorate execuiei concurente a mai multor procese:
1) Secvena de instruciuni din care este alctuit operaia de
actualizare a unei variabile partajate trebuie s fie executat de un proces ca
o operaie atomic, nentreruptibil de ctre alte procese sau chiar de SO.
2) Operaia de actualizare a unei variabile partajate executat de un
proces trebuie s inhibe execuia unei alte operaii asupra aceleai variabile
executate de alt proces. Este deci necesar serializarea operaiilor asupra
variabilelor partajate, serializare care se obine prin excludere mutual a
acceselor la variabila partajat.
n acest sens actualizarea unei variabile partajate poate fi privit ca o
seciune critic. O seciune critic este o secven de instruciuni care
actualizeaz n siguran una sau mai multe variabile partajate. Cnd un
proces intr ntr-o seciune critic, el trebuie s execute complet toate
instruciunile seciunii critice, nainte ca alt proces s o poat accesa. Numai
procesului care execut o seciune critic i este permis accesul la variabila
partajat, n timp ce tuturor celorlalte procese le este interzis accesul. Acest
mecanism est denumit excludere mutual , deoarece un proces exclude
temporar accesul altor procese la o variabil partajat.
Soluionarea problemei excluderii mutuale trebuie s ndeplineasc
urmtoarele cerine:
-s nu presupun nici o condiie privind viteza de execuie sau
prioritatea proceselor care acceseaz resursa partajat;
-atunci cnd unul sau mai multe procese doresc s intre ntr-o
seciune critic, unul din ele trebuie s obin accesul n timp finit.
Sisteme de operare 33
-s asigure c terminarea sau blocarea unui proces n afara seciunii
critice nu afecteaz n nici un fel toate celelalte procese care acceseaz
resursa partajat corespunztoare seciunii critice respective;
Mecanismul de baz pe care-l urmrete un proces este:
-protocol de negociere / nvingtorul continu execuia;
-seciune critic / utilizarea exclusiv a resursei;
-protocol de cedare / proprietarul se deconecteaz.
Soluionarea corect a excluderii mutuale nu este o problem
trivial. Primul care a soluionat aceast problem a fost matematicianul
olandez Decker. Soluia lui, ns, nu este valabil dect pentru dou procese.
Soluii de excludere mutual au mai dat Peterson i Lampert, soluii pur
soft, dar a cror eficien este discutabil cci nu rezolv n ntregime toate
cerinele.
Implementarea eficient a excluderii mutuale se poate realiza prin
suport hard (validare/invalidare de ntreruperi sau instruciuni Test and Set).
Aceste faciliti hard sunt utilizate pentru implementarea unor mecanisme
de sincronizare (obiecte de sincronizare) ca semafoare, mutexuri, bariere,
monitoare etc.
4.1.1. Suportul hardware pentru implementarea
excluderii mutuale
4.1.1.1. Invalidarea / validarea ntreruperilor
Instruciunile de invalidare/validare a ntreruperilor (DI/EI) sunt
disponibile n toate procesoarele.
Secvena care asigur accesul exclusiv al unui singur proces la o
resurs este:
DI / invalidare ntreruperi;
Seciune critic;
EI / validare ntreruperi.
Prin invalidarea ntreruperilor se ajunge la blocarea celorlalte
procese. Este un mecanism prea dur, un model pesimist de control al
concurenei, cu urmtoarele dezavantaje:
-se blocheaz i activitatea altor procese (numite victime inocente)
care nu au nici o legtur cu seciunea critic respectiv;
-dac se execut de ctre useri, se poate bloca sistemul iar dac sunt
executate din kernel, apare un cost de timp suplimentar (overhead) de
comutare a modului de execuie kernel/user.
Sorin Adrian Ciureanu 34
4.1.1.2. I nstruciunea Test and Set (TS)
n principiu, instruciunea TS are ca operand adresa unei variabile de
control i execut urmtorii pai:
-compar valoarea operandului cu o valoare constant (de exemplu
0 pentru BUSY) i seteaz flagurile de condiie ale procesorului;
-seteaz operandul la valoarea BUSY .
Aceti pai sunt executai ca o operaiune unic, indivizibil, numit
operaie atomic.
Subinstruciunea cod, TS, poate fi scris astfel:
LOAD R, operand
CMP R, BUSY flag ZERO=1 dac R=BUSSY
STORE operand,BUSY
4.1.1.3. Protocoale de ateptare n excluderea mutual
Avem dou tipuri de protocoale:
a) (busy-wait)
b) (sleep-wait)
a) BUSY-WAIT (ateptare ocupat)
Folosind instruciunea TS acest model are urmtoarea implementare:
ADRL TS (acces)
JZ ADRL/ateptare ct variabila acces=BUSY
BUSY-WAIT este simplu de implementat dar are dezavantajul unei
eficiene sczute, datorit faptului c se consum timp de execuie al
procesorului de ctre un proces care nu avanseaz.
b) SLEEP-WAIT (ateptare dormant)
n acest tip de protocol, procesul care nu are resurs disponibil este
suspendat (adormit) i introdus ntr-o coad de ateptare. Apoi este trezit,
cnd resursa devine disponibil.
n sistemul uniprocesor este folosit totdeauna SLEEP-WAIT,
deoarece nu se consum timp procesor inutil.
n sistemul multiprocesor se folosesc amndou protocoalele i chiar
o combinaie ntre ele.
4.1.1.4. Mecanisme de sincronizare ntre procese
(obiecte de sincronizare)
a) Semafoare.
Semafoarele sunt obiectele de sincronizare cele mai des folosite.
Sisteme de operare 35
Ele au fost introduse de Dijkstra n 1968.
Un semafor este de fapt o variabil partajat care poate primi numai
valori nenegative. Asupra unui semafor se pot executa dou operaii de
baz:
-decrementarea variabilei semafor cu 1 (DOWN);
-incrementarea variabilei semafor cu 1 (UP).
Dac o operaie DOWN este efectuat asupra unui semafor care este
mai mare dect zero, semaforul este decrementat cu 1 i procesul care l-a
apelat poate continua. Dac, din contra, semaforul este zero, operaia
DOWN nu poate fi efectuat i spunem c procesul ateapt la semafor, ntr-
o coad de ateptare, pn cnd un alt proces efectueaz operaia UP asupra
semaforului, incrementndu-l.
Exemplu.
Avem un complex cu terenuri de handbal i 20 echipe care joac 10
meciuri. 1meci = 1proces. ntr-un co mare (semafor) exist 7 mingi.
Semaforul ia valori ntre 0-7. Fiecare 2 echipe iau cte o minge din co,
efectund 7 operaii DOWN. Semaforul este 0 ( nu mai sunt mingi n co)
i celelalte 6 echipe ateapt o minge n co, deci o operaie UP.
Pentru implementare, operaiile DOWN i UP vor fi nlocuite cu
dou primitive wait(s) i signal(s) , n felul urmtor:
wait(s) - ncearc s decrementeze valoarea variabilei
semafor s cu 1 i dac variabila este 0 procesul rmne n ateptare pn
cnd s = 0.
signal(s) incrementeaz cu 1 semaforul s.
Implementarea semafoarelor n protocolul BUSY-WAIT
wait(s)
{while (s==0);
s--;}
signal(s)
{s++;}
Operaia signal(s) este atomic (indivizibil).
Operaia wait(s) are dou regimuri:
atomic, dac s = 0;
neatomic, dac s=0.
Este normal ca, dac semaforul este ocupat (s=0), operaia
wait(s) s nu fie atomic; n caz contrar ar mpiedica alte operaii,
Sorin Adrian Ciureanu 36
inclusiv signal(s), executate de un alt proces care s acceseze variabila
s pentru a o elibera.
Implementarea cu BUSY-WAIT a semafoarelor are dezavantajul
unui consum de timp procesor de ctre procesele aflate n ateptare. Un alt
dezavantaj este posibilitatea ca un proces s fie amnat un timp nedefinit
(indefinit, postponement) n obinerea unui semafor, datorit faptului c nu
este nici o ordonare ntre procesele care ateapt la semafor. Astfel exist
posibilitatea ca un proces s fie mpiedicat un timp nedefinit de a obine un
semafor datorit aglomerrii provocate de alte procese. Un astfel de
fenomen de blocare se numete livelock iar procesul afectat este numit
strivit (starved).
Implementarea semafoarelor n protocolul SLEEP-WAIT
Procesele care ateapt la semafor stau ntr-o coad de ateptare
(FIFO).
wait(s)
{if(s==0) procesul trece ]n starea suspendat;
else s--;}
signal(s)
{if(coada nu este goal) planific un proces
din coad ;
else s++ ;}
n loc s intre n ateptare ocupat, atunci cnd semaforul este
ocupat, procesul apelant este suspendat i trecut ntr-o coad de ateptare
asociat semaforului apelat. Trebuie ns ca i procesul dormant (suspendat)
s afle cnd semaforul a devenit liber. Acest lucru se realizeaz prin
intermediul operaiei signal. Aceast operaie ncearc mai nti s
trezeasc un proces din coada de ateptare i s-l treac n starea de execuie
(suspendatrun). Numai dac coada de ateptare este goal, incrementaz
semaforul.
b) Mutex-uri
Denumirea MUTEX vine de la mutual exclusion. Mutex-ul este un
caz particular de semafor i este utilizat pentru accesul mai multor procese
la o singur resurs partajat. Operaiile care se execut asupra unui mutex
sunt :
-operaia de acces i obinere a mutex-ului, notat cu ocupare
(mutex) sau lock(mutex) ;
-operaia de eliberare a mutex-ului, notat cu eliberare (mutex) sau
unlock(mutex).
c) Evenimente (semnale.)Unul dintre primele mecanisme de
comunicare ntre procese este reprezentat de semnale sau evenimente. n
Sisteme de operare 37
UNIX se numesc semnale iar n WINDOWS se numesc evenimente. Ele
anun apariia unui eveniment i pot fi trimise de un proces altui proces, de
un proces aceluiai proces sau pot fi trimise de kernel. Momentul apariiei
unui semnal este neprecizat, el aprnd asincron.
Semnale UNIX
n sistemul de operare UNIX, semnalele pot proveni de la nucleu
sistemului, prin care se notific evenimente hardware, sau pot fi generate
soft, de unele procese, pentru a notifica un eveniment asincron. Un semnal
este reprezentat printr-un numr i un nume. n UNIX semnalele dintre
procese au denumiri simbolice, SIGUSR 1 i SIGUSR 2.
Un proces care primete un semnal poate s acioneze n mai multe
moduri:
-s ignore semnalul;
-s blocheze semnalul; n acest caz semnalul este trecut ntr-o coad
de ateptare pn cnd este deblocat;
-s recepioneze efectiv semnalul.
Procesul stabilete ce semnale sunt blocate, folosind o mas de
semnale, n care fiecare bit corespunde unui numr de semnal. n standardul
POSIX exist numere ntre 33 i 64, deci 31 semnale. Un semnal poate s
apar n urmtoarele cazuri:
-la acionarea unei taste a terminalului;
-la apariia unei ntreruperi hardware (mprire prin zero, adres
inexistent etc);
-atunci cnd un proces trimite un semnal altui proces sau thread,
folosind funciile:
a)sigqueue() se transmite un semnal unui proces;
b)kill() se transmite un semnal de terminare a unui proces;
c)pthread se transmite semnal de terminare a unui thread.
Evenimente WINDOWS
n SO WINDOWS, un eveniment este un obiect de sincronizare care
poate fi semnalat sau nesemnalat.
Exist dou tipuri de evenimente:
-evenimente cu resetare manual (evenimente care trecute n stare
semnalat rmn n aceast stare pn cnd sunt trecute n mod explicit n
starea nesemnalat);
-evenimente cu autoresetare.
n WINDOWS un proces poate crea un eveniment folosind funcia
CREATE EVENT.
Sorin Adrian Ciureanu 38
Un proces n ateptarea unui eveniment poate executa una din
funciile de ateptare WAIT FOR SINGLE OBJECT sau WAIT FOR
MULTIPLE OBJECT.
Evenimentele sunt utilizate pentru notificarea unui proces sau thread
despre apariia unui alt eveniment.
Evenimentele creeaz puncte de sincronizare ntre procese sau
threaduri.
d) Monitoare.
Monitoarele sunt mecanisme de sincronizare ntre procese
concurente care pot suporta abstractizarea datelor.
Prin apariia monitoarelor (HOARE, 1976), se reuete s se acopere
unul din neajunsurile principale ale celor mai utilizate mecanisme de
sincronizare, semafoarele, care nu suport abstractizarea datelor.
Sintaxa monitorului este asemntoare cu cea a unei clase, cuvntul
CLASS fiind nlocuit cu MONITOR.
Este de remarcat faptul c ntr-un monitor se asigur excluderea
mutual, astfel c la un moment dat un singur proces poate fi activ.
Un monitor este bazat pe modularitate i ncapsulare.
Fig. 4.1.Structura unui monitor.
Structura unui monitor const n trei pri:
-n prima parte se declar numele monitorului i variabilele locale;
-n a doua parte se declar toate procedurile;
-n cea de a treia parte se iniializeaz toate variabilele acestui
monitor.
Date accesate n comun
Proceduri
Proc 1
Proc 2
Proc n
Variabile
partajate
P1 P2 Pn
Coad de intrare n monitor
Sisteme de operare 39
n general, procedurile unui monitor sunt constituite din principalele
funcii care se ntlnesc ntr-un sistem de operare. De exemplu, o procedur
tipic este intrarea ntr-o seciune critic.
4.2. INTERBLOCAREA (DEADLOCK)
Alturi de problema seciunii critice, interblocarea reprezint una din
principalele probleme ce trebuiesc soluionate n funcionarea unui SO.
Mecanismul principal al interbocrii const n faptul c o resurs cerut de
un proces este deinut de alt proces. Pn cnd procesul care deine resursa
o va elibera, apare o situaie tipic de interblocare.
Deoarece interblocarea este strns legat de resursele sistemului de
operare, vom prezenta, mai nti, cteva noiuni referitoare la aceste resurse.
4.2.1. Resurse
4.2.1.1. Clasificarea resurselor din punct de vedere al interblocrii
Cea mai important clasificare din punct de vedere al interblocrii
este:
a) resurse partajabile ;
b) resurse nepartajabile.
O resurs partajabil poate fi utilizat n comun de mai muli
utilizatori. Un exemplu clasic n acest sens este citirea unui fiier de ctre
mai muli utilizatori.
O resurs nepartajabil nu poate fi folosit n acelai timp de ctre
mai muli utilizatori. Un exemplu este imprimanta. Evident, mai muli
utilizatori nu pot tipri n acelai timp pe aceeai imprimant.
Numai resursele nepartajabile conduc la situaii de interblocare; cele
partajabile nu pun probleme din acest punct de vedere. Sistemul de operare,
n procesul de control al interblocrii, trebuie s aib o gestiune doar a
resurselor nepartajabile.
O alt clasificare a resurselor, important pentru interblocare, este:
a) resurse cu un singur element;
b) resurse cu mai multe elemente.
Pentru situaii diferite de interblocare, aceast clasificare este foarte
important, ea ducnd la decizii diferite. Un exemplu tipic unde intervine
aceast clasificare este graful de alocare a resurselor.
Sorin Adrian Ciureanu 40
4.2.1.2. Etapele parcurse de un proces pentru utilizarea unei
resurse
n vederea utilizrii unei resurse, un proces trebuie s execute
urmtoarele etape:
a)Cererea de acces la resurs. Procesul formuleaz o cerere de acces
la resursa respectiv. Dac nu i este repartizat imediat, intr ntr-o coad
de ateptare i va atepta pn cnd poate dobndi resursa.
b)Utilizarea resursei. Este etapa n care procesul a primit
permisiunea de utilizare a resursei, iese din coada de ateptare i utilizeaz
efectiv resursa.
c)Eliberarea resursei. Se elibereaz resursa i se ncheie utilizarea
resursei de ctre proces.
Pentru implementarea de ctre SO a acestei operaii, exist tabele
ale SO n care fiecrei resurse i este asociat procesul ce o utilizeaz i, de
asemenea, fiecare resurs are asociat o coad de ateptare cu toate
procesele care au fcut cerere de utilizare a resursei. De obicei, sistemele de
operare implementeaz, pentru fiecare din etapele de mai sus, apeluri sistem
sau semafoare.
4.2.2. Condiii necesare pentru apariia
interblocrii
n anul 1971, Cofman a identificat patru condiii necesare care, dac
sunt ndeplinite simultan, pot conduce la apariia interblocrii. Aceste
condiii sunt:
a)Excluderea mutual. Existena excluderii mutuale presupune c un
proces a obinut resursa i exist o coad de ateptare a altor procese la
aceeai resurs.
b)Ocupare i ateptare. Exist cel puin un proces care a obinut
resursa dar care ateapt i alte resurse suplimentare care, la rndul lor, sunt
ocupate de alte resurse.
c)Imposibilitatea achiziionrii forate. Un proces nu poate
achiziiona forat o resurs aferent altui proces dect dup eliberarea
resursei de ctre acel proces.
d)Ateptare circular. Exist un ir de procese P1, P2, Pn, toate n
ateptare, n aa fel nct P1 ateapt eliberarea resurse de ctre P2, P2
ateapt eliberarea resursei de ctre P3.Pn ateapt eliberarea resursei
de ctre P1.
Sisteme de operare 41
P
1
P
2
P
3
P
n-1
P
n
4.2.3. Graful de alocare a resurselor
Pentru descrierea strii de interblocare este folosit un graf orientat,
numit graful de alocare a resurselor. Nodurile grafului sunt alctuite din
procese i resurse. Vom nota procesele cu P i resursele cu R.
Resursa cu indice i :
Procesul cu indice j :
Arcele grafului sunt orientate i sunt de dou feluri:
a) arce cerere, care reprezint faptul c procesul P
j
fcut o cerere
de alocare a resursei R
i
i ateapt dobndirea ei;
c) arce alocare, care reprezint faptul c procesului P
j
i-a fost
alocat resursa R
i
.
Cea mai important aplicaie a acestui graf este legat de detecia
strii de interblocare. Pentru un graf alctuit numai din resurse simple,
existena unei bucle n graf nseamn c n sistem a aprut o interblocare.
De exemplu, n graful urmtor.
Fig.4.2. Graf de resurse.
Ri
P
j
P
j
Ri
P
j
Ri
P1
R1 R2
P2
2
2
Sorin Adrian Ciureanu 42
n graful de mai sus, procesului P
1
i este alocat resursa R
1
i
procesului P
2
resursa R
2
. Procesul P
1
a fcut o cerere de alocare a resursei
R
2
deinut de P
2
iar P
2
a fcut o cerere de alocare a resursei R
1
deinut de
P
1
. Este o situaie clar de interblocare. n graful din figura 4.2. aceast
interblocare este vizibil prin existena buclei.
De menionat c pentru grafurile cu resurse multiple existena buclei
nu nseamn o situaie de interblocare.
De exemplu, n cazul din figura 4.3., existena buclei nu nseamn
interblocare.
Fig. 4.3. Graf fr situaie de interblocare.
4.2.4. Rezolvarea problemei interblocrii
Exist dou tipuri de metode pentru rezolvarea interblocrii:
a) metod n care nu i se permite niciodat sistemului de
operare s intre n interblocare; se face prevenirea sau evitarea
interblocrii.
b) metod n care se permite sistemului de operare s intre n
interblocare i apoi se ncearc scoaterea sa din aceast stare; se utilizeaz
un mecanism de detecie a interblocrii i revenire din aceast stare.
4.2.4.1. Prevenirea interblocrii
Pentru a putea preveni interblocarea este suficient ca una din
condiiile de apariie a acesteia s nu fie ndeplinit. S vedem cum poate fi
mpiedecat ndeplinirea fiecrei din cele patru condiii.
a) Excluderea mutual
Pentru o resurs nepartajabil nu este posibil prevenirea
interblocrii prin nendeplinirea condiiei de excludere mutual.
P1
R1
R2
P2
2 2
Sisteme de operare 43
b) Ocupare i ateptare
Pentru nendeplinirea condiiei de ocupare i ateptare sunt posibile
dou protocoale:
-un protocol n care fiecare proces i poate ncepe execuia numai
dup ce i-a achiziionat toate resursele necesare;
-un protocol n care unui proces nu i se permite s achiziioneze
dect o resurs, achiziionarea resurselor suplimentare fcndu-se cu
eliberarea resurselor deja angajate.
Dei prin ambele protocoale se asigur nendeplinirea condiiei de
ateptare i ateptare, totui ele prezint dou mari dezavantaje:
-utilizarea resurselor este destul de redus, n sensul c timpul ct o
resurs este alocat unui proces i neutilizat este foarte mare;
-apare un proces de nfometare, deoarece un proces nu poate s
atepte la infinit alocarea unei resurse.
c) Imposibilitatea achiziionrii forate
Nendeplinirea acestei condiii nseamn de fapt ca un proces s
poat lua o resurs alocat altui proces n orice moment. Desigur, aceast
achiziionare forat a resurselor unui alt proces nu trebuie fcut haotic, ci
n cadrul unui protocol de achiziionare forat. Un exemplu de astfel de
protocol este urmtorul : un proces care i achiziioneaz resurse n vederea
execuiei va putea lua forat resurse de la alt proces numai dac procesul
respectiv este n ateptare. Acest protocol se aplic frecvent n cazul
resurselor a cror stare poate fi uor salvat i refcut (ex. registrele
procesorului, spaiul de memorie).
d) Ateptare circular
Un algoritm simplu pentru eliminarea ateptrii circulare este dat n
continuare.
Se creeaz o coresponden biunivoc ntre toate resursele
nepartajabile ale sistemului i mulimea numerelor naturale, astfel nct
fiecare resurs este identificat printr-un numr natural. De exemplu:
hard disc .1
CD ROM.2
imprimant..3
MODEM.4
scaner..5
Apoi, un proces poate cere resursa cu numr de ordine k , cu condiia
ca s elibereze toate resursele cu indice mai mare dect k, adic k+1,
k+2,.n. n felul acesta se elimin posibilitatea de ateptare circular.
n concluzie, pentru prevenirea interblocrii se utilizeaz algoritmi
care impun ca cel puin una din condiiile necesare s nu fie ndeplinite.
Sorin Adrian Ciureanu 44
Aceti algoritmi acioneaz prin stabilirea unor restricii asupra modului n
care se pot formula cererile de acces. Principalele dezavantaje ale acestei
metode sunt gradul redus de utilizare a resurselor i timpul mare de ateptare
a unui proces pentru o resurs.
4.2.4.2. Evitarea interblocrii
Dac pentru prevenirea interblocrii se folosesc restricii asupra
modurilor de formulare a cererilor pentru resurse, n evitarea interblocrii se
utilizeaz informaii suplimentare referitoare la modul n care se face
cererea de acces. Algoritmii de evitare difer prin tipul i cantitatea acestor
informaii.
Se definesc dou noiuni: stare sigur i secven sigur.
n cazul acestor algoritmi, fiecare proces trebuie s declare numrul
maxim de resurse de fiecare tip de care ar putea avea nevoie. Algoritmul
examineaz mereu starea alocrii resurselor pentru a avea certitudinea c nu
va exista ateptare circular.
Secven sigur
Fie un ir de procese P
1
, P
2
, ..P
n
exact n aceast ordine.
Spunem c aceast secven este sigur dac pentru orice proces P
i
cu (1 i
n) s-ar cere numrul maxim de resurse, declarat iniial, atunci diferena
intre numrul maxim de resurse i numrul de resurse al procesului n acel
moment nu depete numrul resurselor obinute din nsumarea resurselor
disponibile cu resursele eliberate de procesele P
j
cu j Zi. Dac nu se
ndeplinete aceast condiie, atunci secvena este nesigur.
Stare sigur
Sistemul este ntr-o stare sigur dac conine cel puin o secven
sigur. De exemplu, fie secvena de procese:
P
1
P
2
P
3
P
4
P
5
P
1
P
2
P
3
P
4
P
5
Maxim resurse cerute 10 15 20 25 30
Cerere iniial 5 5 10 10 20
Total resurse = 60
Resurse disponibile = 60-5-5-10-10-20 = 10
S analizm secvena P
1
P
2
P
3
P
4
P
5
.
P
1
la cerere maxim de resurse ar avea nevoie de
10-5 = 5 resurse < 10 resurse disponibile
P
2
15-5 = 10 resurse < 5(eliberate de P
1
) + 10(disponibile)
P
3
20-10=10 resurse < 5(P
1
) + 5(P
2
) +10(disponibile)
P
4
25-10=15 resurse < 5(P
1
) + 5(P
2
) + 10(P
3
) + 10 (disponibile)
Sisteme de operare 45
P
5
30-20=10 resurse < 5(P
1
)+5(P
2
)+10(P
3
)+10(P
4
)+10(dispon.)
Deci aceast secven este sigur.
S analizm secvena P
4
P
5
P
1
P
2
P
3
.
P
4
25-10 = 15 > 10 (resurse disponibile) secven nesigur.
a) Algoritmul bancherului
Un algoritm clasic de evitare a interblocrii, bazat pe noiunea de
secven sigur, este algoritmul bancherului. Se numete aa deoarece poate
fi folosit n sistemul bancar la plata unor sume ctre diferii clieni ai bncii,
plat care trebuie s lase mereu banii ntr-o stare sigur.
Pentru a putea aplica acest algoritm trebuie s se cunoasc de la
nceput numrul maxim de resurse cerute de fiecare proces. Apoi, la fiecare
cerere a unor resurse noi, se aplic algoritmul pentru a vedea dac aceast
cerere duce la o stare sigur sau nesigur. Dac e sigur, cererea este
acceptat, dac nu e sigur, cererea nu este acceptat i procesul rmne n
ateptare.
Structurile de date folosite de algoritm sunt:
n - numrul de procese din sistem
m - numrul de tipuri resurs
-disponibil[m] un vector care indic numrul de resurse
disponibile pentru fiecare tip n parte;
-maxim [n][m] o matrice care arat numrul maxim de cereri
ce pot fi formulate de ctre fiecare proces;
-alocare[n][m]- o matrice care arat numrul de resurse din
fiecare tip de resurse care este alocat fiecrui proces;
-necesar[n][m] o matrice care arat numrul de resurse
care ar mai putea fi necesare fiecrui proces.
Dac necesar[i][j] = t , atunci procesul P
i
ar mai avea nevoie de
t elemente din resursa r
j
.
Avem relaia:
necesar[i][j] = maxim[i][j] alocare[i][j]
-cerere[n][m]matricea cererilor formulate de un proces
Dac cerere[i][j]= t, atunci procesul P
i
dorete t elemente din
resursa r
j
.
Algoritmul banchetului are urmtorii pai:
Pas 1
Procesul P
i
formuleaz o cerere de resurse. Dac linia i din matricea cerere
este mai mare dect linia i din matricea necesar, atunci este eroare, deci nu
se trece la pasul 2.
Sorin Adrian Ciureanu 46
Precizm c V
1
[n] < V
2
[n], dac V
1
[i] < V
2
[i] pentru oricare
i=1.n
if cerere[i][x]<=necesar[i][x] x= m ........ 1 , Pas2
else eroare
Pas 2
if cerere[i][x]<=disponibil[x] se trece la pas 3
else wait (resursele nu sunt disponibile)
Pas 3
Se simuleaz alocarea resurselor cerute de procesul P
i
, strile modificndu-
se astfel:
disponibil[x]=disponibil[x]cerere]i][x];
alocare[i][x]=alocare[i][x]+cerere[i][x]; x=1.m
necesar[i][x]=necesar[i][x]-cerere[i][x];
Pas 4
n acest moment se testeaz dac noua stare este sigur sau nu. n acest scop
se mai utilizeaz doi vectori:
lucru[m]
terminat[n]
Subpasul 1
Se iniializeaz aceti vectori astfel:
lucru[i]=disponibil[i];
terminat[i]=fals
pentru i=1,2,3..n
Subpasul 2
Se caut o valoare i astfel nct:
terminat[i]=fals;
necesar[i][x]<=lucru[x];
Dac nu exist, se trece la subpasul 4.
Subpasul 3
Se simuleaz ncheierea execuiei procesului, deci se execut:
lucru[x]=lucru[x]+alocare[i][x]
terminat = true;
Se trece la subpasul 2.
Subpasul 4
Dac:
terminat[i]=true pentru i=1n ,
Atunci sistemul este ntr-o stare sigur.
Algoritmul bancherului poate fi utilizat n orice sistem de alocare a
resurselor, pentru determinarea strilor sigure, avnd un mare grad de
Sisteme de operare 47
generalitate. Principalul su dezavantaj este numrul mare de operaii pe
care l cere.
b) Folosirea grafului de alocare a resurselor
O alt metod pentru determinarea unei stri sigure este folosirea
grafului de alocare a resurselor. Fa de graful prezentat anterior, elementul
nou este arcul revendicare. Acest arc arat c este posibil ca procesul P
i
s
revendice n viitor resursa R
j
. Ca mod grafic de reprezentare , el este trasat
cu linie ntrerupt. Cnd procesul P
i
cere resursa R
j
, arcul revendicare (P
i
R
j
)
se transform n arc cerere (P
i
R
j
). Cnd resursa R
j
este eliberat de procesul
P
j
,arcul alocare (P
i
R
j
) este transformat n arc revendicare (P
i
R
j
). Pentru a
determina strile nesigure, se caut n graf bucle n care intr arcuri
revendicare. O astfel de bucl reprezint o stare nesigur. Exemplu:
Fig. 4.4. Graf de alocare cu arcuri revendicative.
n graful de mai sus, procesului P
1
i este alocat resursa R
1
, iar
procesului P
2
i este alocat resursa R
2
. n acelai timp procesul P
1
poate s
cear n viitor resursa R
2
ceea ce n graf se concretizeaz prin arcul
revendicare (P
1
R
2
). La fel, Procesul P
2
poate revendica resursa R
1
prin arcul
(P
2
R
1
). Se observ c exist o bucl (P
1
R
2
P
2
R
1
), ceea ce face ca aceste
revendicri s conduc la o stare nesigur.
4.2.4.3.Detectarea interblocrii i revenirea din ea
Atunci cnd, din diverse motive, nu se pot aplica algoritmii de
prevenire i evitare a interblocrii, se intr n aceast stare. n acest caz
trebuie s se execute alte dou tipuri de algoritmi:
-algoritmi de detecie care s informeze sistemul asupra momentului
n care s-a ajuns la aceast stare;
-algoritmi de revenire din starea de interblocare.
c)Detecia interblocrii
n acest scop se folosesc doi algoritmi:
P1
R1
R2
P2
2 2
Sorin Adrian Ciureanu 48
-un algoritm foarte asemntor cu algoritmul bancherului;
-un graf de alocare a resurselor de tip WAIT FOR.
Deoarece algoritmul bancherului a fost discutat n amnunt, ne vom
ocupa doar de graful WAIT FOR. Acest graf se obine din graful de alocare
a resurselor prin eliminarea nodurilor de tip resurs (R
j
) i contopirea arcelor
corespunztoare. n acest caz, un arc (P
i
P
j
) arat c P
i
ateapt ca P
j
s
elibereze resursa care i este necesar.
Fig. 4.5.Graf de alocare a resurselor.
n acest caz, existena buclei nu nseamn interblocare.
Fig.4.6. Graf WAIT FOR.
Algoritmul WAIT FOR se poate aplica numai pentru resurse simple.
Se observ c bucla existent n graful de alocare a resurselor este
mai bine pus n eviden n graful WAIT FOR. Dar avantajul principal al
utilizrii grafului WAIT FOR const n costurile mai mici pentru detecia
unei bucle, deci a interblocrii.
Indiferent de tipul algoritmului de detecie a interblocrii, se pune
problema ct de des trebuie s fie acesta apelat. Exist, n general, dou
modaliti de apelare:
a)apelarea algoritmului ori de cte ori se formuleaz o cerere de
resurse;
b)apelarea algoritmului la intervale regulate de timp.
P1
2
2
P2
2
2
P3
2
2
P4
2
2
P5
2
2
R1 R2 R3 R4 R5
P1
2
2
P2
2
2
P3
2
2
P4
2
2
P5
2
2
Sisteme de operare 49
Prima modalitate detecteaz rapid interblocarea dar presupune un
substanial consum suplimentar de timp de calcul.
n a doua modalitate , se alege un interval de timp la care se apeleaz
algoritmul de detectare. Desigur, un interval scurt va introduce costuri
suplimentare iar la un interval lung este posibil ca starea de interblocare s
fie detectat foarte trziu, cu consecine nedorite n funcionarea sistemului.
d) Revenirea din interblocare
Revenirea din interblocare se poate face n dou moduri:
-manual, fcut de ctre operatorul sistemului;
-automat, executat de anumite programe ale sistemului de operare.
n general, exist dou metode de revenire din starea de interblocare:
1)-Prin dispariia ateptrii circulare; n acest caz se foreaz
terminarea unor procese.
2)-Prin negarea achiziiei forate; n acest caz procesele pot s
achiziioneze resurse de la alte procese.
1)Folosirea metodei de dispariie a ateptrii circulare are dou
forme:
-ncheierea forat a tuturor proceselor interblocate; n acest fel se
revine sigur din starea de interblocare dar se pierd toate rezultatele fiecrui
proces implicat n interblocare.
-ncheierea forat a cte unui singur proces implicat n interblocare;
n acest caz se ncheie forat un proces i apoi se apeleaz algoritmul de
detecie a interblocrii pentru a vedea dac mai persist starea de
interblocare; dac da, se ncheie forat alt proces i se apeleaz din nou
algoritmul de detecie, operaia continund pn la dispariia strii de
interblocare.
Avantajul fa de prima metod este c nu se pierd rezultatele de la
toate procesele. Dezavantajul const n timpul suplimentar, pentru c, dup
terminarea forat a unui proces, trebuie apelat algoritmul de detecie.
O alt problem a acestei metode este determinarea procesului sau
proceselor care trebuiesc terminate forat. Pot intra n discuie mai muli
factori:
-prioritatea procesului;
-numrul resurselor care ar mai fi necesare procesului
pentru a-i ncheia normal execuia;
-numrul resurselor care au fost deja folosite de un proces;
-timpul necesar pn la terminarea normal a procesului.
Din enumerarea acestor factori, se observ c este necesar un
algoritm pentru alegerea procesului sau proceselor care vor fi terminate
forat.
Sorin Adrian Ciureanu 50
De obicei se alege factorul ce necesit un timp minim. Cel mai
frecvent se utilizeaz alegerea dup prioritate, cu att mai mult cu ct
prioritatea proceselor este deja calculat din algoritmii de planificare a
procesorului.
2)Permiterea achiziionrii forate a resurselor de la procese este a
doua metod de revenire din interblocare. Problemele care apar n acest caz
sunt:
-alegerea victimelor, ceea ce nseamn i selectarea resurselor care
vor fi achiziionate forat;
-continuarea procesului cruia i s-au preluat forat resursele;
-prevenirea nfometrii, adic evitarea faptului ca un acelai
proces s fie ales mereu victim.
4.2.4.4. Rezolvarea interblocrii n practic
De obicei, n mod practic, interblocarea poate fi tratat n dou
moduri:
a)-prin ignorarea ei;
b)-printr-o metod mixt de tratare.
Ignorarea se aplic, de exemplu, sistemelor de operare instalate pe
PC-uri. Att WINDOWS-ul ct i UNIX-ul ignor interblocarea, neavnd
programe pentru rezolvarea ei.
Exist sisteme de operare n care interblocarea ar duce la perturbaii
grave n funcionare, de exemplu, n unele sisteme de operare funcionnd n
timp real. Acestor sisteme li se aplic metode mixte de tratare a
interblocrii.
O metod mixt clasic are la baz mprirea resurselor n clase de
resurse ordonate ierarhic, aa cum am prezentat la prevenirea interblocrii
pentru a mpiedica ateptarea circular. n acest mod, o eventual
interblocare ar putea aprea doar n interiorul unei clase.
n interiorul clasei se pot aplica metodele prezentate de prevenire,
evitare, detecie i revenire din interblocare.
4.3. COMUNICAREA NTRE PROCESE
COOPERANTE
ntre dou sau mai multe procese pot exista dou tipuri de
comunicare:
a) prin memorie partajat;
Sisteme de operare 51
b) prin sistem de mesaje.
a) n sistemele cu memorie partajat exist o memorie comun
pentru toi utilizatorii iar procesele pot comunica ntre ele prin intermediul
variabilelor partajate din memoria comun. Mecanismul de comunicare este
simplu: un proces actualizeaz o variabil partajat iar alt proces va citi
aceast variabil. Aceast metod este tipic pentru sistemele
multicalculatoare, cu memorie partajat. Sistemul de operare nu este
responsabil pentru acest tip de comunicare. ntreaga rspundere revine
programatorului de aplicaie. De aceea un sistem de operare pentru
multicalculatoare nu difer foarte mult de un sistem de operare pentru un
monoprocesor.
b)n acest caz, al comunicrii prin mesaje, procesele pot comunica
ntre ele doar prin dou operaii:
-send (mesaj);
-receive (mesaj)
Deci, prin aceste dou primitive de transmisie, un proces poate
comunica cu altul doar transmind sau recepionnd un mesaj.
Acest tip de comunicaie este specific multicalculatoarelor. ntreaga
responsabilitate a comunicrii prin mesaje i revine sistemului de operare.
De aceea, aceste sisteme de operare sunt mult mai complicate i greu de
proiectat i realizat. Ele mai poart numele de sisteme de operare
distribuite.
n acest capitol vom analiza modul de transmisie prin mesaje, acest
lucru fiind indiferent dac folosim mono sau multiprocesoare.
Pentru a exista o comunicare ntre procese trebuie s existe o linie de
comunicaie. Problemele legate de implementarea acestei linii sunt:
-modul n care se stabilesc liniile de comunicaie ntre procese;
-numrul de procese asociate unei linii de comunicaie;
-numrul de legturi care pot exista ntre o pereche de procese;
-capacitatea unei linii de comunicaie;
-tipul liniei de comunicaie (unidirecional sau bidirecional);
-dimensiunea mesajelor care poate fi fix sau variabil.
Modalitile folosite pentru implementarea logic a liniei de
comunicaie i a operaiilor send i receive sunt:
-comunicaie direct sau indirect;
-comunicaie simetric sau asimetric;
-buffering implicit sau explicit ( prin buffering se nelege stocarea
mesajului ntr-o zon tampon de unde este preluat ulterior de ctre
destinatar);
-trimiterea mesajului prin copie sau referin.
Sorin Adrian Ciureanu 52
4.3.1. Comunicaie direct i indirect
4.3.1.1. Comunicaie direct
n comunicaia direct, procesele care trimit sau recepioneaz
mesaje trebuie s menioneze numele procesului care trimite, respectiv care
recepioneaz mesajul.
Primitivele send i receive au urmtoarea form simetric:
send(proces1,mesaj)
(se trimite un mesaj ctre procesul 1)
receive(proces2,mesaj)
(se recepioneaz un mesaj de la procesul 2)
Pot avea i o form asimetric. n acest caz cele dou primitive se
definesc astfel:
send(proces,mesaj)
(se trimite un mesaj ctre proces)
receive(identificator,mesaj)
( se recepioneaz un mesaj de la un proces)
Linia de comunicaie are urmtoarele caracteristici:
-linia de comunicaie ntre dou mesaje este bidirecional;
-ntre procesul care, fie vrea s transmit fie vrea s recepioneze un
mesaj, i cellalt proces partener se stabilete o singur legtur de
comunicaie.
4.3.1.2. Comunicaie indirect
n acest mod de comunicaie mesajele sunt trimise i recepionate
prin intermediul cutiilor potale (mail boxes) care se mai numesc i porturi.
Primitivele de comunicare au urmtoarea form:
send(port1,mesaj)
(se transmite un mesaj portului 1)
receive(port2,mesaj)
(se recepioneaz un mesaj de la portul 2)
Cutia potal sau portul poate avea doi proprietari:
a) procesul;
b) sistemul de operare.
a) La un moment dat, o cutie potal are un singur proprietar i astfel
se cunoate precis care este numele procesului ce va primi mesajele trimise.
Sisteme de operare 53
Pentru ca un proces s devin proprietarul unei cutii potale, se poate
utiliza una din urmtoarele dou metode :
-procesul poate declara o variabil de tip cutie potal;
-se definete mai nti o cutie potal i apoi se declar cine este
procesul care o are n proprietate.
Cnd procesul proprietar al cutiei potale i ncheie execuia, trebuie
s execute dou lucruri: distrugerea cutiei potale i anunarea celorlalte
procese despre distrugerea cutiei potale.
b) n cazul n care sistemul de operare este proprietarul cutiei
potale, atunci aceasta are o existen de sine stttoare i nu depinde de
proces. Mecanismul creat de sistemul de operare cuprinde urmtoarele
operaii:
-crearea unei cutii potale noi;
-trimiterea i recepionarea mesajelor prin cutia potal;
-distrugerea cutiei potale.
4.3.2. Linii de comunicaii i tipuri de mesaje
4.3.2.1. Linii de comunicaii
Cea mai important proprietate a liniei de comunicaie este
capacitatea care arat dac i n ce fel pot fi stocate mesajele. Exist
capacitate zero, capacitate limitat i capacitate nelimitat.
-Capacitate zero. n acest caz nu exist modalitate de stocare a
mesajului. Procesul emitent va rmne n ateptare pn cnd destinatarul va
primi mesajul transmis. Trebuie s existe o sincronizare a proceselor care se
mai numete i rendezvous.
-Capacitate limitat. n acest tip de transmisie exist un buffer care
poate stoca n mesaje.
-Capacitate nelimitat. n acest tip de transmisie exist un buffer de
capacitate infinit, teoretic, care nu duce niciodat la situaia ca procesul
emitor s atepte.
La fel ca n transmisia de date este necesar i aici, n unele cazuri, ca
procesul emitent s tie dac mesajul emis a ajuns la destinaie. Dac n
transmisia de date exist un pachet de tip ACK, aici exist ceva asemntor,
un mesaj confirmare. De exemplu, cnd procesul P
1
transmite un mesaj
procesului P
2
, atunci urmtoarea secven de mesaje face ca P
1
s tie c
mesajul su a fost transmis:
Sorin Adrian Ciureanu 54
send(p2, mesaj) procesul P1
receive(p1,mesaj) procesul P2
send(p1,confirmare) procesul P2
receive(p2,mesaj) procesul P1
4.3.2.2. Tipuri de mesaje
Din punct de vedere al dimensiunii, mesajele pot fi:
-cu dimensiuni fixe;
-cu dimensiuni variabile;
-mesaje tip.
Mesajele cu dimensiune fix necesit o implementare simpl dar o
programare mai dificil.
Mesajele cu dimensiune variabil necesit o implementare fizic
dificil dar o programare mai simpl.
Mesajele tip se folosesc numai n comunicaia indirect.
4.3.3. Excepii n comunicarea ntre procese
Dac n sistemele cu memorie partajat apariia unei erori duce la
ntreruperea funcionrii sistemului , n sistemele cu transmisie de mesaje
apariia unei erori nu este aa de grav. Erorile posibile trebuiesc cunoscute
pentru a le putea trata corespunztor.
Cele mai frecvente erori sunt: terminarea unui proces nainte de
primirea mesajelor, pierderea mesajelor, alterarea mesajelor i amestecarea
lor.
a)Terminarea unui proces nainte de primirea mesajelor. n unele
cazuri, un proces, emitent sau destinatar, i poate ncheia execuia nainte ca
mesajul s fi fost prelucrat. Astfel, pot aprea situaii n care unele mesaje
nu vor ajunge niciodat la destinaie sau situaii n care un proces va atepta
un mesaj ce nu va mai ajunge niciodat. Dac un proces P
1
, destinatar,
ateapt un mesaj de la un proces emitent P
2
, care i-a terminat execuia,
atunci P
1
va rmne n starea blocat. Pentru ca P
1
s nu se blocheze exist
dou posibiliti:
-sistemul de operare termin forat procesul P
1
;
-sistemul de operare comunic procesului P
1
c procesul P
2
s-a
ncheiat.
Dac un proces P
1
este emitent trimind un mesaj unui proces P
2
care i-a ncheiat execuia, exist urmtoarele posibiliti:
Sisteme de operare 55
-dac linia de comunicaie este limitat sau nelimitat, nu se
ntmpl nimic; procesul P
1
i continu execuia;
-dac linia de comunicaie este de capacitate zero, atunci P
1
se
blocheaz; pentru ca P
1
s nu se blocheze se procedeaz ca n cazul anterior.
b)Pierderea mesajelor. Pierderea unui mesaj se poate produce atunci
cnd este o defeciune n linia de comunicaie. Pentru remedierea acestui
lucru se pot folosi urmtoarele metode:
-detectarea evenimentului i retransmiterea mesajului de ctre
sistemul de operare;
-detectarea evenimentului i retransmiterea mesajului de ctre
procesul emitent;
-detectarea evenimentului de ctre sistemul de operare care
comunic procesului emitent pierderea mesajului; procesul emitent decide
dac retransmite sau nu mesajul.
c)Alterarea i amestecarea (scrambling) mesajelor. Este situaia n
care un mesaj ajunge alterat la receptor, n sensul unei alterri a informaiei
din coninutul su. Pentru rezolvarea acestei situaii se folosesc metode
clasice, din teoria transmiterii informaiei, de detectare i corectare a
erorilor:
-folosirea polinomului de detecie i eventual de corecie a erorilor
(aa numitele CRC-uri sau LRC-uri, folosite ,de exemplu, la hard disc);
-folosirea checksums-urilor, care sunt sume ale biilor mesajelor;
exist dou chechsums-uri, unul calculat cnd se transmite mesajul i altul
care se calculeaz din biii mesajului recepionat. La neegalitatea celor dou
chechsums-uri, se consider eroare;
-folosirea paritii n transmiterea i recepionarea mesajului.
4.3.4. Aplicaii ale IPC-urilor (Intercomunicare ntre
Procese)
n sistemul de operare UNIX, ale crui aplicaii vor fi prezentate n
capitolele urmtoare, exist urmtoarele aplicaii ale IPC-urilor:
-pipe-uri;
-cozi de mesaje (n SystemV);
-semafoare;
-zone de memorie partajat (n System V);
-semnale.
Sorin Adrian Ciureanu 56
De asemenea, n subcapitolul urmtor, de procese clasice, se prezint
procesul productor consumator rezolvat i prin metoda sistemelor de
mesaje (Message Passing).
4.4. PROBLEME CLASICE DE COORDONARE i
SINCRONIZARE A PROCESELOR
Exist o serie de exemple clasice de coordonare i sincronizare a
proceselor n care se regsesc principalele probleme ce apar n astfel de
situaii. Multe din aceste probleme se afl n structura oricrui sistem se
operare. Totodat aceste probleme clasice se regsesc i n programarea
concurent. Le vom aborda ncercnd s le soluionm cu mijloacele
specifice prezentate anterior.
4.4.1. Problema productor-consumator
Fie o serie de procese concurente care produc date (procese
PRODUCTOR). Aceste date sunt consumate de alte procese (procese
CONSUMATOR). Datele sunt consumate n ordinea n care au fost
produse. Este posibil ca viteza de producere s difere mult de viteza de
consum.
Aceast problem s-ar rezolva uor dac ar exista un buffer de
dimensiuni foarte mari, teoretic infinit, care ar permite operarea la viteze
diferite ale productorilor i consumatorilor. Cum o astfel de soluie este
practic imposibil, vom considera cazul practic al unui buffer finit.
Principalele probleme care apar n acest caz sunt:
-buffer gol (consumatorii nu pot consuma date i trebuie s atepte);
-buffer plin (productorii nu pot nscrie date n buffer i trebuie s
atepte).
Indiferent de soluiile alese, vor trebui rezolvate situaiile de citire
din buffer-ul gol i de nscriere n buffer-ul plin.
4.4.1.1. Rezolvarea problemei productor consumator cu ajutorul
semafoarelor.
Fie un buffer de dimensiune n organizat dup structura coad
circular. Bufferul are n locaii pe care le-am notat cu tampon[n].
Variabilele cu care se scrie i se citete n buffer au fost notate cu
scriere i citire. Ele asigur accesul proceselor la poziia unde
se dorete operaia de scriere sau citire, n ordinea n care au venit.
Sisteme de operare 57
Semafoarele semscriere i semcitire au rolul de a asigura
excluderea mutual ntre procesele productor i consumator. Semaforul
semscriere conine numrul de poziii libere din buffer iar semaforul
semcitire conine numrul de poziii pline. semscriere se
iniializeaz cu n i semcitire cu 0. Cnd semscriere =0 sau
semcitire=n , se va semnala situaia de buffer plin respectiv buffer gol
i procesele vor fi blocate. Se intr ntr-o excludere mutual cu protocolul
bussy-wait i procesele vor fi deblocate atunci cnd semscriere= n sau
semcitire= 0.
Mutexurile mutexscriere i mutexcitire folosesc
pentru excluderea mutual ntre dou procese de acelai tip.
mutexscriere pentru procesele de tip productor i mutexcitire
pentru procesele de tip consumator.
Procesele productor vor citi numere ntregi la tastatur iar
procesele consumator vor consuma aceste numere.
Iat o implementare a problemei productor/consumator, scris n
limbajul C:
//declaraii de variabile, semafoare, mutexuri
i iniializatori
typedef int semafor; typedef int mutex;
#define n 1000;
int tampon[n];
int scriere=0, citire=0;
semafor semscriere=n, semcitire=0;
mutex mutexscriere, mutexcitire;
//Procese productor
int valoare, tastatura;
while(1)
{ valoare=scanf(%d,&tastatura);
wait(semscriere) ;
lock(mutexscriere) ;
tampon[scriere]=valoare ;
scriere=(scriere+1)%n ;
unlock(mutexscriere) ;
signal(semcitire) ;}
Sorin Adrian Ciureanu 58
//Procese Consumator
int valoare;
while(1)
{wait(semcitire);
lock(mutexcitire);
valoare=tampon[citire];
citire=(citire+1)%n;
unlock(mutexcitire);
signal(semscriere);}
Procesele productor funcioneaz n felul urmtor:
Se consider o bucl while din care practic nu se iese. Se citete
un numr ntreg de la tastatur n variabila valoare. Prin
wait(semscriere) se asigur excluderea mutual a procesului
respectiv productor fa de alte eventuale procese consumator. Prin
lock(mutexscriere) se asigur excluderea mutual a procesului
respectiv productor fa de alte procese productoare. Prin
tampon[scriere]=valoare se scrie efectiv valoarea n buffer. Prin
scriere=(scriere+1)%n se actualizeaz poziia de scriere n
buffer. Prin unlock(mutexscriere) se elibereaz mutexul de
scriere, permind altor productori s foloseasc bufferul. Prin
signal(semcitire) se contorizeaz semaforul de citire cu 1,
semnalnd c, dup ce procesul productor a nscris o valoare n buffer,
numrul de poziii din buffer pentru procesele consumatoare s-a mrit cu 1.
Procesele consumator funcioneaz n mod asemntor.
4.4.1.2. Rezolvarea problemei productor/consumator prin
transmitere de mesaje
Am studiat n subcapitolul precedent tehnica de transmitere prin
mesaje. Prezentm acum o aplicaie a acestei tehnici la problema
productor/consumator.
Pentru aceasta s considerm o linie de transmisie cu capacitate
limitat care folosete un buffer cu n poziii.
Modul de comunicaie ales pentru implementare este cel direct, deci
fr mailboxuri.
Algoritmul este simplu. Consumatorul trimite mai nti mesaje goale
productorului. Ori de cte ori productorul are de dat un produs
consumatorului, va lua un mesaj gol si va transmite consumatorului un
Sisteme de operare 59
mesaj plin. Prin aceasta numrul de mesaje din sistem rmne constant n
timp, nedepind capacitatea limitat a bufferului de comunicaie.
Bufferul de comunicaie este plin atunci cnd productorul lucreaz
mai repede dect consumatorul i toate mesajele sunt pline. n acest moment
productorul se blocheaz, ateptnd ca un mesaj gol s se ntoarc.
Bufferul de comunicaie este gol atunci cnd consumatorul lucreaz
mai repede dect productorul. Toate mesajele vor fi golite ateptnd ca
productorul s le umple. Consumatorul este blocat ateptnd pentru
deblocare un mesaj plin.
Iat mai jos o implementare a problemei productor/consumator prin
transfer de mesaje.
# define n 10000
{int val;
void productor()
message m; /*este mesajul transmis
de productor*/
while(1)
{val=produce element(); /*o funcie care produce
mesajul transmis de
productor*/
receive(consumator,&m); /*ateapt un mesaj gol*/
construieste
mesaj(&m,val);
/*o funcie care
construiete mesajul
transmis*/
send(consumator,&m);}} /*se transmite efectiv
mesajul consumatorului*/
void consumator()
{int i,val;
message m;
for(i=1;i<=n;i++) /*se transmit spre
productor cele n mesaje
goale*/
send(productor,&m);
while(1){
receive(productor,&m); /*se primete mesajul de
la productor*/
val=extrageremesaj(&m); /*se extrage mesajul
pentru a putea fi
prelucrat*/
Sorin Adrian Ciureanu 60
send(productor,&m); /*se trimite o replic la
mesajul gol*/
consuma element(val);}} /*o funcie care are
rolul de a utiliza
mesajul transmis de
productor*/
Se observ n implementarea aleas c parametrul mesaj este un
parametru referin.
4.4.2. Problema brbierului somnoros
Enun
Prvlia unui brbier este format din dou camere, una la strad,
folosit ca sal de ateptare, i una n spate, n care se gsete scaunul pe
care se aeaz clienii pentru a fi servii. Dac nu are clieni, brbierul
somnoros se culc. S se simuleze activitile care se desfoar n prvlia
brbierului.
Rezolvare
Aceast problem este o reformulare a problemei
productor/consumator, n care locul bufferului de obiecte este luat de
scaunul brbierului iar consumatorul este brbierul care i servete
(consum) clienii.
n sala de ateptare sunt n scaune pe care se aeaz clienii; fiecare
scaun este pentru un client. Dac nu sunt clieni, brbierul doarme n
scaunul de frizerie. Cnd vine primul client l trezete pe brbier i brbierul
l servete pe client, aezndu-l n scaunul de frizerie. Dac n acest timp
sosesc i ali clieni, ei vor atepta pe cele n scaune. Cnd toate scaunele
sunt ocupate i mai vine nc un client, acesta prsete prvlia.
Problema const n a programa aceste activiti n aa fel nct s nu
se ajung la aa numitele condiii de curs. Este o problem clasic cu multe
aplicaii, mai ales n cele de help desk.
Pentru implementarea soluiei vom utiliza dou semafoare i un
mutex:
clieni un semafor ce contorizeaz clienii ce ateapt;
brbier un semafor care arat dac brbierul este ocupat sau nu;
el are dou valori, 0 dac brbierul este ocupat i 1 dac este liber;
mutexc un mutex folosit pentru excludere mutual; arat dac
scaunul de frizerie este ocupat sau nu.
De asemenea mai folosim o variabil:
Sisteme de operare 61
clieninateptare care, aa cum arat i numele,
numr clienii care ateapt. Aceast variabil trebuie introdus
deoarece nu exist o cale de a citi valoarea curent a semafoarelor i
de aceea un client care intr n prvlie trebuie s numere clienii
care ateapt. Dac sunt mai puini dect scaunele, se aeaz i el i
ateapt; dac nu, prsete frizeria.
S descriem algoritmul . Cnd brbierul intr dimineaa n prvlie,
el execut funcia brbier(), blocnd semaforul clieni care este
iniial pe zero. Apoi se culc i doarme pn vine primul client. Cnd acesta
sosete, el execut funcia clieni() i ocup mutexul care arat c
scaunul de frizerie este ocupat. Dac intr un alt client n acest timp, el nu
va putea fi servit deoarece mutexul este ocupat. Va numra clienii care
ateapt i, dac numrul lor e mai mic dect numrul scaunelor, va rmne,
dac nu, va prsi prvlia. Rmnnd, va incrementa variabila
clieninateptare. Cnd clientul care este servit a fost brbierit,
el elibereaz mutexul, trezind clienii care ateapt i unul din ei va ocupa
mutexul, fiind servit la rndul su.
Iat mai jos implementarea acestui algoritm.
#define scaune 20 /*se definete numrul
de scaune*/
type def int semafor;
type def int mutex ;
semafor clienti=0; /*declaraii i
iniializri*/
semafor brbier=0;
mutexc=1;
int clientiinasteptare=0;
void brbier()
{while(1){
wait(clienti);
wait(mutexc);
clientiinasteptare--;
signal(brbier);
signal(mutexc);
tunde();
}
void clienti()
{wait(mutexc);
Sorin Adrian Ciureanu 62
if(clientiinasteptare<scaune)
{clientiinasteptare++;
signal(clienti);
signal(mutexc);
clienttuns();
}
else
signal(mutexc);}}
4.4.3. Problema cititori/scriitori
Problema a fost enunat de Coutois, Heymans i Parnas n 1971.
Un obiect (care poate fi o resurs, de exemplu un fiier sau o zon de
memorie) este partajat de mai multe procese concurente. Dintre aceste
procese, unele doar vor citi coninutul obiectului partajat i aceste procese
poart numele de cititori iar celelalte vor scrie n coninutul obiectului
partajat, purtnd numele de scriitori.
Cerina este ca scriitorii s aib acces exclusiv la obiectul partajat, n
timp ce cititorii s poat accesa obiectul n mod concurent (neexclusiv).
Exist mai multe posibiliti de a soluiona aceast problem. Vom
aminti dou variante.
Varianta 1
Nici un cititor nu va fi inut n ateptare, dect dac un scriitor a
obinut deja permisiunea de acces la obiectul partajat.
La un acces simultan la obiectul partajat, att al scriitorilor ct i al
cititorilor, cititorii au prioritate.
Varianta 2
Cnd un scriitor este gata de scriere, el va executa scrierea ct mai
curnd posibil.
La un acces simultan, scriitorii sunt prioritari.
Oricum, n ambele cazuri, problema principal ce trebuie rezolvat
este nfometarea, adic ateptarea la infinit a obinerii dreptului de acces.
S implementm un program pentru prima variant, folosind
urmtoarele semafoare, mutexuri i variabile:
scrie un semafor cu mai multe roluri; el asigur excluderea
mutual a scriitorilor; este folosit de ctre primul cititor care intr n propria
seciune critic; de remarcat c acest semafor nu este utilizat de cititorii care
intr sau ies din seciunea critic n timp ce ali cititori se afl n propria
seciune critic;
Sisteme de operare 63
contorcitire o variabil care are rolul de a ine evidena
numrului de procese existente n cursul citirii;
semcontor un semafor care asigur excluderea mutual cnd
este actualizat variabila contorcitire.
Dac un scriitor este n seciunea critic i n cititori ateapt, atunci
un cititor ateapt la semaforul scriere iar ceilali n-1 ateapt la
semcontor.
La signal(scrie), se poate relua fie execuia unui singur
scriitor, fie a cititorilor aflai n ateptare, decizia fiind luat de planificator.
Iat implementarea programului pentru prima variant:
typedef int semafor; /*declaraii i
initializri*/
int contorcitire=0;
semafor scrie=1,semcontor=1 ;
void scriitor()
{wait(scrie) ;
scriereobiect() ;
signal(scrie) ;}
void cititor()
{wait(semcontor) ;
contor citire++;
if(contorcitire==1)wait(scrie);/*primul
cititor*/
signal(semcontor);
citireobiect();
wait(semcontor);
contor citire--;
if(contorcitire==0)signal(scrie);/*ultimul
cititor*/
signal(semcontor);}
4.4.4. Problema cinei filozofilor chinezi
Cinci filozofi chinezi i petrec viaa gndind i mncnd n jurul
unei mese circulare nconjurat de cinci scaune, fiecare filozof ocupnd un
scaun. n centrul mesei este un platou cu orez i n dreptul fiecrui filozof se
afl o farfurie. n stnga i n dreapta farfuriei cte un beior. Deci, n total,
cinci farfurii i cinci beioare. Un filozof poate efectua dou operaii:
Sorin Adrian Ciureanu 64
gndete sau mnnc. Pentru a putea mnca, un filozof are nevoie de dou
beioare, unul din dreapta i unul din stnga. Dar un filozof poate ridica un
singur beior odat. Problema cere o soluie pentru aceast cin.
2
1
3
3
5
4
4
Fig. 4.7. Problema filozofilor chinezi.
Trebuie rezolvate dou probleme majore:
-Interblocarea care poate s apar. De exemplu, dac fiecare filozof
ridic beiorul din dreapta sa, nimeni nu mai poate s-l ridice i pe cel din
stnga i apare o situaie clar de ateptare circular, deci de interblocare.
-Problema nfometrii unui filozof care nu apuc s ridice niciodat
cele dou beioare.
Aceast problem a fost enunat i rezolvat de ctre Dijkstra n
1965.
Exist multe soluii ale acestei probleme, marea majoritate utiliznd
excluderea mutual.
Pentru a nu aprea interblocarea se folosesc, n general, soluii de
prevenire a acesteia adic se impun unele restricii n ceea ce privete
aciunile filozofilor, cum ar fi:
-unui filozof i se permite s ia un beior numai atunci cnd ambele
beioare, din dreapta i din stnga sa, sunt disponibile;
-se creeaz o coresponden biunivoc ntre mulimea numerelor
naturale i filozofi, fiecare filozof avnd un numr natural; o soluie
asimetric impune filozofilor cu numr impar s apuce mai nti beiorul
din stnga i apoi pe cel din dreapta, iar filozofilor cu numr par s ia mai
nti beiorul din dreapta i apoi pe cel din stnga.
Sisteme de operare 65
Vom prezenta, n continuare, o soluie clasic a acestei probleme,
care rezolv i situaia interblocrii i pe cea a nfometrii. n acest algoritm,
se poate generaliza problema pentru n filozofi. Se urmrete n ce stare
poate fi un filozof, existnd trei stri posibile: mnnc, gndete i este
nfometat.
Unui filozof i se permite s intre n starea mnnc numai dac cel
puin unul din vecinii si nu este n aceast stare. Prin aceast restricie se
previne interblocarea.
Pentru implementare, se utilizeaz urmtoarele structuri:
stare[n] un vector n-dimensional, n care pe poziia
i se gsete starea filozofului la un moment dat; aceasta poate fi:
0 pentru starea gndete
1 pentru starea nfometat
2 pentru starea mnnc
sem[n] un vector n-dimensional, n care sem[i] este un
semafor pentru filozoful i;
mutexfil un mutex pentru excludere mutual;
funcia filozof(i) este funcia principal care coordoneaz
toate celelalte funcii i care se refer la filozoful i;
funcia ridicbeior(i) este funcia care asigur pentru
filozoful i ridicarea ambelor beioare;
funcia punebeior i este funcia care asigur pentru
fiecare filozof i punerea ambelor beioare pe mas;
funcia test(i) este funcia care testeaz n ce stare este
filozoful i.
Implementarea este:
#define n 5 /*am definit numrul
de filozofi*/
#define stang(i+n-1)%n /*numrul vecinului
din stnga filozofului
i*/
#define drept(i+1)%n /*numrul vecinului
din stnga filozofului
i*/
#define gandeste 0
#defineinfometat 1
#define mananca 2
Sorin Adrian Ciureanu 66
typedef int semafor;
typedef int mutex;
int stare[n];
mutex mutexfil=1
semafor sem[n];
void filozof(int i)
while(i) {
gandeste(); /*filozoful i
gndete*/
ridicabetisor(i); /*filozoful i ridic
cele dou beioare*/
mananca(); /*filozoful i
mnnc*/
punebetisor(i); /*filozoful i pune pe
mas dou beioare*/
void ridicabetisor(int i)
{wait(mutexfil); /*se intr n regiunea
critic*/
stare[i]=infometat; /*filozoful i este n
starea nfometat*/
test(i); /*ncearc s
acapareze cele dou
beioare*/
signal(mutexfil); /*se iese din regiunea
critic*/
wait(sem[i]);} /*procesul se
blocheaz dac nu se
pot lua cele dou
beioare*/
void punebetisor(int i)
{wait(mutexfil); /*se intr n regiunea
critic*/
stare [i]=gandeste; /*filozoful i a
terminat de gndit*/
test(stang); /*se testeaz dac
vecinul din stnga
Sisteme de operare 67
filozofului i
mnnc*/
test(drept); /*se testeaz dac
vecinul din
dreaptafilozofului i
mnnc*/
signal(mutexfil); /*se iese din regiunea
critic*/
}
void test(int i);
{if stare [i]==
infometat&&stare[stang]!=
mananca&&stare[drept]!=
mananca)
{stare[i]=mananca;
signal(sem[i]);}}
4.4.5. Probleme propuse pentru implementare
4.4.5.1. Problema rezervrii biletelor
Enun
Fiecare terminal al unei reele de calculatoare este plasat ntr-un
punct de vnzare a biletelor pentru transportul feroviar. Se cere s se
gseasc o modalitate de a simula vnzarea biletelor, fr a vinde dou sau
mai multe bilete pentru acelai loc.
Rezolvare
Este cazul n care mai multe procese (vnztoarele de bilete)
ncearc s utilizeze n mod concurent o resurs nepartajabil, care este o
resurs critic (locul din tren).
Problema se rezolv utiliznd excluderea mutual iar pentru
implementarea ei cea mai simpl metod este folosirea semafoarelor.
4.4.5.2. Problema grdinii ornamentale
Enun Intrarea n grdinile ornamentale ale unui ora oriental se face
prin n pri.
Sorin Adrian Ciureanu 68
S se in evidena persoanelor care au intrat n grdin.
Rezolvare
Fiecare poart de intrare n grdin este o resurs care trebuie
accesat exclusiv de un proces ( o persoan care intr n grdin) .
Dac, la un moment dat, pe una din pori intr o persoan, atunci, n
acel moment, pe nici o alt poart nu mai intr vreo persoan n grdin.
Aceast problem face parte din problema excluderii reciproce.
4.4.5.3. Problema emitor-receptor
Enun
Un emitor emite succesiv mesaje, fiecare dintre ele trebuind s fie
recepionate de toi receptorii, nainte ca emitorul s emit mesajul
urmtor.
Soluie
Este o aplicaie de tipul client-server. n acest tip de aplicaii, un
proces server este un proces ce ofer servicii altor procese din sistem iar un
proces client este unul care solicit servicii de la server i le consum.
Dac procesele client i server nu sunt pe acelai calculator, atunci
aceast aplicaie este distribuit. Implementarea ei, cel mai adesea utilizat
n sistemele multicalculator, se face prin transmisie de mesaje.
Sisteme de operare 69
Capitolul 5
GESTIONAREA MEMORIEI
Sistemele de operare actuale folosesc multiprogramarea ceea ce
nseamn c, la un moment dat, n memorie se pot afla mai multe programe.
Problema esenial pe care trebuie s o rezolve un sistem de operare
este ca un program, pentru a putea fi executat, s aib codul executabil i
datele rezidente n memorie. SO trebuie s partiioneze memoria, ca s
permit utilizarea ei simultan de ctre mai multe programe. De asemenea
trebuie s asigure mecanisme de protecie pentru ca programele s poat
coexista n memorie n bune condiiuni. ntre hardul pe care l pune la
dispoziie un sistem de calcul i sarcinile sistemului de operare exist o
grani foarte flexibil n ceea ce privete gestiunea memoriei . De-a lungul
anilor, hardul a nglobat n componena sa multe din funciile pe care le avea
sistemul de operare. n capitolul de fa, vom prezenta sarcinile principale
ale SO, preciznd totui ce faciliti ofer hardul actual.
5.1. IERARHII DE MEMORIE
Principalele elemente hard care intr ntr-un sistem de memorie
sunt:
-registrele generale ale procesorului;
-memoria CACHE;
-memoria principal;
-memoria secundar.
n memoria intern a unui computer intr memoria principal i
memoria CACHE iar memoria extern este format din memoria
secundar ( hard disk, flopy disk, CD-ROM etc).
Parametrii principali ai unei memorii sunt:
- timpul de acces la memorie (timp necesar pentru operaia
de citire a memoriei);
- capacitatea memoriei.
Sorin Adrian Ciureanu 70
Fig.5.1. Schema principal hard a unui sistem de memorie.
La ora actual, exist urmtoarele categorii de memorie:
- memorii rapide;
- memorii lente;
- memorii foarte lente.
Memoriile rapide au un timp de acces foarte mic; din punct de
vedere tehnologic sunt memorii statice i cu un cost ridicat pe unitatea de
memorie. Se utilizeaz pentru registrele generale ale unitii centrale i
pentru memoria CACHE.
Memoriile lente au un timp de acces mai mare, din punct de vedere
tehnologic sunt realizate ca memorii dinamice i au un cost pe unitatea de
memorie mult mai mic dect al memoriilor rapide. Se utilizeaz pentru
memoria principal.
Memoriile foarte lente au timp de acces foarte mare n comparaie cu
celelalte tipuri, i, bineneles, un cost mult mai mic pe unitatea de
memorie. Este cazul hard discurilor.
O ierarhie de memorie este un mecanism, transparent pentru
utilizator, prin care SO acioneaz aa fel nct, cu o cantitate ct mai mic
de memorie rapid i cu o cantitate ct mai mare de memorie lent i foarte
lent, s lucreze ca i cum ar avea o cantitate ct mai mare de memorie
rapid. Partea din SO care gestioneaz ierarhia de memorie are ca sarcin s
urmreasc ce pri de memorie sunt n uz i ce pri nu sunt folosite, s
aloce memorie proceselor care au nevoie i s o dealoce cnd nu mai este
necesar, s coordoneze schimbul ntre memoria principal i disc cnd
memoria principal este prea mic pentru a conine toate procesele.
Procesor registre
generale
Memorie
principal
(RAM)
Memorie
secundar
(hard disc)
Memoria
cache
Sisteme de operare 71
5.2. OPTIMIZRI N NCRCAREA I EXECUIA
UNUI PROGRAM N MEMORIE
Exist unele optimizri ale sistemelor de operare, legate de
ncrcarea i execuia unui program n memorie :
-ncrcarea dinamic;
-suprapuneri (overlay-uri);
-legarea dinamic (.dll n WINDOWS, .so n UNIX).
5.2.1. ncrcarea dinamic
ncrcarea dinamic este ncrcarea rutinelor n memoria principal
numai atunci cnd este nevoie de ele. n acest mod sunt aduse n memorie
numai rutinele apelate, rutinele neutilizate nu vor fi ncrcate niciodat. Un
astfel de exemplu este un program de dimensiune foarte mare care conine
multe rutine de tratare a erorilor, (rutine foarte mari), erorile tratate fiind
foarte rare. Desigur aceste rutine nu vor fi ncrcate n memorie.
Trebuie remarcat c mecanismul de ncrcare dinamic nu este
implementat n SO, el fiind o sarcin a utilizatorului.
5.2.2. Overlay-uri
Overlay-urile furnizeaz un mod de scriere a programelor care
necesit mai mult memorie dect memoria fizic, cu alte cuvinte a
programelor de mari dimensiuni. La fel ca i n cazul ncrcrii dinamice, nu
este o sarcin a sistemului de operare ci a utilizatorului. Acesta trebuie s
partiioneze programul n buci mai mici i s ncarce aceste partiii n
memorie aa fel ca programul s nu aib de suferit n execuie. Desigur o
astfel de programare este complex, dificil. Ea se utiliza n SO mai vechi.
5.2.3. Legarea dinamic
Legarea dinamic este utilizat n sistemele de operare de tip
WINDOWS sau OS/2 , pentru fiierele cu extensia dll sau n UNIX , n
bibliotecile cu extensia so. Conform acestui mecanism rutinele nu sunt
incluse n programul obiect generat de computer, legarea subrutinelor fiind
amnat pn n momentul execuiei programelor. Ca tehnic, se folosete
un stub care, apelat, este nlocuit cu rutina respectiv ce se i execut.
Sorin Adrian Ciureanu 72
Rolul sistemului de operare este s vad dac rutina este n memorie
i dac nu s o ncarce. In acest mod se realizeaz o bun partajare a
codului. Trebuie menionat c:
-programul nu funcioneaz dac dll-urile necesare nu sunt prezente
n sistem;
-programul depinde de versiunea dll-urilor.
5.3. ALOCAREA MEMORIEI
Alocarea memoriei este efectuat de ctre alocatorul de memorie
care ine contabilitatea zonelor libere i ocupate din memorie, satisface
cererea pentru noi zone i reutilizeaz zonele eliberate. Alocarea memoriei
se face ierarhic; la baza acestei ierarhii se afl sistemul de operare care
furnizeaz utilizatorilor poriuni de memorie iar utilizatorul, la rndul su,
gestioneaz poriunea primit de la SO dup necesitile sale.
5.3.1. Alocarea de memorie n limbaje
de programare
Exist o clasificare a limbajelor de programare din punctul de vedere
al alocrii de memorie:
1)-Limbaje care nu pot aloca memorie. Este cazul limbajelor mai
vechi (Fortran, Cobol). In aceste limbaje, utilizatorul nu poate aloca dinamic
memorie n momentul execuiei ci naintea execuiei programului.
2)-Limbaje cu alocare i delocare explicit. Aceste limbaje permit
utilizatorului s cear, pe parcursul execuiei, noi zone de memorie i s
returneze memoria utilizat. Este cazul funciilor new i free n
PASCAL i new i delete sau malloc i free din C i C++.
3)-Limbaje cu colectoare de gunoaie (garbage collection). In aceste
limbaje, utilizatorul nu specific niciodat cnd vrea s elibereze o zon de
memorie. Compilatorul i o serie de funcii care se execut simultan cu
programul deduc singure care dintre zone nu sunt necesare i le recupereaz.
Avantajele acestui limbaj sunt:
-utilizatorul este scutit de pericolul de a folosi zone de memorie
nealocate, prevenind astfel apariia unor bug-uri ;
-exist sigurana c n orice moment, o zon de memorie utilizat nu
este dealocat.
Dezavantajele limbajului:
-alocarea este impredictibil n timp;
Sisteme de operare 73
-nu se poate ti dac zona de memorie utilizat va fi sau nu utilizat
n viitor, deci este posibil ca un program s pstreze alocate zone de
memorie care-i sunt inutile. Aceast tehnic de alocare este ntlnit n
limbajele Lisp i Java. Menionm c majoritatea alocatoarelor din nucleele
sistemelor de operare comerciale sunt de tipul 1) i 2). Exist i nuclee ale
sistemelor de operare cu alocatoare de tipul 3), cum ar fi sistemele Mach sau
Digital.
5.3.2. Caracteristici ale alocatoarelor
Vom prezenta cteva caracteristici ale alocatoarelor dup care se
poate evalua calitatea acestora.
1)-Timp de operaie. Este timpul necesar unei operaii de
alocare/dealocare. Acest timp depinde de tipul alocatorului, fiecare alocator
trebuind s execute un numr de operaii pentru fiecare funcie. Cu ct
memoria disponibil este mai mare cu att timpul de execuie a unui apel
este mai mare.
2)-Fragmentarea. O problem cu care se confrunt alocatoarele este
faptul c aproape niciodat ele nu pot folosi ntreaga memorie disponibil,
pentru c mici fragmente de memorie rmn neutilizate. Aceste pierderi
apar n urma mpririi spaiului disponibil de memorie n fragmente
neocupate n totalitate de programe. Fragmentarea poate fi : fragmentare
extern i fragmentare intern.
Fragmentarea extern apare ori de cte ori exist o partiie de
memorie disponibil, dar nici un program nu ncape n ea.
Se demonstreaz c atunci cnd avem de-a face cu alocri de blocuri
de mrimi diferite, fragmentarea extern este inevitabil. Singurul mod de a
reduce fragmentarea extern este compactarea spaiului liber din memorie
prin mutarea blocurilor dintr-o zon n alta.
Fragmentarea intern este dat de cantitatea de memorie neutilizat
ntr-o partiie blocat ( ocupat parial de un program). Pentru a nu avea
fragmentare intern ideal ar fi ca fiecare program s aib exact dimensiunea
partiiei de memorie n care este ncrcat, lucru aproape imposibil.
3)-Concuren. Aceast caracteristic se refer la gradul de acces
concurent la memorie. Este cazul mai ales la sistemele cu multiprocesor, cu
memorie partajat. Un alocator bine scris va permite un grad mai ridicat de
concuren, pentru a exploata mai bine resursele sistemului.
4)-Grad de utilizare. Pe lng faptul c memoria este fragmentat,
alocatorul nsui menine propriile structuri de date pentru gestiune. Aceste
structuri ocup un loc n memorie, reducnd utilizarea ei efectiv.
Sorin Adrian Ciureanu 74
5.3.3. Tipuri de alocare a memoriei
n sistemul de gestiune a memoriei exist dou tipuri de adrese:
-adrese fizice;
-adrese logice.
Adresele fizice sunt adresele efective ale memoriei fizice. Se tie c
pentru a adresa o memorie fizic cu o capacitate de n octei este necesar un
numr de adrese egal cu log
2
n .
Adresele logice, sau virtuale, sunt adresele din cadrul programului
ncrcat.
De obicei, n marea majoritate a alocatoarelor, n momentul
ncrcrii unui program sau chiar al compilrii lui, adresele fizice coincid cu
cele logice. n momentul execuiei acestea nu mai coincid. Translatarea
adreselor logice n adrese fizice este executat de ctre hardware-ul de
mapare al memoriei.
Alocarea memoriei se poate face n dou feluri:
-alocare contigu;
-alocare necontigu.
Alocarea contigu nseamn alocarea, pentru un proces, a unei
singure poriuni de memorie fizic, poriune continu; (elemente contigue
nseamn elemente care se ating spaial sau temporal).
Alocarea necontigu nseamn alocarea, pentru un proces, a mai
multor poriuni separate din memoria fizic.
Alocarea memoriei se mai face n funcie de cum este privit
memoria. Exist dou tipuri de memorie: memorie real i memorie
virtual.
Memoria real const numai n memoria intern a sistemului i este
limitat de capacitatea ei.
Memoria virtual vede ca un tot unitar memoria intern i cea
extern i permite execuia unui proces chiar dac acesta nu se afl integral
n memoria intern.
5.3.4. Scheme de alocare a memoriei
Exist mai multe scheme de alocare de la foarte simple la foarte
complexe. n general, sunt de dou categorii:
-sisteme care transport procesele, nainte i napoi, ntre memoria
principal i disc (swapping i paging);
- sisteme care nu fac acest lucru ( fr swapping i paging).
Sisteme de operare 75
a)-Pentru sistemele cu alocare contigu, exist schemele:
-alocare unic;
-alocare cu partiii fixe ( alocare static);
-alocaii cu partiii variabile (alocare dinamic);
-alocare cu swapping.
b)Pentru sistemele cu alocare necontigu:
-alocare paginat (simpl sau la cerere);
-alocare segmentat (simpl sau la cerere);
-alocare segmentat-paginat (simpl sau la cerere).
5.3.4.1.Alocare unic
a) Alocare unic cu o singur partiie
Este un tip de alocare folosit n primele sisteme de operare care
lucrau monouser. Este cea mai simpl schem n care toat memoria intern
este destinat sistemului de operare, fr nici o schem de administrare a
memoriei. Desigur, ea ine de domeniul istoriei.
b) Alocare unic cu dou partiii
n acest tip de alocare exist dou partiii;
-partiie pentru sistemul de operare (nucleul);
-partiie pentru utilizator.
Este cazul sistemului de operare MS-DOS. Principalul dezavantaj
const n faptul c nu se ofer soluii pentru multiprogramare.
5.3.4.2. Alocare cu partiii fixe (alocare static)
Memoria este mprit static n mai multe partiii, nu neaprat de
dimensiuni egale. n fiecare partiie poate rula cel mult un proces, gradul de
multiprogramare fiind dat de numrul partiiilor.
De obicei, mprirea n partiii i dimensionarea acestora se face la
nceput de ctre operator. Programele sunt ncrcate n memorie prin nite
cozi de intrare. Este posibil ca s existe o singur coad de intrare in
memorie sau diferite cozi la diferitele partiii. Din coada de intrare un
program intr n cea mai mic partiie destul de mare, ins, pentru a-l primi.
Spaiul neocupat de program n aceast partiie rmne pierdut i n acest
fapt const dezavantajul schemei. Exista att fragmentare intern ct i
fragmentare extern.
Acest tip de alocare a fost utilizat de sistemul de operare SIRIS V, in
sistemele de calcul FELIX C-256/1024, sisteme care au existat i la noi n
ar, n toate centrele de calcul.
Sorin Adrian Ciureanu 76
n aceast alocare aprea pentru prima dat i un mecanism de
protecie a memoriei care era asigurat de sistemul de chei de protecie i
chei de acces.
Sistemul de memorie era mprit n pagini de 2KO i fiecare pagin
avea o cheie de protecie. Aceasta era pus printr-o instruciune cod-main
a calculatorului. Pentru ca un program s fie rulat ntr-o zon a memoriei,
trebuia s fie prezentate cheile de acces pentru fiecare pagin utilizat. La
identitatea cheii de acces cu cea de protecie, se permitea accesul n pagina
respectiv. Existau i chei de acces care deschideau orice cheie de protecie
(de exemplu cheia de acces zero), precum i chei de protecie deschise de
orice cheie de acces.
5.3.4.3. Alocare cu partiii variabile
n aceast alocare numrul, locaia i dimensiunea partiiilor variaz
dinamic. Ne mai fiind fixat dimensiunea partiiilor, care pot fi ori prea mari
ori prea mici fa de program, crete mult gradul de utilizare al memoriei. n
schimb se complic alocarea i dealocarea memoriei i urmrirea acestor
operaii.
Cnd se ncarc un proces n memorie, i se aloc exact spaiul de
memorie necesar, din memoria liber crendu-se dinamic o partiie. Cnd
se termin un proces, partiia n care a fost procesul devine memorie liber,
ea unificndu-se cu spaiul de memorie liber existent pn atunci.
Pentru gestionarea unei astfel de alocri, sistemul de operare trebuie
s aib dou tabele:
-tabela partiiilor ocupate;
-tabela partiiilor libere.
Principala problem este alegerea unui spaiu liber; aceast alegere
trebuie fcut cu minimizarea fragmentrii interne i externe. Exist anumii
algoritmi de alegere a spaiului liber.
-FFA (First Fit Algoritm), prima potrivire. Se parcurge lista spaiilor
libere care este ordonat cresctor dup adresa de nceput i se alege primul
spaiu de dimensiune suficient. Acest algoritm este folosit n sistemul SO
MINIX, creat de Tannenbaum.
-BFA (Best Fit Algoritm) , cea mai bun potrivire. Se parcurge lista
spaiilor libere i se alege spaiul cu dimensiunea cea mai mic n care
ncape programul. n acest fel se minimizeaz fragmentarea intern. n cazul
n care lista spaiului liber este ordonat cresctor dup dimensiunea
spaiilor libere, se alege evident primul spaiu liber. n acest caz FFA i BFA
coincid. BFA este utilizat n SO MS-DOS.
Sisteme de operare 77
-WFA (Worst Fit Algoritm) , cea mai proast potrivire. Se parcurge
lista spaiilor libere ordonat cresctor dup dimensiune i se alege ultimul
spaiu din list. Din punct de vedere al vitezei i al gradului de utilizare al
memoriei, FFA i BFA sunt superioare strategiei WFA.
5.3.4.4. Alocarea prin swapping
n acest tip de alocare, un proces, n majoritatea cazurilor n stare
de ateptare, este evacuat temporar pe disc, elibernd memoria principal.
Reluarea execuiei procesului se face prin rencrcarea sa de pe disc n
memoria principal. Swap nseamn a face schimb i, ntr-adevr, este vorba
de o schimbare de pe memoria principal pe una extern i napoi .
Problema principal n swapping este: ce procese sunt evacuate din memorie
pe disc ? Exist un algoritm bazat pe prioriti, numit Rollout-Rollin,
conform cruia, la apariia unui proces cu prioritate ridicat, vor fi evacuate
procesele sau procesul cu prioritatea cea mai sczut. O alt problem este:
la ce adres din memorie va fi readus procesul evacuat. De obicei, dac
alocarea este static, procesul va fi readus n aceeai partiie din care a
plecat. n cazul alocrii dinamice, procesul va fi adus n orice loc al
memoriei. Pentru ca alocarea prin swapping s aib eficien, este necesar
ca memoria extern (hard discul) s aib dou caracteristici: o capacitate
suficient de mare i un timp de acces foarte mic. Capacitatea mare este
necesar deoarece pe disc trebuie s se evacueze toate imaginile proceselor,
numrul lor putnd ajunge, la un moment dat, foarte mare. Timpul de acces
trebuie s fie foarte mic. n caz contrar, costul swappingului
memorie disc poate deveni inconvenabil. O condiie esenial pentru
micorarea costului este ca timpul de execuie al procesului s fie mult mai
mare dect timpul de swapping. Cnd un proces necesit date noi n timpul
execuiei i, implicit, zone suplimentare de memorie. Este situaia aa
numitelor procese cu dimensiune variabil n timpul execuiei.
Dac, datorit cererii suplimentare de memorie, se depete zona de
memorie afectat procesului, atunci sistemul de operare trebuie s intervin.
Exist urmtoarele posibiliti:
- s ncheie forat procesul care a formulat cerere de suplimentare a
memoriei i s considere aceast cerere ca o eroare de execuie;
-s returneze decizia procesului, n sensul c acesta va decide dac
i va ncheia activitatea sau o va continua strict n zona de memorie care i-a
fost impus;
-n cazul alocrii dinamice, s evacueze procesul pe disc, i s
atepte eliberarea unei zone de memorie satisfctoare pentru proces.
Sorin Adrian Ciureanu 78
Trebuie menionat c nc suntem n modul de alocare contiguu, deci
spaiul de adresare al unui proces nu poate depi capacitatea memoriei
interne.
(evacuare)
Fig.5.2. Mecanismul swapping.
n concluzie, putem spune c principalul avantaj al alocrii prin
swapping este faptul c se simuleaz o memorie mai mare dect cea fizic
existent. Principalul dezavantaj este costul swappingului care uneori poate
fi destul de mare. Mecanismul de swapping este redat n Fig.5.2.
5.4. PAGINAREA MEMORIEI
Paginarea este un tip de alocare necontiguu, aceasta nsemnnd c
unui proces i poate fi alocat memorie oriunde, att n memoria intern ct
i n cea extern, iar memoria alocat poate fi format din buci de
memorie.
5.4.1. Suportul hardware
Memoria fizic este mprit n blocuri de lungime fix, numite
cadre de pagin (frames) sau pagini fizice. Lungimea unui cadru este o
P
1
P
2
P
n
P
1
P
2
P
n
Imaginea lui P
1
Imaginea lui P
2
Imaginea lui P
n
Swapout
(evacuare)
MEMORIE PRINCIPAL MEMORIE SECUNDAR
Sisteme de operare 79
putere a lui doi i este constant pentru fiecare arhitectur de sistem n parte.
Pentru Intel lungimea unui cadru este 4KO.
Memoria logic a unui proces este mprit n pagini logice sau
pagini virtuale care sunt plasate n memoria secundar, pe hard disc.
Pentru execuia unui proces, paginile sale logice trebuie ncrcate n
cadrele libere ale memoriei fizice, intr-un mod necontiguu.
Evidena cadrelor libere este inut de sistemul de operare.
Bineneles, dac procesul are nevoie de n pagini logice, trebuie s se
gseasc n cadre libere.
Att adresele fizice ct i cele logice sunt implementate n hard i ele
conin:
-adresa fizic=numr de cadru(f)+deplasament n cadru(d)
-adresa logic=numr de pagini logice(l)+deplasament n
pagina logic
Prin mapare se nelege translatarea adresei logice n adres fizic.
Aceast sarcin i revine sistemului de operare prin utilizarea tabelei de
pagini. Fiecare proces are o tabel de pagini n care n care fiecare pagin
logic are adresa de baz a cadrului asociat ei. Pentru translatare se folosete
numrul de pagin drept index n tabela de pagini. n schema din figura 5.3.
se vede corespondena ntre adresa logic i cea fizic prin intermediul
tabelei de pagini.
Adresa logic Adresa fizic
l f
Tabel de pagini Memoria fizic
Fig.5.3. Corespondena dintre adresa logic i cea fizic.
l d d f
d
f
Sorin Adrian Ciureanu 80
5.4.2. Implementarea tabelei de pagini
Pstrarea tabelelor de pagini se face n :
a)-registrele hard;
b)-memoria principal;
c)-memoria hard special, de tip asociat.
a) Soluia de implementare a tabelelor de pagini n registrele unitii
centrale este , desigur , foarte rapid dar i foarte scump, mai ales pentru un
numr foarte mare de tabele. n plus accesul la registre se face n mod
privilegiat ceea ce, la un moment dat, poate constitui un impediment.
b) Soluia de implementare a tabelei de pagini n memoria principal
presupune un cost mult mai sczut i de aceea este soluia cea mai des
ntlnit. Ea impune accese multiple la memorie; mai nti trebuie accesat
tabela de pagini pentru aflarea adresei fizice asociat adresei logice dorite;
apoi se acceseaz memoria fizic la adresa aflat pe baza translatrii. n
acest tip de translatare se folosete un Registru de Baz al Tabelei de
Pagin (RBTP). Atunci cnd se dorete s se lucreze cu alt tabel de
pagin dect cea curent, se ncarc RBTP cu noua valoare de pagin,
reducndu-se n acest fel timpul de comutare.
c) O alt soluie de implementare este aceea n care se utilizeaz o
memorie asociativ hardware, de mic dimensiune. Aceasta folosete un set
de registre asociative. Fiecare registru are dou componente:
-cheie, n care se memoreaz numrul paginii logice;
-valoare, n care se memoreaz numrul cadrului asociat.
Cutarea ntr-o astfel de memorie asociativ se face n felul urmtor:
un element care trebuie gsit este comparat simultan cu toate cheile i unde
se gsete coinciden se extrage cmpul valoare corespunztor.
n scopul utilizrii unei astfel de memorii asociative pentru tabela de
pagin, se face urmtoarea coresponden:
-n cheie se memoreaz numrul paginii logice;
-n valoare se memoreaz numrul cadrului asociat.
Atunci cnd procesorul genereaz o adres logic, dac numrul de
pagin logic coincide cu una din chei, numrul de cadru devine imediat
disponibil i este utilizat pentru a accesa memoria. Dac numrul de pagin
nu coincide cu nici una dintre chei, atunci, pentru aflarea numrului cadrului
asociat, se face un acces la tabela de pagini din memoria intern. Informaia
astfel obinut este utilizat pentru accesarea memoriei utilizator, ct i
pentru a fi adugat n cadrul registrelor asociative, mpreun cu numrul de
pagini asociat, ca s poat fi regsit rapid n cadrul unei referiri ulterioare.
Sisteme de operare 81
Alte mbuntiri ale implementrii tabelei de pagini folosesc:
a)-tabele de pagini pe nivele multiple;
b)-tabele de pagini inverse.
a) Pentru un spaiu de adresare foarte mare, tabelele de pagini pot
avea dimensiuni mari. De exemplu, pentru o memorie principal de 4 GO
(2
32
octei), dac pagina are 4KO, atunci o tabel de pagini are 1 milion de
intrri. Una din tehnicile de reducere a dimensiunilor tabelei de pagini este
utilizarea unei tabele de pagini pe nivele multiple. Aceasta echivaleaz cu
mprirea tabelei de pagin n altele care s aib dimensiuni mai mici i
unde cutarea s se fac ntr-un timp mai scurt.
Pornind de la exemplul precedent, cu memoria principal de 2
32
octei, o adres logic arat astfel:
Fiecare tabel de pagin are un milion de intrri. Dac partionm
tabelul de pagin n 4 seciuni, fiecare seciune are 256 K intrri iar o adres
logic pentru o seciune arat astfel:
b) O alt modalitate de reducere a dimensiunii tabelelor de pagini
este folosirea tabelei de pagini invers. n loc de a avea o intrare n tabel
pentru fiecare pagin virtual, avem cte o intrare pentru fiecare cadru fizic.
Deci n loc s se fac corespondena:
-pagin virtual cadru fizic
se face o coresponden invers:
-cadru fizic pagin virtual.
Cnd se translateaz o adres logic, se caut n tabela de pagini
invers numrul paginii logice i se returneaz cadrul fizic corespunztor. n
acest mod se face o reducere a numrului de intrri n pagin dar cutarea
are o vitez mai mic, deoarece trebuie cutat ntreaga tabel.
5.4.3. Concluzii privind paginarea
Principalul avantaj al paginrii este eliminarea complet a
fragmentrii externe. Nu dispare ns i fragmentarea intern, deoarece
numrul de pagin
20 bii
deplasament
12 bii
numrul de seciune
2 bii
numrul de pagin
18 bii
deplasament
12 bii
Sorin Adrian Ciureanu 82
poate rmne un spaiu nefolosit dar alocat proceselor, fiindc dimensiunea
proceselor nu este un multiplu exact al lungimii paginilor.
Un alt avantaj al paginrii este posibilitatea de partajare a memoriei.
Dou sau mai multe pagini pot vedea aceeai zon de memorie ncrcnd
paginile logice n acelai cadru fizic. Singura soluie este ca n acel cadru
fizic s fie memorat cod reentrant, adic un cod care nu se mai poate
automodifica n timpul execuiei. Datorit proprietii de reentran , este
posibil ca dou sau mai multe procese s execute simultan acelai cod,
fiecare proces pstrnd o copie a registrelor i a datelor proprii.
n memoria fizic este necesar s se pstreze o singur copie a
codului comun, fiecare tabel de pagin indic spre acelai cadru, n timp
ce paginile corespunztoare datelor proceselor sunt memorate n cadre
diferite.
Un dezavantaj al paginrii este faptul c fiecare acces la memorie
presupune un acces suplimentar la tabela de pagini pentru calculul de
adres.
5.4.4. Segmentarea memoriei
Segmentarea reprezint o privire a memoriei din punctul de vedere al
utilizatorului care percepe memoria nu ca pe o succesiune de cuvinte, aa
cum este n realitate, ci ca pe o mulime de buci de memorie de diverse
dimensiuni. Aceste segmente pot cuprinde: programul principal, proceduri,
funcii, stive, vectori, matrici etc.
Segmentarea este o schem de administrare a memoriei n care
programul este divizat n mai multe pri funcionale. Spaiul logic de
adresare al programului este i el mprit n segmente. Fiecrui segment de
memorie i corespunde o unitate funcional a programului.
Program Memorie
Program principal
Segment 1
Funcia 1
Segment 2
Funcia 2
Segment 3
Procedura
Segment 4
Matrice 1
Segment 5
Matrice 2
Segment 6
Vector
Segment 7
Fig. 5.4. Principiul segmentrii.
Sisteme de operare 83
Fiecare segment are un nume i o dimensiune, deci:
-un nume
-un deplasament.
Programatorul vede spaiul virtual de adresare al programului ca un
spaiu bidimensional, nu un spaiu unidimensional ca la programare.
5.4.5. Segmentare paginat
A fost introdus de sistemul de operare MULTICS al lui
Tannenbaum i ncearc s mbine avantajele celor dou metode, de
paginare i de segmentare.
Fiecare segment este mprit n pagini. Fiecare proces are o tabel
de segmente, iar fiecare segment are o tabel de mapare a paginilor.
Adresa virtual se formeaz din: segment, pagin i deplasament.
Adresa fizic se formeaz din cadru de pagin i deplasament.
n segmentarea paginat se elimin dou dezavantaje ale segmentrii
pure: alocarea contigu a segmentului i fragmentarea extern.
5.4.6. Memorie virtual
Alocarea prin memorie virtual are capacitatea de a aloca un spaiu
de memorie mai mare dect memoria intern disponibil. Pentru aceasta se
utilizeaz paginarea sau segmentarea combinate cu swappingul.
Memoria virtual este o tehnic ce permite execuia proceselor chiar
dac acestea nu se afl integral n memorie.
Metoda funcioneaz datorit localitii referinelor la memorie.
Numai un subset din codul, respectiv datele, unui program sunt necesare la
un moment arbitrar de timp.
Problema const n faptul c sistemul de operare trebuie s prevad
care este subsetul dintr-un moment urmtor. Pentru aceasta se apeleaz la
principiul localitii (vecintii), enunat de J.P.Denning n 1968. Acest
principiu are dou componente:
-localitate temporar tendina de a accesa n viitor locaii accesate
deja n timp;
-localitate spaial tendina de a accesa n viitor locaii cu adrese
apropiate de cele accesate deja.
Alocrile cele mai des utilizate n memoria virtual sunt:
-alocarea de tip paginare la cerere;
-alocarea de tip segmentare la cerere.
Sorin Adrian Ciureanu 84
5.4.6.1. Paginare la cerere
Paginarea la cerere mbin tehnica de paginare cu tehnica swapping.
n acest fel, paginile de pe harddisc sunt aduse n memorie numai cnd sunt
referite, cnd este nevoie de ele. In acest mod se elimin restricia ca
programul s fie n ntregime n memorie.
n figura 5.5. se d o organigram a paginrii la cerere.
Aa cum se observ din organigram, dac referirea unei pagini este
valid, adic dac adresa ei este corect, atunci primul lucru care se testeaz
este bitul valid/nevalid. Acesta este implementat n tabelul de mapare a
paginilor i dac este 1 nseamn c pagina se afl n memorie, dac este 0
pagina este pe hard disc i trebuie adus n memorie. Dac este zero, se
declaneaz eroare de pagin, se genereaz o ntrerupere de pagin ( PFI =
Page Fault Interrupt), de tip sincron, transparent pentru utilizator, cu o
prioritate superioar.
Fig. 5.6. Organigrama paginrii la cerere.
Referire pagin memorie
referin
valid
Eroare de
accesare
Bit valid =1
Pagin prezent n
memorie i se acceseaz
Eroare pagin
Se execut PFI=
Page Fault Interrupt
Rutin de tratare a ntreruperii
NU(BIT VALID=0)
NU DA
DA
Sisteme de operare 85
n acest moment se va ntrerupe execuia programului n curs iar
sistemul de operare va lansa rutina de tratare a ntreruperii de pagin.
Aceasta va cuta un spaiu liber i, dac exist, va plasa pagina n el. Dac
nu, va trebui s aleag o rutin, adic un cadru ce va fi nlocuit.
Fig.5.7. Rutina de tratare a ntreruperii de pagin.
Se testeaz, n continuare, bitul de tranzit al paginii rutin i dac
este 1 se abandoneaz aceast pagin victim i se trece la alt victim.
Regula este ca n alegerea victimei s se evite o pagin n curs de ncrcare.
Apoi se testeaz bitul dirty. Acesta este pus la 0 iniial la ncrcare i este
Exist cadru liber
Se plaseaz
pagina adus de
pe disc n cadrul
liber din memorie
Se alege un cadru
victim = cadrux
Bit tranzit=1
Pagina e n curs de ncrcare i se
alege alt cadru victim
Bit dirty
cadrux=1
Pagina a fost modificat i
trebuie salvat pe harddisc
Pagina nu a fost modificat i nu trebuie
salvat pe harddisc
Se alege un algoritm de nlocuire a paginilor:
LRUINRU, FIFO
Politica de plasare n memorie: WFA, FFA,
BFA, Buddy-System
NU (bit dirty=0) DA
NU
NU
DA
DA
Sorin Adrian Ciureanu 86
setat la 1 ori de cte ori se face o modificare n pagin. Deci acest bit arat
dac pagina a fost modificat sau nu la nivel de memorie. Dac nu a fost
modificat, atunci nu are rost salvarea ei pe hard disc, unde exist deja
aceast pagin. Dac a fost modificat, atunci ea trebuie salvat pe hard
disc. Alegerea victimei se face conform unui algoritm de nlocuire iar
plasarea n memorie conform unei anumite politici de plasare .
5.4.7. Algoritmi de nlocuire a paginii
Algoritmii de nlocuire a paginii au drept scop alegerea celei mai
bune victime. Criteriul dup care se face aceast alegere este minimizarea
ratei erorilor de pagin.
Teoretic, cel mai bun algoritm ar fi acela care alege victime dintre
paginile care vor fi solicitate cel mai trziu. Acest lucru este greu de realizat
deoarece evoluia unui program nu este previzibil i de aceea rspunsul nu
poate fi prevzut uor. Au existat ncercri de determinare a paginilor care
vor fi utilizate cel mai trziu. n 1966, L.A.Belady a creat un algoritm
statistic care ncerca, pe baze probabilistice, s rezolve aceast problem dar
rezultatul algoritmului nu a fost dintre cele mai bune. n continuare vom
prezenta cei mai cunoscui astfel de algoritmi practici.
5.4.7.1. Algoritmul FIFO
Este unul dintre cei mai simpli algoritmi, att ca idee ct i ca
implementare. Fiecrei pagini i se asociaz momentul de timp cnd a fost
adus n memorie.
Se realizeaz o structur de coad la care printr-un capt vor fi aduse
noile pagini n memorie, n ordinea strict a sosirii lor, iar cellalt capt va fi
pentru paginile victim.
S lum un exemplu. Fie o situaie cu numrul de pagini virtuale 5.
Secvena de alocare a paginilor 543254154321
Rata erorilor de pagin este, pentru folosirea a trei cadre, de:
r
3
= % 75 %
12
9
=
iar pentru folosirea a patru cadre :
r
4
= % 83
12
10
=
Sisteme de operare 87
Secvena 5 4 3 2 5 4 1 5 4 3 2 1
r
3
=75%
3 cadre 5 4 3 2 5 4 1 1 1 3 2 2
- 5 4 3 2 5 4 4 4 1 3 3
- - 5 4 3 2 5 5 5 4 1 1
Situaii de
nenlocuire a
paginilor
* * *
4 cadre 5 4 3 2 2 2 1 5 4 3 2 1
r
4
=83%
- 5 4 3 3 3 2 1 5 4 3 2
- - 5 4 4 4 3 2 1 5 4 3
- - - 5 5 5 4 3 2 1 5 4
Situaii de
nenlocuire a
paginilor
**
n aceste dou cazuri se observ c pentru utilizarea a 3 cadre rata
erorilor de pagin este 75% iar cnd sunt 4 cadre rata erorilor crete, fiind
83%. Ne-am fi ateptat ca, odat cu creterea numrului de cadre rata
erorilor de pagin s scad nu s creasc. Acest fapt este cunoscut ca
anomalia lui Belady i constituie unul din dezavantajele algoritmului FIFO.
Un alt dezavantaj al acestui algoritm este faptul c o pagin frecvent
utilizat va fi foarte des evacuat pe disc i rencrcat n memorie.
5.4.7.2. Algoritmul LRU (Least Recently Used)
Algoritmul LRU alege victima dintre paginile cele mai puin
utilizate n ultimul timp. Algoritmul se bazeaz pe presupunerea c pagina
care a fost accesat mai puin ntr-un interval de timp va fi la fel de accesat
i n continuare. Ideea este de a folosi localitatea temporar a programului.
Pentru implementare este necesar s se in evidena utilizatorilor
paginilor i s se ordoneze paginile dup timpul celei mai recente referine
la ele. Teoretic, implementarea s-ar putea face cu o coad FIFO n care o
pagin accesat este scoas din coad i mutat la nceputul ei. Totui
aceast implementare este destul de costisitoare. Principalul avantaj al
algoritmului LRU este faptul c el nu mai prezint anomalia lui Belady.
S lum exemplul anterior, folosit la algoritmul FIFO.
Se observ c odat cu creterea numrului de cadre scade rata
erorilor de pagin, deci anomalia Belady nu mai apare. De asemenea este
corectat i cellalt dezavantaj al algoritmului FIFO i anume la LRU sunt
avantajate paginile frecvent utilizate, care sunt pstrate n memorie, ne mai
fiind necesar evacuarea pe disc.
Sorin Adrian Ciureanu 88
Exist mai multe feluri de implementare a algoritmului LRU:
a) LRU cu contor de accese
b) LRU cu stiv
c) LRU cu matrice de referine.
Secvena 5 4 3 2 5 4 1 5 4 3 2 1
r
3
=
12
10
=
83%
3 cadre 5 4 3 2 5 4 1 5 4 3 2 1
- 5 4 3 2 5 4 1 5 4 3 2
- - 5 4 3 2 5 4 1 5 4 3
Situaii de
nenlocuire a
paginilor
* *
4 cadre 5 4 3 2 5 4 1 5 3 3 2 1
r
4
=
12
7
=
58%
- 5 4 3 2 5 4 1 5 4 3 2
- - 5 4 3 2 5 4 1 1 5 3
- - - 5 4 3 2 2 4 4 1 5
Situaii de
nenlocuire a
paginilor
* * * * *
a) LRU cu contor de accese se implementeaz hard. Se utilizeaz un
registru general al unitii centrale pe post de contor. La fiecare acces la
memorie, contorul va fi incrementat. La fiecare acces la o pagin, contorul
este memorat n spaiul corespunztor acelei pagini n tabela de pagini.
Alegerea victimei const n cutarea n tabela de pagini o pagin
cu cea mai mic valoare a contorului.
b) LRU cu stiv utilizeaz o stiv n care sunt pstrate numerele
paginilor virtuale. Cnd este referit o pagin, este trecut n vrful stivei. n
felul acesta vom gsi victima la baza stivei.
c) LRU cu matrice de referine utilizeaz o matrice ptratic n-
dimensional, binar (cu elemente 0 i 1), unde n este numrul de pagini
fizice. Iniial matricea are toate elementele 0. n momentul n care se face o
referin la pagina k, se pune 1 peste tot n linia k, apoi 0 peste tot n
coloana k. Numrul de uniti (de 1) de pe o linie arat ordinea de referire a
paginii. Alegerea victimei se face n matrice; indicele liniei cu cele mai
puine cifre de 1, este numrul paginii fizice aleas ca victim.
5.4.7.3. Algoritmul LFU ( Least Frequently Used)
Victima va fi pagina cel mai puin utilizat.
Ca mod de implementare se folosete un contor de accese care se
incrementeaz la fiecare acces de pagin dar care nu este resetat periodic ca
Sisteme de operare 89
la LRU. Victima va fi pagina cu cel mai mic contor. Principalul
dezavantaj al acestei metode apare n situaia n care o pagin este utilizat
des n faza iniial i apoi nu mai este utilizat de loc; ea rmne n memorie
deoarece are un contor foarte mare.
5.4.7.4.Algoritmul real Paged Daemon
De obicei, sistemele de operare desemneaz un proces sistem
responsabil cu implementarea i realizarea politicii de nlocuire a paginilor
pentru memoria virtual. Un astfel de proces autonom care st n fundal i
execut periodic o anumit sarcin se numete demon (daemon).
Demonul de paginare poart numele de paged daemon. Acesta
pregtete sistemul pentru evacuarea de pagini nainte ca evacuarea s fie
necesar. Obinuit el este ntr-o stare dormant, fiind trezit de sistemul de
operare atunci cnd numrul cadrelor libere devine foarte mic. Dintre
principalele sale sarcini amintim:
-salveaz pe disc paginile cu bitul dirty pe 1, efectund aa numita
operaie de curire a paginilor;
-utiliznd un algoritm sau o combinaie de algoritmi de nlocuire a
paginilor, alctuiete o list ordonat pentru paginile ce vor fi victime;
-decide ct memorie s aloce pentru memoria virtual.
5.4.7.5. Fenomenul de trashing
Atunci cnd procesele folosesc mai mult timp pentru activitatea de
paginare dect pentru execuia propriu zis se spune c are loc fenomenul de
trashing.
Un exemplu tipic este acela cnd un proces are alocat un numr mai
mic de cadre dect i este necesar. Aceasta este o condiie necesar pentru
apariia trashingului. Deoarece toate paginile sunt necesare pentru rularea
programului, procesul va ncerca s aduc din memoria extern i restul
paginilor necesare. Dac nu sunt cadre libere, este posibil ca victimele s fie
chiar pagini ale procesului. Pentru acestea se vor genera din nou cereri de
aduceri n memorie i astfel se poate intra la un moment dat ntr-un cerc
vicios, cnd procesul va face numai cereri de paginare, i nu va mai execut
nimic din programul su. Acesta este, de fapt, trashingul.
Exist mai multe modaliti de a evita trashingul. Se alege un
algoritm de paginare care poate fi global sau local.
Algoritmii globali permit procesului s aleag pentru nlocuire orice
cadru, chiar dac acesta este alocat altui proces.
Sorin Adrian Ciureanu 90
Algoritmii locali impun fiecrui proces s foloseasc pentru selecie
numai cadre din propriul set, numrul cadrelor asociate procesului rmnnd
acelai. Dac se utilizeaz un algoritm local, fenomenul de trashing dispare,
deoarece setul de pagini asociat unui proces n memorie este influenat
numai de activitatea de paginare a procesului respectiv.
5.4.7.6. Concluzii privind paginarea la cerere
Principalele avantaje ale paginrii la cerere sunt:
- programul este prezent doar parial n memorie;
-se execut mai puine operaii de intrare ieire;
-la un moment dat, este necesar o cantitate mai mic de memorie;
-crete mult gradul de multiprogramare;
-n programarea la cerere nu mai este nevoie ca programatorul s
scrie overlayurile, sarcina aceasta revenind sistemului de operare.
Principalul dezavantaj este c mecanismul de gestiune a memoriei,
att hard ct i soft, are o complexitate deosebit.
5.5. ALOCAREA SPAIULUI LIBER. TIPURI DE
ALOCATOARE
5.5.1. Alocatorul cu hri de resurse
Acest alocator folosete un vector de structuri care descriu fiecare
bloc liber.
Iat un exemplu ce utilizeaz o hart a resurselor.
Harta resurselor
Adresa de nceput a
blocului
(hexa)
Lungime
(baii)
Situaia blocului
0 100 Ocupat
64 50 Liber
96 200 Ocupat
16 E 400 Ocupat
3FE 100 Liber
482 50 Ocupat
Fig. 5. 8. Harta resurselor n alocatorul cu hart de resurse.
Sisteme de operare 91
Harta
memoriei
0
64
96
16E
3FE
482
(a)
16E 5B4
100
(b)
Fig. 5.9. Hri de memorie n alocatorul cu hri de resurse.
ntr-un alt mod de reprezentare, fiecare bloc liber conine lungimea
blocului liber i adresa urmtorului bloc liber. Astfel, blocurile libere sunt
inute ntr-o structur de list simplu nlnuit. Cnd alocatorul vrea s
gseasc un bloc liber, pleac de la adresa primului bloc liber i parcurge
lista de blocuri libere pn gsete unul de dimensiune corespunztoare.
Pentru exemplul anterior, harta memoriei arat ca in figura 5.9.(b).
Acest tip de alocare, cu hri de resurse, este simplu dar destul de
ineficient. Din cauza fragmentrii, complexitatea operaiilor este mare. Este
posibil ca, dup un anumit timp, lista de blocuri s conin foarte multe
blocuri mici a cror traversare s fie inutil i foarte costisitoare.
5.5.2. Alocatorul cu puteri ale lui 2
La alocatorul prezentat anterior, cel cu hri de resurse, principalul
dezavantaj este dat de cutarea unui bloc de dimensiune potrivit printre
blocurile libere. Pentru a contracara acest lucru, o soluie este de a crea
blocuri de dimensiuni diferite, cresctoare ca lungime, care s prezinte o
Sorin Adrian Ciureanu 92
ofert mai bun n cutare. n acest sens se poate impune ca dimensiunea
unui bloc s fie o putere a lui 2, deci ca un bloc s aib 2
k
octei.
Tehnica de alocare este urmtoarea: dac dimensiunea unei cereri de
alocare nu este o putere a lui 2, atunci se aloc o zon a crei dimensiune
este puterea imediat superioar a lui 2, cu alte cuvinte, dac cererea de
alocare are dimensiunea cuprins ntre 2
k
i 2
k+1
, se alege zona cu
dimensiunea 2
k+1
. Metoda se mai numete i metoda njumtirii, pentru c,
practic, dac exist o cerere de alocare de dimensiunea 2
k
i aceasta nu
exist, atunci se alege o zon liber de dimensiune 2
k+1
, mai mare (dubl),
care este mprit n dou pri egale. Dup un numr finit de astfel de
operaii se obine o zon cu dimensiunea dorit i alocarea este satisfcut.
Implementarea acestei metode este asemntoare cu cea precedent cu
meniunea c pentru alocatorul cu puteri ale lui 2 exist liste separate pentru
fiecare dimensiune 2
k
pentru care exist cel puin o zon liber. Mai trebuie
menionat faptul c, atunci cnd dou zone nvecinate de dimensiune 2
k
devin libere, ele sunt regrupate pentru a forma o singur zon liber de
dimensiune 2
k+1
. De aici i numele de metoda camarazilor.
5.5.3. Alocatorul Fibonacci
Acest alocator este asemntor cu alocatorul cu puteri ale lui 2, dar
n loc s divizeze o zon liber n dou subzone egale, o mparte n alte
dou de dimensiuni diferite. La fel ca n irul lui Fibonacci, o zon a
i
este:
a
i
= a
i-1
+ a
i-2
Cnd un proces i termin execuia ntr-o zon ocupat, aceasta
devine liber i pot aprea urmtoarele situaii:
-zona eliberat se afl ntre dou zone libere i atunci cele trei zone
se regrupeaz ntr-o singur zon liber;
-zona eliberat se afl ntre o zon liber i una ocupat i atunci se
unesc cele dou zone libere;
-zona eliberat se afl ntre dou zone ocupate i atunci zona
eliberat este adugat listelor zonelor disponibile.
5.5.4. Alocatorul Karels Mckusick
Acest alocator a fost construit n 1988 i este o variant mbuntit
a alocatorului cu puteri ale lui 2. Metoda are avantajul c elimin risipa
pentru cazul blocurilor care au dimensiuni exact puteri ale lui 2. Exist dou
mbuntiri majore.
Sisteme de operare 93
a) Blocurile ocupate i reprezint lungimea ntr-un vector mare de
numere v[k]=t , ceea ce nseamn c pagina k are blocuri de dimensiunea t,
unde t este o putere a lui 2. De exemplu :
vectorul v
16 1024 512 32 16 64
n acest exemplu, pagina 3 are blocuri de 512 octei, pagina 6 are
blocuri de 64 octei etc.
b) O alt mbuntire este modul de calcul al rotunjirii unei puteri a
lui 2. Se utilizeaz operatorul condiional din C (expresie 1; expresie 2;
expresie 3;). Nu se folosesc instruciuni ci numai operatori i n felul acesta
crete viteza de execuie.
Acest alocator a fost utilizat pentru BDS UNIX.
5.5.5. Alocatorul slab
Alocatorul slab este inspirat din limbajele orientate pe obiecte.
Are zone de memorie diferite pentru obiecte diferite, formnd un fel de
mozaic, de unde i numele slab care n englez nseamn lespede.
Iat cteva particulariti ale acestui alocator:
- alocatorul ncearc, cnd caut zone noi, s nu acceseze prea multe
adrese de memorie pentru a nu umple cache-ul microprocesorului cu date
inutile; spunem c alocatorul este de tip small foot print (urm mic).
- alocatorul ncearc s aloce obiecte n memorie astfel nct dou
obiecte s nu fie n aceeai linie n cache-ul de date;
-alocatorul ncearc s reduc numrul de operaii de iniializare
asupra noilor obiecte alocate.
Alocatorul slab const dintr-o rutin central care creeaz
alocatoare pentru fiecare obiect. Rutina primete ca parametri numele
obiectului, mrimea obiectului, constrngerile de aliniere i pointere pentru
o funcie construit i o funcie destinatar.
Fiecare alocator are propria lui zon de memorie n care exist numai
obiecte de acelai tip. Astfel exist o zon de pagini numai cu fiiere, o zon
de pagini numai cu date, etc. Toate obiectele dintr-o zon au aceeai
dimensiune.
Fiecare alocator are o list de obiecte care au fost de curnd
dealocate i le refolosete atunci cnd i se cer noi obiecte. Deoarece
obiectele au fost dealocate, nu mai trebuie iniializate din nou.
Atunci cnd un alocator nu mai are memorie la dispoziie, el cere o
nou pagin n care scrie obiecte noi. Pentru c obiectele nu au fost
Sorin Adrian Ciureanu 94
niciodat iniializate , alocatorul cheam constructorul pentru a iniializa un
nou obiect.
liber obiect fiier
alocat
liber Pagina 0 cu obiecte
fiier
liber liber Pagina 1 cu obiecte
fiier
Fig 5.10. Alocatorul slab.
Fiecare obiect are propriul lui alocator care are n paginile sale
obiecte alocate i libere. n fiecare pagin, primul obiect alocat ncepe la alt
adres, pentru a ncrca uniform liniile din cache-ul microprocesorului.
Fiecare pagin mai posed anumite structuri de date, folosite n acest scop,
ca ,de exemplu, lista dublu nlnuit a tuturor paginilor pentru un anumit
obiect. Fiecare alocator folosete propriile lui pagini la fel ca alocatorul cu
puteri ale lui 2. La sfritul unei pagini alocatorul rezerv o zon pentru o
structur de date care descrie cum este acea pagin ocupat. Primul obiect
din pagin este plasat la o distan aleatoare de marginea paginii; acest
plasament are efectul de a pune obiecte din pagini diferite la adrese diferite.
Alocatorul slab poate returna sistemului de paginare paginile total
nefolosite. El are o urm mic deoarece majoritatea cererilor acceseaz o
singur pagin. Acest tip de alocator risipete ceva resurse datorit modului
de plasare n pagin i pentru c are zone diferite pentru fiecare tip de
obiect. Alocatorul slab este utilizat n sistemul de operare Solaris 2.4.
5.6. GESTIUNEA MEMORIEI N UNELE SISTEME
DE OPERARE
5.6.1. Gestiunea memoriei n Linux
n UNIX gestiunea memoriei a cunoscut diferite variante n funcie
de versiunea cu care se lucra. n primele versiuni, nainte de versiunea
Alocatorul
de fiiere
Alocatorul
de noduri
Sisteme de operare 95
3BSD (Berkeley System Distribution), gestiunea memoriei se baza pe
swapping.
Transferul din memorie pe hard disc este pornit n momentul n care
nucleul rmne fr memorie datorit urmtoarelor evenimente:
-crearea unui proces prin apelul fork();
-mrirea segmentului de date;
-epuizarea spaiului unei stive.
Victima este aleas dintre procesele n starea blocat sau, dac
acestea nu exist, dintre procesele cu un timp rezident n memorie foarte
mare.
Swapperul intr n funciune la fiecare cteva secunde. Exist dou
feluri de schimbri: uoare i grele. Un schimb uor este un schimb n care
exist suficient memorie liber i nu se evacueaz nici un proces din
memorie nspre disc. Un schimb greu este un schimb n care nu exist
suficient memorie liber i trebuie evacuate procese.
Pentru a preveni un swapping cu o rat prea mare se impune ca un
proces s petreac obligatoriu n memorie un timp de cteva secunde.
n ceea ce privete implementarea swappingului, blocurile libere din
memorie sunt inute ntr-o list dublu nlnuit iar algoritmul de cutare
este de prim potrivire (first fit).
ncepnd cu versiunea 4BSD, s-a implementat gestiunea de memorie
bazat pe paginare. Demonul care se ocup cu paginarea este procesul 2
(procesul 0 este swappingul iar procesul 1 este INIT) i este lansat periodic.
Principala sa sarcin este de a vedea cte pagini libere exist la un moment
dat. Dac acest numr este prea mic, el pornete o aciune de eliberare a
paginilor.
Memoria este format din trei pri:
-nucleul, rezident n memorie i niciodat eliminat;
-punerea n coresponden principal, rezident n memorie i
niciodat eliminat;
-cadre de pagin, coninnd cod, date, stiv, tabel de pagini, lista
paginilor libere etc.
Punerea n coresponden principal conine informaii despre
coninutul cadrelor de pagini. Intrarea 0 descrie cadrul de pagin 0, intrarea
1 descrie cadrul de pagin 1 .a.m.d. Dac se utilizeaz cadre de 1KB i
intrarea de 16 octei atunci se folosesc n jur de 2% din memorie pentru
punerea n coresponden principal.
Primele dou cmpuri (figura 5.11) sunt utilizate numai cnd cadrul
de pagin corespunztor se afl pe lista cadrelor libere. Urmtoarele trei
cmpuri sunt utilizate n momentul n care cadrul de pagin conine
Sorin Adrian Ciureanu 96
informaii. Deoarece fiecare pagin din memorie are o adres de disc unde
va fi stocat n momentul n care este eliminat, aceste cmpuri sunt
folosite pentru a localiza aceast adres. Urmtoarele trei cmpuri sunt
utilizate n tabela de procese, pentru procesul care deine pagina i anume
indic n ce segment este i unde este localizat n cadrul acelui segment.
Ultimul cmp reprezint civa dintre indicatorii folosii de algoritmul de
paginare.
Fig. 5.11. Punerea n coresponden principal la versiunea 4 BSD
UNIX.
Cnd un proces este lansat, dac una din paginile utilizate la proces
nu se afl n memorie, se declaneaz rutina de defect de pagin. Aceasta
selecteaz primul cadru de pagin din lista de cadre libere. Dac lista de
cadre libere este goal, atunci procesul este suspendat pn cnd demonul de
pagin elibereaz un cadru.
Algoritmul de nlocuire a paginilor este rulat de demonul de
pagin la fiecare 250 ms. Demonul verific dac numrul de cadre libere
Cadru de pagin n
bnpagin
Cadru de pagin 2
bnpagin
Cadru de pagin 1
bnpagin
Nucleu
Indexul urmtoarei nregistrri
Indexul nregistrrii precedente
Numrul blocului pe disc
Numrul dispozitivului disc
Rezumatul blocului
Index n tabloul de procese
Cod / Date / Stiv
Ofset n cadrul segmentului
L
i
b
e
r
D
a
t
e
n
t
r
a
n
z
i
t
B
i
t
u
l
d
e
f
i
x
a
r
e
n
m
e
m
o
r
i
e
Memorie principal nregistrarea din maparea principal
U
t
i
l
i
z
a
t
e
p
e
n
t
r
u
c
a
d
r
e
l
i
b
e
r
e
nregistrri n
maparea principal
(cte una pentru
fiecare cadru de
pagin)
Sisteme de operare 97
este cel puin egal cu un parametru, numit lotsfree, care de obicei este setat
la un sfert din capacitatea memoriei. Dac nu sunt suficiente pagini libere,
atunci demonul ncepe activitatea de transfer a paginilor pe disc. n primele
versiuni UNIX se utiliza algoritmul ceasului precum i o variant
mbuntit a acestuia, algoritmul ceasului cu dou brae.
Algoritmul ceasului funcioneaz scannd cadrele de pagini ca i
cum s-ar afla pe circumferina unui ceas. Se fac dou trieri. La prima triere
se seteaz un bit pentru fiecare pagin iar la a doua triere se verific paginile
care au fost accesate ntre prima i a doua triere. Paginile ce nu au fost
accesate sunt evacuate pe disc. Dac au fost scrise ct au stat n memorie
sunt salvate integral iar dac nu, nu sunt salvate, locaia pe disc fiind
cunoscut.
Algoritmul ceasului cu dou brae. Algoritmul ceasului, care este de
fapt un algoritm al eliminrii paginii celei mai puin utilizate, are
dezavantajul c, pentru memorii de mari dimensiuni, consum mult timp.
De aceea s-a trecut la un algoritm modificat, numit algoritmul ceasului cu
dou brae. Exist dou brae care se rotesc n acelai timp, ntre brae
existnd un unghi constant. Primul bra va reseta bitul de acces iar al doilea
bra l va citi. Astfel se va micora timpul consumat. ns dac unghiul
dintre cele dou brae este prea mic, se vor elimina multe procese iar dac
este prea mare, se ajunge la algoritmul ceasului simplu.
De remarcat c algoritmul ceasului este un algoritm global, adic nu
se ia n consideraie pagina crui proces este eliminat. Deoarece exist
posibilitatea eliminrii paginilor aceluiai proces, numrul de pagini alocate
unui proces variaz n timp.
Atunci cnd apare fenomenul de trashing sau cnd rata de paginare
este foarte ridicat, este trezit demonul pentru a elimina din memorie
procese care s concureze la cadre de pagin. n varianta 4BSD, orice proces
care a stat inactiv mai mult de 20 secunde este evacuat pe disc. Astfel 4
procese cu timpul cel mai mare de inactivitate sunt eliminate din memorie.
n varianta System V exist dou diferene fa de variantele
anterioare:
-se utilizeaz algoritmul ceasului cu un singur bra dar eliminarea nu
se face dup a doua trecere ci cup n treceri consecutive;
-exist dou valori pentru lotsfree, lotsfree
min
i lotsfree
max
; demonul
este pornit atunci cnd numrul de pagini libere este mai mic dect
lotsfree
min
i i nceteaz activitatea cnd acest numr este mai mare dect
lotsfree
max
; n acest fel se creeaz o rezerv de pagini libere destul de mare,
nefiind nevoie ca demonul s ruleze din nou un timp destul de ndelungat.
Sorin Adrian Ciureanu 98
n ceea ce privete procesele care sunt aduse de pe disc n memorie,
se utilizeaz planificatorul de lung durat, cu un algoritm n care fiecrui
proces i este asociat o valoare asociat unei funcii. Aceast funcie este
construit aa fel nct s fie favorizate procesele care au stat cel mai mult
pe disc dar care nu au o dimensiune foarte mare.
5.6.2. Gestiunea memoriei n LINUX
In Linux se aloc i se elibereaz pagini fizice, grupuri de pagini,
blocuri mici de memorie. n ceea ce privete administrarea memoriei fizice,
alocatorul de pagini poate aloca la cerere intervale contigue de pagini fizice.
Politica de alocare este cea bazat pe puteri ale lui 2, metoda camarazilor.
Pentru administrarea memoriei virtuale, nucleul Linux rezerv o
zon de lungime constant din spaiul de adresare al fiecrui proces pentru
propriul su uz intern. Aceast zon conine dou seciuni:
- o seciune static care conine tabela de pagini cu referire la fiecare
pagin fiic disponibil n sistem, astfel nct s existe o translaie simpl de
la adresele fizice la adresele virtuale atunci cnd se ruleaz codul nucleului;
- o seciune care nu este rezervat pentru ceva anume.
LINUX ul utilizeaz un tablou de pagini pe trei nivele. (Figura
5.12) Acest model a fost utilizat pentru prima dat n microprocesorul
ALPHA creat de firma DEC (Digital Equipement Corporation ) i a fost
preluat n majoritatea versiunilor de LINUX actuale.
Fig. 5.12. Model de paginare LINUX.
Director
global
Director de
mijloc de pagin
Tabel de
pagini Pagini
DIRECTOR MIJLOC PAGIN OFFSET
Adres virtual
Cuvnt
selectat
Sisteme de operare 99
O adres virtual conine patru cmpuri:
-director;
-mijloc;
-pagin;
-offset.
Cmpul director este folosit ca index n catalogul global, existnd un
catalog global pentru fiecare proces. Valoarea gsit este un pointer ctre
tablourile de pagini de mijloc. Aici se pointeaz din nou ctre un tabel de
pagini. Apoi nregistrarea se mai pointeaz odat spre pagina dorit.
Alocatorul utilizat este alocatorul cu puteri ale lui doi (metoda
camarazilor), descris anterior, care are avantajul c se poate oricnd obine o
regiune de memorie cu mrime arbitrar. Principalul su dezavantaj este o
fragmentare intern destul de consistent. Pentru a contracara acest
dezavantaj, LINUX ul mai utilizeaz alte dou alocatoare, derivate din
algoritmul camarazilor. Al doilea alocator preia fragmente de memorie i
apoi gestioneaz separat fragmentele mici rezultate n urma algoritmului
camarazilor. Al treilea alocator este disponibil ori de cte ori este necesar ca
memoria cerut s fie continu (este vorba de memoria virtual nu de cea
fizic). De remarcat c toate aceste alocatoare sunt derivate din System V.
LINUX ul folosete un sistem de paginare la comand cu prepaginare.
Codul i fiierele puse n coresponden sunt pagini pe disc. Orice altceva
este stocat n urmtoarele dou forme:
-partiie de paginare;
-fiier de paginare de lungime fix.
Paginarea pe o partiie este mai eficient dect paginarea cu fiier din
urmtoarele motive:
-corespondena dintre blocuri de fiier i blocuri disc nu este
necesar;
-scrierea fizic poate fi de orice dimensiune, nu numai de mrimea
blocului fizic;
-o pagin este scris continuu pe disc.
O pagin nu este alocat pn cnd nu este necesar. Exist un
dispozitiv, tip hart de bii, care contorizeaz paginile libere din memorie.
Cnd trebuie eliminat o pagin din memorie, se alege fiierul sau partiia
cu cea mai mare prioritate care are un spaiu disponibil.
nlocuirea paginilor este gestionat de demonul KSWapd, cel ce
gestioneaz memoria n LINUX. Acesta este pornit de ctre sistemul de
operare o dat pe secund. Demonul verific dac sunt suficiente pagini
libere. Dac sunt, se inactiveaz o secund. Codul demonului de paginare
este format dintr-u ciclu care se execut de 6 ori. n corpul ciclului se fac
Sorin Adrian Ciureanu 100
apeluri la trei proceduri, fiecare dintre ele ncercnd s recupereze diferite
feluri de pagini. Un parametru care exprim urgena este transmis procedurii
i arat ct de mare efort trebuie s depun pentru a recupera pagina.
Algoritmul ncearc nti paginile uoare din fiecare categorie i apoi
paginile grele.
Prima procedur ncearc s recupereze pagina care nu a fost referit
recent, folosind un algoritm asemntor cu cel al ceasului. A doua procedur
ncearc s recupereze paginile pe care un utilizator nu le-a folosit prea
mult. A treia procedur ncearc s utilizeze pagini normale.
Mai nti este realizat un ciclu n care se vede care proces are cele
mai multe pagini n memorie. Toate structurile sunt scanate i toate paginile
sunt inspectate, n ordinea adreselor virtuale, de unde s-a plecat ultima dat.
Pagina este srit cnd este: invalid, absent din memorie, fixat n
memorie sau utilizat de DMA (Direct Memory Acces). Dac pagina are
bitul de referin setat, de asemenea este srit. Dac acesta este resetat,
pagina este eliminat din memorie.
Apoi se testeaz bitul dirty . Dac e murdar ( adic dac pagina a
fost scris) i are un spaiu de stocare pe disc, atunci pagina este programat
pentru o scriere pe disc. Dac pagina nu are spaiu de stocare pe disc, este
dus n memoria intermediar de paginare.
n LINUX mai exist un al doilea demon de paginare, numit bdflush,
care este trezit periodic cu scopul de a verifica dac exist n memorie un
numr mare de pagini murdare. Dac exist, atunci el face scrierea acestora
pe disc.
5.6.3. Gestiunea memoriei n SO WINDOWS
Gestiunea memoriei n sistemul de operare WINDOWS este mai
complex dect la UNIX. Administrarea memoriei este asigurat de o parte
a executivului i de ctre ase fire de execuie din nucleu, dedicate. Se
utilizeaz paginarea la cerere, cu pagini de dimensiune fix, maximum de 64
Kb (la Pentium se utilizeaz o pagin de 4Kb).
O pagin din memoria virtual se poate afla n urmtoarele stri:
-liber;
-rezervat;
-angajat.
O pagin liber un este utilizat momentan iar un acces la ea
provoac un defect de pagin. Cnd un proces este lansat n execuie, toate
paginile sunt libere pn cnd codul i datele sunt puse n coresponden n
propriul spaiu de adrese.
Sisteme de operare 101
O pagin este angajat n momentul n care sunt puse ntr-o pagin
liber cod i date.
O pagin este rezervat atunci cnd nu este disponibil pentru a fi
pus n coresponden pn cnd rezervarea nu este explicit nlturat.
Paginile libere i cele rezervate au pagini shadow pe disc, iar accesul
la ele provoac ntotdeauna eroare de pagin.
Cele ase fire de execuie, (pe post de demoni ca n LINUX), care
gestioneaz memoria n WINDOWS sunt:
-gestionarul ncrcrii spaiilor de lucru;
-gestionarul spaiilor de lucru;
-firul de execuie pentru interschimbul de memorie (swapper thread);
-scriitorul paginilor puse n coresponden;
-scriitorul paginilor modificate;
-firul de execuie pentru iniializarea paginilor cu zerouri.
-Gestionarul ncrcrii spaiilor de lucru verific dac exist
destule pagini libere. Dac nu exist suficiente pagini libere, se pornete
thread-ul denumit gestionarul spaiilor de lucru.
-Gestionarul spaiilor de lucru are dou sarcini:
-examineaz spaiile de lucru;
-recupereaz alte pagini.
Se determin nti ordinea n care se vor examina procesele.
Procesele mari, care sunt inactive de mult timp, sunt examinate naintea
proceselor mici i active. Procesul care rula n acel moment este examinat
ultimul.
Apoi se inspecteaz procesele n ordinea aleas. Un proces este
pstrat numai dac spaiul su este mai mic dect minimul su sau dac a
cauzat un numr mare de defecte de pagin. n caz contrar se elimin pagini.
-Firul de execuie pentru interschimbul de memorie (swapper
thread) are rolul de a cuta procesele ale cror fire de execuie au fost
inactive un anumit timp. n momentul n care se gsete un asemenea
proces, stivele nucleu sunt dealocate iar paginile procesului sunt mutate n
lista de pagini n ateptare.
-Scriitorul paginilor puse n coresponden i scriitorul paginilor
modificate sunt demoni trezii periodic pentru a verifica dac sunt destule
pagini nemodificate. Dac nu exist, firele de execuie iau pagini din capul
listei de pagini modificate, le scriu pe disc i apoi le mut n lista de pagini
n ateptare. Primul demon scrie n fiierele puse n coresponden, al doilea
scrie n fiierele de paginare.
Motivul existenei a dou fire de execuie este acela c un fiier pus
n coresponden poate fi nevoit s creasc dup o operaie de scriere i
Sorin Adrian Ciureanu 102
creterea n dimensiune se face prin acces la structurile de date de pe disc,
pentru alocarea unui bloc de disc liber. Dac nu exist spaiu n memorie la
scrierea paginii, poate aprea interblocare. Cellalt fir de execuie poate
rezolva problema scriind pe disc pagini ntr-un fiier de paginare care nu
crete niciodat.
-Firul de execuie pentru iniializarea paginilor cu zerouri este un
demon ce lucreaz cu prioritate minim i se execut deoarece regulile de
securitate cer ca o pagin liber s conin numai zerouri. El pune pe o
pagin liber zerouri , mutnd n acelai timp pagina de la lista cu pagini
libere la lista cu pagini cu zerouri.
Sisteme de operare 103
Capitolul 6
GESTIUNEA SISTEMULUI DE
INTRARE/IEIRE
6.1. DEFINIREA SISTEMULUI DE
INTRARE/IEIRE
Toate computerele au dispozitive fizice pentru acceptarea intrrilor
i producerea ieirilor. Exist multe astfel de dispozitive: monitoare,
tastaturi, mausuri, imprimante, scanere, hard discuri, compact discuri,
floppy discuri, benzi magnetice, modemuri, ceasuri de timp real etc. Ele se
numesc dispozitive periferice, deoarece sunt exterioare unitii centrale.
O funcie important a sistemului de operare este gestionarea
dispozitivelor periferice ale unui calculator. Fiecare SO are un subsistem
pentru gestionarea lor, sistemul intrare/ieire (I/O, input/output). Parte din
softul I/O este independent de construcia dispozitivelor, adic se aplic
multora dintre ele. Alt parte , cum ar fi driverele dispozitivelor, sunt
specifice fiecruia.
Principalele funcii pe care trebuie s le genereze SO n acest scop
sunt:
- generarea comenzilor ctre dispozitivelor periferice;
- tratarea ntreruperilor specifice de intrare/ieire;
- tratarea eventualelor erori de intrare/ieire;
- furnizarea unei interfee utilizator ct mai standardizat i
ct mai flexibil.
Gestiunea sistemului de intrare/ieire este o sarcin destul de dificil
iar generalizrile sunt greu de fcut, din diferite motive printre care:
- viteze de acces foarte diferite pentru diferitele periferice;
- unitatea de transfer difer de la un periferic la altul ea putnd fi:
octet, caracter, cuvnt, bloc, nregistrare;
- datele de transfer pot fi codificate n diverse feluri, depinznd de
mediul de nregistrare al dispozitivului de intrare/ieire;
Sorin Adrian Ciureanu 104
- tratarea erorilor se face n mod diferit, n funcie de periferic,
deoarece i cauzele erorilor sunt foarte diferite;
- este greu de realizat operaii comune pentru mai multe periferice
dat fiind tipul lor diferit dar i datorit operaiilor diferite, specifice fiecrui
dispozitiv.
Atunci cnd se proiecteaz un SO, pentru gestiunea sistemului de
intrare/ieire se pot avea n vedere urmtoarele obiective:
a) Independena fa de codul de caractere. n acest sens, sistemul de
I/O ar trebui s furnizeze utilizatorului date ntr-un format standard i s
recunoasc diversele coduri utilizate de periferice.
b) Independena fa de periferice. Se urmrete ca programele
pentru periferice s fie comune pentru o gam ct mai larg din aceste
dispozitive.
De exemplu, o operaie de scriere ntr-un dispozitiv periferic ar
trebui s utilizeze un program comun pentru ct mai multe tipuri de
periferice.
Desigur, apelarea perifericelor ntr-un mod uniform face parte din
acest context. Astfel n UNIX i WINDOWS aceast problem este
rezolvat prin asocierea la fiecare dispozitiv a unui fiier, dispozitivele fiind
apelate prin intermediul numelui fiierului.
c) Eficiena operaiilor. Pot aprea deseori aa numitele erori de ritm,
datorate vitezei diferite de prelucrare a datelor de ctre unitatea central, pe
de o parte, i de ctre periferic, pe de alt parte. Revine ca sarcin sistemului
de operare s fluidizeze traficul.
Un exemplu de eficientizarea unei operaii de intrare /ieire este
sistemul cache oferit de SO. Prin utilizarea mai multor tampoane cache, SO
reuete s mbunteasc, de multe ori, transferul de date, s-i mreasc
viteza.
6.2. CLASIFICAREA DISPOZTIVELOR
PERIFERICE
Exist mai multe criterii dup care se pot clasifica perifericele.
a) Din punct de vedere funcional
-Periferice de intrare/ieire, utilizate pentru schimbul de informaii
cu mediul extern, cum ar fi: imprimanta , tastatura , monitorul.
-Periferice de stocare, utilizate pentru pstrarea nevolatil a
informaiei, cum ar fi hard discul, compact discul, floppy discul, banda
magnetic.
Sisteme de operare 105
Perifericele de stocare, la rndul lor, pot fi clasificate dup variaia
timpului de acces, astfel
-Periferice cu acces secvenial, la care timpul de
acces are variaii foarte mari, cazul tipic fiind banda
magnetic.
-Perifericele cu acces complet direct, la care timpul
de acces este constant, exemplul tipic fiind o
memorie RAM.
-Periferice cu acces direct, la care timpul de acces
are variaii foarte mici, exemplul tipic fiind hard
discul.
b) Din punctul de vedere al modului de operare, de servire a
cererilor
-Periferice dedicate, care pot deservi un singur proces la un moment
dat, de exemplu imprimanta.
-Periferice distribuite, care pot deservi mai multe procese la un
moment dat, cum ar fi hard discul.
c) Din punctul de vedere al modului de transfer i de memorare a
informaiei
-Periferice bloc, care memoreaz informaia n blocuri de lungime
fix. Blocul este unitatea de transfer ntre periferic i memorie, fiecare bloc
putnd fi citit sau scris independent de celelalte blocuri. Structura unui bloc
este format din partea de date propriu zis i din informaiile de control al
corectitudinii datelor ( paritate, checksum, polinom etc). Din aceast
categorie fac parte hard discul, compact discul, banda magnetic.
-Periferice caracter, care utilizeaz iruri de caractere crora nu le
confer structur de blocuri. Octeii din aceste iruri nu sunt adresabili i
deci nu pot fi accesai prin operaia de cutare. Fiecare octet este disponibil
ca un caracter curent, pn la apariia urmtorului caracter. Din aceast
categorie fac parte imprimanta, monitorul, tastatura.
-Periferice care nu sunt nici bloc nici caracter. Exist i periferice
care nu pot fi ncadrate n nici una din aceste dou categorii. Un exemplu
este ceasul de timp real, cel care are rolul de a genera ntreruperi la intervale
de timp bine determinate.
6.3. STRUCTURA HARD A SISTEMELOR DE
INTRARE/IEIRE
Prile hard componente ale unui sistem de intrare ieire, a crui
schem este dat n fig. 6.1., sunt:
Sorin Adrian Ciureanu 106
-controllerul;
-perifericul propriu zis.
Controllerul este alctuit dintr-o serie de registre de comenzi i de
date. Pentru un periferic simplu, ca tastatura sau imprimanta, exist un
singur registru de comenzi i unul de date. Pentru hard disc exist mai multe
registre de comenzi i unul de date. Lungimea registrelor este funcie de
arhitectura calculatorului, obinuit sunt pe 16 bii.
Fig. 6.1. Schema bloc a unui sistem intrare/ieire.
Secvena de lucru pentru o operaie de intrare/ieire este urmtoarea:
Cnd UC detecteaz o operaie de intrare/ieire, transmite principalii
parametri ai operaiei pe care i depune prin intermediul busului n registrele
de comenzi i date. n continuare, controllerul, pe baza datelor din registre,
va sintetiza comenzi pentru echipamentul periferic, comenzi pe care le pune
n interfaa controller/periferic. Dac este o operaie de scriere, va pune i
informaiile pe liniile de date. Perifericul, pe baza acestor comenzi, execut
operaia i returneaz pe interfaa cu controlerul rspunsurile la aceast
operaie i eventualele erori . Controlerul le va prelua i le va pune n
registrele de comenzi i date i le va transmite la UC. Cel mai simplu
registru de comenzi arat astfel:
1 6 7
GO IE RDY
Bitul 1, de obicei bitul de GO, are rolul de a porni efectiv operaia. Bitul 6,
IE (interruption enable), are rolul de a masca sau nu ntreruperea de
Registru comenzi 1
Registru comenzi 2
Registru comenzi n
Registru de date
Dispozitiv
de
comand
CONTROLER PERIFERIC
UC/
UM
UC
Sisteme de operare 107
intrare/ieire. Bitul 7, RDY, este bitul de READY, care arat dac
perifericul este n stare liber de a primi alte comenzi.
6.4. STRUCTURA SOFT A SISTEMELOR DE
INTRARE/IEIRE
Pe suportul hard prezentat, sistemul de operare furnizeaz i
controleaz programe care s citeasc i s scrie date i comenzi n registrele
controllerului i sincronizeaz aceste operaii. Sincronizarea se efectueaz,
de obicei, cu ajutorul ntreruperilor de intrare ieire. Pentru a realiza aceste
sarcini, softul sistemului de intrare/ieire are patru componente:
-rutinele de tratare a ntreruperilor;
-driverele, asociate dispozitivelor periferice;
-programe independente de dispozitivele periferice;
-primitivele utilizator.
6.4.1. Rutine de tratare a ntreruperilor
Un proces, care are ncorporat o operaie intrare/ieire, este blocat
n urma unei operaii de wait la semafor. Se iniiaz operaia de
intrare/ieire iar cnd operaia este terminat, procesul este trezit printr-o
operaie signal, cu ajutorul rutinei de tratare a ntreruperilor. n acest fel,
procesul va fi deblocat i va trece n starea ready.
Fig.6.2. Rutina de tratare a ntreruperilor.
proces Iniiere
operaie
I/E
Rutina de
tratare a
ntreruperilor
Periferic
wait ready
signal
Sorin Adrian Ciureanu 108
Fig.6.3. Reprezentarea rutinei de ntrerupere.
Se observ c sarcinile principale ale rutinei de tratare a
ntreruperilor sunt:
- rutina identific dispozitivul periferic care a generat o ntrerupere;
- rutina reiniializeaz linia de ntrerupere pe care a utilizat-o
perifericul;
- memoreaz ntr-o stiv starea dispozitivului periferic;
- are rolul de a trezi procesul care a iniiat operaia de I/E printr-o
operaie signal.
n acest mod procesul va fi deblocat i trecut n starea ready.
n realitate lucrurile nu sunt aa de simple, SO avnd o mare
cantitate de lucru n acest scop. Etapele parcurse n acest proces n care
intervin ntreruperile sunt:
- salvarea tuturor registrelor (i PSW);
- pornirea procedurii de ntreruperi;
- iniializarea stivei;
- pornirea controlorului de ntreruperi;
- copierea din registrele unde au fost salvate ntreruperile n tabelul
procesului;
- rularea procedurii de ntrerupere care va citi informaia din registre;
- alegerea procesului care urmeaz; dac ntreruperea a fost cauzat
de un proces de nalt prioritate, acesta va trebui s ruleze din nou;
-ncrcarea registrelor noului proces (inclusiv PSW);
Rutina identific sursa ntreruperii.
Reiniializeaz linia de ntrerupere.
Memoreaz starea perifericului.
Trezete procesul cnd operaia de
I/E este gata.
periferic
Linia de
ntrerupere
signal Proces
ready
Sisteme de operare 109
-pornirea rulrii noului proces.
6.4.2. Drivere
Driverul este partea component a SO care depinde de dispozitivul
periferic cruia i este asociat. Rolul su este de a transpune n comenzi la
nivelul registrelor controllerului ceea ce primete de la nivelul soft superior.
Din punct de vedere structural, driverul este un fiier care conine diferite
comenzi specifice unui dispozitiv periferic.
O prim problem care se pune este: unde ar trebui instalate aceste
drivere, n nucleu (kernel) sau n spaiul utilizator (user) ? Prezena
driverelor n user ar avea avantajul unei degrevri a kernelului de anumite
solicitri i al unei mai bune izolri a driverelor ntre ele. De asemenea, la o
eroare necontrolat provenit din driver, nu ar mai ceda sistemul de operare
aa uor.
Totui, majoritatea sistemelor de operare ncarc driverele n kernel
i asta pentru o mai mare flexibilitate i o mai bun comunicare, n special
pentru driverele nou instalate.
Operaiile efectuate de un driver, a crui schem este dat n figura
6.4, sunt:
- verificarea parametrilor de intrare dac sunt valizi, n caz contrar
semnalarea erorii;
- translaia de la termeni abstraci la termeni concrei, aceasta
nsemnnd, de exemplu, la un hard disc:
numr bloc adresa
tor
cilindru
cap
sec
- verificarea strii dispozitivului ( ready sau nu);
- lansarea operaiei efective pentru dispozitivul periferic, de
exemplu, o citire a unui sector al hard discului;
- blocarea driverului pn cnd operaia lansat s-a terminat (printr-
un wait la semafor);
- trezirea driverului (prin operaia signal);
- semnalarea ctre nivelul soft superior a disponibilitii datelor (n
cazul unei operaii de citire de la periferice) sau a posibilitii de
reutilizare a zonei de memorie implicate n transferul de date (pentru
o operaie de scriere ntr-un periferic);
- preluarea unei noi cereri aflate n coada de ateptare.
Sorin Adrian Ciureanu 110
Fig. 6.4. Schema de funcionare a unui driver.
C1 C2 Cn-1 Cn
Desfacerea
parametrilor
Parametri
valizi
eroare
Translaie
Termeni abstracitermeni
concrei
Ready
dispozitiv
periferic
Lansarea operaiei efective
Blocare
driver
(wait)
Trezire
driver
(signal)
Citire/scriere
Zona de memorie disponibil Date disponibile
Preluarea cererii urmtoare
Coad de ateptare
DA
DA NU
NU
Dispozitiv
periferic
Dispozitiv
periferic
Operaie terminat
Citire Scriere
Sisteme de operare 111
Schema de funcionare a unui driver, pentru o comand de citire a
unui bloc logic de pe hard discul C, este dat n figura 6.5.
6.5. Schema funcionrii unui driver pentru o comand de citire a unui
bloc logic.
cerere citirea blocului 1123 de pe hard discul C
adresa hard disc C
numr bloc 1123
operaie citire date
translaie
bloc 1123
3 sec , 40 , 2
2 sec , 40 , 2
tor cilindru cap
tor cilindru cap
poziionare pe
cap 2, cilindru 40, sector 2 i sector 3
citire date
trezire
driver
(signal)
Blocare
driver
(wait)
date disponibile
preluarea cererii urmtoare
Dispozitiv periferic
Dispozitiv periferic
Citire date de pe sect. 2 i
3, cap2, cilindru 40.
memorie
Sorin Adrian Ciureanu 112
6.4.3. Programe-sistem independente
de dispozitive
Sarcinile ce revin acestui nivel soft sunt:
- asigurarea unei interfee uniforme pentru toate driverele;
- realizarea corespondenei dintre numele simbolice
ale perifericelor i driverele respective; n UNIX, de exemplu, un fiier este
asociat unui dispozitiv periferic;
- utilizarea unor tampoane sistem, puse la dispoziie de SO, pentru a
prentmpina vitezele diferite ale dispozitivelor periferice;
- raportarea erorilor de intrare/ieire n conjuncie cu aceste operaii
de intrare/ieire; de obicei erorile sunt reperate i generate de drivere, rolul
acestui nivel soft fiind acela de a raporta o eroare ce nu a fost raportat.
6.4.4. Primitive de nivel utilizator
Cea mai mare parte a sistemului de intrare/ieire este nglobat n
sistemul de operare dar mai exist nite proceduri, numite primitive de nivel
utilizator, ce sunt incluse n anumite biblioteci. Aceste proceduri au rolul de
a transfera parametrii apelurilor sistem pe care le iniiaz. Aceste primitive
pot lucra n dou moduri: sincron i asincron. O primitiv sincron
returneaz parametrii numai dup ce operaia de intrare/ieire a fost realizat
efectiv. Se utilizeaz pentru operaii de intrare/ieire cu o durat ce trebuie
estimat sau cu o durat foarte mic. O primitiv asincron are rolul numai
de iniiere a operaiei de intrare/ieire, procesul putnd continua n paralel cu
operaia. Procesul poate testa mereu evoluia operaiei iar momentul
terminrii ei este marcat de o procedur, definit de utilizator, numit
notificare. Problemele primitivelor asincrone sunt legate de utilizarea
bufferului de date. Procesul iniiator trebuie s evite citirea/scrierea n buffer
att timp ct operaia nu este terminat, sarcina aceasta revenindu-i
programatorului. Primitivele asincrone sunt utilizate n cazul operaiilor cu o
durat mare sau greu de estimat.
6.4.5. Model de interaciune componentelor soft I/E
n figura 6.6 este dat interaciunea celor 4 subsisteme soft, cnd se
lanseaz o operaie I/E.
Sisteme de operare 113
Fig. 6.6. Model de interaciune a componentelor soft I/E.
Semnificaiile mrimilor din figura 6.6. sunt:
OPIE operaia I/E care se lanseaz;
PACHET I/E pachet de intrare/ieire care definete tipul i
parametrii operaiei de I/E; pachetul este de fapt o structur de date creat pe
baza parametrilor operaiei de I/E;
Cerere de ateptare
Cerere servit 3 semafoare utilizate pentru sincronizare;
Operaie terminat
fd descriptor de fiier asociat unui periferic;
buffer dimensiunea (n octei) a zonei tampon;
buf adresa din memorie a zonei tampon.
6.5. MBUNTIREA OPERAIILOR DE
INTRARE/IEIRE
Problema esenial, la ora actual, n ceea ce privete o operaie de
intrare/ieire, este timpul de acces la hard disc, principalul dispozitiv
periferic de memorare a informaiei. nc exist o diferen foarte mare ntre
timpii n care se desfoar o operaie n unitatea central i o operaie pe
hard disc. Desigur , odat cu noile tehnologii, aceti timpi s-au mbuntit
i exist premize de micorare a lor n viitor, totui decalajul de timp intre
PRIMITIVE DE
NIVEL UTILIZATOR
PROGRAME SISTEM
INDEPENDENTE DE
DISPOZITIV DRIVERE
RUTINE DE
TRATARE A
NTRERUPERILOR
OP IE
Parametrii primitivei
de I/E
(buf, buffer, fd)
-citire stare dispozitiv;
-reiniializare
ntrerupere;
signal (operaie
teminat)
wait(cerere n
ateptare);
-preia PACHETE I/E
din coad;
-copiaz date din
memorie n bufferul
perifericului;
-iniiaz operaia I/E;
wait (operaie
terminat);
signal (cerere servit);
-terge PACHE I/E;
-Identificare dispozitiv
-Asamblare PACHET
I/E;
-Plasare PACHET I/E
n lista de cereri
asociat dispozitivului;
-signal (cerere n
ateptare);
wait(cerere servit);
exit
Sorin Adrian Ciureanu 114
operaiile din UC i cele de intrare/ieire este nc foarte mare. Rolul SO
este de ncerca, prin diferii algoritmi, s mbunteasc, adic s
micoreze, timpul unei operaii de intrare/ieire. Multe din soluiile adoptate
au fost apoi implementate n hard, n soluiile constructive ale hard discului.
Dou exemple sunt edificatoare n acest sens:
-factorul de ntreesere;
-cache-ul de hard disc.
6.5.1. Factorul de ntreesere.
La apariia discurilor magnetice, se consuma foarte mult timp pentru
citirea continu a sectoarelor, unul dup altul. Astfel pentru un disc cu 80
sectoare pe pist, pentru citirea unei piste erau necesare 80 rotaii ale
platanului. Aceasta deoarece, dup citirea unui sector, era necesar un timp
pentru transferul datelor spre memorie iar n acest timp capul respectiv se
poziiona pe alt sector. Deci, pentru citirea sector cu sector, era necesar o
rotaie pentru citirea unui sector. O idee simpl, venit din partea de SO, a
fost de a calcula timpul de transmitere a datelor spre memorie, de a vedea
pe ce sector a ajuns capul dup aceast transmisie i de a renumerota
sectoarele. Exemplu:
Fie un disc cu 8 sectoare, numerotate n ordine , ca n figura 6.6.
1
2
3
4 5
6
7
8
Fig. 6.6. Hard disc cu 8 sectoare.
Dac acest disc are un factor de ntreesere egal cu 2, aceasta
nseamn c, dup ce capul a mai parcurs dou sectoare, datele au fost
transmise n memorie. La o rotaie se citesc trei sectoare. La prima rotaie,
sectoarele 1,2,3, la a doua rotaie, sectoarele 4,5,6, la a treia rotaie
sectoarele 7 i 8. Pentru un factor de ntreesere 2 noua numerotare a
sectoarelor va fi ca n figura 6.7.
Sisteme de operare 115
1
4
7
2 5
8
3
6
Fig. 6.7. Hard discul dup trei rotaii.
Se observ c, prin introducerea factorului de ntreesere, nu mai
sunt necesare 8 rotaii pentru citirea unei piste ci numai trei. Aceast soluie
a fost introdus nti n SO, mai apoi fiind preluat n hardware de ctre
disc, unde factorul de ntreesere era un parametru lowlevel al hard discului.
Datorit progresului tehnologic, de la factori de ntreesere de 3 sau
4 s-a ajuns la un factor de valoare 1, deci la o rotaie se citete ntreaga pist.
6.5.2. Cache-ul de hard disc
Folosirea tampoanelor de date, pentru transferul de date ntre hard
disc i memoria sistemului, a fost preluat hardware de ctre disc. Astfel s-a
implementat o memorie cache la nivel de hard disc, memorie alctuita pe
acelai principiu ca i memoria cache RAM.
6.5.3. Crearea unui hard disc cu performane
superioare de ctre SO
n general, timpul total de acces pentru un hard disc este dat de
urmtoarele componente:
- timpul de cutare (seek time) care este timpul necesar pentru
micarea mecanic a capului de scriere/citire pn la pista specificat;
- latena de rotaie ( rotational latency) care este timpul de ateptare
necesar pentru ca sectorul specificat s ajung sub capul de scriere/citire;
- timpul de transfer ( transfer time) care este timpul necesar pentru a
citi informaia de pe sectorul specificat;
Planificarea accesului la disc are n vedere dou lucruri:
- reorganizarea cererilor la disc pentru a minimiza timpul de cutare;
- un mod de plasare a informaiilor pe disc care s minimizeze
latena de rotaie.
Sorin Adrian Ciureanu 116
Exist algoritmi de plasare n care ideea principal este de a schimba
ordinea de servire a cererilor venite de la procese, astfel nct s se pstreze
ordinea cererilor fiecrui proces.
Dintre algoritmii care minimizeaz timpii de acces amintim:
a) FCFS (First Come First Served) ;
b) SSTF ( Shortest Seek Time Firs);
c) SCAN, C SCAN ;
d) LOOK, C LOOK.
a) FCFS ( First Come First Served =primul venit , primul
servit). Cererile sunt servite n ordinea sosirii.
b) SSTF (Shortest Seek Time First=cel cu cel mai scurt timp de
cutare, primul) . Conform acestui algoritm, capul de scriere/citire se va
deplasa de la cilindrul unde este pozionat spre cilindrul cel mai apropiat.
Este mai eficient dect FCFS, dar poate duce la ntrzierea unor cereri i la
nfometare.
c) SCAN i C SCAN. n SCAN, capul de scriere /citire se
deplaseaz de pe primul cilindru spre unul din capete i apoi baleiaz discul
pn la capt i napoi, deservind cererile. n C SCAN , se ncepe de la
cilindrul 0 iar cnd se ajunge la sfrit, se reia baleierea tot de la cilindrul 0.
Practic, n SCAN baleierea se face n ambele sensuri, n timp ce n C SCAN
ntr-un singur sens, de la cilindrul 0 la ultimul. Prin analogie, algoritmul
SCAN poate fi reprezentat de o list dublu nlnuit, iar C SCAN de o list
simplu nlnuit.
d) LOOK, C LOOK. n acest algoritm, capul de scriere/citire se
deplaseaz pn la ultima cerere, dup care inverseaz sensul de micare,
imediat, fr s mearg pn la captul discului.
n continuare, s lum un exemplu i s vedem care este timpul de
cutare pentru fiecare algoritm.
Fie un hard disc cu 250 cilindri, cu braul cu capete poziionat iniial
pe cilindrul 50. Fie urmtoarea coad a cererilor se acces:
50, 200, 100, 25, 250, 150, 144, 143
S calculm, pentru exemplul dat, timpii de cutare pentru fiecare algoritm,
timpi exprimai n numrul cilindrilor parcuri.
FCFS-Ordinea deservirii (n ordinea cererii de acces):
50,200,100,25,250,150,144,143.
-Numrul cilindrilor parcuri:
(200-50)+(200-100)+(100-25)+(250-25)+(250-150)+(150-
44)+(144-143)==150+100+75+225+100+6+1=657
Sisteme de operare 117
SSTF-Ordinea deservirii (ctre cel mai apropiat cilindru):
50,25,100,143,144,150,200,250.
-Numrul cilindrilor parcuri =(50-25)+(100-25)+(143-100)+(144-
143)+(150-144)+(200-150)+(250-200)=
25+75+43+1+6+50+50=250
SCAN-Ordinea deservirii: 50,0,25,100,143,144,150,200,250
-Numrul cilindrilor parcuri = 50+25+75+43+1+6+50+50=300
C SCAN-Ordinea deservirii: 50,100,143,144,150,200,250,0,25.
- Numrul cilindrilor parcuri = 50+43+1+56+50+50+250+25=475
0
20
40
60
80
100
120
140
0 25 50 75 100 125 150 175 200 225 250
timpul de cutare (numr de cilindri parcuri)
(a)
s
p
a
i
u
l
p
a
r
c
u
r
s
(
u
n
i
t
i
c
o
n
v
e
n
i
o
n
a
l
e
)
0
20
40
60
80
100
120
0 25 50 75 100 125 150 175 200 225 250
timpul de cutare (numr de cilindri parcuri) (b)
s
p
a
i
u
l
p
a
r
c
u
r
s
(
u
n
i
t
i
c
o
n
v
e
n
i
o
n
a
l
e
)
Sorin Adrian Ciureanu 118
0
20
40
60
80
100
120
0 25 50 75 100 125 150 175 200 225 250
timpul de cutare (numr de cilindri parcuri)
(c)
s
p
a
u
l
p
a
r
c
u
r
s
(
u
n
i
t
i
c
o
n
v
e
n
i
o
n
a
l
e
)
0
50
100
150
200
250
0 25 50 75 100 125 150 175 200 225 250
timpul de cutare (numr de cilindri parcuri)
(d)
s
p
a
i
u
l
p
a
r
c
u
r
s
(
u
n
i
t
i
c
o
n
v
e
n
i
o
n
a
l
e
)
Fig.6.8. Reprezentarea micrii capului magnetic n diferii algoritmi
(a)FCFS=n ordinea sosirii ; (b) SSTF=spre cel mai apropiat cilindru ; (c)
SCAN ; (d) C SCAN
Se constat c cel mai scurt timp de cutare ofer algoritmul SSTF,
aa cum se observ i din graficul (b). Este frecvent utilizat, n ciuda
faptului c poate duce la nfometare.
Algoritmii SCAN i C SCAN se comport mai bine pentru sistemele
care au ncrcare mare a discului, adic multe operaii de intrare/ieire.
Sisteme de operare 119
La algoritmul SSTF, cei mai favorizai din punct de vedere al
timpului de acces, sunt cilindrii aflai la mijloc. De aceea, n aceti cilindri
sunt alocate fiiere cu frecvena ridicat de utilizare, cum ar fi structura de
directoare.
Exist i algoritmi mai pretenioi n care se urmrete i
minimizarea latenei de rotaie.
6.5.4. Construirea unui hard disc prin tehnica RAID
(Redundant Arrays of Independent Discks)
Ideea RAID este de a folosi mai multe discuri simultan la aceeai
magistral i de a scrie informaiile n felii (stripes)care acoper toate
discurile. Aceste felii sunt de fapt blocuri. Discul este vzut ca un ntreg dar
blocurile alterneaz n toate discurile. Pentru un ansamblu de trei discuri,
blocul 1 va fi pe discul 1, blocul 2 pe discul 2, blocul 3 pe discul 3 i apoi
blocul 4 pe discul 1, blocul 5 pe discul 2 s.a.m.d. Pentru un subansamblu de
n discuri, blocul m va fi pe discul m modulo n.
n Raid, aceast tehnic a stripingului se combin cu ideea de
redundan, de unde i denumirea Redundant Arrays of Independent Discks
adic o mulime redundant de discuri independente. Redundana const n
alocarea, n caz de defect, a unui disc pentru refacerea informaiei pe
celelalte discuri.
Tehnica de refacere cea mai des utilizat este paritatea dar se pot utiliza i
checksum-uri sau, mai rar, polinoame de control.
Cea mai simpl schem RAID este cea cu dou discuri, care menin
informaii identice, tehnic care se mai numete mirrored discks.
n tehnica actual RAID, exist 7 nivele:
-nivelul 0: striping fr redundan;
-nivelul 1: discuri oglindite (mirrored discks);
-nivelul 2: coduri Hamning detectoare de erori:
-nivelul 3: un disc de paritate la fiecare grup,
bit-interleaved;
-nivelul 4: scrieri/citiri independente, block-interleaved;
-nivelul 5: informaia de paritate este mprtiat pe toate discurile;
-nivelul 6: nivelul n care de detecteaz i se corecteaz mai mult de
o eroare pe disc.
Principalul dezavantaj al discurilor RAID const n aa numitele
scrieri mici. Acest lucru se produce atunci cnd se face o scriere ntr-un
singur disc i toate celelalte discuri trebuie accesate pentru a se recalcula
paritatea, generndu-se astfel un trafic destul de mare. Acest dezavantaj
Sorin Adrian Ciureanu 120
poate fi contracarat prin implementarea unei cache de disc, cu o capacitate
foarte mare, ceea ce face ca ocul scrierilor mici s fie absorbit de cache,
utilizatorii netrebuind s atepte calculul paritii.
6.6. GESTIUNEA SISTEMULUI I/E N UNELE
SISTEME DE OPERARE
6.6.1. Gestiunea sistemului I/E n UNIX
Sistemul I/E n UNIX are un principiu simplu: fiecare dispozitiv de
I/E are ataat un fiier. Accesul la dispozitiv se face prin apeluri sau funcii
specifice de fiiere, cum ar fi apelurile read i write.
Fiierele ataate unui dispozitiv de intrare/ieire sunt fiiere speciale
i sunt de dou categorii:
-fiier special de tip bloc;
-fiier special de tip caracter.
Un fiier special de tip bloc este format dintr-un ir de blocuri
numerotate, la fiecare bloc existnd un acces secvenial.
Un fiier special de tip caracter este utilizat pentru dispozitive
periferice care utilizeaz fluxuri de caractere.
Fiecrui fiier special i este asociat un driver de dispozitiv pentru a
crui identificare se utilizeaz : un numr major de dispozitiv i un numr
minor de dispozitiv. Cu ajutorul unui numr major de dispozitiv se identific
un periferic simplu (tastatura, imprimanta). Cu ajutorul unui numr minor
de dispozitiv se identific un dispozitiv dintr-un periferic multiplu (discuri
dure, CD-ROM uri ).
Rolul unui driver de dispozitiv este s izoleze sistemul de
nesincronizrile hardului.
Cnd un utilizator acceseaz un fiier special, sistemul de fiiere
determin numerele major i minor ale dispozitivului. Numrul major este
utilizat ca index ntr-unul din cele dou tablouri de structuri, numite bdesw,
pentru fiiere speciale bloc i cdesw , pentru fiiere speciale caracter.
Structura astfel gsit conine pointeri pentru operaii cu dispozitivul.
Numrul minor de dispozitiv este transmis ca parametru. n UNIX, a
aduga un periferic nseamn de fapt a aduga un element ntr-unul din
tablouri i a pune la dispoziie funciile corespunztoare care s se ocupe de
diversele operaii asupra dispozitivului.
Fiecare driver are dou componente:
Sisteme de operare 121
-partea superioar, care ruleaz n contextul apelantului i are
interfee cu restul sistemului de operare;
-partea inferioar, care ruleaz n contextul nucleului i
interacioneaz cu perifericul.
Driverele apeleaz proceduri ale nucleului aflate n Driver Kernel
Interface.
6.6.1.1.Fiiere speciale de tip bloc
Scopul acestor fiiere este de a micora efectiv numrul de
transferuri. Pentru acesta se utilizeaz o memorie tampon soft situat ntre
driver i sistemul de fiiere. Memoria tampon este de obicei organizat ca o
list simplu nlnuit de blocuri. Regula de gestionare a blocurilor din list
este:
-un bloc accesat trece n capul listei;
-se elimin un bloc de pe ultima poziie a listei, dup regula blocului
celui mai puin renet utilizat.
Blocurile murdare sunt scrise pe disc la un interval de 30 secunde.
6.6.1.2. Fiiere speciale de tip caracter
n aceste fiiere se lucreaz cu fluxuri de caractere. Exist dou
soluii pentru a structura i modulariza driverele de tip caracter.
Soluie BSD, bazat pe structuri de date numite C-list. Acestea sunt
blocuri de pn la 64 caractere, un contor i un pointer la blocul urmtor. Pe
msur ce caracterele ajung de la dispozitivul periferic tip caracter sunt puse
ntr-un lan de astfel de blocuri.
Caracterele pot ajunge la procesor n dou moduri: mod prelucrat
sau mod neprelucrat.
n modul prelucrat, atunci cnd sunt citite caractere, ele nu sunt
transmise direct din C-list procesului ci trec printr-o seciune cod a
nucleului, numit line discipline. Aceasta se comport ca un filtru. Ea
primete fluxul de caractere neprelucrate de la driverul terminal, l
prelucreaz i apoi produce i trimite spre proces aa numitul flux de
caractere pregtit (cooked character stream). Pregtirea unui flux
nseamn eliminarea caracterelor i liniilor terse i transformarea lui
carriage return n line feed.
n modul neprelucrat nu se mai trece prin line discipline. Modul
neprelucrat este util n mod special atunci cnd se trimit date binare ctre alt
calculator, pe o linie scurt, unde nu este nevoie de conversie.
Sorin Adrian Ciureanu 122
Soluie System V, bazat pe nirarea modulelor de procesare n flux,
n mod dinamic, n timpul execuiei. Pn la un anumit punct, un flux este
analogul din nucleu al liniilor de conducte din spaiul utilizator.
Fig. 6.9. Exemplu de fluxuri n System V.
Un flux are ntotdeauna un antet de flux deasupra i se conecteaz la
un driver dedesubt. ntre acestea pot fi introduse module, cte sunt necesare.
Procesarea poate fi bidirecional, deci fiecare modul poate avea un flux de
scriere i unul de citire.
Atunci cnd un proces utilizator scrie ntr-un flux de caractere, codul
din antet interpreteaz apelul de sistem i pune datele n zonele tampon ale
fluxului care sunt transmise din modul n modul, n jos, fiecare modul
opernd transformarea dorit. Fiecare modul are o coad de scriere i una de
citire, tampoanele fiind procesate n ordinea corect. Modulele au interfee
bine definite iar modulele fr legtur pot fi legate ntre ele. n exemplul
din figur s-a utilizat un protocol INTERNET TCP pe reaea local
ETHERNET.
n figur apare un aspect important al fluxurilor i anume
multiplexarea. Un modul multiplexat poate prelua un flux, l poate despri
n mai multe fluxuri i le poate uni ntr-un singur flux. Modulul IP
realizeaz ambele lucruri.
Sistem de calcul
Mod utilizator
Mod nucleu
PROCES
ANTET DE FLUX
TCP
IP
CONTROLER ETHERNET
DRIVER ETHERNET
Sisteme de operare 123
6.6.2. Gestiunea sistemului I/E n LINUX
Ceea ce aduce nou Linux ul este noiunea de module ncrcabile.
Un modul ncrcabil este o poriune de cod ce poate fi ncrcat n nucleu n
timp ce sistemul funcioneaz. n mod normal acestea sunt drivere dispozitiv
tip bloc sau caracter dar pot fi i fiiere, protocoale de reea, programe de
monitorizare a performanelor etc.
Cnd un modul este ncrcat se petrec urmtoarele operaii:
-modulul este realocat dinamic n timpul ncrcrii;
-sistemul verific dac resursele de care are nevoie sunt disponibile;
-se seteaz toi vectorii de ntrerupere afereni;
-se actualizeaz tabloul de drivere pentru a putea trata un nou
dispozitiv major;
-se ruleaz driverul pentru a putea realiza orice iniializare specific
dispozitivului;
-n final, dup toate aceste operaii, driverul este instalat ca orice
driver ncrcat static.
Prin acest procedeu de ncrcare dinamic a driverului, LINUX ul
se deosebete fundamental de toate variantele UNIX clasice care ncarc
driverele n mod static i care la orice ncrcare a unui driver nou trebuie s
recompileze nucleul.
6.6.3. Gestiunea sistemului I/E n WINDOWS
Principalul scop urmrit n gestiunea I/E de SO WINDOWS este
acela de a avea un cadru, n care s opereze diferitele dispozitive de I/E,
constnd dintr-un set de proceduri independente de dispozitive care se ocup
de anumite aspecte legate de evenimentele de I/E. La acestea se adaug un
set de drivere de dispozitiv, ncrcate, care se ocup de comunicarea cu
dispozitivele.
6.6.3.1. Structura general a sistemului de I/E n SO WI NDOWS
ncepnd cu SO WINDOWS NT, sistemul de I/E este de tipul
packet driver. Aceasta nseamn c pentru fiecare cerere de I/E sistemul
asambleaz un pachet numit I/O Request Packet (IRP) care descrie complet
operaia de I/E. IPR este utilizat de diferitele componente ale sistemului de
I/E n decursul operaiei.
Sorin Adrian Ciureanu 124
IRP IRP
Fig.6.10. Componente ale sistemului I/E n SO WINDOWS NT.
Figura 6.10 arat schematic interaciunea dintre diferitele
componente ale sistemului de I/E i operaiile aferente.
1 Un proces care dorete s iniieze o operaie de I/E apeleaz o
funcie de bibliotec care genereaz un apel sistem. Acest apel va fi preluat
de ctre nucleu, component servicii sistem, transfernd controlul unui modul
ce realizeaz o gestiune de resurse n funcie de natura operaiei de I/E.
2 Modulul de gestiune I/E trimite ctre driver pachetul IRP care
conine informaii despre codul operaiei, parametrii specifici operaiei i
contextului de execuie.
3 Driverul pornete IRP ul i apoi genereaz comenzile ctre
periferic.
4 Cnd se termin operaia de I/E, controlerul genereaz o
ntrerupere care va fi tratat n dou etape:
-n prima etap se execut numai operaiile ce necesit utilizarea
unui nivel de privilegiu ridicat; acestea sunt executate de ISR (Interrupt
Service Routine), o rutin care ia n considerare numai acele ntreruperi de
I/E.
SERVICII SISTEM
Modul de gestiune I/E
DRIVER
Controler + Periferic Sistemul de tratare a ntreruperilor
3
4
2 5
1 6
Sisteme de operare 125
-n a doua etap se execut de ctre driver o rutin, denumit DPC
(Deferred Procedure Call). Aceast rutin ruleaz n modul supervizor i
ndeplinete diferite funcii sistem. Cuvntul deferred (amnat) se refer la
faptul c execuia este amnat pn cnd ntreruperea coboar la un nivel
destul de sczut. Acest tip de rutin este utilizat de nucleu pentru procesarea
ntreruperilor de I/E dar i pentru evenimente legate de ceasul de timp real.
5 Driverul iniiaz o finalizare a cererii de I/E, operaie executat
de modulul de gestiune I/E prin intermediul unei rutine APC
(Asynchronous Procedure Call). Aceasta transfer datele din zona sistem n
spaiul de adresare asociat firului de execuie care a iniiat cererea de I/E.
6 Se terge IPR i se returneaz controlul.
6.6.3.2. Drivere n WINDOWS
Driverele din WINDOWS ar trebui s ndeplineasc un standard e
cuprinde urmtoarele cerine:
-s trateze cererile de I/E primite care respect un anumit format
standard;
-driverul s fie scris ntr-un limbaj orientat pe obiecte, aa cum este
n totalitate SO WINDOWS (ncepnd de la WINDOWS 2000);
-s permit dispozitivelor plug-and-play s fie adugate sau
nlturate dinamic; aceasta nseamn c dac un dispozitiv gestionat de un
driver este adugat sau eliminat din sistem, driverul trebuie s fie pregtit s
primeasc aceast informaie i s acioneze corespunztor;
-s prezinte gestiunea consumului de putere unde este cazul;
-driverul s fie configurabil, cu privire la resursele utilizate; nu
trebuie s se fac nici o presupunere prealabil despre liniile de ntrerupere
sau porturile de I/E pe care dispozitivele le utilizeaz;
-driverul s fie reentrant pentru a putea fi utilizat pe un sistem
multiprocesor; aceasta nseamn c toate structurile de date ale driverului s
fie accesibile numai din interiorul regiunilor critice;
- s fie compatibil cu versiunile mai vechi, ncepnd cu WINDOWS
98; s-ar putea s fie necesar recompilarea driverului pentru fiecare sistem i
utilizarea directivelor de preprocesare din C, care sunt permise.
Sorin Adrian Ciureanu 126
Capitolul 7
GESTIUNEA RESURSELOR LOGICE.
SISTEMUL DE FIIERE
7.1. NOIUNI INTRODUCTIVE
Pentru aplicaiile soft sunt necesare dou condiii eseniale:
- stocarea informaiei;
- regsirea informaiei.
Pn acum, singura entitate pe care am studiat-o a fost procesul.
Acesta, ns, nu beneficiaz de aceste dou condiii, un proces neputnd fi
stocat ntr-un mediu de memorare extern i, implicit, nu se poate apela la
informaiile deinute de el dup o anumit perioad. De aceea se impunea
introducerea unei noi entiti care s satisfac cele dou condiii. Aceast
entitate a fost denumit fiier iar sistemul ce gestioneaz fiierele se
numete sistemul de fiiere.
Fiierul este o resurs logic a sistemului de operare i este memorat
ntr-un mediu extern de memorare. Prin definiie, fiierul este:
-unitatea logic de stocare a informaiei;
-o colecie de informaii definit de creatorul ei;
-o colecie de informaii mapate pe perifericile fizice.
Pentru a furniza un mod de pstrare a fiierelor, multe sisteme de
operare au i conceptul de director ca o cale de a grupa mai multe fiiere.
Sistemul de fiiere dintr-un SO trebuie s realizeze urmtoarele
operaii:
-Crearea i tergerea fiierelor/directoarelor.
-Denumirea i manipularea fiierelor; fiecare fiier ar trebui s aib
un nume care s fie reprezentativ pentru coninutul su; manipularea
fiierelor const n operaiile ce se pot efectua cu ele, ca scriere , citire,
cutare.
-Asigurarea persistenei datelor. Acest lucru nseamn satisfacerea
condiiei de regsire a datelor stocate, chiar i dup perioade de timp foarte
Sisteme de operare 127
mari. De asemenea trebuie s existe posibilitatea de refacere a coninutului
unui fiier n caz de accident, posibilitate pe care sistemul de fiiere trebuie
s o pun la dispoziie.
-Asigurarea mecanismelor de acces concurent al proceselor din
sistem la informaiile stocate n fiier.
7.2. CLASIFICAREA FIIERELOR
7.2.1. Clasificarea fiierelor dup structur
7.2.1.1. Secvene de octei
Fiierul este alctuit dintr-un ir de octei. Interpretarea lor este
fcut de ctre programele utilizator, conferindu-se astfel acestui tip de
structur o maxim flexibilitate. Marea majoritatea a sistemelor de operare
actuale, printre care UNIX i WINDOWS, prezint acest tip de structur.
7.2.1.2. Secvene de nregistrri
Un fiier este alctuit dintr-o secven de nregistrri, de obicei
specific unui anumit dispozitiv periferic. Astfel, pentru imprimant, era
linia de tiprit format din 132 de caractere, pentru lectorul de cartele era o
coloan .a.m.d. Acest tip de structur ine deja de domeniul istoriei.
7.2.1.3. Structur arborescent
Structura intern a unui fiier este organizat ca un arbore de cutare.
Un arbore de cutare este un arbore binar ale crui noduri au o cheie de
identificare. Cheia asociat unui anumit no este mai mare dect cheia
asociat unui nod din sub-arborele drept. Cheia asociat unui anumit nod
este mai mic dect cheia asociat uni nod din sub-arborele stng. O astfel
de structur este utilizat n calculatoarele de mare capacitate.
7.2.2. Clasificarea fiierelor dup tip
7.2.2.1. Fiiere normale
Aceste fiiere conin informaie utilizator i pot fi de dou feluri:
-fiiere text;
Sorin Adrian Ciureanu 128
-fiiere binare.
Fiierul text este format din linii de text; fiecare linie este terminat
cu caracterele CR (carriage return) sau LF (line feed).
Fiierul binar este organizat ca secvene de octei dar sistemul de
operare i poate asocia o anumit structur intern, cazul tipic fiind al
fiierelor executabile.
7.2.2.2. Directoare (Cataloage)
Sunt nite fiiere sistem destinate gestionrii structurii sistemului de
fiiere. Modul obinuit de organizare a fiierelor on-line la un sistem de
operare modern este gruparea lor n directoare (cataloage). Fiecare catalog
este tot un fiier i poate fi inclus n alt catalog, ceea ce duce la apariia unui
arbore de cataloage.
7.2.2.3. Fiiere speciale de tip caracter/bloc
Sunt destinate utilizrii n conjuncie cu dispozitivele periferice.
Un fiier special de tip bloc este format dintr-un ir de blocuri
numerotate, la fiecare bloc existnd un acces secvenial.
Un fiier special de tip caracter este utilizat pentru dispozitive
periferice care utilizeaz fluxuri de caractere.
7.2.3. Clasificarea fiierelor dup suportul pe
care sunt rezidente
Din acest punct de vedere fiierele pot fi:
-fiiere pe disc magnetic; -fiiere pe band magnetic;
-fiiere pe imprimant;
-fiiere pe ecran;
-fiiere pe tastatur.
7.2.4. Clasificarea fiierelor dup acces
7.2.4.1. Fiiere cu acces secvenial
n aceste fiiere, pentru a ajunge la informaie, trebuie mai nti s se
parcurg nite structuri. Este cazul tipic al benzii magnetice. n accesul
secvenial nu se pot face citiri i scrieri n acelai timp.
Sisteme de operare 129
7.2.4.2. Fiiere cu acces direct
Accesul se face direct ntr-o structur dat, existnd posibiliti de a
se face citiri i scrieri n acelai timp. Este cazul tipic al hard discului.
7.2.4.3. Fiiere cu acces indexat
Se face acces direct prin coninut, folosind o serie de tehnici ca
fiiere de index, fiiere multi list, arbori binari, hashing etc.
7.3. ATRIBUTE I OPERAII CU FIIERE
7.3.1. Atribute
Nume - numele fiierului este, pentru toate sistemele de operaii,
pstrat n form uman inteligibil.
Tip - acest atribut este absolut necesar deoarece SO cuprinde mai
multe tipuri de fiiere(binar, text..).
Locaie este un pointer la locaia fiierului pe perifericul de
stocare.
Protecie n legtur cu protecia fiierului, cele mai multe atribute
se refer la posesorul su i la drepturile de acces ale utilizatorilor si.
Timp, data i identificatorul de utilizator informaii pentru
protecia, securitatea i monitorizarea utilizrii.
7.3.2. Operaii cu fiiere
Prezentm, n continuare, principalele operaii cu fiiere .
-Crearea unui fiier, creat().
-Citirea unui fiier; read();se citesc din fiier un numr specificat
de octei de la o poziie curent.
-Scrierea ntr-un fiier, write(); se scrie ntr-un fiier un numr
specificat de octei, ncepnd de la poziia curent.
-Deschiderea unui fiier, open(); cutarea n structura de
directoare de pe disc a intrrii fiierului i copierea coninutului intrrii n
memorie.
Sorin Adrian Ciureanu 130
-Descriptorul de fiier, fd; n urma operaiei de deschidere a unui
fiier, se returneaz un ntreg, numit descriptor de fiier, care va fi utilizat de
procesul care a iniiat operaia open() pentru toate operaiile ulterioare
asupra fiierului respectiv. Descriptorul de fiier este folosit de SO ca un
index ntr-o tabel de descriptori asociat fiecrui proces, n care se regsesc
i ali descriptori asociai altor fiiere folosite de procesul respectiv.
-tergerea unui fiier, delete(), unlink().
-Trunchierea unui fiier, trunc(), nseamn tergerea unei zone
contigue, de obicei la nceputul sau sfritul fiierului.
-nchiderea unui fiier, close(), este mutarea coninutului unui
fiier din memorie n structura de directoare de pe disc.
-Adugarea de date la sfritul unui fiier, append().
-Setarea poziiei n fiier, seek().
-Repoziioanrea n fiier, lseek().
-Redenumirea unui fiier, rename().
-Operaia de setare i citire a atributelor unui
fiier,setattributes().
Aceste operaii prezentate au echivalent n funciile bibliotec pe
care utilizatorul le poate apela din program. La rndul lor, aceste funcii
iniiaz apeluri sistem. n sistemele de operare actuale accesarea unui fiier
se face aleatoriu i nu secvenial ca n sistemele mai vechi. Aceasta
nseamn c se pot face operaii de scriere/citire n orice poziie din cadrul
fiierului, adic orice octet din fiier este adresabil.
Fig. 7.1. Fiier cu secven de octei.
7.4. IMPLEMENTAREA SISTEMULUI DE FIIERE
7.4.1. Alocarea fiierelor pe disc
Un SO lucreaz la nivel logic cu blocuri. Un bloc este format din
dou sau mai multe sectoare fizice. Una din problemele eseniale ale
implementrii sistemului de fiiere este modul n care blocurile din disc sunt
alocate pentru fiiere. Exist, la ora actual, trei posibiliti de alocare:
Marker de accesare a uui octet
Octet
1
Octet
2
Octet
3
Octet
k
Octet
n
Sisteme de operare 131
-alocare contigu;
-alocare nlnuit;
-alocare secvenial.
7.4.1.1. Alocare contigu
n acest mod de alocare fiecare fiier ocup o mulime contigu de
blocuri pe disc, adic o mulime n care elementele se ating.
Avantajele acestei alocri sunt:
- simplicitatea, fiind necesare doar numrul blocului de nceput i
numrul de blocuri ale fiierului; de exemplu, un fiier cu 8 blocuri , cu
adresa blocului de nceput 1234, va fi reprezentat pe disc astfel:
Bloc
1234 1235 1236 1237 1238 1239 1240 1241
Fig. 7.2. Reprezentarea unui fiier cu 8 blocuri.
- faptul c sunt permise accese directe.
Dezavantaje:
-exist o risip de spaiu foarte mare, adic o mare fragmentare a
discului datorat condiiei de contiguitate a blocurilor din fiier;
-fiierele nu pot crete n dimensiune ceea ce constituie un
impediment important.
Alocarea contigu a fost folosit n primele sisteme de operare, n
prezent aproape nu mai este utilizat.
7.4.1.2. Alocarea nlnuit
Fiecare fiier este o list liniar nlnuit de blocuri pe disc.
Fiecare bloc conine partea de informaie, care este blocul propriu
zis, i o legtur spre blocul urmtor, de tip pointer.
n figura 7.3. este dat o astfel de reprezentare pentru un fiier
format din 4 blocuri.
Avantaje:
-blocurile unui fiier pot fi mprtiate oriunde n disc cci nu mai
exist condiia de contiguitate;
-fiierul poate crete n dimensiuni pentru c oricnd i se pot aloca
blocuri libere de pe disc;
-accesul secvenial se face relativ uor.
Sorin Adrian Ciureanu 132
Dezavantaje:
- accesul direct se face destul de greu, datorit numeroaselor legturi
ce pot s apar la un moment dat;
- o corupere a lanului de pointere, duce la distrugerea fiierului sau
chiar a ntregului sistem de fiiere.
Acest tip de alocare este specific sistemelor de operare ce folosesc
tabela FAT (File Alocation Table). n tabela FAT un fiier este reprezentat
ca n exemplul din figura 7.4.
Fig. 7.3. Reprezentarea unui fiier cu 4 blocuri. Alocare nlnuit.
Nume fiier Nr. bloc nceput Nr. bloc sfrit
test 29 1234
Fig. 7.4. Reprezentarea unui fiier n tabele FAT.
Sisteme de operare ce utilizeaz alocarea nlnuit, deci tabela FAT,
sunt: MS DOS, WINDOWS 95, WINDOWS 98, OS/2(versiunea 1 i 2).
7.4.1.3. Alocarea indexat
n acest tip de alocare se pun la un loc toi pointerii, ntr-un bloc de
index. Alocarea indexat grupeaz referinele i le asociaz cu un fiier
particular.
Avantaje:
-se realizeaz un acces direct;
-aproape dispare fragmentarea extern:
-este o situaie avantajoas n cazul n care sistemul de operare are
multe fiiere de dimensiune mic.
Dezavantaje:
-implic un cost suplimentar prin accesul la blocul de index.
Bloc
29
Bloc
70
Bloc
29
Bloc
200
Bloc
200
Bloc
1234
Bloc
1234
Zon
date
Zon
date
Zon
date
Zon
date Pointer Pointer Pointer Pointer
Sisteme de operare 133
Alocarea indexat este utilizat n sistemele UNIX, n sistemul cu i-
noduri.
Un i-nod (index nod) conine un cmp de date n care sunt stocate
atributele fiierului respectiv i o legtur spre alt bloc. Fiecrui fiier i
corespunde un i-nod.
Structura unui nod de indexare este dat n figura 7.4.
Fig. 7.4. Structura unui i-nod (nod de indexare).
Aceast implementare permite o indirectare pn la nivel de
trei blocuri.
Adresa indexat unde se gsesc informaiile din fiier poate fi:
-blocul iniial, dac adresa este mai mic dect 10 blocuri;
-blocul urmtor indexat, pentru bloc de indirectare simpl;
-al doilea bloc, dat de blocul urmtor, pentru bloc de indirectare
dubl;
atribute
1
2
3 bloc
4
5
6
7
8
9
9
10
11
12
13
Bloc de indirectare simplu
Bloc de indirectare dublu
Bloc
de
indirectare
triplu
Sorin Adrian Ciureanu 134
-al treilea bloc, dup indirectarea dat de primele 2 blocuri, pentru
bloc de indirectare tripl.
7.4.2. Evidena blocurilor libere
Operaiile de creare, tergere, scriere , efectuate asupra fiierelor,
sunt operaii dinamice, ceea ce necesit, n orice moment, alocare/dealocare
de blocuri pentru fiiere.
Cum se aloc, firesc, blocuri libere n acel moment, este necesar ca
sistemul de fiiere s aib o eviden a blocurilor libere n orice moment.
Cele mai utilizate metode de eviden sunt:
-metoda listei nlnuite;
-metoda hrii de bii;
-gruparea.
n prima metod, blocurile libere din disc sunt organizate ntr-o
structur de list simplu nlnuit.
Operaiile efectuate asupra acestei liste sunt: inserarea de noi noduri,
pentru blocurile libere nou aprute, i tergerea de noduri pentru blocurile ce
au fost ocupate. Aceast list este implementat la o adres dintr-un bloc
dinainte stabilit. Implementare permite o indirectare pn la nivel de trei
blocuri.
Fig. 7.5. Lista simplu nlnuit a blocurilor libere din disc.
Adresa indexat unde se gsesc informaiile din fiier poate fi:
-blocul iniial, dac adresa este mai mic dect 10 blocuri;
-blocul urmtor indexat, pentru bloc de indirectare simpl;
-al doilea bloc, dat de blocul urmtor, pentru bloc de indirectare
dubl;
-al treilea bloc, dup indirectarea dat de primele 2 blocuri, pentru
bloc de indirectare tripl.
Bloc
liber
Bloc
liber
Bloc
liber
Bloc
liber
Sisteme de operare 135
n metoda hrilor de bii, se utilizeaz o structur de hart de bii n
care fiecare bit corespunde unui bloc de pe disc. Un bit 0 nseamn c
blocul este liber iar un bit 1 nseamn c blocul este ocupat.
Aceast metod are avantajul, fa de prima, c harta de bii are o
dimensiune constant, relativ mic. n plus, localizarea unei zone libere de
blocuri cu dimensiune prestabilit se face uor, prin cutarea n hart a unei
secvene de bii 0.
Bl. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Zon de 4
blocuri libere
Fig. 7.6.Hart de bii pentru evidena blocurilor libere pe disc.
n metoda gruprii se folosete o structur care memoreaz zonele
libere din disc, fiecare zon fiind caracterizat prin adresa primului bloc din
zona liber i prin numrul de blocuri.
7.4.3. Eficiena i performana sistemului de
fiiere
Eficiena unui sistem de fiiere depinde n primul rnd de doi factori:
-de algoritmii de alocare a discului, discutai anterior;
- de tipurile de date pstrate n intrarea fiierului din director.
Performana unui sistem de fiiere poate fi mbuntit prin trei
factori:
-disc cache; aceasta nseamn o seciune bine determinat a
memoriei principale, utilizat ca memorie cache a blocurilor de disc cele
mai des utilizate;
-free-behind i read ahead care sunt tehnici de optimizare a
accesului secvenial;
-RAM disc care nseamn declararea unei poriuni de memorie
principal ca un disc virtual.
7.4.4. Fiabilitatea sistemelor de fiiere
Este necesar ca sistemele de fiiere s ofere instrumente care s
permit urmtoarele lucruri:
a)-Evitarea distrugerii informaiei pe disc.
b)-Recuperarea informaiilor n urma unor erori hard sau soft.
1 0 0 0 0 1 1 1 1 0 0 1 0 0 0
Sorin Adrian Ciureanu 136
c)-Asigurarea consistenei sistemului de fiiere.
7.4.4.1. Evitarea distrugerii informaiei pe disc
n acest context, una dintre cele mai importante probleme este
evidena blocurilor defecte (bad blocks). Aceast problem este rezolvat
att la nivel hard ct i la nivel soft.
La nivel hard, pn n anul 1993, era permis unui productor de hard
discuri ca acestea s aib un numr limitat de sectoare defecte, sectoare ce
erau stanate pe hard disc. Dup 1993, standardele internaionale nu au mai
permis productorilor s scoat pe poarta fabricii discuri cu sectoare defecte.
La nivel soft, sistemul de operare, prin intermediul sistemului de
fiiere, are ncorporat un fiier bad bloc n care sunt trecute toate blocurile
defecte ale hard discului. Un bloc situat n acest fiier nu va fi utilizat de
sistemul de fiiere, fiind ignorat. Exist dou tipuri de metode pentru a
determina dac un bloc este defect i pentru a-l trece n fiierul de bad-bloc:
-metode offline;
-metode online.
Metodele offline constau n a rula programe fr ca sistemul de
operare s fie ncrcat, deci a efectua teste independent de sistemul de
operare.
La sistemele mai noi acest lucru se face, de obicei, prin formatarea
lowlevel, cnd se determin blocurile defecte, se trec ntr-o memorie local a
discului i apoi , la ncrcarea SO, ele vor fi trecute n fiierul bad block. La
sistemele mai vechi, cnd nu exista noiunea de formatare a discului, se
treceau teste, se determinau sectoarele defecte i se derutau aceste sectoare,
n sensul c se treceau pe pista de rezerv a discului i nu mai erau
considerate blocuri defecte.
Metodele online se desfoar att timp ct sistemul de operare este
activ. De obicei, sistemul de fiiere are nglobat un program care testeaz
blocurile unui disc i le declar defecte dac este cazul.
7.4.4.2. Recuperarea informaiei n urma unor erori
soft sau hard
Recuperarea unui fiier poate fi fcut prin urmtoarele metode:
-prin mecanisme de back-up;
-prin sisteme jurnalizate.
Un mecanism de back-up nseamn copierea ntregului sistem de
fiiere pe alt periferic dect discul, adic pe band magnetic sau, mai
Sisteme de operare 137
adesea, pe streamer. Aceast operaie de salvare se face periodic, perioada
fiind hotrt de inginerul de sistem, i se numete massive dump sau
periodic dump.
Principalul ei dezavantaj const n timpul lung ce necesit.
Exist i o variant ce necesit timp mai scurt, numit incremental
dump, care const n salvarea pe band sau pe streamer numai a fiierelor ce
au fost modificate de la ultima operaie de salvare.
Sistemele jurnalizate nregistreaz fiecare actualizare a sistemului de
fiiere ca pe o tranzacie. Toate tranzaciile sunt scrise ntr-un jurnal. O
tranzacie este considerat comis atunci cnd este scris n jurnal.
Tranzaciile din jurnal sunt operate asincron n sistemul de fiiere.
Dup ce sistemul de fiiere este modificat, tranzacie este tears din
jurnal. n momentul n care sistemul de fiiere a czut dintr-o eroare de hard
sau soft, se repornete sistemul de operare i tranzaciile din jurnal vor fi,
toate, actualizate.
7.4.4.3, Asigurarea consistenei sistemului de fiiere
Probleme de consisten a sistemului de fiiere apar n cazul n care
unele modificri fcute sistemului de fiiere nu au fost actualizate pe disc.
Verificarea consistenei sistemului de fiiere se face, att la nivel de bloc ct
i la nivel de fiiere, cu ajutorul unor programe utilitare.
Un exemplu de program care verific consistena la nivel de bloc,
din sistemul UNIX, este cel dat n continuare.
C1- indic numrul de apariii ale blocului respectiv n toate i-
nodurile.
C2- indic numrul apariiilor blocului n lista de blocuri libere.
n mod normal trebuie s avem C1+C2=1
Tabelul 7.1. Situaiile anormale care pot s apar n asigurarea
consistenei sistemului de fiiere.
C1 C2 Situaie aprut Corecie
0 0 Se irosete un bloc ce nu va putea fi
alocat
Se face C2 = 1
1 1 Exist riscul ca blocul s fie alocat
mai multor fiiere; pot aprea
suprancrcri de date
Se face C2=0
0 >1 Bloc alocat mai multor fiiere Se face C2=1
>1 0 Blocul este ters ntr-unul din fiiere; Se aloc C1-1
Sorin Adrian Ciureanu 138
el va fi trecut n lista de noduri libere
i, eventual, alocat altui fiier.
Celelalte C1-1 referine la blocul
respectiv vor adresa o informaie
invalid ntruct e posibil ca el s fie
alocat unui fiier nou creat.
blocuri libere n
care se copiaz
coninutul
blocului incorect
adresat.C1-1
dintre referinele
ctre blocul
respectiv vor fi
nlocuite ctre
copiile acestuia.
Pentru verificarea consistenei la nivel de fiier se folosesc dou
contoare, CF1 i CF2. CF1 contorizeaz apariiile fiierului n directorul de
sistem i CF2 contorizeaz numrul de legturi stocat n i-nodul asociat
fiierului respectiv. n mod normal CF1=CF2. Situaiile anormale sunt:
CF1< CF2, fiierul va figura ca fiind adresat chiar dac el a fost ters
din toate directoarele unde figura i irosete un i-nod;
CF1>CF2, se aloc acelai i-nod pentru dou fiiere diferite.
7.4.5. Protecia fiierelor
Este foarte important ca fiecare utilizator s-i defineasc drepturile
de acces asupra propriilor fiiere, preciznd cine le poate accesa i ce
operaie poate efectua asupra lor. Sistemul UNIX are unul din cele mai
eficiente sisteme de protecie a fiierelor. In acest sistem sunt trei tipuri de
utilizatori i proprietari : proprietarul fiierului, utilizatori membri ai
grupului din care face parte posesorul fiierului, ali utilizatori. Se
efectueaz trei tipuri de operaii: citire, scriere i execuie.
Utilizatori, membri
Proprietarul fiierului ai grupului Ali utilizatori
Citire scriere execuie Citire scriere execuie Citire scriere execuie
Fig. 7.7. Implementarea sistemului de protecie n UNIX.
1 1 1 1 0 1 1 0 0
Sisteme de operare 139
Implementarea se face cu un grup de 9 bii, 3 bii de fiecare operaie,
pentru fiecare tip de utilizator. Acest grup de 9 bii este coninut n unul
dintre atributele care se gsesc n i-nodul asociat.
n acest caz proprietarul are toate drepturile asupra sistemului,
utilizatorii membri ai grupului au drept de citire i execuie iar ceilali
utilizatori au doar dreptul de citire.
Metoda utilizat n sistemul WINDOWS este cea a listelor de acces.
Fiecrui fiier i este asociat o list de control de acces (acces control list=
ACL). Lista conine mai multe intrri de control al accesului (acces control
entries =ACE). Fiecare ACE specific drepturile de acces pentru un
utilizator sau grup de utilizatori, coninnd un identificator al acestora, o
descriere a drepturilor i drepturile pe care le confer asupra fiierului,
precum i alte opiuni cum ar fi cea legat de posibilitatea ca un fiier creat
n cadrul unui director s moteneasc drepturile de acces ale acestuia. n
momentul n care un utilizator ncearc s acceseze fiierul, se verific
automat n cadrul listei de control asociate (ACL) dac este vorba de un
acces permis sau nepermis.
7.4.6. Organizarea fiierelor pe disc
7.4.6.1. Organizarea fiierelor n SO ce folosesc FAT
n SO care utilizeaz mecanisme de tip FAT, structura unei intrri de
director este:
Nume
fiier
Extensie Atribute Rezervat Timp Data Numrul
primului
bloc
Principalul dezavantaj al mecanismelor FAT este absena
mecanismului de crearea legturilor la fiiere. Pentru realizarea unor legturi
ar fi necesar ca o aceeai intrare s figureze n dou sau mai multe
directoare, avnd drept consecin duplicarea unor date legate de
poziionarea pe disc, de timpul i dimensiunea fiierului respectiv, ceea ce
poate genera inconsistene.
7.4.6.2. Organizarea n HPFS (High Performance File System)
Aceast organizare utilizeaz pentru descrierea localizrii pe disc a
fiierelor structuri de date de tip arbori B care au principala proprietate de a
avea performane ridicate pentru operaiile de cutare.
Sorin Adrian Ciureanu 140
n aceast organizare discul arat astfel:
-Primele 18 sectoare conin blocul de boot, superblocul, blocul de
rezerv. Aceste blocuri conin informaii despre iniializarea sistemului de
fiiere , gestiunea sistemului i refacerea sistemului dup producerea de
erori.
-Benzi de 8MB, fiecare band avnd asociat o hart de bii de
dimensiunea 2kB n care un bit corespunde unui bloc de 4KB din cadrul
benzii; dac bitul e zero bitul este liber, dac bitul e 1 blocul este alocat.
Hrile de bii sunt situate n mod alternativ la sfritul i la nceputul
benzilor aa nct s se poat face alocri contigue de pn la 16MB. Se las
spaiu ntre fiierele existente i cele nou create n ideea obinerii unor
alocri de blocuri contigue.
Bloc de boot
Superbloc
Bloc rezerv
Banda 1
Bitmap 1
Bitmap 2
Banda 2
Banda3
Bitmap 3
Memorie
Intern
ascuns
Sisteme
de
fiiere
Numirea
fiierelor
Memoria
intermediar
de pagini
Memorie virtual
Planificarea proceselor
Crearea i
terminarea
proceselor
P
u
n
e
r
e
i
n
c
o
r
e
s
p
o
n
d
e
n
T
r
a
t
a
r
e
a
s
e
m
n
a
l
e
l
o
r
D
e
f
e
c
t
e
d
e
p
a
g
i
n
M
a
n
a
g
e
r
a
l
P
a
P
M
a
n
a
g
e
r
d
e
a
l
i
m
e
n
t
a
r
e
M
a
n
a
g
e
r
d
e
c
o
n
f
i
g
u
r
a
r
e
M
a
n
a
g
e
r
L
P
C
W
i
n
3
2
G
D
J
Sistem de
fiiere
Servicii sistem
Interfaa sistemului (NT DLL-DLL)
Proces de
serviciu
Subsistem POSIX
Program POSIX
Subsistem WIN 32 Subsistem 05/2
Program WIN 32 Program 05/2
Driver de
dispozitiv
Nivelul de abstractizare a hardului (HAL)
HARD
NUCLEU Driver
video
Sorin Adrian Ciureanu 230
Fig.10.6. Structura sistemului de operare WINDOWS 2000.
Dintre toate versiunile, alegem prezentarea structurii sistemului de
operare din WINDOWS 2000.
Aceast structur are dou pri semnificative:
-nucleul propriuzis;
-subsistemele de mediu care lucreaz n mod utilizator.
Dup cum se vede din figur, structura acestui sistem de operare este
modular ceea ce mbuntete mult portabilitatea. WINDOWS 2000 este
organizat pe niveluri, fiecare nivel utiliznd serviciile nivelelor din nivelul
inferior. Fiecare modul ndeplinete o funcie particular i are o interfa
bine definit fa de celelalte module.
Nivelele cele mai de jos HAL i nucleul sunt scrise n limbaj C i
limbaj de asamblare i sunt dependente de main. Nivelele superioare sunt
scrise n C sau C++.
Vom examina n continuare diferitele componente ale sistemului,
ncepnd de la nivelurile inferioare pn la cele superioare.
Nivelul de abstractizare a hardului (HAL)
HAL nseamn Hardware Abstraction Layer. Denumirea a fost
inspirat i de filmul lui Stanley Kubrick Odiseea spaial 2001 n care
exist un computer numit HAL. Numele acestuia se obine prin scderea
unui 1 din fiecare liter de la IBM.
Scopul nivelului Hal este de a prezenta celorlalte nivele ale SO
dispozitive hard abstracte, sub forma unor servicii independente de maini,
cum ar fi apelurile de proceduri sau macro-urile. n general, serviciile alese
pentru a fi incluse n HAL sunt servicii legate de cipul de pe placa de baz,
care pot varia de la o main la alta. Hal este proiectat pentru a ascunde
diferenele dintre diferite plci de baz, nu ns i diferenele dintre
procesoare. Serviciile oferite de Hal sunt:
-accesul la registrele dispozitivelor;
-adresarea dispozitivelor independent de magistral;
-tratarea ntreruperilor;
-transferul DMA;
-controlul cronometrelor i a ceasului de timp real, a zvoarelor de
spin de nivel jos;
-sincronizarea procesoarelor multiple;
-interfaa cu memoriile BIOS i CMOS.
n ceea ce privete scrierea n registrele dispozitivelor i adresarea
dispozitivelor independent de magistral, Hal ofer trei proceduri pentru
citire i trei proceduri de scriere:
Sisteme de operare 231
Proceduri de citire din registrele dispozitivelor:
UC=READ-PORT-UCHAR(port);
US=READ-PORT-USHOR(port);
Ul=READ-PORT-ULONG(port);
Proceduri de scriere n registrele dispozitivelor:
WRITE-PORT-UCHAR(port,UC);
WRITE-PORT-USHORT(port,UC);
Hal furnizeaz un serviciu pentru identificarea dispozitivelor prin
punerea n coresponden a adreselor relative la magistral cu adresele
logice ale sistemului. n acest fel driverele nu trebuie s urmreasc pe ce
magistral este un dispozitiv. Aceste adrese logice sunt asemntoare cu
referinele pe care sistemul de operare le d programelor utilizator pentru
referirea fiierelor i a altor resurse de sistem. De asemenea, acest mecanism
protejeaz nivelele de mai sus de proprietile structurilor alternative de
magistrale i de conveniile de adresare.
ntreruperile sunt dependente de magistral. HAL pune la dispoziie
servicii pentru denumirea ntreruperilor, n general, n tot sistemul, i
servicii ce permit driverelor s ataeze o ntrerupere, n mod portabil, fr a
trebui s cunoasc nimic despre ce anume vector de ntrerupere este pentru o
anumit magistral.
Configurarea i administrarea transferului DMA ntr-un mod
independent de dispozitiv se face n mod comandat, utiliznd mecanismele
specifice ale DMA i ale plcilor de I/E. De asemenea scrierea i
citirea. cache este fcut tot de HAL.
Tot Hal administreaz ceasurile i cronometrele ntr-un mod portabil.
HAL asigur unele primitive pentru administrarea acestei sincronizri , cum
ar fi zvoarele de spin n care un proces ateapt ca o resurs deinut de alt
proces s fie eliberat, n special n cazul n care resursa este meninut
foarte puin, numai cteva instruciuni main.
HAL discut cu BIOS-ul i examineaz memoria CMOS, pentru a
vedea ce magistrale i ce dispozitive de I/E conine sistemul i cum au fost
ele configurate.
Deoarece HAL este dependent de main, este normal s existe o
diversitate de HAL-uri disponibile pe kitul de instalare de pe WINDOWS
2000. n momentul instalrii sistemului, este selectat cel potrivit i copiat n
catalogul sistem \ winkit\system 32\ cu hal.dll. Toate pornirile ulterioare
folosesc aceeai versiune de HAL iar tergerea ei face ca sistemul s nu mai
porneasc.
Nivelul nucleu .Deasupra nivelului de abstractizare a hardului se
afl nucleul i driverele dispozitiv.
Sorin Adrian Ciureanu 232
Principalele obiective ale nucleului sunt:
a)-asigurarea unei abstractizri a hardului, de nivel mai nalt;
b)-comutarea firelor de execuie;
c)-suportul de nivel jos pentru obiecte de control;
d)-suportul de nivel jos pentru obiecte dispecer;
a)-Obiectivul nucleului este de a face ca restul sistemului de operare
s fie complet independent de hard i astfel foarte portabil. El continu de
acolo de unde se oprete HAL i construiete peste serviciile HAL, la un
nivel extrem de jos, pentru a crea abstraciuni de un nivel mai nalt.
La nivelul nucleu, operaiile curente care se fac sunt:
-salvarea tuturor registrelor procesorului;
-modificarea tabelelor de pagini;
-managementul tampoanelor cache.
b)-Comutarea firelor de execuie se face de ctre nucleu prin
salvarea vechiului fir n tabelele de memorie, prin setarea hrii de memorie
i ncrcarea registrelor pentru noul fir de execuie. Codul pentru
planificarea firelor de execuie se afl tot n nivelul nucleu, acesta selectnd
din coada de ateptare noul fir de execuie.
c)-Obiectele de control (Control Objects), cele care controleaz
sistemul, sunt:
-obiecte primitive de proces;
-obiecte de ntreruperi;
-DPC (Defererred Procedure Call) sau Apeluri de Proceduri
ntrziate;
-APC ( Asynchronous Proceure Call) sau Apeluri de Proceduri
Asincrone.
Un obiect DPC este utilizat, ntr-o procedur de tratare a
ntreruperilor, pentru a separa partea critic, din punct de vedere al timpului,
de partea necritic. Un obiect APC este asemntor cu obiectul DPC, cu
excepia faptului c el se execut n contextul unui proces specific.
d)-Obiectele dispecer constau n: mutex-uri, semafoare, evenimente,
cronometre de ateptare, obiecte utilizate la planificarea firelor de execuie,
planificare care este o sarcin a nucleului.
Drivere de dispozitiv.
n general rolul driverelor este foarte clar: ele asigur buna
funcionare a dispozitivelor I/E. Pot avea ,ns, i alte roluri, cum ar fi:
criptarea unui flux de date sau asigurarea accesului la anumite structuri de
date ale nucleului. Organizarea driverelor n WINDOWS este urmtoarea:
-drivere vizibile macroscopic, pentru dispozitive I/E foarte utilizate,
cum ar fi discurile i imprimantele;
Sisteme de operare 233
-drivere foarte puin utilizate, pentru dispozitive interne i cipuri;
-driverele WIN 32 CDI i driverele video care sunt cele mai mari
drivere de dispozitiv i care sunt cele maides utilizate drivere de ctre
sistemul de operare, ele rezolvnd multe apeluri sistem i o mare parte din
grafic.
Executivul
Deasupra nivelului nucleu i a driverelor de dispozitiv, se afl partea
superioar a sistemului de operare, denumit executiv.
Executivul este scris n limbaj C, este independent de arhitectur i
poate fi portat cu un efort relativ mic. Structura executivului const n 11
componente, fiecare dintre ele fiind doar o colecie de proceduri care
conlucreaz pentru realizarea unui obiectiv. Nu exist bariere ferme ntre
pri iar componentele de pe acelai nivel pot s se apeleze una pe cealalt
n mod extensiv.
Cele 11 componente sunt:
-Managerul de obiecte (Object manager) gestioneaz toate obiectele
cunoscute sistemului de operare. Obiectivul su este de a ine evidena
tuturor obiectelor. La crearea unui nou obiect, managerul de obiecte i aloc
un bloc de memorie virtual din spaiul de adrese al nucleului pe care l
returneaz n lista de blocuri libere atunci cnd obiectul este dealocat.
-Managerul de I/E (I/Omanager) ofer servicii de generare de I/E i
gestioneaz dispozitivele I/E, apelnd driverele.
-Managerul de procese (Process manager) controleaz procesele i
firele de execuie, asigurnd principalele operaii cu procese precum crearea
i terminarea lor. Ele se ocup de mecanismele de gestionare a proceselor i
nu de politicile respective, aceste mecanisme constituind cheia
multiprogramrii n sistemul de operare WINDOWS.
-Managerul de memorie (Memory manager) asigur serviciile pentru
memoria virtual, implementat prin paginare la cerere.
-Managerul de securitate (Security manager) asigur mecanismul de
securitate care const n implementarea cerinelor crii aurii.
-Managerul memoriei intermediare (Cache manager) menine
ultimele blocuri de disc folosite n memorie pentru a accelera accesul la ele
cnd sunt cerute. Funcioneaz dup principiile memoriei cache.
-Managerul de configurare automat a dispozitivelor (Plug and Play
(PaP)) este utilizat pentru dispozitivele periferice cel mai recent ataate
sistemului de operare. Pentru unele dispozitive I/E se face o verificare la
pornire, pentru altele nu se face. Unele dispozitive, ca USB, pot fi ataate n
orice moment i ataarea lor va declana un mesaj ctre managerul PaP care
va localiza i ncrca driverul respectiv.
Sorin Adrian Ciureanu 234
-Managerul de alimentare (Power manager) ine sub supraveghere
folosirea energiei de alimentare ceea ce nseamn ntreruperea alimentrii
monitorului (displayului) i a discurilor, dac acestea nu au fost accesate o
anumit perioad de timp. Pe calculatoarele portabile, managerul de
alimentare monitorizeaz folosirea bateriei.
-Managerul de configurare (Configuration manager ) rspunde de
adugarea unei noi nregistrri n registre i caut o cheie cnd i se cere.
-Managerul de apeluri de proceduri locale (Local Procedure Call
Manager-RPC) ntreine o comunicaie ntre procese cu un nivel ridicat de
eficien. Este utilizat ntre procese i subsistemele lor.
-Modulul Win 32 GDI manipuleaz anumite apeluri sistem. Iniial el
a fost plasat n spaiul utilizator. Apoi a fost mutat n spaiul nucleu, n
WINDOWS NT 4.0. pentru mbuntirea performanelor. GDI trateaz
gestionarea imaginilor pentru monitor i imprimante. El furnizeaz apeluri
sistem care permit programelor utilizator s scrie pe un monitor sau
imprimant ntr-un mod independent de dispozitiv. De asemenea el conine
i managerul de ferestre i drivere de afiare.
Servicii de sistem (System services)
Funcia sa este s furnizeze o interfa ctre executiv. El primete
apeluri sistem WINDOWS 2000 i apeleaz alte pri ale executivului
pentru rezolvarea acestora.
La pornire, WINDOWS 2000 este ncrcat n memorie sub forma
unei colecii de fiiere. Partea principal a sistemului de operare, care const
din nivelele nucleu i executiv, se afl n fiierul ntoskml.exe.. HAL este o
biblioteca partajat aflat ntr-un fiier denumit hal.dll. win32 GDI i
interfaa dispozitivelor grafice se afl n fiierul win32 k.sys.
Nivelul utilizator
Componentele nivelului utilizator sunt:
-DLL-urile (Dynamic Link Librairy = Bibliotec cu legare
dinamic);
-subsistemele de mediu;
-procese de serviciu.
Aceste componente conlucreaz pentru a furniza fiecrui proces
utilizator o interfa, alta dect interfaa apelurilor sistem.
WINDOWS 2000 suport trei API-uri diferite:
-WIN 32
-POSIX
-OS/2
Fiecare dintre aceste interfee are o list de apeluri de bibliotec
publicate care pot fi folosite de programatori. Treaba DLL-urilor i a
Sisteme de operare 235
subsistemelor de mediu este s implementeze funcionalitatea interfeei,
ascunznd n acest fel programelor de aplicaii adevrata fa a apelurilor de
sistem. n particular, interfaa Win 32 este interfaa oficial a mai multor
versiuni Windows printre care i WINDOWS 2000. Prin utilizarea DLL-
urilor i a subsistemului de mediu Win32, se poate scrie unprogram
folosind specificaiile Win 32, program care s ruleze pe toate versiunile
Windows care au interfa Win 32 (WINDOWS 2000, WINDOWS NT,
WINDOWS 95/98), cu toate c apelurile sistem nu sunt aceleai pe sisteme
diferite.
Un program Win 32 conine apeluri ctre funciile Win 32 cum ar fi:
Create Window, Draw MenuBar, Open Semaphore. Exist mii de astfel de
apeluri, iar majoritatea programelor folosesc o parte substanial din ele. O
implementare posibil ar fi legarea static a fiecrui program Win 32 cu
toate procedurile din bibliotec pe care le utilizeaz. Dac s-ar face acest
lucru, fiecare program binar ar conine n interiorul executabilului su o
copie a fiecrei proceduri folosite. Aceasta ar nsemna o risip mare de
memorie, mai ales n situaia n care utilizatorul are mai multe programe
deschise n acelai timp i multe dintre ele utilizeaz aceleai proceduri de
bibliotec. Pentru a evita aceast problem, se utilizeaz biblioteci partajate
numite DLL-uri. Fiecare DLL adun n acelai fiier, cu extensie. dll, o serie
de proceduri de biblioteci nrudite i structurile lor de date. Atunci cnd o
aplicaie este legat, editorul de legturi i d seama c unele proceduri de
bibliotec aparin DLL-urilor i nregistreaz aceast informaie n antetul
executabilului.
Apelurile ctre procedurile din DLL sunt fcute indirect, printr-un
vector de transfer din spaiul de adrese al apelantului. Iniial acest vector
este umplut cu zerouri deoarece adresele procedurilor ce vor fi apelate nu
sunt nc cunoscute. Cnd procesul aplicaie este pornit, DLL-urile care sunt
necesare sunt localizate pe disc sau chiar n memorie i puse n
coresponden cu spaiul virtual de adrese al procesorului. Vectorul de
transfer este apoi completat cu adrese corecte, n aa fel ca procedurile s fie
apelate prin intermediul lui, cu o pierdere mic de eficien. Ctigul este
aici faptul c, dei sunt mai multe programe de aplicaie cu acelai DLL, pus
n coresponden n interior, numai o singur copie a textului DLL este
necesar n memoria fizic.
n figura 10.8. sunt date diferite moduri de implementare a apelurilor
din Win 32 API.
Fiecare proces utilizator este legat de obicei cu un numr de DLL-uri
care mpreun implementeaz interfaa Win 32. Pentru a efectua un apel
API, trebuie apelat o procedur dintr-un DLL, n figur acesta fiind pasul
Sorin Adrian Ciureanu 236
1. n unele cazuri, DLL-ul apeleaz un alt DLL, n figur fiind ntdll.dll,
care la rndul su este captat n sistemul de operare, n figur 2a i3a. De
asemenea este posibil ca DLL-ul s fac ntreaga operaie fr s fac nici
un apel sistem. Pentru alte apeluri Win 32 API este aleas alt cale. Mai
nti este trimis un mesaj ctre procesul csrss.exl al subsistemului Win 32,
care face unele prelucrri, i apoi un apel de sistem (paii 2b, 3b, 4b.)
Fig. 10.8. Moduri de implementare a apelurilor sistem Win 32 API
n prima versiune de WINDOWS NT , toate apelurile WIN 32 API
foloseau ruta 2b,3b,4b, meninnd o mare parte din sistemul de operare n
spaiul utilizator (de exemplu grafica). ncepnd cu WINDOWS NT 4.0 , o
mare parte din cod a fost trecut n modul nucleu (de fapt n driverul Win 32
GDI).
n WINDOWS 2000 numai un mic numr din apelurile Win 32 API,
cum ar fi crearea proceselor i a firelor de execuie, aleg ruta cea mai lung.
Celelalte aleg ruta prin ocolirea subsistemului Win 32.
n ultimele variante ale sistemului WINDOWS 2000, exist 800
DLL-uri diferite n catalogul /Win nt/system 32. totaliznd 1300 MB,
gdi 32.dll
user 32.dll Proces
utilizator
kernel 32.dll
2b 2a
Proces al
subsistemului
de mediu
(csrss.exl) 3b
3b
4b 3a
4b 3a
Apel
Apel
Apel 1
Subsistem
Win 32
Interfaa sistemului (nt dl.dll)
Sistem de operare
Sisteme de operare 237
numrul apelurilor API coninute n ele fiind aproximativ13060; numrul de
operaii exportate din prima lansare public a ntdll.dll din WINDOWS 2000
este de 1179.
Afar de interfaa de proces Win 32, care este cea mai important i
cel mai des utilizat, mai exist dou interfee, POSIX i 05/2.
POSIX (Portable Operating System Interface)furnizeaz un suport
minim pentru aplicaiile UNIX. Dei ar fi trebuit ca prin mediul POSIX s
se porteze programe UNIX pe WINDOWS 2000, acest lucru este practic
imposibil. Mediul POSIX a fost inclus doar la cerina guvernului SUA care
cere ca sistemele de operare utilizate de guvern s fie compatibile cu
P1003.1, iar mediul POSIX suport acest lucru. Practic, pentru a permite
utilizatorilor UNIX s migreze ctre WINDOWS 2000, Microsoft a pus la
dispoziie un produs, numit Inferix, care ofer un grad mai mare de
compatibilitate dect subsistemul POSIX.
Subsistemul 05/2 este limitat n funcionalitate i nu suport nici o
aplicaie grafic, practic fiind nefolositor. Deci, ideea de a avea mai multe
interfee de sistem de operare implementate de diferite procese din spaiul
utilizator este, n esen, pierdut, singura interfa rmnnd Win 32.
10.8.1.Implementarea obiectelor n SO WINDOWS
2000
Obiectele sunt probabil conceptul cel mai important din WINDOWS
2000. Ele asigur o interfa uniform i consistent ctre toate resursele
sistemului i ctre structurile de date.
Un obiect este o colecie de variabile legate ntre ele printr-un set de
proceduri numite metode, care in loc de fiiere sau documente.
Iat cteva din aspectele cele mai importante ale utilizrii obiectelor
n WINDOWS 2000:
-toate obiectele sunt denumite i accesate n acelai fel;
-prezint o securitate mult mai bun, din moment ce toate accesele la
obiecte trec obligatoriu prin acelai loc: managerul de obiecte; n consecin
toate verificrile de securitate sunt puse ntr-un singur loc, pe care nici un
proces nu poate s-l ocoleasc;
-partajarea obiectelor ntre procese funcioneaz ntr-un mod
uniform;
-tergerea obiectelor se face n siguran, tot datorit managerului de
obiecte.
n figura 10.9. este prezentat structura unui obiect.
Sorin Adrian Ciureanu 238
Fig. 10.9. Structura unui obiect.
Fiecare obiect conine un antet cu anumite informaii comune tuturor
obiectelor de toate tipurile. Cmpurile din acest antet includ: numele
obiectului, catalogul n care se afl, informaia de securitate i o list de
procese cu referine deschise ctre obiect.
Antetul de obiect conine un cmp de ncrcare a cotei, care
reprezint cota perceput proceselor pentru deschiderea obiectului. Dac un
obiect fiier cost 1 punct i un proces aparine unui job care are o cot de
30 de puncte, procesele din acel job pot deschide n total numai 30 de
fiiere. n acest el se pot fixa limite de resurse pentru fiecare tip de obiect
separat. Cnd un obiect trebuie ters, spaiul su de adrese trebuie recuperat.
Mecanismul de recuperare const ntr-un contor de referine n antetul
A
n
t
e
t
u
l
o
b
i
e
c
t
u
l
u
i
Numele obiectului
Directorul n care se afl obiectul
Informaie de securitate
Costul folosirii obiectului
Lista proceselor, cu referine
Contoare de referin
Indicator ctre obiectul de tip
Date specifice obiectului
D
a
t
e
l
e
o
b
i
e
c
t
u
l
u
i
o
b
i
e
c
t
u
l
u
i
Tipuri de acces
Drepturi de acces
Costul de folosire a obiectului
Sincronizabil
Paginabil
Metoda de deschidere
Metoda de nchidere
Metoda de tergere
Metoda de cerere nume
Metoda de audibilitate
Metoda de securitate
Numele tipului
Sisteme de operare 239
fiecrui obiect. Contorul este incrementat de fiecare dat cnd un obiect este
deschis i decrementat de fiecare dat cnd este nchis. Cnd ajunge la
valoarea 0, nici un utilizator nu mai deine o referin ctre obiect. Cnd un
obiect este nsuit sau eliberat de o component executiv, un al doilea
contor este incrementat sau decrementat., cu toate c nu este emis efectiv
nici o referin. Cnd amndou contoarele ajung la 0, nici un proces
utilizator i nici un proces executiv nu mai folosete obiectul, aa c acesta
poate fi ters i memoria sa eliberat.
Obiectele sunt tipizate, fiecare obiect avnd proprietile tuturor
obiectelor de acelai tip. Informaia obiectului de tip include elemente cum
ar fi: denumirea tipului, ateptarea unui obiect la mutex-uri sau semafoare
etc. Foarte importante n coninutul unui obiect sunt referinele la codul
pentru anumite operaii standard ca: open, close, delete.
Sorin Adrian Ciureanu 240
Sisteme de operare 241
Capitolul 11
SISTEMUL DE OPERARE LINUX.
APLICAII
11.1. SCURT ISTORIC
Anul 1965 poate fi considerat ca punct de pornire pentru sistemul de
operare UNIX. Atunci a fost lansat la MIT (Massachusets Institute of
Technology) un proiect de cercetare pentru crearea unui sistem de operare
multiutilizator, interactiv, punndu-se la dispoziie putere de calcul i spaiu
de memorie n cantitate mare. Acest sistem s-a numit MULTICS. Din el,
Ken Thompson a creat n 1971 prima versiune UNIX. De atunci UNIX-ul a
cunoscut o dezvoltare puternic n noi versiuni.
In 1987, profesorul Andrew Tanenbaum creeaz, la Vrije
Universiteit din Amsterdam, un sistem de operare , asemntor cu UNIX-ul,
cu scop didactic, pentru dezvoltare de aplicaii, numit MINIX.
Pornind de la MINIX, un tnr student finlandez, Linus Torvalds, a
realizat n anul 1991 un sistem de operare mai complex, numit LINUX.
Datorit faptului c a fost nc de la nceput free , LINUX-ul a cunoscut
o puternic dezvoltare, fiind sprijinit da majoritatea firmelor mari, cu
excepia, bineneles, a MICROSOFT-ului.
n anul 1998 s-a format Free Standars Group n cadrul cruia exist
iniiative de standardizare pentru a ncuraja dezvoltarea de programe i
aplicaii n LINUX. Ceea ce a lipsit mult vreme LINUX-ului a fost un
standard pentru ierarhia din sistemul de fiiere al programelor i aplicaiilor
dar mai ales al bibliotecilor.
Lucrul cel mai important n LINUX este faptul c ntregul sistem de
operare i o serie ntreag de operaii sunt puse la dispoziie, inclusiv
sursele. Multe universiti i faculti de specialitate i dezvolt propriile
aplicaii n LINUX.
Sorin Adrian Ciureanu 242
11.2. DISTRIBUII N LINUX
LINUX-ul este un sistem distribuit. Dintre cele trei specii de sisteme
cu procesoare multiple i anume: multiprocesoare, multicomputere i
sisteme distribuite, sistemele distribuite sunt sisteme slab cuplate, fiecare
din noduri fiind un computer complet, cu un set complet de periferice i
propriul sistem de operare.
Exist la ora actual peste 300 de distribuii n LINUX. Vom trece n
revist cele mai importante i mai utilizate distribuii.
11.2.1. Distribuia SLACWARE
Creatorul acestei distribuii este Patrick Volkerding, prima versiune
fiind lansat de acesta n aprilie 1993. Aceast distribuie are dou prioriti
de baz: uurina folosirii i stabilitatea.
Instalarea se face n mod text, existnd posibilitatea alegerii unui
anumit KERNEL la bootare, dei cel implicat este suficient, n general,
pentru o instalare normal.
Formatul standard al pachetelor SLACKWARE este .tgz i exist o
serie de programe de instalarea, upgradarea i tergerea pachetelor, cum ar fi
install pkg, upgrade pkgrd, care nu pot fi folosite dect direct din linia de
comand.
11.2.2. Distribuia REDHAT
Este una din cele mai rspndite distribuii. Conine un sistem de
pachete RPM, sistem ce ntreine o baz de date cu fiierele i pachetele din
care provin.
Versiunea REDHAT conine codul surs complet al sistemului de
operare i al tuturor utilitarelor, cea mai mare parte a acestuia fiind scris n
limbajul C.
La instalarea sistemului nu se permit dect partiii tip ext 2 i ext 3.
Exist module de kernel i sisteme jurnalizate, ca JFS sau Reiser FS, care
pot fi montate i dup instalare. La instalare se poate configura un sistem
FireWall cu trei variante de securitate, High, Medium i N.FireWall.
Exist o sut de aplicaii destinate configurrii n mod grafic a
sistemului, aplicaii specifice att interfeei GNOME ct i KDE.
Sisteme de operare 243
11.2.3. Distribuia DEBIAN
Este considerat cea mai sigur dintre toate distribuiile existente. De
aceast distribuie se ocup o comunitate restrns de dezvoltatori, pachetele
fiind foarte bine studiate i testate nainte de a fi lansate ca release-uri ntr-
o distribuie. De obicei, aplicaiile i programele sunt cu cteva versiuni n
urma celorlalte distribuii. Nu exist, n general, o activitate comand de
promovare a acestei distribuii, singurul suport fiind asigurat de o list de
discuii.
Procedura de instalare este una din cele mai dificile. Exist dou
posibiliti de instalare:
a)simpl;
b)avansat.
n varianta simpl se aleg taskuri de instalare, fiecare task
presupunnd instalarea mai multor pachete reunite de acesta.
n cazul unei variante avansate, exist posibilitatea alegerii efective a
fiecrui pachet n parte.
Meritul de baz al acestei distribuii este acela c este cea mai
apropiat de comunitatea Open Source. Pachetele sunt de tipul deb i sunt
administrate cu ajutorul unui utilitar numit APT(Advanced Package Tool).
11.2.4. Distribuia MANDRAKE
Este o distribuie care pune baz pe o mare internaionalizare, fiind
disponibile versiuni de instalare n 40 de limbi. Exist i o distribuie n
limba romn, n dou variante de manipulare a tastaturii, gwerty i qwertz.
MANDRAKE are un sistem de gestiune dual:
a)Linux Conf;
b)Drak Conf.
Linus Conf reprezint motenirea de la RedHat i permite
modificarea setrilor obinuite ale sistemului: gestiunea utilizatorilor, a
serviciilor (dns, mail, rtp), configurarea plcii de reea.
Drak Conf este un utilitar care se dorete a fi pentru LINUX ceea ce
Control Panel reprezint pentru WINDOWS. El permite configurarea
sistemului de la partea hardware ce folosete Hard Drake (plci de reea,
video, sunet, tuner) pn la cele mai utilizate servicii (web rtp, dns, samba,
NIS, firewall). Au fost introduse wizard-uri pentru toate serviciile ce pot fi
setate grafic.
Sorin Adrian Ciureanu 244
11.2.5. Distribuia LYCORIS
Este o companie foarte tnr care i-a propus drept scop crearea
unei versiuni Linux foarte uor manevrabil. Instalarea acestei distribuii
este cea mai simpl instalare dintre toate existente pn n prezent. Nu este
permis nici un fel de selecie a pachetelor, individuale sau n grup. Procesul
de instalare ncepe imediat dup alegerea partiiilor, rulnd n fundal, iar
configurrile sistemului se realizeaz n paralel.
O aplicaie util este Network Browser, realizat de Lycoris, care
permite interconectarea simpl cu alte sisteme Linux sau Windows. Aceast
versiune de Linux se adreseaz utilizatorilor obinuii cu mediile de lucru
Microsoft Windows. n acest sens, desktopul conine MyLinux System i
Network Browser. Configurarea sistemului se realizeaz prin intermediul
unui Control Panel care este de fapt KDE Control Center. Managerul
sistemului de fiiere, Konqueror, reunete aplicaiile executabile de ctre
Microsoft Windows i le ruleaz cu ajutorul programului Wine, cu care se
pot chiar instala programe Windows.
11.2.6. Distribuia SUSE
SUSE este distribuia european (de fapt german) cea mai
cunoscut i de succes. Se axeaz pe personalizarea sistemului n ct mai
multe ri europene. Din pcate limba romn lipsete din aceast
distribuie.
11.3. APLICAII LINUX
Vom prezenta n aceste aplicaii o serie de programe pe baza unor
apeluri sistem sau a unor funcii din LINUX. Mediul de programare este
limbajul C.
Aplicaiile sunt structurate pe modelul unui laborator la disciplina
Sisteme de operare, fiecare lucrare de laborator prezentnd trei pri:
1) Consideraii teoretice asupra lucrrii.
2) Desfurarea lucrrii, cu exemple de programe.
Sisteme de operare 245
3) Tema pentru lucru individual, care, de obicei, propune crearea de
diferite programe n contextul lucrrii respective.
11.3.1. Comenzi LINUX
1) Consideraii teoretice
Vom prezenta aici cteva din comenzile principale ale sistemului de
operare LINUX, date pe linia de comand. Aceste comenzi reprezint
interfee ntre utilizator i sistemul de operare i ele sunt de fapt programe ce
se lanseaz n execuie cu ajutorul unui program numit interpretor de
comenzi sau, in terminologia UNIX, numit shell.
2)Desfurarea lucrrii
a) Comenzi pentru operaii asupra proceselor.
Listarea proceselor active n sistem.
Comanda ps (process status) furnizeaz informaii detaliate, n
funcie de opiunile afiate, despre procesele care aparin utilizatorului.
Comanda $ps, cu urmtorul exemplu de rspuns:
pid TTY STAT TIME COMMAND
3260 p3 R 0:00 bash
3452 p4 W 1:21 ps
4509 p3 Z 5:35 ps
5120 p9 S 8:55 bash
Prima coloan (pid) reprezint identificatorul procesului.
A doua coloan (TTY) reprezint terminalul de control la care este
conectat procesul. Pot fi i adrese de ferestre sau terminale virtuale, cum
este i n exemplul de fa ( valorile p3, p4, p9 sunt adrese de terminale
virtuale).
A treia coloan reprezint starea procesului.
R(Running) = n execuie
S(Sleeping) = adormit pentru mai puin de 20 secunde
I(Idle) = inactiv, adormit pentru mai mult de 20
secunde
W(Swapped
out)
= scos afar din memoria principal i
trecut pe hard disc
Z(Zombie) = terminat i ateapt ca printele s se
termine
N(Nice) = proces cu prioritate redus
A patra coloan (TIME) indic timpul de procesor folosit de proces
pn n prezent.
Sorin Adrian Ciureanu 246
A cincia coloan (COMMAND) listeaz numele programului
executat de fiecare proces.
Dintre opiunile acestei comenzi amintim:
Opiunea $ps -u, cu urmtorul rspuns:
USER pid %CPU MEM VSZ RSS TTY STAT START CMD.
500 3565 0.0 1.4 4848 1336 pts/0 S 19:15 bash
500 3597 0.0 0.7 3824 688 pts/0 R 19:37 ps-u
unde cmpurile noi reprezint:
USER = Numele proprietarului fiierului
%CPU = Utilizarea procesorului de ctre proces
%MEM = Procentele de memorie real folosite de proces
START = Ora la care procesul a fost creat
RSS = Dimensiunea real n memoria procesului(kB)
Opiunea $ps -l , cu urmtorul rspuns:
F S UID PID PPID C PPI NI ADDR SZ TTY TIME CM
D
0 S 500 3565 3563 0 76 0 - 1212 - pts/0 00:00:00 bash
0 R 500 3599 3565 0 78 0 - 1196 - pts/0 00:00:00 ps
unde cmpurile noi reprezint:
UID = Identificatorul numeri al proprietarului procesului
F = Fanioane care indic tipul de operaii executate de
proces
PPID = Identificatorul procesului printe
NI = Incrementul de planificare al procesului
SZ = Dimensiunea segmentelor de date al stivei
WCHAN = Evenimentul pe care procesul l ateapt
Opiunea $ps -e determin ca la fiecare comand s se afieze att
argumentele ct i ambiana de execuie.
Opiunea $ps -a determin afiarea de informaii i despre procesele
altor utilizatori momentani conectai n sistem.
Listarea activitilor diverilor utilizatori
Comanda $W, cu urmtorul rspuns:
USER TTY FROM LOGING IDLE JLPU PCPU WHAT
Ion 0 - 7:13pm ? 0,00s 0,32s jusr/bin/gnome
Ion pts/0 0:0 7:15pm 0,00s 0,06s 0,01s W
Listarea dinamic a proceselor din sistem
Comanda $top cu care se poate avea o imagine dinamic a
proceselor din sistem i nu o imagine static ca la comanda W. Perioada de
actualizare este implicit de 5 secunde.
b) Comenzi pentru operaii generale asupra fiierelor i cataloagelor:
Comanda $pwd , pentru afiarea numelui catalogului curent.
Sisteme de operare 247
Comanda $ls , pentru afiarea coninutului unui catalog ; este
echivalent cu comanda DIR din MS-DOS. Cele mai des utilizate opiuni
sunt $ls -l , $ls -al, $ls -li bin.
Comanda $cd , pentru schimbarea catalogului curent; nume catalog.
Comanda $rm , pentru tergerea unei intrri n catalog; nume
catalog.
Comanda $cat , pentru listarea coninutului unui fiier; nume fiier,
cu opiunile cele mai frecvente $cat -n , (afieaz numrul de ordine la
fiecare linie din text) i $cat -v (afieaz i caracterele netipribile).
Comanda $cp , pentru copierea unui fiier; nume1, nume2.
Comanda mv, redenumirea unui fiier; surs destinaie.
3) Tem
S se realizeze toate comenzile prezentate n aceast lucrare,
folosind un utilitar al LINUX-ului, de preferin mc.
11.3.2. Crearea proceselor
1) Consideraii teoretice
Pentru crearea proceselor LINUX folosete apelul sistem
fork(). Ca urmare a acestui apel un proces printe creeaz un proces
fiu. Funcia fork() returneaz o valoare dup cum urmeaz:
-1, dac operaia nu s-a putut efectua, deci eroare;
0, n codul FIULUI;
PID FIU, n codul printelui.
n urma unui fork procesul fiu, nou creat, va moteni de la printe
att codul ct i segmentele de date i stiva. n ceea ce privete sincronizarea
printelui cu fiul, nu se poate spune care se va executa mai nti, fiul sau
printele. Se impun dou probleme majore:
a) sincronizarea printelui cu fiul;
b) posibilitatea ca fiul s execute alt cod dect printele.
Pentru a rezolva aceste dou situaii se folosesc dou apeluri:
wait() i exec().
Funcia wait() rezolv sincronizarea fiului cu printele . Este
utilizat pentru ateptarea terminrii fiului de ctre printe. Dac punem un
wait() n cadrul printelui, se execut nti fiul i apoi printele. Exist
dou apeluri:
pid_t wait(int*status)
pid_t waitpid(pid_t pid, int*status, int
flags)
Sorin Adrian Ciureanu 248
Prima form wait() este folosit pentru ateptarea terminrii
fiului i preluarea valorii returnate de acesta. Parametrul status este
utilizat pentru evaluarea valorii returnate, cu ajutorul ctorva macro-uri
definite special.
Funcia waitpid() folosit ntr-un proces va atepta un alt proces
cu un pid dat.
Funcia exec() are rolul de a face ca fiul s execute alt cod dect
printele. Exist mai multe forme ale acestei funcii : execvp, execle,
execvl, execlp, execvp. De exemplu, pentru execvp avem
sintaxa:
int execvp(const char*filename,const* char arg)
Prin aceast funcie fiul va executa, chiar de la creare, fiierul cu
nume filename.
Deoarece este prima aplicaie cu programe scrise i executate n
limbajul C, prezentm mai jos etapele lansrii unui program n C, n
sistemul de operare LINUX.
-Se editeaz un fiier surs in limbajul C, utiliznd un editor de texte,
de exemplu vi, kate sau mc. Se numete fiierul, de exemplu nume
fiier.c
-Se compileaz fiierul editat n C cu comanda:
$gcc numefiier.c
-Se execut fiierul rezultat n urma compilrii.
$ . /a.out
2)Desfurarea lucrrii
-Programul a
#include<stdio.h>
#include<sys/wait.h>
#include<unistd.h>
#include<sys/types.h>
main()
{int pid,status,i;
if((pid=fork())<0) {printf(EROARE;
exit(0);}
if(pid==0) {printf(am pornit copilul\n);
for(i=1;i<=25;i++)
{fflush(stdout);
printf(0);}
Sisteme de operare 249
exit(1);}
else {wait(&status);
printf(am pornit printele\n);
for(i=1;i<=25;i++)
{fflush(stdout);
printf(1);}}}
Aceasta este o schem posibil de apelare a funciei fork().
Dac n urma execuiei s-a terminat cu eroare, se va afia
EROARE. Dac suntem n procesul fiu (pid = =0), atunci codul
fiului nseamn scrierea a 25 cifre de 0, iar dac suntem n procesul printe,
se vor scrie 25 cifre de 1. Deoarece avem apelul wait n cadrul printelui,
nti se va executa fiul i apoi printele. Pe ecran se va afia:
am pornit copilul 0000000000000000000000000
am pornit printele 1111111111111111111111111
Rolul fflush(stdout) este de a scrie pe ecran, imediat ce
bufferul stdout are un caracter n el. Fr fflush(stdout),
momentul scrierii pe ecran este atunci cnd stdout este plin. n acest caz
trebuie s tim cnd se afieaz pe ecran ceva. Dac acest program nu ar
conine wait , atunci nu s-ar ti cine se execut primul i cine al doilea,
fiul i printele lucrnd n paralel. n programul nostru, cnd fiul tiprete
numai 0 iar printele numai 1, ar trebui ca, la o rulare, s avem la printare o
secven de 0 ,1 amestecat.( Ex: 0011101010110). Dar, dac rulm de
multe ori acest program, constatm c de fiecare dat el va tipri mai nti
25 de 0 i apoi 25 de 1, ca i cum a exista wait-ul. Care este
explicaia? Ea trebuie cutat n modul de rulare, n time sharing, n funcie
de cuanta de timp alocat fiecrui proces. Oricum ea este foarte mare n
raport cu duratele proceselor printe i fiu din exemplul nostru. De aceea,
procesele fiu i printe nu vor fi ntrerupte din rularea n procesor, deoarece
ele se termin amndou ntr-o singur cuant.
-Programul b
#include<stdio.h>
#include<sys/wait.h>
#include<unistd.h>
#include<sys/types.h>
main()
{int pid,status,i;
if((pid=fork())<0) {printf(EROARE);
exit(0);}
Sorin Adrian Ciureanu 250
if(pid==0) {printf(am pornit copilul\n);
execlp(./sorin1,./sorin1,NULL);
exit(1);}
else {wait(&status);
printf(am pornit printele\n};
for (i=1;i<=25;i++)
{fflush(stdout);
printf(1);}}}
unde sorin1 este un fiier executabil ce se obine prin compilarea
fiierului surs sorin1.c astfel:
$gcc -o sorin1 sorin1.c
Fiierul sorin1.c are coninutul:
#include<stdio.h>
main()
{int i;
for(i=1;i<=25;i++)
printf(0);}
Se observ c n acest program n codul fiului avem funcia execlp
care va nlocui codul printelui prin codul dat de fiierul executabil
sorin1 care, de fapt, realizeaz acelai lucru ca la programul anterior.
Rezultatul rulrii va fi:
0000000000000000000000000
am pornit printele 1111111111111111111111111
Fa de rezultatul de la programul anterior, nu se mai execut
printf(am pornit copilul). Din ce cauz? Pentru c atunci
cnd se execut fiul, printarea am pornit copilul este trecut n
bufferul stdout, ns cnd se execut execlp, bufferul se golete i se
execut strict numai fiierul sorin1.
Programul c
#unclude<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
main()
{pid_t copil_pid;
copil_pid=fork();
if(copil_pid>0)
/*suntem n printe i vom dormi 120 secunde*/
sleep(120);
Sisteme de operare 251
if(copil_pid==-1) {printf(EROARE);
exit(0);}
else {printf(pid copil%d\n,
getpid());
exit(1);
/*suntem n copil i ieim imediat*/}}
n acest program fiul i termin execuia imediat iar printele este
ntrziat cu 120 secunde. n acest timp fiul intr n starea zombie, pn cnd
procesul init(), care preia copiii orfani, va prelua rolul de printe al
fiului i l va scoate din starea zombie, elibernd tabela proceselor.
Programul se compileaz cu:
$gcc -o zombie numefiier.c
i se execut astfel :
$ ./zombie &
Dac se lanseaz comanda :
$ps -a
se poate observa ct timp st fiul n starea zombie, pn l preia procesul
init()
Program d
#include<stdio.h>
#include<unistd.h>
main()
{int i/*iterator*/
sum=0;
if(fork()<0){perror(eroare la fork);return(1);}
for(i=0;i<=100;i++)
{printf(valoarea lui i este%d\n,i);
fflush(stdout):}
sum+=i;}
printf(suma este%d\n,sum);return(0);}
va fi afisata de 2 ori suma primelor 100mde numere naturale dar valorile
iteratiei i vor altera in functie de care dintre ceel doua procese este
programat sa ruleze
3) Tem
S se scrie un program care s creeze 10 procese. Fiecare proces va
scrie o linie numai cu cifre; procesul 0 va scrie o linie de 0, procesul 1 va
scrie o linie numai de 1.. procesul 9 va scrie o linie numai de 9. Liniile
vor trebui scrise n ordinea cifrelor, deci prima linie de 0 i ultima de 9.
Sorin Adrian Ciureanu 252
11.3.3 Gestiunea fisierelor
11.3.3. Comunicare ntre procese
11.3.3.1. Comunicarea ntre procese prin
PIPE-uri i FI FO
1) Consideraii teoretice
a) Pipe-ul este un pseudofiier care servete la comunicarea
unidirecional ntre dou procese. Faptul c este unidirecional a fost
considerat ulterior ca una dintre limitele mecanismului i de aceea unele
versiuni actuale au nlocuit pipe-ul unidirecional prin cel bidirecional.
Astfel la SOLARIS pipe-urile sunt bidirecionale dar n Linux sunt
unidirecionale. Aici, deci, vom considera pipe-urile unidirecionale.
O alt caracteristic a pipe-ului este faptul c procesele care
comunic ntre ele trebuie s aib un grad de rudenie, de exemplu tat-fiu.
Un pipe este creat cu apelul:
int pipe (int file des[2]);
care creeaz n kernel un pipe accesibil n procesul apelant prin doi
descriptori:
file des[0] deschis n citire
file des[1] deschis n scriere
n urma apelului pipe exist dou returnri:
0 , n caz de succes,
-1, n caz de eroare.
FILE DES[0] FILE DES[1]
Fig. 11.1. Schema unui pipe unidirecional.
PROCES
KERNEL
PIPE
Sisteme de operare 253
Marea majoritate a aplicaiilor care utilizeaz pipe-urile nchid, n
fiecare dintre procese, captul de pipe neutilizat n comunicarea
unidirecional. Astfel, dac pipe-ul este utilizat pentru comunicaia printe-
fiu, atunci procesul printe scrie n pipe iar procesul fiu citete din pipe.
b)FIFO (pipe-uri cu nume)
Restricia ca procesele care comunic s fie nrudite este eliminat la
pipe-urile cu nume care sunt fiiere de tip FIFO.
Apelul sistem pentru crearea unui FIFO este:
#include<sys/types.h>
#include<sys/stat.h>
int mkfifo(const char*pathname,mode_t mode);
Cele dou argumente ale apelului sunt:
char*pathname, ( numele FIFO-ului)
mode_t mode, (apare numai la deschidere, are loc i
crearea fiierului).
Dup ce FIFO a fost creat, i se pot ataa toate operaiile tipice cu
fiiere (open, read, write, unlink etc.).
2) Desfurarea lucrrii
Programul a
Acesta este un program care transmite un text (text prin
pipe) prin pipe de la procesul printe la procesul fiu.
#include<unistd.h>
#include<sys/types.h>
#define MAXLINE 500
main()
{int n, fd[2];
pid_t pid;
char line [MAXLINE];
if(pipe(fd)<0) {printf(eroare pipe);
exit(0);}
if((pid=fork())<0) { printf(eroare fork)
exit(1);}
else
if(pid>0) {/*printe*/
close(fd[0]);
write(fd[1],text prin pipe,14);}
else {close(fd[1]);/*fiu*/
Sorin Adrian Ciureanu 254
n=read(fd[0],line, MAXLINE);
write(1,line,n);}
exit(0);}
Program b
Programul folosete dou pipe-uri, pipe1 i pipe2, ncercnd s
simuleze un pipe bidirecional. Se va observa c, de fiecare dat cnd se
execut o operaie la un capt al pipe-ului, cellalt capt este nchis.
/*
Se compileaz trei fiiere surs ca obiecte
$gcc c mainpipe.c
$gcc c client.c
$gcc c sever.c
i apoi
$gcc o mainpipe mainpipe.o client.o server.o
Se va crea un fiier cu cteva linii de text
avnd un nume, de exemplu unu, i apoi se lanseaz
$.mainpipe unu
i apare afiat ce era scris n fiierul unu.
*/
mainpipe.c
#include<stdio.h>
main()
{int childpid,pipe1[2],pipe2[2];
if(pipe(pipe1)<0 || pipe(pipe2)<0){
perror(nu pot crea pipe);
if((childpid=fork())<0)
perror(nu pot crea fork);
}else
if(childpid>0) {/*printe*/
close(pipe1[0]);
close(pipe2[1]);
client(pipe2[0],pipe[1]);
Sisteme de operare 255
while(wait((int*)0)!=childpid//wait pt. copil
close(pipe1[1]);
close(pipe2[0]);
exit(0);}
else
{/*copil*/
close(pipe1[1];)
close(pipe2[0]);
server(pipe1[0],pipe2[1]);
close(pipe1[0]);
close(pipe2[1]);
exit(0);
}
}
client.c
#include<stdio.h>
define MAXBUFF 1024
client(int readfd,int writefd)
{
char buff[MAXBUFF];
int n;
/*Citete nume fiier de la standard input*/
if(fgets(buff, MAXBUFF, stdin)==NULL)
perror(Client:eroare nume fiier);
n=strlen(buff);
if(buff[n-1]==\n)
n--;
if(write(writefd,buff,n)!=n)
perror(Client:eroare scriere nume
fiier);
/*Citire date din descriptor IPC i scriere la
standard output*/
while((n=read(readfd,buff,MAXBUFF))>0)
if(write( 1,buff,n) !=n /*fd==1 pt stdout*/
Sorin Adrian Ciureanu 256
perror(Client:eroare citire date);
}
server.c
#include<stdio.h>
define MAXBUFF 1024
server(int readfd,int writefd){
char buff[MAXBUFF];
char errmsg[256];
int n,k,fd;
extern int errno;
/*Citire nume fiier din IPC descriptor*/
if((n=read(readfd,buff,MAXBUFF))<=0)
perror(Server:eroare citire nume
fisier);
buff[n]=\0;
if((fd=open(buff,0))<0){
/*Eroare.Generm un mesaj de eroare i l
trimitem la client*/
sprint(errmsg,:nu pot sa deschid
fisierul\n);
strcat(buff,errmsg);
n=strlen(buff);
if(write(writefd,buff,n)!=n)
perror(server:eroare scriere);
}
else{
perror(ncepem bucla de citire din fisier-
scriere la client.\n);
/*Citete data din fiier i trimite
clientului*/
while((n=read(fd,buff,MAXBUFF))>0)
{
printf(Am citit %d car din fisier\n,n);
if((k=write(writefd,buff,n))!=n)
{printf(Am scris ctre client%d car\n,k);
perror(server:eroare scriere date);
}}
if(n<0)
perror(server:eroare citire);
Sisteme de operare 257
}
}
Program c
Acest program creaz un proces copil care citete dintr-un pipe un
set de caractere trimis de procesul printe, convertind orice liter mic ntr-o
litera mare. Procesul printe citete irul de caractere de la intrarea standard.
#include<stdio.h>
#include<ctype.h>
#include<stdlid.h>
#include<unist.h>
#include<sys/wait.h>
int piped[2]; /*pipe-ul*/
int pid; /*pid-ul fiului*/
int c; /*caracterele citite*/
main()
{if(pipe(piped)<0) /*se creaz pipe-ul 1*/
{perror(eroare pipe);
exit(0);}
if((pid=fork())<0) /*creare proces fiu*/
{perror(eroare fork); exit(1);}
if (pid) /*sunt n procesul
printe*/
{close(piped[0]); /*nchiderea descriptorului
de citire*/
printf(proces printe:introducei irul de
caractere);
/*se citete de la intrarea
standard*/
while(read(0,&c,1))/*se scriu datele n
pipe*/
if(write(piped[1],&c,1)<0)
{perror(eroare scriere);exit(2);}
/*se nchide descriptorul
de scriere n pipe*/
close(piped[1]);
if (wait(NULL)<0)
{perror(eroare wait);exit(3);}
exit(4);}
else
Sorin Adrian Ciureanu 258
{ /*sunt n fiu*/
close(piped[1]); /*se nchide descriptorul
de scriere*/
printf(proces datele\n);
while(read(piped[0],&c,1))
{if(islower(c) /*este litera mic?*/
printf(%c,toupper(c));
else
printf(%c,c);}
close(piped[0]); /*se nchide descriptorul
de citire*/
exit(0);}}
Program d
n acest program se citesc date dintr-un fiier existent, specificat ca
prim argument linie de text, i se trimit prin pipe comenzii sort ce are ieire
redirectat ntr-un fiier specificat ca argumentul al doilea.
#include<stdio.h>
#include<unistd.h>
int main(int argc,char*argv[])
{char buf[81];
char command[80];
FILE*ip;
FILE*pp;
sprintf(command,sort>%s,argv[2]);
ip=fopen(argv[1],r);
pp=fopen(command,w);
while(fgets(buf,80,ip))fputs(buf,pp);
pclose(pp);
fclose(ip);
exit(0);}
Programul se compileaz cu
$gcc -o pope pope.c
i se lanseaz
$./ pope fiierintrare fiierieire
Program e
Sisteme de operare 259
Acest program este asemntor cu programul d numai c de data
aceasta nu mai comunic printele cu fiul prin pipe ci dou procese prin
FIFO, unul client , altul server.
Client (fifoc.c)
/*se compileaz cu
$gcc - o fifoc
i se lanseaz n execuie serverul cu
$ ./fifos
apoi de la alt terminal sau de la acelai dac
am lansat serverul n backround
$./fifoc Sir ce va fi afiat la server
*/
#include<stdio.h>
#include<stdlib.h>
#define FIFO_FILE MYFIFO
int main(int argc, char*argv[])
{
FILE*fp;
if(argc!=2){
printf(Utilizare:fifoc[sir]\n);
exit(1);
}
if((fp=fopen(FIFO_FILE,w))==NULL){
perror(fopen);
exit(1);
}
fputs(argv[1],fp);
fclose(fp);
return(0);
}
Server (fifos.c)
/*fifos.c
Sorin Adrian Ciureanu 260
Se compileaz programul cu comanda
$gcc o fifos fifos.c
i apoi se lanseaz serverul n execuie n
foreground sau backround
$./fifos
ateptnd s se afieze ce s-a scris cu clientul
folosind
$./fifoc Sir ce va fi afisat la server
de la alt terminal sau de la acelai dac s-a
lansat severul n backround */
#include<stdio.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<unistd.h>
#include<linux/stat.h>
#define FIFO_FILE MYFIFO
int main(void)
{
FILE *fp;
char readbuf[100];
/* se creaz FIFO dac nu exist*/
umask(0);
mknod(FIFO_FILE, S_IFIFO|0666, 0);
while(1)
{
fp=fopen(FIFO_FILE, r);
fgets(readbuf, 100, fp);
printf(Am recepionat sirul: %s\n,
readbuf);
fclose(fp);
}
return(0);
}
Sisteme de operare 261
Program f
Acest program arat dac implementarea pipe-
lor permite funcionarea n ambele sensuri (pipe
bidirecionale).
La Solaris pipe-le sunt bidirecionale. La
Linux nu. Aceasta se poate pune n eviden (la
cele bidirecionale)prin reuita citirii n printe
dup ce a scris cu write() citirea, ateptnd
ceva de la copil i nu returnnd ce a scris tot
printele.
Pentru a realiza scenariul, copilul doarme cu
sleep() 4 secunde, timp n care printele ncearc
ce a fost prezentat mai sus.
Se compileaz cu
$gcc o bidi bidi.c
i se lanseaz cu
$.bidi
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char *argv[]){
int fd[2]; int n; char c; pid_t pid;
pipe(fd);
if((pid=fork())==0{//copil
sleep(5);
printf(Copil nainte de read()\n);
if((n=read(fd[0],&c,1)) !=1)
printf(Eroare read() a returnat
%d\n,n);
printf(Copilul a citit %c\n,c);
write(fd[0],c,1);exit(0);}
else if(pid>0){
//printe
printf(Printe nainte de write()\n);
write(fd[1],q,1);
printf(Printe nainte de read()\n);
if((n=read(fd[1],&c,1)) !=1)
printf(printe read() a returnat %d\n,n);
printf((printele a citit %c\n,c);exit(0);}}
Sorin Adrian Ciureanu 262
Program g
/* Acest program se compileaz cu
$gcc o popen popen.c
Se lanseaz n execuie cu
$.popen
Vom obine un file pointer (captul dinspre
noi al pipei) la care vom scrie trei iruri.
La captul cellalt al pipei este comanda sort
ce va afia la STDOUT rezultatul.
*/
#include<stdio.h>
#include<unistd.h>
int main(){
FILE*stream;
stream=popen(sort,w);
fprintf(stream,O ncercare\n);
fprintf(stream,A doua ncercare\n);
fprintf(stream,Ultima ncercare\n);
pclose(stream);
return 0;
}
3) Tem
a)S se creeze un pipe prin care procesul printe va trimite
procesului fiu numai numerele rotunde dintre cele citite de printe de la
tastatur. (Un numr rotund este numrul care, n baza 2, are numrul de
cifre 0 egal cu numrul de cifre 1.
b) S se creeze un FIFO prin care un proces va trimite altui proces
numai numere multiple de 11 dintre cele citite de la tastatur de primul
proces.
11.3.3.2. Comunicarea ntre procese prin semnale
1)Consideraii teoretice
Sisteme de operare 263
Semnalele reprezint unul dintre primele mecanisme de comunicare
ntre procese. Ele anun apariia unui eveniment. Semnalele pot fi trimise
de ctre un proces altui proces sau pot fi trimise de ctre kernel. Momentul
apariiei unui semnal este neprecizat el aprnd asincron.
Un semnal este reprezentat printr-un numr i un nume care se post
vedea prin lansarea comenzii
$kill -1
Se pot trimite semnale:
-cu comanda kill,
-n program cu apelul sistem kill(),
-cu anumite combinaii de chei de la tastatur,
-cnd se ndeplinesc anumite condiii: de exemplu eroare de virgul
mobil (SIGFPE) sau referirea unei adrese din afara spaiului unui proces
(SIGSEGV)
-sau prin kernel care poate semnaliza, de exemplu, prin SIGURG
apariia aut-of-band pe un soclu-socket.
Funcia kill()
Trimite un semnal unui proces sau unui grup de procese.
int kill(pid_t pid,int sig);
Pentru ca un proces s poat trimite un semnalaprocesului identificat
prin pid, trebuie ca user ID-ul real sau efectiv al procesului care trimite
semnalul s se potriveasc cu ID-ul real sau set-user-ID salvat
al procesului care recepioneaz semnalul.
-Dac pid>0 semnalul se trimite tuturor procesului pid;
-dac pid==0 semnalul se trimite tuturor proceselor care fac
parte din acelai grup de procese cu procesul care trimite semnalul, dac
exist permisiunile necesare;
-dac pid==-1 semnalul se trimite tuturor proceselor (cu excepia
unui set nespecificat de procese sistem), dac exist permisiunile necesare;
-dac pid<0&&pid!=-1, semnalul se trimite tuturor proceselor
care fac parte din grupul de procese al crui pgid este egal cu modulul
valorii primului argument, dac exist permisiunile necesare;
-dac al doilea argument este 0, nu se trimite nici un semnal; se
testeaz existena procesului specificat n primul argument.
Exist dou moduri de lucru cu semnalele:
A) folosind standardul iniial (stil vechi, nerecomandat);
B) folosind noul stil.
n ambele situaii, pentru procesul care recepioneaz un semnal,
putem seta trei tipuri de aciuni:
Sorin Adrian Ciureanu 264
-aciunea implicit, reprezentat prin pointerul la funcie SIG_DEL;
-aciunea de a ignora semnalul recepionat, reprezentat prin
pointerul la funcie SIG_IGN;
-aciunea precizat printr-o funcie, numit handler, reprezentat
printr-un pointer la funcie (numele funciei este adresa ei.
A)Standardul vechi
n vechiul stil, pentru a seta o aciune corespunztoare unui semnal
foloseam funcia signal() al crui prototip era:
void(*signal(int sig,void(*handler)(int)))(int);
glibc folosete pentru handlere tipul sig_t.
Mai exist extensia GNU:
typedef void(*sighandler_t handler)(int);
sighandler_t signal(int signum,
sighandler_t handler);
B) Standardul Posix
Cele trei cazuri rmn i aici valabile.
Putem s specificm un handler pentru semnal cnd aciunea este de
tipul captare de semnal:
void handler(int signo);
Dou semnale nu pot fi captate (nu putem scrie handlere pentru ele):
SIGKILL i SIGSTOP.
Putem ignora un semnal prin setarea aciunii la SIG_IN. Pentru
SIGKILL i SIGSTOP nu se poate acest lucru.
Putem seta o aciune implicit prin folosirea lui SIG_IN. Aciunea
implicit nseamn, pentru majoritatea semnalelor, terminarea unui proces.
Dou semnale au aciunea implicit s fie ignorate: SIGCHLD ce este trimis
printelui cnd un copil a terminat i SIGURG la sosirea unor date aut-
of-band.
Funcia sigaction()
Pentru a seta aciunea corespunztoare unui semnal, n loc de funcia
signal() vom folosi funcia sigaction().Pentru aceasta trebuie s
alocm o structur de tipul sigaction:
typedef void(*sighandler_t)(int signo)
struct sigaction
{
sighandler_t sa_handler;/*pointer la o funcie
de captare semnal sau SIG_IGN sau SIG_DEF*/
sigset_t sa mask; /*setul de semnale blocate n
timpul execuiei handlerullui*/
Sisteme de operare 265
unsiged long sa_flags; /*flaguri speciale*/
void(*sa_restorer)(void); /*pointer la o funcie
captare de semnal*/
};
Cteva flaguri:
SA_NOCLDSTOP - un semnal SIGCHLD este trimis printelui
unui proces cnd un copil de-al su a terminat sau e oprit. Dac specificm
acest flag, semnalul SIGCHLD va fi trimis numai la terminarea unui
proces copil.
SA_ONESHOT - imediat ce handlerul pentru acest semnal este
rulat, kernelul va reseta aciunea pentru acest semnal la SIG_DEL.
SA_RESTART apelurile sistem lente care returnau cu eroarea
EINTR vor fi restartate automat fr s mai returneze.
Prototipul funciei sigaction() este:
int sigaction(int signum,struct sigaction act,
struct sigaction oact);
Unde signum este semnalul a crui livrare urmez s fie setat,
prima structur sigaction act conine setrile pe care kernelul le va
utiliza cu privire la semnalul signum, iar a doua structur oact
memoreaz vechile setri (pentru a fi setate ulterior); se poate specifica
NULL pentru ultimul argument dac nu ne intereseaz restaurarea.
Alte funcii utilizate
Tipul de date pe care se bazeaz funciile pe care le vom prezenta
este sig_set i reprezint un set de semnale. Cu acest tip putem pasa uor
o list de semnale kernelului.
Un semnal poate aparine sau nu unui set de semnale.
Vom opera asupra unui obiect sig_set numai cu ajutorul
urmtoarelor funcii:
int sigempzyset(sigset_t*set);
int sigfillset(sigset_t*set);
int sigaddset(sigset_t*set,int signo);
int sigdelset(sigset_t*set,int signo);
int sigismember(const sigset_t*set, int signo)
Observm c primul argument este un pointer la setul de semnale.
sigempzyset() scoate toate semnalele din set, iar sigfillset()
adaug toate semnalele setului. Trebuie neaprat s folosim una din cele
dou funcii pentru a iniializa setul de semnale. sigaddset() adaug un
semnal setului iar sigdelset() scoate un semnal din set.
Sorin Adrian Ciureanu 266
Un concept important referitor la procese l reprezint masca de
semnale corespunztoare procesului. Aceasta precizeaz care semnale sunt
blocate i nu vor fi livrate procesului respectiv; dac un astfel de semnal este
trimis, kernelul amn livrarea lui pn cnd procesul deblocheaz acel
semnal. Pentru a modifica masca de semnale se utilizeaz:
int sigprocmask(int how,const sigset_t*modset,
sigset_t*oldset);
how poate fi:
SIG_BLOCK semnalele coninute n modset vor fi adugate
mtii curente i semnalele respective vor fi i ele blocate.
SIG_UNBLOCK semnalele coninute n modset vor fi scoase din
masca curent de semnale.
SIG_SETMASK masca de semnale va avea exact acelai coninut
cu modset.
Cnd un semnal nu poate fi livrat deoarec eeste blocat, spunem c
semnalul respectiv este n ateptare. Un proces poate afla care semnale sunt
n ateptare cu:
int sigpending(sigset_t*set);
n variabila set vom avea toate semnalele care ateapt s fie livrate
dar nu sunt, deoarece sunt blocate.
Un proces poate s-i suspende execuia simultan cu schimbarea
mtii de semnale pe timpul execuiei acestui apel sistem prin utilizarea lui:
int sigsuspend(const segset_t*mask);
Este scos din aceast stare de oricare semnal a crui aciune este precizat
printr-un handler sau a crui aciune este s termine procesul. n primul caz,
dup execuia handlerului se revine la masca de semnale de dinaintea lui
sigsuspend() iar n al doilea caz (cnd aciunea e s termine procesul)
funcia sigsuspend() nu mai returneaz. Dac masca este specificat
ca NULL, atunci va fi lsat nemodificat.
Concluzii pentru semnalele Posix:
-un semnal instalat rmne instalat-(vechiul stil dezactiva handlerul);
-n timpul execuiei handlerului, semnalul respectiv rmne blocat; n plus,
i semnalele specificate n membrul sa_mask al structurii sigaction sunt
blocate;
-dac un semnal este transmis de mai multe ori cnd semnalul este blocat,
atunci va fi livrat numai odat, dup ce semnalul va fi deblocat;
-semnalele sunt puse ntr-o coad.
Semnale de timp real
Sisteme de operare 267
Modelul de semnale implementat n UNIX n 1978 nu era sigur. n
decursul timpului au fost aduse numeroase mbuntiri i n final s-a ajuns
la un model Posix de timp real.
Vom ncepe cu definiia structurii sigval
union sigval {
int sival_int;
void*sival_ptr;
};
Semnalele pot fi mprite n dou categorii:
1) semnale realtime ale cror valori sunt cuprinse ntre
SIGRTMIN i SIRTMAX (vezi cu $kill_1);
2) restul semnalelor.
Pentru a avea certitudinea comportrii corecte a semnalelor de timp
real va trebui s specificm pentru membrul sa_flags al structurii
sigaction valoarea SA_SIGINFO i s folosim unul din semnalele
cuprinse ntre SIGRTMIN i SIGRTMAX.
Ce nseamn semnale de timp real?
Putem enumera urmtoarele caracteristici:
1)FIFO semnalele nu se pierd; dac sunt generate de un numr de
ori, de acelai numr de ori vor fi livrate;
2)PRIORITI cnd avem mai multe semnale neblocate, ntre
limitele SIGRTMIN i SIRTMAX, cele cu numere mai mici sunt livrate
naintea celor cu numere mari (SIGRTMIN are prioritate mai mare dect
SIRTMIN+1;
3)Comunic mai mult informaie pentru semnalele obinuite
singurul argument pasat era numrul semnalului; cele de tipul real pot
comunica mai mult informaie.
Prototipul funciei handler este:
void func(int signo,siginfo_t*info,void*context);
unde signo este numrul semnalului iar structura siginfo_t
este definit:
typedef struct{
int si_signo;//la fel ca la argumentul signo
int si_code;//SI_USER,SI_QUEUE,SI_TIMER,
SI_ASYNCIO,SI_MESGQ
union sigval si value;/*valoare ntreag sau
pointer de la emitor*/
}siginfo_t;
Sorin Adrian Ciureanu 268
SI_ASYNCIO nsemn c semnalul a fost trimis la terminarea unei
cereri I/O asincrone.
SI_MESGQ nseamn c semnalul a fost trimis la plasarea unui
mesaj ntr-o coad de mesaje goale.
SI_QUEUE nseamn c mesajul a fost trimis cu funcia
sigqueue().
SI_TIMER semnal generat la expirarea unui timer.
SI_USER semnalul a fost trimis cu funcia kill().
n afar de funcia kill() mai putem trimite semnale cu funcia
sigqueue(), funcie care ne va permite s trimitem o union sigval
mpreun cu semnalul.
Pentru SI_USER nu mai putem conta pe si_value. Trebuiesc
i :
act.sa_sigachon=func;//pointer k funcie handler
act.sa_flags=SA-SIGINFO;//rest time
2) Desfurarea lucrrii
Program a
/*Compilm programul cu
$gcc -o semnal semnal.c
i dup lansare observm de cte ori a fost chemat handlerul aciune,
n dou cazuri:
-lsm programul s se termine fr s mai trimitem alte semnale;
-lansm programul n fundal i trimitem mai multe comenzi prin
lansarea repetat:
$kill -10 pid
Ar trebui s gsim valoarea:
10000+nr-de-killuri */
#include<signal.h>
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
sig_atomic_t nsigusrl=0;
Sisteme de operare 269
void aciune(int signal_number{
++nsigusrl;}
int main(){
int i;
struct sigaction sa;
printf(am pid-ul %d\n,getpid());
memset)&sa,0,sizeof(sa));
sa.sa_handler=aciune;
sigaction(SIGUSR!,&sa,NULL);
/*aici efectum calcule.*/
for(i=0;i<10000;i++)
{kill(getpid(),SIGUSR1);}
for(i=0;i<20;i++)sleep(3);
printf(SIGUSR1 a aprut de %d ori\n,
nsigusfl1);
return 0;
}
Program b
#include<signal.h>
/*vom compila programul cu
$gcc-o ter1 ter1
i vom putea lansa programul n fundal cu
$./ter1 &
Vom citi pid-ul copilului i-i vom putea trimite un semnal
cu
$kill-10pid-copil
i vom vedea starea de ieire (corespunztoare semnalului trimis). La
o alt lansare n foreground, lsm programul s se termine i observm
starea de ieire. S se remarce utilizarea handlerului curatare-copil care este
instalat s trateze terminarea unui copil. Aceast abordare permite ca
printele s nu fie blocat ntr-un wait() n ateptarea strii de ieire a
copilului*/
#include<signal.h>
#include<unistd.h>
#include<setjmp.h>
sig_atomic_t copil_stare_exit;
Sorin Adrian Ciureanu 270
void curatare_copil(int signal_number){
int stare;
wait(stare);
copil_stare_exit=stare;
}
int main(){
int i;
pid_t pid_copil;
int copil_stare
struct sigaction sa;
memset(&sa,0,sizeof(sa));
sa.sa_handler=curatare.copil;
sigaction(SIGCHLD,&sa,NULL);
/*aici lucrm*/
pid_copil=fok();
if(pid_copil !=0){
/*suntem n printe*/
printf(pid-ul copilului este %d\n,pid_copil);
sleep(30);//s ne asigurm c nu terminm
naintea copillui
}
else {
/*suntem n copil*/
sleep(15);
execlp(ls,ls,-1,/,NULL;
/*nu trebuie s ajungem aici*/
exit(2);
}
for(i=0;i<10000000;i++);
if(WIFEXISTED(copil_stare_exit)){
prinf(copilul a ieit normal cu starea
exit%d\n,WEXITSTATUS(copil_stare_exit));
printf(n handler de terminare am setat
variabila global la valoarea %d\n,
copil_stare_exit);}
Sisteme de operare 271
else
prinf(copilul a ieit anormal cu semnalul
%d\n,WTERSIG(copil_stare_exit));
return 0;
}
Program c
/*Programul vrea s testeze comportarea real time a semnalelor
din intervalul SIGRTMIN-SIGRTMAX.
Dup fork() copilul blocheaz recepia celor trei semnale.
Printele trimite apoi cte trei salve purtnd informaie (pentru a verifica
ordinea la recepie), pentru fiecare semnal, ncepnd cu semnalul cel mai
puin prioritar. Apoi copilul deblocheaz cele trei semnale i vom putea
vedea cte semnale i n ce ordine au fost primite.
*/
#include<signal.h>
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
typedef void sigfunc_rt(int,siginfo_t*,void*);
static void sig_rt(int,siginfo_t*,void*);
sigfunc_rt*signal_rt(int,sigfunc_rt*,sigset*);
int main(){
int i,j;
pid_t pid;
sigset_t newset;
union sigval val;
printf(SIGRTMIN=%d,SIGRTMAX=%d\n,
(int)SIGRTMIN,(int)SIGRTMAX);
if((pid=fork())==0){//n copil
sigemptyset(&newset);//iniializeaz set
semnale
sigaddset(&newset,SIGRTMIN);//adaug un semnal
setului
Sorin Adrian Ciureanu 272
sigaddset(&newset,SIGRTMIN+1);
sigaddset(&newset,SIGRTMIN+2);
sigprocmask(SIG_BLOCK,&newset,NULL);//blocare
recepie set semnale
signal_rt(SIGRTMIN,sig_rt,&newset);/*folosete
o funcie aparte pentru setare structura sigaction
i apoi cheam funcia sigaction()*/
signal_rt(SIGRTMIN+1,sig_rt,/newset);
signal_rt(SIGRTMIN+2,sig_rt,/newset);
sleep(6);//delay pentru a lsa printele
s trimit toate semnalele
sigprocmask(SIG_UNBLOCK,&newset,
NULL)//deblochaz recepia semnalelor
sleep(3)//las timp pentru livrarea semnalelor
exit(0);
}
//n printe
sleep(3);//las copilul s blocheze semnalele
for(i=SIGRTMIN+2;i>=SIGRTMIN;i--){
for(j=0;j<=2;j++){
val.sival_int=j;
sigqueue(pid,i,val);/*n loc de kill() folosim
aceast funcie pentru trimitere semnal cu
argumentele:pid_copil,nr_semnal,extra_valoare*/
printf(am trimis semnal %d,val=%d\n,i,j);
}
}
exit(0);
}
static void sig_rt(int signo,siginfo_t*info,
void*context){
ptintf(recepie semnal #%d,code=%d,
ival=%d\n,signo,\infosi_code,
infosi_value.sival_int);
}
/*vom seta structura sigaction i apoi vom
apela funcia sigaction() pentru a comunica
kernelului comportamentul dorit*/
Sisteme de operare 273
sigfunc_rt*signal_rt(int signo,
sigfunc_rt*func,sigset_t*mask)
{
struct sigaction act,oact;
act.sa_sigaction=func;
act.sa_mask)*mask;
act.sa_flags=SA-SIGINFO;//foarte important
pentru a activa realtime
if(signo==SIGALRM){
#ifdef SA_INTERUPT
act.sa_flags|=SA_INTERUPT;
#enddif
}else{
#ifdef SA_RESTART
act.sa_flags|=SA_RESTART;
#endif
}
if(sigaction(signo,&act,&oact)<0)
return((sigfunc.rt*)SIG_ERR);
return(oact.sa_sigaction);}
3) Tem
S se scrie un program care terge n 10 minute, toate fiierele
temporare, (cu extensie.bak), din directorul curent.
11.3.3.3. Comunicaie ntre procese prin sistem V I PC.
Cozi de mesaje
Mecanismele de comunicare ntre procese prin sistem V IPC sunt de
trei tipuri:
-cozi de mesaje;
-semafoare;
-memorie partajat.
Pentru a genera cheile necesare obinerii identificatorilor, care vor fi
folosii n funciile de control i operare, se utilizeaz funcia ftok():
#include<sys/ipc.h>
key_t ftok(const char*pathname,int id);
unde tipul de dat keyt_t este definit n <sys/types.h>
Funcia folosete informaii din sistemul de fiiere pornind de la
pathname, numrul i-node i din LSB-ul lui id. Pathname nu
Sorin Adrian Ciureanu 274
trebuie ters i recreat ntre folosiri deoarece se poate schimba i-node-
ul. Teoretic nu este garantat c folosind dou pathname-uri diferite i
acelai id vom obine dou chei de 32 bii diferite. n general, se convine
asupra unui pathname unic ntre clieni i server i dac sunt necesare
mai multe calale se utilizeaz mai multe id-uri.
Structura ipc-perm
O structur nsoete fiecare obiect IPC
struct ipc_perm{
uid_t uid;
gid_tgid;
uid_t cuid;
gid_t cgid;
mode_t mode;
ulong seq;
key_t key;
}
uid i gid sunt id-urile proprietar, cuid i cgid sunt id-urile creator
ce vor rmne neschimbate, mode conine permisiunile read-write,
seq un numr de secven care ne asigur c nu vor fi folosite de procese
diferite din ntmplare i, n final,cheia key.
Pentru a obine identificatorul care va fi utilizat n funcia de control
i operare cu ajutorul funciilor _get(), putem folosi ca prim argument o
valoare ntoars de funcia ftok() sau valoarea special IPC- PRIVATE
(n acest caz avem certitudinea c un obiect IPC nou i unic a fost creat,
deoarece nici o combinaie de pathname i id nu va genera valoarea 0,
datorit faptului c numrul de i-nod este mai mare ca zero).
Se pot specifia n oflag IPC_CREAT,cns de va crea o nou
intrare, corespunztor cheii specificate dac nu exist sau
IPC_CREAT|IPC_EXCL cnd,la fel ca mai sus, se va crea o nou cheie
dac nu exist sau va returna eroarea EEXIST dac deja exist. Dac
serverul a creat obiectul, clienii pot s nu specifice nimic.
Permisiuni IPC
n momentul creerii unui obiect IPC cu una din funciile _get(),
urmtoarele informaii sunt salvate n structura ipc_perm:
-permisiunile dec read sau/i write pentru user, grup i alii:
0400 read de ctre user
0200 write de ctre user
0040 read de ctre grup
0020 write de ctre grup
Sisteme de operare 275
0004 read de ctre alii
0002 write de ctre alii
-cuid i cgid (id-urile creator) sunt setai la uid-ul
efectiv i gid-ul efectiv al procesului chemtor (acetia nu se pot
schimba)
-uid i gid sunt setai la fel ca mai sus; se numesc uid i gid
proprietar; se pot schimba prin apelul unei funcii de control ctl( )
cu argument IPC_SET.
Verificarea permisiunilor se face att la deschiderea obiectului cu
_get( ) ct i de fiecare dat cnd un obiect IPC este folosit. Dac un
obiect, la deschidere, are precizat pentru membrul mode s nu aib drept de
read grupul i alii i un client, i un client folosete un oflag ce include
aceti bii, va obine o eroare chiar la _get( ). Aceast eroare s-ar putea
ocoli prin precizarea unui flag 0, dar de aceea se vor verifica la orice
operaie permisiunile.
Iat ordinea testelor-la prima potrivire se acord accesul:
-superuserului i se permite accesul;
-dac uid-ul efectiv este egal cu uid-ul sau cuid-ul
obiectului IPC i dac bitul corespunztor din membrul mode este setat, se
permite accesul;
-dac gid-ul efectiv este egal cu cu gid-ul sau cgid-ul
obiectului IPC i bitul corespunztor din membrul mode al obiectului este
setat, accesul este permis;
-dac bitul corespunztor din membrul mode al obiectului IPC este
setat, se permite accesul.
Comenzi de vizualizare IPC
$ipcs, pentru a vedea informaii pentru fiecare IPC.
Pentru a terge IPC-uri din sistem folosim:
$ipcrm -q msg_id (pentru cozi)
$ipcrm -m shm_id (pentru memorie partajat)
$ipcrm -s sem_id (pentru semafoare)
Exist i o sintax cu aceleai opiuni dar cu litere mari unde se
specific ca ultim argument cheia.
Cozi de mesaje
Un proces cu privilegiile corespunztoare i folosind identificatorul
cozii de mesaje poate plasa mesaje n ea, dup cum un proces cu privilegiile
corespunztoare poate citi mesajele. Nu este necesar (la fel ca la POSIX) ca
un proces s atepte mesaje inainte ca s plasm mesaje n coad.
Sorin Adrian Ciureanu 276
Kernelul pstreaz informaiile pentru o coad ntr-o structur
definit n <sys/msg.h> ce conine :
struct msgid_ds {
struct ipc_perm msg_perm;//permisiuni read-
write
msgqnum_t msgqnum; //nr.mesaje prezente n
coad
msglen_t msg_qbytes ; //nr.max de bytes
permii n coad
pid_t msg_lspid ; //pid-ul ultimei operaii
msgsnd()
pid_t msg_lrpid ; //pid-ul ultimei operaii
msgrcv()
time_t msg_stime ; //timpul ultimei operaii
msgsnd()
time_t msg_rtime; //timpul ultimei operaii
msgrcv()
time_t msg_ctime ; /*timpul ultimei operaii
msgctl() ce a modificat structura*/
La LINUX tipurile msgqnum_t, msglen_t,pid_t
sunt ushort.
Funcia msgget()
Are prototipul:
int msgget(key_t key, int msgflg);
O nou coad de mesaje este creat sau se acceseaz o coad
existent. Valoarea de retur este identificatorul cozii de mesaje i aceasta va
fi folosit ca prim argument pentru celelalte funcii de control i operare.
Primul argument al funciei poate fi IPC_PRIVATE sau o valoare
obinut prin apelul funciei ftok(). O nou coad este creat dac
specificm IPC_PRIVATE pentru msgflg sau dac nu specificm
IPC_PRIVATE dar specificm IPC_CREAT i nici o coad nu este
asociat cu key. Altfel va fi doar referit.
Flagul IPC_EXCL, dac este mpreun cu IPC_CREAT (prin
folosirea lui | ), face ca funcia msgget() s returneze eroarea EEXIST
dac coada exist deja.
La crearea unei noi cozi se vor iniializa urmtorii membri ai
structurii msqid_ds :
Sisteme de operare 277
-msg_perm.cuid i msg_perm.uid sunt setai la userul
uid efectiv al procesului chemtor;
-msg_perm.cgid i msg_perm.gid sunt setai la gid-ul
efectiv al procesului apelant;
-cei mai puin semnificativi 9 bii ai lui msg_perm.mode sunt
setai la valoarea celor mai puin semnificativi 9 bii ai lui msflg.
-msg-qnum, msg-lspid, msg-lrpid,msg-stime,
msg_rtime, sunt setai la 0;
-msg_ctime este setat la timpul curent;
-msg_qbytes este setat la limita sistemului de
operare( la Linux MSGMNB).
Alte erori returnate:
EACCES dac un identificator exist pentru key dar procesul
apelant nu are permisiunile necesare;
EIRDM (Linux) coada este marcat pentru tergere;
ENOENT - coada nu exist i nici nu s-a specificat IPC_CREAT;
ENOMEM - (Linux) o coad trebuie creat dar nu exist memorie
pentru structura de date.
Funcia msgsnd()
Cu ajutorul funciei:
int msgsnd(int msqid,cont void*msgp,size_t,
int msgflg);
vom trimite un mesaj n coada specificat prin identificatorul msquid. Al
doilea argument este un pointer ctre un buffer, definit de utilizator, care
are n primul cmp o component de tip long i care specific tipul
mesajului, urmat apoi de poriunea de date.
n Linux prototipul funciei este:
int msgsnd(int msquid, struct msgbuf*msgp,
size_t msgsz,int msgflg);
Funcia msgrcv()
Pentru a citi din coad folosim:
size_t msgrcv(int msqid, void*msgp,
size_t msgsz,int msgflg);
Argumentul msgp este un pointer la o structur buffer, definit de
utilizator, care conine ca prim membru un ntreg de tip long ce specific
tipul mesajului urmat de zona de date:
struct msgbuf{
long mtype;
char mtext[1];
Sorin Adrian Ciureanu 278
};
Primul membru reprezint tipul mesajului recepionat. mtext este
textul mesajului. Argumentul msgsz specific lungime n bytes a
componentei mtext. Mesajul recepionat va fi trunchiat la lungimea
msgsz dac n cadrul flagurilor msgflg precizm MSG_NOERROR. Altfel
funcia msgrcv() va returna eroarea E2BIG.
Argumentul msgtype determin politica la recepie astfel:
-dac = = 0, primul mesaj din coad este solicitat;
-dac = = n>0, primul mesaj de tipul n este solicitat;
-dac = = n<0, primul mesaj al crui tip este mai mic sau egal cu valoarea
absolut a lui msgtyp va fi solicitat.
Argumentul msgflg precizeaz cum s se procedeze dac tipul
dorit nu este n coad:
-dac msgflg conine i IPC_NOWAIT, funcia msgrcv() va returna
imediat cu eroarea ENOMSG; astfel se intr n sleep pn cnd:
-un mesaj de tipul dorit este disponibil n coad;
-coada creia i solicitm un mesaj este distrus de altcineva, astfel c
msgrcv() returneaz eroarea EIDRM;
-sleepul este ntrerupt de un semnal.
Dac recepionarea s-a efectuat cu succes, structura informaional
asociat cu msqid este actualizat astfel:
-msg_qnum va fi decrementat cu 1;
-msg_lrpid va fi setat la pid-ul procesului apelant;
-msg_rtime este setat la timpul curent.
La Linux prototipul funciei este:
Ssize_t msgrcv,(int msqid,struct msgbuf*msgp,
Ssize_t msgsz,long msgtyp,\int msgflg);
Funcia msgctl()
Prototipul funciei este;
int msgctl(int msqid,int cmd,struct msqid_ds*buf);
Sunt permise urmtoarele comenzi:
IPC_STA va copia informaiile din structura informaional
asociat cu msqid n structura indicat prin pointerul buf, dac avem
dreptul de read asupra cozii;
IPC_SET va scrie unii membri din structura indicat prin pointerul
buf n structura de date informaional a cozii; membrii care pot fi
modificai sunt:
msg_perm.uid
msg_perm.gid
Sisteme de operare 279
msg_perm.mode //numai LSB 9 bii
msg_qbytes
Aceast actualizare se va efectua dac procesul apelant are privilegiile
necesare: root sau user id-ul efectiv al procesului este cel al
msg_perm.cuid sau msg_perm.uid.La Linux pentru a mri
msg_qbytes peste valoarea sistem MSGMNB trebuie s fim root. Dup
o operaie de control se va actualiza i msg_ctime.
IPC_RMID va distruge coada al crei identificator a fost specificat
n msgctl() mpreun cu structura de date informaional msqid_ds
asociat. Aceast comand va putea fi executat de un proces cu user
id-ul efectiv egal cu cel msg_perm.cuid sau msg_perm.uid.
Erori:
EINVAL - msqid greit sau comanda greit:
EIDRM coada deja distrus;
EPERM comanda IPC_SET sau IPC_RMID dar procesul
apelant nu are drepturile necesare;
EACCES comanda IPC_STAT dar procesul apelant nu are
dreptul de read;
EFAULT comanda IPC_SET sau IPC_STAT dar adresa
specificat de pointerul buf nu este accesibil.
2) Desfurarea lucrrii
Program a
/*scriere-q.c-scriu mesaj n coad
se compileaz cu
$gcc o scriere q scriere q.c
i se lanseaz n execuie
$./scriere_q nr-nivel
se introduc linii de text.
Se pornete citirea cu
$gcc citire_q nr_nivel
S se ncerce citirea cu niveluri diferite*/
#include<stdio.h>
#include<errno.h>
#include<sys/ipc.h>
#include<sys/msg.h>
Sorin Adrian Ciureanu 280
#include <sys/stat.h>
struct my_buf{
long mytype;
char mytext[400];
};
int main(int argc,char*argv[])
{
struct my_buf buf;
int msqid;
key_t key;
if(argc!=2){printf(utilizare:$./scriere-q
nivel-numeric\n);}
if((key=ftok(scriere-q.c,'L'))==(key_t)-1){
perror(ftok);
exit(1)
}
if((msqid=msgget(key,S_IRUSR|S_IWUSR|S_IRGRP|S
_IROTH|IPC_CREAT))==-1){
perror(msgget);
exit(1);
}
printf)introducei linii de text,^D pt.
terminare:\n);
buf.mtype=atoi(argv[1];/*nu ne intereseaz
acum*/
while(gets(buf.mytext),!feof(stdin)){
if(msgsnd(msqid,(struct msgbuf*)&buf,
sizeof(buf),0)==-1)
perror(msgsnd);
}
if(msgctl(msqid,IPC_RMID,NULL)==-1){
perror(msgctl);
exit(1)
}
return 0;
}
Program b
/*
citire-q.c- citete coada
Sisteme de operare 281
Se lanseaz scrierea:
$./scriere-q nivel
se ncepe introducerea liniilor de test.
Se iese cu ^D.
S se lanseze citirile cu niveluri aleatoare
$./citire-q nivel
*/
#include<errno.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<sys/stat.h>
struct my_buf {
long mtype;
char mytext[400];
};
int main(int argc,char*argv[])
{
struct my_buf buf;
int msqid;
key_t key;
if(argc!=2){printf(Utilizare:$./citire-q
nivel_ numeric\n);exit(2);}
if((key=ftok(scriere-q.c,'L'))==(key_t)-1{
/*aceeai cheie ca n scriere-coada.c*/
perror(ftok);
exit(1);
}
if((msqid=msgget(key,S_IRUSR|S_IWUSR|S_IRGRP|S
IROTH))==-1 {/*conectare la coad*/
perror(msgget);
exit(1);
}
printf(citire mesaj:sunt gata pentru recepie
mesaje\n);
Sorin Adrian Ciureanu 282
while(1){/*citire mesaj nu se termin
niciodat*/
if(msgrcv(msqid, (struct msgbuf*)&buf,
sizeof(buf),atoi(argv[1],0)==-1){
perror(msgrcv);
exit(1);
}
printf(citire-mesaj:\%s\\n,buf.mytext);
}
return 0;
}
3)Tem
S se creeze dou procese numite client i server n care clientul
va introduce mesaje n ir iar serverul va extrage mesajul de prioritate
maxim.
11.3.3.4. Comunicaie ntre procese prin sistem V IPC.
Semafoare
Aa cum am artat n capitolele anterioare, semaforul a fost inventat
de Edsger Dijkstra, ca obiect de sincronizare a proceselor. Implementarea
din Linux este bazat pe acest concept dar ofer faciliti mai generale.
Exist o implementare n SVR4, foarte complex, cu urmtoarele
caracteristici:
-semafoarele nu exist individual ci numai n seturi, numrul
semafoarelor dintr-un set fiind definit la crearea setului;
-crearea i iniializarea sunt dou operaii separate i distincte;
crearea se face prin apelul semget iar iniializarea prin apelul semet1;
-deoarece semafoarele rmn n sistemul de operare dup terminarea
proceselor care le utilizeaz, ca i la celelate structuri IPC, trebuie gsit o
soluie de tratare a situaiilor n care un program se termin fr a elibera
semafoarele alocate.
Forma structurilor semafoarelor este:
struct semid_ds
{struct ipc_perm sem_perm;
struct sem*sem_base;/*primul semafor*/
ushort sem_usems; /*numrul semafoarelor din
set*/
time_tsem_otime; /*timpul ultimei operaii*/
Sisteme de operare 283
time_t sem_ctime; /*timpul ultimei
modificri*/}
La rndul su, cmpul sem_base are urmtoarele structuri:
struct sem
{ushort semval; /*valoarea semaforului*/
pid_t sempid; /*pid-ul ultimei operaii*/
ushort semcnt; /*numrul de procese care
ndeplinesc condiia semval>crtval*/
ushort semzcnt;/*numrul de procese pentru
semval=0*/
};
Apelul sistem de creare a semafoarelor este:
#include<sys/tipes.h>
#include<sys/ipc.h>
#include<sys/sem.h>
int semget(key_t key,int nsems, int flag);
/*unde nsems reprezint numrul de semafoare
din set; valoarea lui se pune la crearea
semaforului*/
Apelul sistem pentru iniializare este:
int semcti(int semid,int semnum,intcmd,union
semnum arg);
unde parametrii reprezint:
semnum indic un semafor din set pentru funciile cmd
union semnum arg are urmtoarea structur:
union sem num
{int val; /*pentru SETVAL*/
struct semid_ds*buf; /*pentru IPC_STAT i
IPC_SET*/
ushort*array; /*pentru GETALL iSETALL*/
}
cmd specific 10 funcii de executat asupra setului identificat de
semid.
2) Desfurarea lucrrii
Program a
Este un program care implementeaz primele semafoare binare,
inventate de Dijkstra, pentru nite procese care intr n seciunea critic.
#include<sys/types.h>
#include<sys/ipc.h>
Sorin Adrian Ciureanu 284
#include<sys/sem.h>
#include<errno.h>
#define SEMPERM 0600
#define TRUE 1
#define FALSE 0
typedef union_semun
{int val;
struct semid_ds*buf;
ushort*array;
}
semun;
int init_sem(key_t semkey)
{
int status=0,semid;
if((semid=semget(semkey,1,SEMPERM |
IPC_CREAT | IPC_EXCL))==-1)
{if(errno==EEXIST) semid=semget(semkey,1,0);}
else
{semun arg; arg.val=1;
status=semct1(semid,0,SETVAL,arg);}
if(semid==-1|| status==-1)
{perror(eroare intrare); return-1}
return semid;}
/*implementarea operaiei p(s)*/
int p(int semid)
{struct sem buf p_buf;
p_buf.sem_num=0;
p_buf.sem_op=-1;
p_buf.sem_flg=SEM_UNDO;
if(semop(semid,&p_buf,1)==-1)
{
perror(p(semid)failed);
exit(1);
}
return 0;
}
/*implementarea operaiei v(s)*/
int v(int semid)
{
struct sembuf v_buf;
Sisteme de operare 285
v_buf.sem_num=0;
v_buf.sem_op=1;
v_buf.sem_flg=SEM_UNDO;
if(semop(semid,&v_buf,1)==-1)
{
perror(v(semid)failed);
exit(1);
}
return 0;
}
/*procese concurente ce folosesc semaforul*/
void procsem(key_t skey){
int semid;
pid_t pid=getpid();
if((semid=init_sem(skey))<0)
exit(1);
printf(\nproces %d inaintea seciunii
critice\n,pid);
p(semid);
printf(procesul %d n seciune
critic\n, pid);
sleep(5); /*simulare- aici se desfoar
operaiile critice*/
printf(procesul %d prsete seciunea
critic\n,pid);
v(semid);
printf(procesul %d iese\n,pid);
exit(0);
}
/*programul principal, drearea proceselor */
int main(void)
{
key_t semkey=0x200;
int i;
for(i=0);i<3;i++)
if(fork()==0)
procsem(semkey);
}
Sorin Adrian Ciureanu 286
3)Tem
S se implementeze problema productor-consumator folosind
semafoarele.
11.3.3.5.Comunicaia ntre procese prin sistem V I PC.
Memorie partajat
1) Consideraii teoretice
Mecanismul care permite comunicarea ntre dou sau mai multe
procese folosind o zon comun de memorie este folosit frecvent de
multiprocesoare. Pentru a utiliza memoria partajat este nevoie de
sincronizarea proceselor, deci de utilizarea excluderii mutuale.
Implementarea excluderii mutuale se poate face cu obiecte de sincronizare,
cel mai adesea cu semafoare.
Structura pentru evidena segmentelor de memorie este:
struct shmid_ds
{struct ipc_perm shm_perm;/*drepturi de acces*/
struct anon_map*shm_map; /*pointer spre kernel*/
int shm_segsz; /*dimensiune segment*/
ushort shm_lkcnt; /*zvorrea segmentului*/
pid_t shm_lpid; /*pid petru ultim shmop*/
pid_t shm_cpid; /*pid-ul procesului creator*/
ulong shm_nattch; /*numr de atari curente*/
ulong shm_cnattch; /*shminfo*/
time_t shm_atime; /*timp ultima ataare*/
time_t shm_dtime; /*timp ultima detaare*/
time_t shm_ctime; /*timp ultima modificare*/
}
Pentru a obine un identificator de memorie partajat se utilizeaz
apelul shmget
#include<sys/tipes.h>
#include<sys/ipc.h>
#include<sys/shm.h>
int shmget(key-t key,int size,int flag);
2) Desfurarea lucrrii
Program a
Sisteme de operare 287
#include<stdio.h>
#include<signal.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#define SHMKEY1(key_t)0x100 /*cheia primului
segment*/
#define SHMKEY2 (key_t) 0x1AA /*cheia pentru al
doilea segment*/
#define SEMKEY (key_t) 0x100 /*cheie pentru
semafoare*/
#define SIZ 5*BUFSIZ /*dimensiunea segmentului
BUFSIZ def n stdio.h */
struct databuf
{int d_nread;
char d_buf[SIZ];};
typedef union_semun
{int val;
struct semid_ds*buf;
ushort*array;}
semun;
/*rutinele de iniializare*/
#define IFLAGS (IPC_CREAT|IPC_EXCL)
#define ERR ((struct databuf*)-1)
static int shmid1,shmid2,semid;
void getseg(struct databuf**p1,struct databuf p2)
/*se creeaz segmentele de memorie partajat*/
{if((shmid1=shmget(SMKEY,sizeof(struct databuf),
0600|IFLAGS))==-1)
{perror(shmget error); exit(1);}
/*ataeaz segmentele de memorie*/
if((*p1=(struct databuf*)shmat(shmid1,0,0))==ERR)
{perror(shmget error); exit(1);}
if((*p2=(struct databuf*)shmat(shmid2,0,0))==ERR)
{perror(shmget error); exit(1);}}
int getsem(void)
{semun x;x.val=0;
/*se creeazun set cu dou semafoare*/
if((semid=semget(SEMKEY,2,0600| IFLAGS))==-1)
{perror(semget error); exit(1);}
/*se iniializeaz valorile semafoarelor*/
Sorin Adrian Ciureanu 288
if(semct1(semid,0,SETVAL,x)==-1)
{perror(semct1 error); exit(1);}
return semid;}
/*rutina pentru tergerea identificatorilor
memoriei partajate i semafoarelor*/
void remobj(void)
{if(shmct1(shmid1,IPC_RMID,NULL)==-1
{perror(shmct error); exit(1);}
{if(shmct1(shmid2,IPC_RMID,NULL)==-1
{perror(semct1 error); exit(1);}
{if(semct1(semid,IPC_RMID,NULL)==-1)
{perror(shmct1 error); exit(1);}}
/*definiie pentru operaiile p() i v() pe
cele dou semafoare*/
struct sembuf p1={0,-1,0},p2={1,-1,0};
struct sembuf v1={0,1,0}, v2={1,1,0};
/*rutina de citire*/
void reader(int semid,struct databuf*buf1,
struct databuf*buf2)
{for(;;){
/*citire n tamponul buf1*/
buf1d_nread=read(0,buf1d_buf,SIZ);
/*punct de sincronizare*/
semop(semid,&v1,1);
semop(semid,&p2,1);
/*test pentru evitarea inactivit.proc. writer*/
if(buf1d_nread<=0)
return;
buf2d.nread=read(0,buf2d_buf,SIZ);
semop(semid,&p1,1);
semop(semid,&v2,1);
if(buf2d_nread<=0) return;
/*rutina pentru scriere*/
void writer(int semid,struct databuf*buf1,
struct databuf*buf2){
for(;;){
semop(semid,&p1,1); semop(semid,&v2,1)
if(buf1d_nread<=0) return;
write(1,buf1d_buf,buf1d_nread);
semop(semid,&p1,1); semop(semid,&v2,1);
if(buf2d_nread<=0) return;
Sisteme de operare 289
write(1,buf2d_buf,buf2d_nread);}}
/*program principal*/
int main(void)
{int semid;
pid_t pid;
struct databuf*buf1,*buf2)
semid=getsem();getseg(&buf1,*buf2);
switch(pid=fork())
{case-1;perror(forkerror);exit(1);break;
case 0; /*proces fiu*/
writer(semid,buf1,buf2);
remobj();
break;
default:/*proces printe*/
reader(semid,buf1,buf2);
break;}
exit(0);
11.3.3.6. Comunicaia ntre fire de execuie
1) Consideraii teoretice
n capitolul 3 am definit firele de execuie i motivele din care au
fost introduse. Firele de execuie (thread-urile) pot fi considerate ca nite
subuniti ale proceselor.
Crearea unui fir de execuie se face prin comanda:
#include<pthread.h>
int pthread_create(pthread_t*thread,const pthread_
attrt*attr,void*(start_routine)(void*),void arg);
Firul de execuie nou creat va executa codul din start_routine
cruia i se transmit argumentele arg.
Noul fir de execuie are atributele transmise prin attr, iar dac
ele sunt implicite se utilizeaz NULL. Dac funcia se execut cu succes ea
va returna 0 i n thread se va pune identificatorul nou creat.
Terminarea execuiei unui fir de ateptare se specific prin apelul
funciei pthread.
#include<pthread.h>
void pthread_exit(void*status);
O alt proprietate a unui fir de execuie este detaarea. Firele de
execuie detaate elibereaz, n momentul terminrii lor, memoria pe care au
deinut-o, astfel c alte fire nu se pot sincroniza cu fire detaate. Implicit,
Sorin Adrian Ciureanu 290
firele sunt create cu atributul joinable, ceea ce face ca alte fire s poat
specifica c ateapt terminarea unui astfel de fir.
#include<pthread.h>
int pthread_join(pthread_t thread,void status);
2) Desfurarea lucrrii
Program a
#include<stdio.h>
#include<pthread.h>
int global=5;
void*copilfuncie(void*p)
{printf(copilaici,pid=%d,global=%d\n,getpid(),
global());
global=15;
printf(copil,globalacum=%d\n,global);}
main()
{pthread_t copil;
pthread_create(&copil,NULL,copilfuncie,NULL);
printf(printe,pid=%d,global=%d\n,getpid(),
global);
global=10;
pthread_join(copil,NULL);
printf(nucopil,global=%d\n,global);}
Programul se va compila astfel
$gcc -o sorin sorin.c -lpthread
unde sorin.c este fiierul surs.
Un posibil rspuns ar fi:
copil aici,pid=3680,global=5
copil,global acum 15
printe,pid=3680,global=15
nu copil,global=10
3) Tem
S se creeze trei fire de execuie n care:
-primul fir calculeaz media aritmetic a n numere citite,
-al doilea fir calculeaz media geometric a n numere citite,
-al treilea fir calculeaz media armonic a n numere citite.
(n i numerele se citesc de la tastatur) . Apoi s se compare
rezultatele.
Sisteme de operare 291
11.3.3.6.1 Functii pentru excluderea mutuala in standardul
POSIX
1) Mutexuri
a) Initializarea unui mutex se face cu functia:
#include<pthread>
int pthread_mutex_init(pthread_mutex_t *mutx const
pthread_mutex_attr *attr);
Functia creeaza un nou mutex, cu atributele specificate de attr sau cu
atributeleimplicite.Nu este absolut necesara utilizarea acestei functii pentru
ca o initializare implicita a unui mutex are loc la decalarea sa in program
b) Blocarea unui mutex se face cu functia
#include<pthread>
int pthread_mutex_init(pthread_mutex_t *mutx const
pthread_mutex_t *mutx);
Daca functia gaseste mutx deja blocat, firul de executie curent intra
in asteptare pana cand ul alt fir il va debloca.
c)Blocarea unui mutex cu testarea valorii acestuia, permite ca firul
curent sa nu fie pus in asteptare.
#include <pthread>
int pthread_mutex_trylock(pthread_mutex_t mutx);
Daca mutx este liber in momentul apelului, el va fi blocat,iar functia
va returna zero.In caz contrar se revine din functie cu eroare,fara apune firul
curent in asteptare.
d) Deblocarea unui mutex se face prin apelarea functiei:
# include <pthread>
int pthread_mutex_unlock(pthread_mutex_t *mutx);
Daca firul curent este momentan proprietatea lui mutx,acesta va fi
deblocat.Daca exista fire de executie in asteptare la mutx,atunci
planificatorul pentru fire l va selecta pe cel ce va obtine mutx,altfel mutx
ramane disponibil pentru urmatorul fir care va apela functia pthread_mutex-
unlock.
1) program a
Programul calculeaza suma numerelor naturale d ela 1 la 50 dar
fiecare numar este adunat la totalul declarat ca variabila globala de un fir de
executie separat. Accesul firelor la variabila globala este controlat d eun
mutex iar in absenta acestuia valoarea lui tot_items nu poate fi determinata
corect.
# include <stdio.h>
# include<pthread.h>
# include<stdlib.h>
Sorin Adrian Ciureanu 292
# define NKIDS 50
int tot_items=0;
pthread_mutex_t mutx;
struct kidrec{
int data;
pthread_t id;};
void *kidfunc(void*p){
int *ip=(int*)p;
int, tmp,n;
pthread_mutex_lock(&mutx);
tmp=tot_items;
/* for(n=50000;n--;);*/
tot_items=tmp+*ip;
pthread_mutex_unlock(&mutx);}
int main(){
struct kidrec kids[NKIDS];
int n;
for(m=0;m<NKIDS;m++){
kids[m].data=m+1;
pthread_join(kids[m].id,NULL);
printf(End.Total=%d,tot-items);}
Ciclul for din codul functiei kidfunc nu are nici o semnificatie pentru
cazul codificarii corecte prezentate aici.daca se elimina mutexul prin acest
ciclu for se creeaza o incarcare artificiala a sistemului care va face ca tot
tot_items sa obtina si alte valori decat cea corecta.
2)Semafoare
O gneralizare a mutexului este seamforul, considerat in standardul
Pthreads ca o variabila cu valori de tip intreg, partajata inte firele de
executie. Pricipalele operatii asupra semafoarelor sunt:incrementarea
atomica,asteptarea ca semaforul sa aiba o valoare nenegativa si
decrementarea saa tomica.
Functiile pentru llucrul cu semafoare au prototipurile in
<semaphore.h> .
Principalele functii sunt:
- int sem_init(sem_t *sem,int pshared,unsigned int value);
Initializeaza la vlaue valoarea semforului spre care indica sem.Prin
argumnetul pshared se indica daca semaforul este local procesului
curent(pshared=0) sau poate fi partajat de mai mult eporcese.Se precizeaza
ca momentan in Linux nu se permite partajarea.
- int sem_wait(sem_t *sem);
Sisteme de operare 293
Suspenda firul de executie aplenat pana cand valoarea semaforului spre care
indica sem devine nenegativa.Atunci valoarea semaforului este
decrementata atomic.
- int sem_trywait(sem_t, *sem);
Este varianta fara blocare a lui sem-wait.Daca semaforul spre care tinde sem
are valoare diferita de zero acesta este decrementat atomic si sem.trywait
returneaza imediat zero.Daca valoarea semaforului este zero sem.trywait
revine imediar semnaland eraorea EGAIN.
- int sem_post(sem_t *sem);
Se incementeaza atomic valoarea semaforului spre care indica sem.Acwasta
functie nu conduce niciodata la blocare si poate fi folkosita in rutinele de
control a semnalelor.
- int sem_getvalue(sem_t *sem, int *sval);
Se memoreaza valoarea curenta a semaforului indicat de sem in locatia spre
care indica sval.
- int sem_destroy(sem_t *sem);
Se distruge un semafor eliberand toate resursele detinute de acesta. Se
presupune ca in momnetul apelului nu exista fire de executie inasteptare la
sem. In implentareaa ctuala de Linux nu exista resurse asociate semfoarelor.
Program1
Se folosesc tampoane duble pentru a reduce timpul de executie a operatiilor
de I/E.
#include<pthread.h>
#include<sys/types.h>
#include<semaphore.h>
#define BSIZE 1024
sem_t emptybuf_sem,fullbuf_sem;
struct{
char data[BSIZE];
int size;}
buf[2];
void *reader(void*p){
int i=0;
sem_init(&emptybuf_sem,0,2);
seminit(&fullbuf_sem,0,0);
while(1){
sem_wait(&emptybuf_sem);
buf[i].size=read(0,buf[i].data,BSIZE);
sem_post(&fullbuf_sem);
if(buf[i].size<=0)
Sorin Adrian Ciureanu 294
break;
}}
void *writer(void*p){
while(1){
sem_wait((&fullbuf_sem);
if(buf[i].size<=0)
break;
write(1,buf[i].data,buf[i].size);
sem_post(&emptybuf_sem);}}
int main(){
pthread_t,treader,twriter;
pthread_create(&treader,NULL,reader,NULL);
pthread_create(&twriter,NULL,writer,NULL);
pthread_join(writer,NULL);}
Firul pentru citire(reader)umple pe rabd cele doua tampoane,preluand
informatii dinfisierul standard de intrare, iar firul pentru scriere(writer)ia
datele din tampoanele pline si le duce spre fisierul de iesire standard. Cele
doua fire se sincronizeaza folosind doua semafoare:empty-buf_sem numara
cate tampoane au fost golite pe firul pentru scriere, iar fullbuf-sem numara
cate tampoane au fost umplute de firul pentru citire. Initializarea
semaforului emptybuf_sem este obligatorie, pentru ca valoarea de start e
diferita de zero.Celalt semfor nu trebuie neaparat initializat prin apel la
sem_init, deoarece initializarea cu zero se produce la alocarea spatiului
pentru semafor.
3.Sincronizarea cu variabile de conditie
Folosind doar concpetul de mutex sau chiar de semafor, firele de executie
nu iis pot transmite efectiv informatia,ci pot doar s aiis sincronizeze accesul
la resursele partajate sau sa anunte un eveniment. O comunicare mai
complexa este realizata prin variabilele de conditie, care permit ca un fir d
eexecutie sa se blocheze pana cand este satisfacuta o anumita conditie.
Variabilele de conditie se folosesc totdeuna impreuna cu un mutex.Valoarea
variabilei de conditie este testata sub protectia mutexului, iar daca valoarea
este falsa firul aplenat se blocheaza la variabila conditie, eliberand atomic
mutexul.Cand un alt fir schimba conditia el poate semnala variabilei d
econditie sa determine reluarea unuia sau a mai multor fire de
asteptare.Acestea vor trebui sa obtina din nou mutexul si sa reevalueze
conditia.
Nu exista nici o ordine impusa pentru deblocarea firelor de astptare la o
variabila de conditie.
Principalel functii sunt:
Sisteme de operare 295
-int pthread_cond_init(pthread_cond_t*cond,const ptread_cond_attr*attr);
Se creeaza o noua variabila conditie cu atributele specificate de attr sau cu
cele implicite daca attr=NULL.Executia cu succes a functiei face
identificatorul noii variabile conditie sa se memoreze in locatia spre care
indica argumentul cond.
-int pthread_cond_destroy(pthread-cond_t *attr);
Distrugerea unei variabile conditie realizabila in principiu prinapelarea
functiei pthread_cond_destroy nu se paote efectua daca aceasta este referita
de un alt fir.
-int pthread_cond_wait(pthread_cond_t*cond,pthread_mutex_t*mutex);
Un apel la aceasta functie apare atunci cand un fir de executie obtine un
mutex si in sectiunea critica testeazadaca un anumit predicat(conditie) are
valoarea true.Daca acel predicat este false firulva astepta la o variabila de
conditie,apeland aceasta functie cu variabila de conditie ca prim argument
si cu mutexul detinut ca al doilea argument.
- int pthread_cond_signal(pthread_cond_t *cond);
Se deblocheaza numai unul dintre firele de asteptare la varibila de conditie
specificata prin cond.Alegerea firului de executie deblocat este facuta de
palnificatorul firelor.
Program2
Utilizarea variabilelr de conditie este ilustrata printr-o solutie a problemei
clasice producator-consumator prin tampon de caapcitate limitata.
Programul se desfasoara ca un ciclu infinit dar se afiseaza mesaje la intrarea
in asteptare a fiecaruia dinre firele producator si consumator.
#include <pthread.h>
#define MAX 20
int queue[MAX];
int i=0, ip=0,ic=0,length=0;
pthread mutex_t mutex;
pthread_cond_t prod, cons;
int get_prod(){
i=(i+1)%MAX;return i;}
void put_cons(int i0{}
void add(int i){
queue[ip]=i;ip=(ip+1)%MAX;length++;}
int remove(){
int i;
i=queue[ic]ic={ic+1)%MAX;length--;return i;}
void * producer9void *arg)
Sorin Adrian Ciureanu 296
{int p;
while(1)
{p=get_prod();
pthread_mutex_lock($mutex);
while(length>=MAX){
printfproducer waits....\n);
pthread_cond_wait(&prod,&mutex);}
add(p);
pthread_mutex_unlock(&mutex);
pthread_cond_signal(&cons);}}
void *consumer(void *arg){
int c;
while(1){
pthread_mutex_lock($mutex);
while(length==0){
printfconsumer waits....\n);
pthread_cond_wait(&prod,&mutex);}
c=remove();
pthread_mutex_unlock(&mutex);
pthread_cond_signal(&prod);put_cons(c);}}
int main(0{
pthread_t pr, con;
pthread_create(&pr,NULL,producer, NULL);
pthread_create(&con,NULL,consumer, NULL);
pthread_join(con, NULL);}
.3.3.7. I nterfaa SOCKET
1) Consideraii teoretice
Interfaa SOCKET reprezint o facilitate general de comunicare a
proceselor aflat, n general, pe maini diferite.
Un SOCKET poate avea tipuri diferite i poate fi asociat cu unul sau
mai multe procese, existnd n cadrul unui domeniu de comunicaie. Datele
pot fi schimbate numai ntre SOCKET-uri aparinnd aceluiai domeniu de
comunicaie.
Exist dou primitive pentru SOCKET-uri.
Sisteme de operare 297
Prima primitiv
#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain,int type,intprotocol)
int domain este un parametru ce stabilete formatu adreselor
mainilor implicate n transferul de date. Uzual aceste domenii sunt:
AF-UNIX, care stabilete domeniile de comunicare local (UNIX);
AF-INET, care folosete protocolul TCP/IP i este utilizat n
INTERNET.
int type se refer la modalitile de realizare a comunicrii.
Cele mai utilizate tipuri sunt:
SOCK-STREAM, n care un flux de date se transmite ntr-o
comunicare de tip full-duplex;
SOCK-DGRAM, n care se stabilete o comunicare fr conexiune cu
utilizarea datagramelor.
int protocol specific protocolul particular utilizat pentru
transmisia datelor. De obicei se utilizeaz valoarea 0(zero).
A doua primitiv este SOCKETPAIR()
Aceasta se utilizeaz pentru crearea unei perechi de SOCKET-uri
conectate.
#include<sys/types.h>
#include<sys/socket>
int socketpair(int domain,int type,int protocol,
int SV[2];
Primele trei argumente sunt la fel ca la socket iar cel de-al patrulea
argument SV[2] este la fel ca la pipe.
2)Desfurarea lucrrii
Program a
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<stdio.h>
#include<errno.h>
#include<unistd.h>
#include<string.h>
#include<sys/wait.h>
main()
{int sd[2];
/*mesajele folosite*/
char*p=sunt printele;
Sorin Adrian Ciureanu 298
char*c=sunt copilul;
char tampon[500];
/*se creeaz perechea de socketuri*/
if(socketpair(AF_UNIX,SOCK_STREAM,0,sd)==-1)
{perror(eroare la crearea socket);exit(1);}
/*crearea fiului*/
switch(fork())
{case -1 : /*eroare*/
perror(eroare la creareproces);
exit(1);
break;
case 0: /*fiu*/
/*citim din socket mesajul*/
if(read(sd[1],tampon,100)<0)
{perror(eroare la citire); exit(2);}
prinf(procesul cu pid-ul%d(fiu)a primit%s\n,
getpid, tampon);
/*scriem mesajul copilului*/
if(write(sd[1],c,100)<0)
{perror(eroare la citire); exit(2);}
/*trimitem EOF*/
close (sd[1]);
exit(0);
default :/*printe*/
/*trimitem mesajulprintelui*/
if(write(sd[0],p,100)<0)
{perror(eroare scriere); exit(3);}
/*citim mesajul pornind de la copil*/
if(read(sd[0],tampon,100)<0)
{perror(eroare citire); exit(3);}
printf(procesul cu pid %d(printe)
a pornit'%s'\n,getpid(),tampon);
/*s ateptm terminarea copilului*/
if(wait(NULL)<0)
{perror(eroare wait); exit(3);}
close(sd[0]);
return(0);}}
Dup rulare se va afia:
procesul cu pidul 10896(fiul) |sunt printele|
procesul cu pidul 10897(printele)|sunt fiul|
eroare: No child proces
Sisteme de operare 299
3) Tem
S se creeze o pereche de socket-uri n care primul socket va trimite
celui de-al doilea socket un ir de caractere, iar cel de-al doilea va returna
primului socket caracterele ordonate dup alfabetul ASCII.
11.3.3.8. Modelul client/server-TCP
1) Considerente teoretice
n modelul client /server o main numit server ofer anumite
servicii altor maini numite clieni.
TCP (Transmission Control Protocol) este un protocol de
comunicaie care realizeaz legtura ntre client i server prin intermediul
socketurilor, utiliznd streamuri.
Schema general de funcionare client/server TCP, n Linux, este
dat n fig. 10.2.
Fig. 10.2. Schema de funcionare client/server-TCP.
Server TCP
socket()
socket()
bind()
listen()
accept()
read()
write()
close()
connect()
write()
read()
close()
Server TCP Client TCP
Sorin Adrian Ciureanu 300
Se execut urmtoarele apeluri sistem:
socket() se creaz un socket care va trata conexiunile cu
clienii.
bind() - se ataeaz socketul creat anterior la un port de
comunicaie.
listen() se instaleaz socketul n vederea ascultrii portului
pentrustabilirea conexiunii cu clienii.
acept() se ateapt realizarea unei conexiuni cu un client i
apoi acest apel blocheaz programul pn cnd vine o cerere de conectare
de la alt client.
read(),write() primitive pentru schimbul de mesaje
client/server.
close() se nchide conexiunea cu clientul.
Client TCP
Se utilizeaz aceleai apeluri sistem ca i la server, cu excepia
primitivei accept() care trebuie s conin adresa IP i portul serverului
la care se conecteaz clientul.
La apelul read() din server va corespunde un apel write() la
client iar la write() din server va corespunde un apel read() n client.
Primitivele utilizate n acest protocol sunt:
a) bind()
#include<sys/types.h>
#include<sys/socket.h>
int bind(int sockd,struct sockaddr*addr,
socklen_t addrlen);
int sock d este descriptorul serverului.
struct sockaddr*addr este o structur care reine informaia
de adres pentru orice tip de socket-uri.Este definit astfel:
struct sockaddr
{unsignet short sa_family;
char sa_data[16]
}
n cazul INTERNET-ului structura utilizat este:
struct sockaddr_in
{short int sin_family:/*familia de adrese AF_INET*/
unsignet short int sin_port;/*portul(0-65365)*/
struct in_addr sin_addr; /*adresa Internet*/
Sisteme de operare 301
unsignet char sin_zero[8]; /*octei neutilizai*/
}
Trebuie testat c sin_zero este nul i acest lucru se realizeaz
prin funciile bzero() sau manset().
Adresa Internet este stocat n structura in_addr :
struct in_addr
{unsigned long int s_addr;}/*adresa IP*/
b) listen()
#include<sys/socket.h>
int listen(int sockd,int backlog);
-backlog arat numrul de conexiuni permise n coada de
ateptare a conexiunilor clieni, uzual fiind 5.
c) accept()
Se ruleaz ateptarea de ctre master.
#include<sys/types.h>
#include<sys/socket.h>
in accept(int socd,struct sockaddr*addr,
socklen_t*addrlen)
2) Desfurarea lucrrii
Acest program creeaz un server i un client; serverul primete un ir
de caractere de la client i l trimite napoi n ecou. Clientul citete un ir de
caractere de la intrarea standard, il trimite serverului, apoi ateapt ca
serverul s l returneze.
servertcp.c
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<errno.h>
#include<unist.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define PORT 8081 /*se definete portul */
extern int errno; /*codul de eroare*/
/*programul*/
Sorin Adrian Ciureanu 302
int
main()
{/*structurile utilizate de server i client*/
struct sockaddr_in server;
struct sockaddr_in from;
char tampon[100]; /*mesaj trimis de client*/
int sd; /*descriptorul de socket*/
/*se creaz un socket*/
if((sd=socket(AF_INET,SOCK_STREAM,0))==-1)
{perror(eroare socket()\n);
return errno;}
/*se pregtesc structurile de date*/
bzero(&server,sizeof(server));
bzero(&from,sizeof(from));
/*umplem structura folosit de server*/
server.sin_family=AF_INET;/*familia de socketuri*/
server.sin_addr.s_addr=htonl(INADDR_ANY);/*se
accept orice adres*/
server.sin_port=htons(PORT);/*port utilizator*/
/*se ataeaz socketul*/
if(bind(sd,(struct sockaddr*)&server,
sizeof((struct sockaddr))==-1)
{
perror(eroare la bind().\n);
return errno;
}
/*serverul ascult linia dac vin clieni*/
if(listen(sd,5)==-1)
{
perror(eroare listen().\n);
return errno;
}
/*se servesc clienii*/
while(1)
{
int client;
int length=sizeof(from);
printf(se ateapt la portul %d\n,PORT);
fflush(stdout);
Sisteme de operare 303
/*se accept un client*/
/*serverul se blocheaz pn la realizarea
conexiunii*/
client=accept(sd,(struct
sockaddr*)&from,&length);
/*eroare de acceptarea conexiunii de la un
client*/
if(client<0)
{
perror(eroare la accept().\n);
continue;
}
bzero(tampon,100);/*s-a realizat conexiunea,
se ateapt mesajul*/
printf(ateptm mesajul\n);
fflush(sdout);
/*se citete mesajul*/
if(read(client,tampon,100)<=0)
{
perror(eroare la read()de la client.\n);
close(client); continue;/*s-a nchisconexiunea
cu clientul*/
continue;
}
printf(mesaj recepionat\n
trimitem mesaj napoi);
/*se returneaz mesajul clientului*/
if(write(client,tampon,100)<=0)
{
perror(eroare la write() ctre client.\n);
continue;/*se continu ascultarea*/
}
else
printf(transmitere cu succes.\n);
/*am terminat cu acest client,
se nchide conexiunea*/
close(client)
} /*while*/
}
Sorin Adrian Ciureanu 304
Codul surs al clientului este client-tcp.c
clienttcp.c
/*Client-tcp (echo*/)
/*retransmite serverului mesajul primit de la
acesta*/
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<errno.h>
#include<unistd.h>
#include<stdio>
#include<stdlib.h>
#include<netdb.h>
#include<string.h>
/*codul de eroare returnat de anumite
apeluri*/
extern int errno;
/*portulde conectare la server*/
int port;
/*programul*/
int
main(int argc,char*argv[])
{
/*descriptorul de socket*/
int sd;
/*structura utilizat la conectare*/
struct sockaddr_in server;
/*mesaj transmis*/
char tampon[100];
/*testarea argumentelor din linia de comand*/
if(argc!=3)
{
printf(sintaxa:%s<adresa_server><port>\n,
argv[0]);
return-1;
}
Sisteme de operare 305
/*se stabilete portul*/
port=atoi(argv[2]);
/*se creeaz socketul*/
if((sd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror(Eroare la socket().\n);
return errno;
}
/*umplem structura folosit pentru realizarea
conexiunii cu serverul*/
server.sin_family=AF_INET;/*familia socketului*/
server.sin_addr.s_addr=inet_addr(argv[1];)/*adresa
IP a serverului*/
server.sin_port=htons(port);/*portulde conectare*/
/*ne conectm la server*/
if(connect(sd,(struct sockaddr*)&server,
sizeof(struct sockaddr))==-1
{
perror(Eroare la connect().\n);
return errno;
}
/*citirea mesajului i transmiterea ctre
server*/
bzero(tampon,100);
printf(introducei mesajul:);
fflush(stdout);
read(0,buffer,100);
if(write(sd,tampon,100)<=0)
{
perror(Eroare la write() spre srver.\n);
return errno;
}
/*citirea rspunsului dat de server (ne blocm
pn cnd serverul rspunde)*/
if (read(sd,tampon,100)<0)
{
perror(Eroare la read()de la server.\n);
return errno;
}
/*afiarea mesajului primit*/
Sorin Adrian Ciureanu 306
printf(mesajul primit este:%s\n,tampon);
/*nchiderea conexiunii, am terminat*/
close(sd);
}
Pentru compilarea clientului i a serverului vom folosi comenzile:
$gcc -o servertcp servertcp.c
$gcc -o clienttcp clienttcp.c
Pentru execuia programelor:
$ ./servertcp
$ ./clienttcp 127.0.0.1 8081
3)Tem. S se creeze dou fiiere, server i client, n care clientul
trimite serverului numere ntregi iar serverul va returna clientului numai
numerele pare dintre cele transmise (n TCP).
11.3.3.9. Modelul client/server-UDP
(User Datagrama Protocol)
n acest protocol de transmisie a datelor nu se realizeaz o conexiune
ntre client i server pentru ca apoi s se citeasc i s se scrie date. n UDP
transmisia este asincron, n sensul c clientul i serverul i trimit mesaje
unul altuia prin intermediul primitivelor SEND i RECEIVE. Structura de
date transmis se numete datagram.
Organizarea UDP este dat n fig.10.3.
socket()
bind()
recfrom()
sento()
close()
socket()
bind()
sendto()
recfrom()
close()
Server UDP Client UDP
cerere
rspuns
Sisteme de operare 307
Fig.11.3. Organigrama UDP
Apelurile folosite sunt:
recfrom() cu sintaxa:
#include<sys/types.h>
#include<sys/socket.h>
int recvfrom(int sockd.void*buf,size_t len,
int flags,struct sockaddr*from,socklen.t*fromlen);
sendto() cu sintaxa:
#include<sys/types.h>
#include<sys/socket.h>
int sendto(intsockd,const void*msg,size_t len,
int flags, const struct sockadd*to,socklen_t
tolen);
2) Desfurarea lucrrii
serverudp.c
/*server UDP iterativ (echo)
Ateapt un mesaj de la clieni;
Mesajul primit este trimis napoi.*/
#include<sys/types.h>
#include<sys/socket.h>
#include<stdio.h>
#include<netinet/in.h>
#include<errno.h>ss
#include<unistd.h>
/*portul folosit*/
#define PORT 8081
/*codul de eroare returnat de anumite
apeluri*/
extern int errno;
Sorin Adrian Ciureanu 308
/*programul*/
int
main()
{
/*structurile folosite de server i client*/
struct sockaddr-in adresa;
struct sockaddr client;
char buffer[100]; /*mesajul trimis de
client*/
int sd; /*descriptorul de socket*/
/*lansm serverul n fundal*/
switch(fork())
{
case 1: /*eroare la fork*/
perror(Fork error\n;
return errno;
case 0: /*copilultriete*/
break;
default: /*printele moare*/
print(serverul a fost lansat n
fundal\n);
exit(0);
}
/*creem un socket*/
if ((sd=socket(AF_INET,SOCK_DGRAM,0))==-1)
{
perror(Eroare la socket().\n);
return errno;
}
/*pregtim structura folosit de server*/
adresa.sin_family=AF_INET;
/*stabilirea familei de socket-uri*/
adresa.sin_addr.s_addr=htonl)INADDR_ANY);
/*acceptm orice adres*/
adresa.sin_port=htons(PORT);
/*utilizm un port utilizator*/
/*atam socketul*/
int (bind(sd,struct sockaddr*)&adresa,
Sisteme de operare 309
sizeof(struct sockaddr))==-1)
{
perror(Eroare la bind().\n);
return errno;
}
/*servim n mod iterativ clienii*/
while(1)
{
int bytes;
int length=sizeof(client);
/*citim mesajul primit de la client*/
if(bytes=recvfrom(sd,buffer,100,0,
&client,&length))<0)
{
perror(Eroare la recvfrom()de la
client.\n);
return errno;
}
/*..dup care l trimitem napoi*/
if(sendto(sd,buffer,bytes,0,&client,length)<0)
{
perror(Eroare la sendto()spre client.\n);
return errno;
}
} /*while*/
} /*main*/
clientudp.c
/*Client UDP (echo)
Trimite un mesaj unui server;
Mesajul este recepionat de la server.*/
#include<sys/types.h>
#include<sys/socket.h>
#include<stdio.h>
#include<netinet/in.h>
Sorin Adrian Ciureanu 310
#include<errno.h>
#include<netdb.h>
#include<string.h>
/*codul de eroare returnat de anumite apeluri*/
extern int errno;
/*portul de conectarela server*/
int port;
/*programul*/
int
main(int argc,char*argv[])
{
/*descriptorul de socket*/
int sd;
/*structura folosit pentru conectare*/
struct sockaddr_in server;
/*mesajul trimis*/
char buffer[100];
int length;
/*exist toate argumentele n linia de
comand?*/
if(arg!=3)
{
printf(sintaxa:%s<adresa-server><port>\n,
argv[0];
return -1;
}
/*stabilim portul*/
port=atoi(argv[2];
/*creem socketul*/
if((sd=socket(AF_INET,SOCK_DGRAM,0))==-1)
{
perror(Eroare la socket().\n);
return errno;
}
Sisteme de operare 311
/*umplem structura folosit pentru realizarea
dialogului cu serverul*/
server.sin_family=AF_INET;
/*familia socketului*/
server.sin_addr.s_addr=inet.addr(argv[1];
/*adresa IP a serverului*/
server.sin_port=htons(port);
/*portul de conectare*/
/*citirea mesajului de la intrarea standard*/
bzero(buffer,100);
printf(introducei mesajul:);
fflush(stdout);
read(0,buffer,100;
length=sizeof(server);
/*trimiterea mesajului ctre server*/
if(sendto(sd,buffer,strlen(buffer),0,
&server,length)<0)
{
perror(Eroare la sendto()spre server.\n);
return errno;
}
/*citirea rspunsului dat de server (ne blocm
pn cnd serverul rspunde)*/
if(recvfrom(sd,buffer,100,0,&server.&length)<0
{
perror(Eroare la recvfrom() de la server.\n);
return errno;
}
printf(Mesajul primit este:%s.\n,buffer);
/*nchidem socketul, am terminat*/
close(sd);
return 0;
}
Clientul va necesita dou argumente n linia de comand,
semnificnd adresa IP a serverului i portul de conectare la serverul UDP.
Sorin Adrian Ciureanu 312
Dac ambele programe ruleaz pe aceeai main, atunci vom putea
introduce:
$gcc o serverudp serverudp.c
$gcc o clientudp clientudp.c
$./serverudp
$./clientudp 127.0.0-18081
Serverul va rula automat n fundal (adoptnd postura de daemon ) .
3) Tem.S se scrie un program n care un client va trimite un ir de
numere ntregi serverului iar acesta va returna ctre client numerele primite
n ordine invers.
Sisteme de operare 313
Bibliografie
1.D. Cramer, Interworking with TCP-IP, vol.1, Prentice Hall, New
-Jersey,1991.
2.Andrew S. Tanenbaum, Modern Operating Systems, Prentice
Hall,1992.
3.Iosif Ignat, Emil Muntean, Kalman Pustzai, Microinformatica,
1992.
4.B. Chapman, E.D. Zwicky, Building Internet Firewalls,
O'Reilly&Associates, 1995.
5.Traian Ionescu, Daniela Saru, John Floroiu, Sisteme de
operare-principii i funcionare, Editura tehnic, Bucureti, 1997.
6.R. Stevens, UNIX Network Programming, vol. 1, Networking,
Prentice Hall, 1998
7.Felicia Ionescu, Principiile calculului paralel,Editura Tehnic,
Bucureti, 1999.
8.Interprocess Communications, Prentice Hall, N.J. 1999.
9.A. Silberschatz, P.B. Galvin, G.Gagne, Applied Operating
System Concepts, Wiley, New-York,200.
10.Liviu Miclea, Noiuni de sisteme de operare i reeele de
calculatoare (LINUX), Universitatea Tehnic Cluj-Napoca, 2001.
11.Dan Cosma, UNIX. Aplicaii, Ed. de Vest, Timioara, 2001.
12.Ioan Jurc, Sisteme de operare, Editura de Vest, Timioara,
2001.
13.Sabin Buraga, Gabriel Ciobanu, Atelier de programare n
reele de calculatoare, Editura Polirom, Iai, 2001.
14.Drago Acostchioaie, Securitatea sistemelor LINUX, Editura
Polirom, Iai, 2001.
15. Andrew Tanenbaum, Sisteme de Operare Moderne, Editura
Byblos, Bucureti, 2004.
17. Cristian Vidracu, http://www.infoiai.ro/~vidracu.
18. Mihai Budiu, Alocarea memoriei n nucleul sistemului de
operare, http://www.cs.cmu.edu/mihaib, 1998.
19. http://www.oreilly.com/catalog/opensources/book/
Sorin Adrian Ciureanu 314
linus. html
20. Rzvan Daniel Zota, Elemente de arhitectur a sistemelor de
calcul i operare, Ed-ASE, Bucureti, 2005.
Sisteme de operare 315
Sorin Adrian Ciureanu 316
CUPRINS
Pg.
1. INTRODUCERE... 3
1.1. SISTEME DE OPERARE. DEFINIIE.. 4
1.2. LOCUL UNUI SISTEM DE OPERARE NTR-UN SISTEM DE
CALCUL.. 4
1.3. FUNCIILE UNUI SISTEM DE OPERARE. 6
1.3.1. Asigurarea interfeei cu utilizatorul.. 6
1.3.1.1. Monitoare... 6
1.3.1.2. Interfee n linie de comand...... 7
1.3.1.3. Interfee grafice.. 7
1.3.2. Gestionarea proceselor i procesoarelor... 8
1.3.3. Gestionarea memoriei... 8
1.3.4. Gestionarea perifericelor.. 9
1.3.5. Gestionarea fiierelor.... 9
1.3.6. Tratarea erorilor.... 9
1.4. CARACTERISTICILE SISTEMELOR DE OPERARE.... 10
1.4.1. Modul de introducere a programelor n sistem..... 10
1.4.2. Modul de planificare a lucrrilor pentru execuie. 10
1.4.3. Numrul de programe prezente simultan n memorie.. 10
1.4.4. Gradul de comunicare a proceselor n multiprogramare.. 11
1.4.5. Numrul de utilizatori simultani ai SO. 11
1.4.6. Modul de utilizare a resurselor. 11
1.4.7. SO pentru arhitecturi paralele... 12
1.5. COMPONENTELE SISTEMELOR DE OPERARE. 12
1.5.1. Partea de control... 12
1.5.2. Partea de serviciu. 13
1.6 Structura sistemelor de operare... 13
2 PLANIFICAREA PROCESOARELOR (UC).. 15
2.1 SCHEMA GENERAL DE PLANIFICARE 15
2.2. CRITERII DE PERFORMAN A PLANIFICRII... 16
2.3. ALGORITMI DE PLANIFICARE UC.. 17
2.3.1. Algoritmul FCFS (First Come First Served)... 17
2.3.2. Algoritmul SJF (Shortest Job First).. 17
2.3.3. Algoritmi bazai pe prioritate 18
2.3.4. Algoritmi preemptivi 18
2.3.5. Algoritmul Round-Robin. 19
2.3.6. Ali algoritmi de planificare. 20
3. GESTIUNEA PROCESELOR... 21
3.1. NOIUNI GENERALE DE PROCESE I THREAD-URI.. 21
3.1.1. Definiia procesului... 21
3.1.2. Starea procesului... 22
3.1.3. Comutarea proceselor... 24
3.1.4. Crearea i terminarea proceselor25
Sisteme de operare 317
3.2. PROCESE I THREAD-URI N UNIX.25
3.2.1. Procese n UNIX....25
3.2.2. Thread-uri n UNIX.. 29
3.3. PROCESE I THREAD-URI N WINDOWS30
3.3.1. Procese n WINDOWS. 30
4. COMUNICAIA I SINCRONIZAREA NTRE PROCESE... 31
4.1. PROBLEMA SECIUNII CRITICE I A EXCLUDERII MUTUALE.31
4.1.1. Suportul hardware pentru implementarea excluderii mutuale... 33
4.1.1.1. Invalidarea/validarea ntreruperilor. 33
4.1.1.2. Instruciunea Test and Set (TS).. 34
4.1.1.3. Protocoale de ateptare n excluderea mutual34
4.1.1.4. Mecanisme de sincronizare ntre procese (obiecte de
sincronizare).. 34
4.2. INTERBLOCAREA (DEADLOCK).. 39
4.2.1. Resurse.. 39
4.2.1.1. Clasificarea resurselor din punct de vedere al
interblocrii... 39
4.2.1.2. Etapele parcurse de un proces pentru utilizarea unei
resurse.... 40
4.2.2. Condiii necesare pentru apariia interblocrii.. 40
4.2.3. Graful de alocare a resurselor.... 41
4.2.4. Rezolvarea problemei interblocrii... 42
4.2.4.1. Prevenirea interblocrii42
4.2.4.2. Evitarea interblocrii44
4.2.4.3. Detectarea interblocrii i revenirea din ea. 47
4.2.4.4. Rezolvarea interblocrii n practic. 50
4.3. COMUNICAIA NTRE PROCESE COOPERANTE.. 50
4.3.1. Comunicaie direct i indirect.52
4.3.1.1. Comunicaie direct. 52
4.3.1.2. Comunicaie indirect.. 52
4.3.2. Linii de comunicaii i tipuri de mesaje. 53
4.3.2.1. Linii de comunicaii. 53
4.3.2.2. Tipuri de mesaje.. 54
4.3.3. Excepii n comunicaia interprocese.... 54
4.3.4. Aplicaii ale IPC-urilor.. 55
4.4. PROBLEME CLASICE DE COORDONAREA I
SINCRONIZAREA PROCESELOR.. 56
4.4.1. Problema productor-consumator. 56
4.4.1.1. Rezolvarea problemei productor-consumator cu
ajutorul semafoarelor 56
4.4.1.2. Rezolvarea problemei productor-consumator prin
transmitere de mesaje58
4.4.2. Problema brbierului somnoros. 60
4.4.3. Problema cititori/scriitori. 63
4.4.4. Problema cinei filozofilor chinezi.62
4.4.5. Probleme propuse pentru implementare67
4.4.5.1. Problema rezervrii biletelor67
4.4.5.2. Problema grdinii ornamentale67
Sorin Adrian Ciureanu 318
4.4.5.3. Problema emitor-receptor. 68
5 GESTIONAREA MEMORIEI... 69
5.1. IERARHII DE MEMORIE. 69
5.2. OPTIMIZRI N NCRCAREA I EXECUIA UNUI PROGRAM
N MEMORIE.. 71
5.2.1. ncrcarea dinamic... 71
5.2.2. Overlay-uri. 71
5.2.3. Legarea dinamic... 71
5.3. ALOCAREA MEMORIEI... 72
5.3.1. Alocarea memoriei n limbaje de programare... 72
5.3.2. Caracteristici ale alocatoarelor.. 73
5.3.3. Tipuri de alocare a memoriei. 74
5.3.4. Scheme de alocare a memoriei 74
5.3.4.1. Alocare unic... 75
5.3.4.2. Alocare cu partiii fixe (alocare static).. 75
5.3.4.3. Alocare cu partiii variabile. 76
5.3.4.4. Alocare prin swapping. 77
5.4. PAGINAREA MEMORIEI. 78
5.4.1. Suportul hardware. 78
5.4.2. Implementarea tabelei de pagini.. 80
5.4.3. Concluzii privind paginarea... 81
5.4.4. Segmentarea memoriei.. 82
5.4.5. Segmentarea paginat 83
5.4.6. Memorie virtual83
5.4.6.1. Paginare la cerere. 83
5.4.7. Algoritmi de nlocuire a paginii. 86
5.4.7.1. Algoritmul FIFO.. 86
5.4.7.2. Algoritmul LRU (Least Recently Used).. 87
5.4.7.3. Algoritmul LFU (Least Frequently Used)... 88
5.4.7.4. Algoritmul Real Paged Daemon.. 88
5.4.7.5. Fenomenul trashing.. 89
5.4.7.6.. Concluzii privind paginarea la cerere.. 89
5.5. ALOCAREA SPAIULUI LIBER. TIPURI DE ALOCATOARE... 90
5.5.1. Alocatorul cu hri de resurse 90
5.5.2. Alocatorul cu puteri ale lui doi (metoda camarazilor)... 91
5.5.3. Alocatorul Fibonacci.. 92
5.5.4. Alocatorul Karels-Mckusick. 92
5.5.5. Alocatorul slab.. 93
5.6. GESTIUNEA MEMORIEI N UNELE SISTEME DE OPERARE... 94
5.6.1. Gestiunea memoriei n Unix.. 94
5.6.1. Gestiunea memoriei n Linux. 98
5.6.2. Gestiunea memoriei n WINDOWS . 100
6. GESTIUNEA SISTEMULUI DE INTRARE/IEIRE.. 103
6.1. DEFINIREA SISTEMULUI DE INTRARE/IEIRE.. 103
6.2. CLASIFICAREA DISPOZITIVELOR PERIFERICE 104
6.3. STRUCTURA HARD A UNUI SISTEM DE INTRARE/IEIRE. 104
6.4. STRUCTURA SOFT A UNUI SISTEM DE INTRARE/IEIRE... 107
6.4.1. Rutine de tratare a ntreruperilor107
Sisteme de operare 319
6.4.2. Drivere... 109
6.4.3. Programe-sistem independente de dispozitive.. 112
6.4.4. Primitive de nivel utilizator... 112
6.5. MBUNTIREA OPERAIILOR DE INTRARE/IEIRE... 113
6.5.1. Factorul de ntreesere114
6.5.2. Cache-ul de hard disc.115
6.5.3. Crearea de ctre SO a unui hard disc cu performane
superioare...115
6.5.4. Construirea unui hard disc prin tehnica RAID (Redundant
Arrays of Indpendent Disck)..119
6.6. GESTIUNEA SISTEMULUI I/E N UNELE SO 120
6.6.1. Gestiunea sistemului I/E n UNIX. 120
6.6.1.1. Fiiere speciale de tip bloc 121
6.6.1.2. Fiiere speciale de tip caracter.. 121
6.6.2. Gestiunea sistemului I/E n LINUX 123
6.6.3 Gestiunea sistemului I/E n WINDOWS.. 123
6.6.3.1. Structura general a sistemului I/E n WINDOWS.. 123
6.6.3.2. Drivere n WINDOWS. 125
7. GESTIUNEA RESURSELOR LOCALE. 126
7.1. NOIUNI INTRODUCTIVE. 126
7.2. CLASIFICAREA FIIERELOR... 127
7.2.1. Clasificarea fiierelor dup structur. 127
7.2.1.1. Secvene de octei ... 127
7.2.1.2. Secvene de nregistrri... 127
7.2.1.3. Structura arborescent..127
7.2.2. Clasificarea fiierelor dup tip.. 127
7.2.2.1. Fiiere normale.127
7.2.2.2. Directoare.128
7.2.2.3. Fiiere speciale de tip caracter / bloc... 128
7.2.3. Clasificarea fiierelor dup suportul pe care sunt rezidente.. 128
7.2.4. Clasificarea fiierelor dup acces.. 128
7.2.4.1. Fiiere cu acces secvenial... 128
7.2.4.2. Fiiere cu acces direct.. 129
7.2.4.3. Fiiere cu acces indexat... 129
7.3. ATRIBUTE I OPERAII CU FIIERE129
7.3.1. Atribute.. 129
7.3.2. Operaii cu fiiere.. 129
7.4. IMPLEMENTAREA SISTEMULUI DE FIIERE.130
7.4.1. Alocarea fiierelor pe disc. 130
7.4.1.1. Alocarea contigu130
7.4.1.2. Alocarea nlnuit.. 131
7.4.1.3. Alocarea indexat132
7.4.2. Evidena blocurilor libere.. 134
7.4.3. Eficiena i performana sistemului de fiiere135
7.4.4. Fiabilitatea sistemelor de fiiere135
7.4.4.1. Evitarea distrugerii informaiei136
7.4.4.2. Recuperarea informaiei n urma unei erori hard sau
soft..136
Sorin Adrian Ciureanu 320
7.4.4.3. Asigurarea consistenei sistemului de fiiere 137
7.4.5. Protecia fiierelor..138
7.4.6. Organizarea fiierelor pe disc139
7.4.6.1. Organizarea fiierelor ce folosesc FAT... 139
7.4.6.2. Organizarea fiierelor n HPFS. 139
7.4.6.3. Organizarea fiierelor n NTFS141
7.5. FIIERE N DIFERITE SISTEME141
7.5.1. Sisteme de fiiere pentru CD-ROM-uri 141
7.5.1.1. Sistemul de fiiere ISO9660.. 141
7.5.1.2. Extensia ROCK RIDGE. 143
7.5.1.3. Extensia JOLIET143
7.5.2. Sistemul de fiiere n UNIX.. 143
7.5.2.1. Sistemul de fiiere rapid Berkeley. 144
7.5.2.2. Sistemul de fiiere n LINUX. 144
7.5.2.3. Sistemul de fiiere de reea NFS... 145
7.5.3. Sistemul de fiiere WINDOWS. 147
7.5.3.1. Sistemul de fiiere NTFS... 147
8. SISTEME DE OPERARE PENTRU CALCULATOARE PARALELE.153
8.1. NOIUNI INTRODUCTIVE.153
8.2. SISTEME DE OPERARE N REEA155
8.3. SISTEME DE OPERARE CU MULTIPROCESOARE.155
8.3.1. Programarea paralel.156
8.3.1.1. Memoria partajat ntre procese.. 156
8.3.1.2. Exemple de programare paralel.157
8.4. SISTEME DE OPERARE DISTRIBUITE..161
8.4.1. Structura unui sistem de operare distribuit163
8.4.1.1. Comunicare sistem client / server163
8.4.1.2. Apeluri de proceduri la distan...166
8.4.1.3. Comunicare n grup..167
8.4.2. Exemple de sisteme de operare distribuite.181
8.4.2.1. Sistemul de operare AMOEBA... 181
8.4.2.2. Sistemul de operare GLOBE... 184
9. SECURITATEA SISTEMELOR DE OPERARE.187
9.1. NOIUNI INTRODUCTIVE187
9.2. ATACURI ASUPRA SISTEMULUI DE OPERARE I MSURI
DE PROTECIE MPOTRIVA LOR190
9.2.1. Depirea zonei de memorie tampon (Buffer Overflow).191
9.2.2. Ghicirea parolelor (Password guessing)191
9.2.3. Interceptarea reelei192
9.2.4. Atacul de refuz al serviciului (Denial Of Service)192
9.2.5. Atacuri cu bomba e-mail194
9.2.6. Falsificarea adresei expeditorului (e-mail spoofing). 194
9.2.7. Cai troieni (Trojan Horses)195
9.2.8. Ui ascunse (Back dors and traps). 195
9.2.9. Virui..195
9.2.10
Viermi196
9.3. MECANISME DE PROTEC IE197
9.3.1. Criptografia197
Sisteme de operare 321
9.3.1.1. Criptografia cu chei secrete (Criptografia simetric). 197
9.3.1.2. Criptografia cu chei publice (Criptografia asimetric) 199
9.3.2. Dispozitive firewall200
9.3.2.1. Tipuri de firewall.201
9.3.2.2. Funciile unui firewall..202
9.3.2.3. Forewall-uri n sistemele de operare Windows... 202
9.3.2.4. Firewall-uri n sistemul de operare Linux203
9.3.3. Sisteme de ncredere.. 205
9.3.3.1. Monitorul de referin.. 205
9.3.3.2. Modelul Liste de Control al Accesului (ACL)206
9.3.3.3. Modelul Bell-La Padula.. 207
9.3.3.4. Modelul Biba... 209
9.3.3.5. Modelul securitii Crii Portocalii209
9.3.4. Securitatea n sistemele de operare Windows211
9.3.4.1. Concepte fundamentale de securitate n Windows.. 212
9.3.4.2. Implementarea securitii.214
9.3.5. Securitatea n Linux214
9.3.5.1. Open Source.. 214
9.3.5.2. Programe ce depisteaz i corecteaz vulnerabiliti 215
9.3.5.3. Auditarea sistemului. 216
10 STRUCTURA SISTEMELOR DE OPERARE...219
10.1 SISTEME DE OPERARE MONOLITICE...219
10.2 SISTEME DE OPERARE STRUCTURATE PE NIVELURI. 220
10.3 MAINI VIRTUALE221
10.4 SISTEME DE OPERARE CU MICROKERNEL.. 223
10.5 SISTEME DE OPERARE CU EXOKERNEL. 224
10.6 SISTEME DE OPERARE CU NANOKERNEL..225
10.7 STRUCTURA UNUI SO UNIX/LINUX. 226
10.7.1. Structura nucleului UNIX227
10.8 STRUCTURA UNUI SO WINDOWS229
10.8.1. Implementarea obiectelor n WINDOWS237
11 SISTEME DE OPERARE LINUX. APLICAII... 241
11.1 SCURT ISTORIC... 241
11.2 DISTRIBUII IN LINUX.242
11.2.1 Distribuia SLACWARE.. 242
11.2.2 Distribuia REDHAT242
11.2.3 Distribuia DEBIAN.243
11.2.4 Distribuia MANDRAKE.243
11.2.5 Distribuia LYCORIS... 244
11.2.6 Distribuia SUSE.. 244
11.3 APLICAII LINUX244
11.3.1 Comenzi LINUX245
11.3.2 Crearea proceselor.247
11.3.3 Comunicare ntre procese.. 251
11.3.3.1. Comunicarea ntre procese prin PIPE i FIFO.. 251
11.3.3.2. Comunicarea ntre procese prin semnale. 262
11.3.3.3. Comunicarea ntre procese prin sistem V IPC.
Cozi de mesaje. 273
Sorin Adrian Ciureanu 322
11.3.3.4. Comunicarea ntre procese prin sistem V IPC.
Semafoare.. 282
11.3.3.3. Comunicarea ntre procese prin sistem V IPC
Memorie partajat.. 285
11.3.3.6. Comunicarea ntre fire de execuie... 289
11.3.3.7. Interfaa SOCKET. 290
11.3.3.8. Modelul client / server TCP 293
11.3.3.9. Modelul client / server UDP. 300
BIBLIOGRAFIE.. 307
Sisteme de operare 323
Sorin Adrian Ciureanu 324
DICIONAR
DE TERMENI I PRESCURTRI
Algoritm -de planificare a proceselor:
FCFS=First Come First
Served
Primul venit primul servit
FIFO=First Input First
Output
Primul intrat primul ieit
SJF=Shortest Job First Cea mai scurt sarcin mai nti
-de alegere a spaiului de
memorie liber:
FFA=First Fit Algorithme Algoritm de prima potrivire
BFA=Best Fit Algorithme Alg. de cea mai bun portrivire
WFA=Worst Fit Algorithme) Alg. de cea mai proast potrivire
-de nlocuire a paginii de
memorie
FIFO=First Input First
Output
Primul intrat primul ieit
LRU=Least Recently Used Ultimul folosit
LFU=Least Frequenzly Used Cel mai puin utilizat
Algoritm real- Paged
daemon
Pregtete sistemul pentru
evacuarea de pagini
ACE Acces Control Entries Intrri de control al accesului
ACL Acces Control List List de control al accesului
AES Application Environnement
Specification
Specificaie a serviciilor utilizabile
de ctre o aplicaie client/server
APC Application Procedure Call Apelul unei proceduri de aplicaie
APC Asynchronous Procedure
Call
Apel de procedur asincron
API Application Programing
Interface
O intefa ce conine definiia
tipurilor de date i funciilor apel
n WINDOWS
APT Advanced Package Toll Utilitar pentru pachete deb
Atribute Caracteristici ale fiierelor Nume, tip, locaie, protecie etc.
BCP Bloc Cotrol Process Descriptor de proces
BIOS Basic I/O System Un sistem de memrie pentru
dispozitive intrare/ieire
Boot Proces Boot Un proces care iniializeaz SO
Boot Block Bloc de Boot Conine proceduri i funcii pentru
iniializarea sistemului de fiiere
Booting Botare Creare de procese care s
porneasc SO
BSD Berkeley System
Distribution
Versiune a sistemuluide operare
UNIX
Broadcast Emisie, emitere
Sisteme de operare 325
Bug defect n hard i n soft
Bussy Ocupat
Bussy-sleep Ateptare dormant Protocol de ateptare n excluderea
mutual
Bussy-wait Ateptare ocupat Protocol de ateptare n excluderea
mutual
CACHE Memorie rapidn Parte din memoria principal
CBC Cipher Bloc Chainning Mod de criptare cu nlnuire
CFB Cipher Feed Back Mod de criptare cu reacie
Checksumm Sum de verificare Suma biilor mesajelor
Circuit Level
Gateways
Portie de circuit
CList Capabilities List List de capabiliti
Coad Structur de date Funcioneaz dup principiul
FIFO, cu comenzile POP i PUSH
CODE RED Numele unui vierme
CORBA Common Object Request
Broker Arhitecture
Sistem bazat pe derularea
obiectelor
CPU Central Processing Unit Unitate central de procesare
CRE Cluster tools Runtime
Environement
Mediu de lansare n execuie n
MPI
DACL Discretionary ACL List de acces discreionar
Daemon Demon Un proces care st n fundal,
pentru manevrarea diferitelor
activiti
Deadlock Impas Interblocare n comunicaia
proceselor
DEC Distributed Environement
Corporation
Consoriu
DEC Digital Equipement
Corporation
Consoriu
DES Data Encryption Standard Standard de incriptare a datelor
bazat pe chei secrete
DESX Data Encryption Standard X Tip de DES
DI/EI Invalidare/validare
ntreruperi
Director (Catalog) Un fiier sistem care gestioneaz
structura sistemului de fiiere
DMA Direct Acces Memory Mod de transfer de date n unitatea
de I/E
Disck cache O seciune a memoriei
principale
Pentru blocurile de disc cele mai
des utilizate
DNS Domain Name System Schem de baz de date care
mapeaz ncod ASCII numele
gazdelor pe adresele lor IP
DOS Disck Operating System
DPC Deferred Procedure Call Apelul procedurii de amnare
Sorin Adrian Ciureanu 326
Driver Fiier ce conine comenzi
specifice unui periferic
Partea de SO care depinde de
perifericul asociat
ECB Electronic Code Bloc Mod de criptare cu carte de coduri
Eveniment (Semnal) Mecanism de comunicare ntre
procese
FAT File Alocation Tabel Tabel de alocare a fiierulor
Firestar n UNIX Interfa grafic pentru iptables
Firewall Perete de foc Sistem ce separ o reea protejat
de una neprotejat
Firewall
Builder
n UNIX Interfa grafic pentru iptables
Fiier Entitatea de baz a unui SO Pstreaz informaia
Fragle Atac cu pachete UDP la portul 7 al
adresei broadcast
Free behind Liber n urm Tehnic de optimizare a accesului
secvenial
Handle O intrare n tabelul de
resurse
Entitate de identificare a unui
proces n Windows
HMAC H Message Autentification
Code
Cod de autentificare a mesajelor
bazat pe funcia de dispersie H
HPFS High Performance File
System
Sistem de fiiere de nakt
performan
HTTP Hiper Text Transfer Protocol
I/O Input/Output = Intrare / Ieire
ICMP Protocol de transmitere a
pachetelor de date
Id Identificator proces n Windows
i-nod Nod de indexare
IP Internet Protocol
IP sniffing Atac asupra IP Intercepteaz o reea
IPC Inter Process
Communication
Comunicaie ntre procese
IPspoofing Falsificarea adresei IP Tip de atac
Iptables Firewall n UNIX
IRP I/O Request Packet
ISA Instructions Set Architecture Arhitetura setului de instruciuni
ISR Interrupt Service Routine Rutin de ntrerupere
JDK JAVA Developement Kit
Kernel Nucleu
Land craft Aterizare forat Tip de atac
LIFO Last Input First Out Ultimul intrat, primul ieit
List Structur de date ir de noduri ntr-o relaie de
ordine
LSF Lood Sharing Facility Mediu de lansare n execuie n
MPI
MAC Message Autentification
Code
Cod de autentificare a mesajelor
Sisteme de operare 327
MBR Master Boot Record
MFT Master File System Fiier de informaii asupra
fiierelor de pe volumul respectiv
MP Message Passing Transmisie de mesaje
MPI Message Passing Inteface Intefa n transmisia de mesaje
MORRIS Numele primului vierme inventat
MS-DOS Microsoft Disck Operating
System
Un sistem de operare mai vechi
Mutex Mutual exclusive Obiect de sincronizare
NAT Network Adress Translation Firewall n Windows
NESSUS n UNIX Program de scanare care
determin vulnerabilitile unei
maini
Network
Browser
Aplicaie ce permite
interconectarea cu alte sisteme
UNIX sau WINDOWS
NFS Network File System Sistem de fiiere de reea
NTFS New Tehnology File System Noua tehnologie a sistemului de
fiiere- sistem de organizare a
fiierelor
Obiect n unele limbaje de
programare ca C
++
, JAVA,
CORBA
O colecie de variabile legate ntre
ele printr-un set de proceduri
numite metode; n loc de fiiere
sau documente
OFB Out Feed Back Mod de criptare cu reacie la
ieire
Ofline n afara SO Tip de metod pentru
determinarea blocurilor defecte
ONC Open Network Computing Reea deschis de computere
Online n cadrul SO Tip de metod pentru
determinarea blocurilor defecte
Open Sources Surse deschise Comunitatea sistemelor de operare
libere
Overhead Costul comutrii procesului
Overlay Suprapunere
Packet flood Potop de pachete Bombardarea unei reele cu
pachete de date
Page daemon Demon de paginare Pregtete sistemul pentru
evaccuarea de pagini
Paging Paginarea memoriei
PVM Parallel Virtual Machine
Periferic Dispozitiv aflat n afara UC Ex: hard disc, imprimanta modem,
scanner,CD ROM
PFF Packet Filtering Firewalls Firewall-uri cu filtrare de pachete
PID Process Identificator Identificator de proces UNIX
Ping flood Tip de atac
Ping of death Tip de atac
Sorin Adrian Ciureanu 328
Pipe conduct Un pseudofiier pentru
comunicaia unidirecional
ntredou procese
PRAM Parallel Random Acces
Machines
Maini cu acces ntmpltor
paralel
Proces Program n execuie Sub controlul SO
Proces Switch Comutarea procesului
Program
Counter
Registru special vizibil
utilizatorului
Conine adresa de memorie a
urmtoarei instruciuni de utilizat
Proxies Proxi-uri de aplicaii
PSW Program Status Word
RAID Redundant Array of
Independent Discks
O mulime redundant de discuri
independente
RAM-disc Random Memory Disk O poriune de memorie principal
declarat ca disc virtual
Read ahead Citete nainte Tehnic de optimizare a accesului
secvenial
RPC Remote Process
Comunication
RO Read Only=numai citire Segment de cod
SACL System Acces Control
Scrambling nvlmeal Alterarea i amestecarea mesajelor
Semafor Obiect de sincronizare
Shel n UNIX Interpretor de comenzi
SID Security identificator Identificator de securitate
SIGUSR n UNIX Tip de semnal
Smarf Atac de tipul ICMF asupra adresei
brodcast a reelei
SMI Stateful Multilayer
Inspections
Firewall-uri cu inspecii multistrat
SMTP Simple Mail Transfer
Protocol
Protocol de transfer al mesajelor
Sniffer Adulmecare Program de interceptarea traficului
de reea
SO Sistem de operare
SPAM E.Mail spamming
Spoofing E-Mail spoofing Falsificarea adresei expeditorului
Stack Pointer Registru special vizibil
utilizatorului
Pointeaz pe partea de sus a stivei
curente de memorie
Stiv Structur de date Funcioneaz dup principiul
LIFO
Streamer Nucleu n spaiul utilizator
(analog pipelines-urilor)
Conecteaz dinamic un proces
utilizator la driver
Swapping Deplasare, micare Deplasarea proceselor de pe
memoria principal pe hard disc
Synchronous
calls
Apeluri sincrone Apeluri blocante
Sisteme de operare 329
SYNCOOKIES Un mecanism de prevenire a
atacurilor DOS
SYNflood Potop de pachete SYN Bombardare cu pachete care au
setat numai bitul SYN
SYSTEM V Versiune de UNIX Se bazeaz pe Berkeley UNIX
System calls Apeluri sistem
System Shadow Sistem de umbrire mpiedic accesarea fiierului de
parole
Task (Job) Sarcin
TCB Trusted Computing Base Baz de calcul de ncredere
TCP Transmission Control
Protocol
Protocol de control al transmisiei
pachetelor de date
TCP/IP Transmission Control
Protocol / Internet Protocol
Protocol de control al transmisiei
pachetelor de date
Tear drop Tip de atac TCP
TELNET Television Netwok Reea de televiziune
Thread Fir de execuie Subunitate a unui proces
Time out Timp depit Rezultat al atacului SYNflood
TITAN In UNIX Program de scanare care
determin i corecteaz
vulnerabilitile unei maini
Trashing Devalorizare Cnd procesele folosesc mai mult
timp pentru paginare dect pentru
execuie
Tripwire n UNIX Program de auditare
TS Test and Set Suport hard pentru
validare/invalidare de ntreruperi
sau instruciuni
UC Unitatea Central
UDP User Datagram Protocol Protocol de transmitere a
pachetelor de date
URL Uniform Resource Locator Adresa unic a unei pagini Web
WWW World Wide Web Larg reea mondial
Web Reea, estur Un mare graf orientat de
documente care pointeaz spre alte
documente
Web page Pagin Web Document n reeaua Web
Zombie Stare a unui proces Proces terminat, n ateptarea
terminrii printelui
Zone Allarm
Pro
n WINDOWS Program de instalare a unui
firewall
Sorin Adrian Ciureanu 330
Sisteme de operare 331