Documente Academic
Documente Profesional
Documente Cultură
Gestiunea Memoriei Externe
Gestiunea Memoriei Externe
Datele constituie una dintre cele mai importante resurse ale unui sistem de calcul, în primul rând
pentru cã activitatea de stocare, prelucrare şi transfer de date este activitatea care justificã
existenţa sistemelor de calcul, în al doilea rând pentru cã, de cele mai multe ori, datele gestionate
de o aplicaţie sunt de neînlocuit, în cazul pierderii lor.
Atât stocarea cât şi accesul utilizatorului la date trebuie sã se facã în mod unitar, indiferent de
suportul de memorie externã folosit; în plus, sistemul de operare trebuie sã faciliteze accesul
utilizatorului la date, acţionând ca un element de interfaţã între utilizator şi echipamentele care
realizeazã stocarea datelor.
Schimbul de date gestionat de SGF se realizeazã la nivel de fişier, prin cooperarea rutinelor SGF
cu programele driver corespunzãtoare echipamentelor periferice implicate.
Funcţiile îndeplinite de SGF pentru gestionarea datelor stocate pe suporţii de memorie externã
sunt:
funcţia de evidenţã a fişierelor, care trebuie sã ofere date despre fişiere şi despre modul de
organizare a fişierelor pe suport cât şi despre drepturile de acces ale utilizatorilor la fişiere;
funcţia de alocare a memoriei externe, pentru stocarea fişierelor; pentru realizarea acestei
funcţii, sistemul de operare trebuie sã realizeze şi o evidenţã a ocupãrii dispozitivelor de memorie
externã;
funcţia de dezalocare a memoriei externe, prin eliberarea memoriei externe ocupate;
funcţia de acces la date, care trebuie sã faciliteze accesul utilizatorului la date, prin
localizarea înregistrãrii dorite şi accesarea ei, conform drepturilor de acces.
Utilizând conceptul de fişier, se poate spune cã SGF este acea componentã a sistemului de operare
care implementeazã operaţiile de creare, întreţinere şi exploatare a fişierelor.
Ţinând cont de funcţiile pe care trebuie sã le îndeplineascã în sistemul de calcul, SGF trebuie sã
satisfacã urmãtoarele condiţii:
sã asigure un mecanism de lucru cu fişierele cât mai accesibil pentru utilizator;
sã permitã o utilizare cât mai eficientã a dispozitivelor de memorie externã;
sã asigure o independenţã maximã a programelor faţã de particularitãţile hardware ale
sistemului de calcul;
sã permitã accesul concurent la fişiere;
sã asigure securitatea şi integritatea datelor memorate în fişiere.
Evidenţa fişierelor
Fiecare volum de disc conţine câte o tabelã cu informaţii despre fişierele memorate în volumul
respectiv, tabelã numitã catalog de fişiere sau director. Accesul la fişiere se face pe baza datelor
din aceastã tabelã; fiecare intrare în tabela director conţine câte un descriptor de fişier, ce
cuprinde date despre fişier, şi anume:
cu un singur nivel, definind un director unic pentru fiecare volum de disc; acest director
are dimensiune fixã, deci numãrul de intrãri în director este fix, adicã numãrul maxim de fişiere
care pot fi memorate în volumul de disc este limitat de aceastã valoare maximã. Pentru o astfel de
organizare a sistemului de fişiere, pe un volum de disc poate fi un singur fişier cu un anumit nume
(identificator);
cu douã niveluri, între care existã o relaţie de subordonare:
pe primul nivel se defineşte un director principal MFD (Master File Directory), având câte o
intrare pentru fiecare utilizator; în felul acesta se asigurã protecţia datelor între utilizatori, pentru
cã drepturile de acces ale unui utilizator se pot limita la fişierele din propriul sãu director;
pe al doilea nivel sunt definiţi directorii utilizatorilor, UFD (User File Directory), care conţin câte
o intrare pentru fiecare fişier al utilizatorului respectiv. Pentru o astfel de organizare, pot exista
pe un volum de disc mai multe fişiere cu acelaşi nume, cu condiţia sã aparţinã la UFD-uri diferite;
cu structurã de arbore, care extinde modul de organizare de mai sus la mai multe niveluri;
fiecare volum conţine un director principal, numit rãdãcinã; intrãrile unui director conţine
descriptori pentru toate fişierele pe care le include; un director este tot un fişier, care diferã de
fişierele utilizator numai prin conţinut; rezultã cã un director poate conţine oricâţi directori sau
oricâte fişiere, cu condiţia ca orice fişier sã se gãseascã într-un singur director;
cu structurã de graf aciclic, asemãnãtoare organizãrii în arbore de directori, dar cu
deosebirea cã un fişier poate sã aparţinã la mai mulţi directori.
Pentru a realiza alocarea spaţiului din disc, sistemul de operare trebuie sã asigure o evidenţã a
modului în care este ocupat fiecare volum şi a spaţiului liber din disc. În acest scop, volumul este
împãrţit în unitãţi de alocare de lungime fixã, numite blocuri şi numerotate secvenţial; existã mai
multe modalitãţi de realizare a evidenţei blocurilor libere şi a celor ocupate:
cu ajutorul tabelei de ocupare a volumului (TOV), care are atâtea poziţii câte blocuri are
volumul; în fiecare poziţie se memoreazã câte un indicator, care este setat pe 0 dacã blocul nu este
ocupat şi pe o valoare diferitã de 0 la ocuparea blocului;
cu ajutorul unei liste înlãnţuite a blocurilor libere; în directorul volumului se memoreazã
un pointer la primul bloc liber de pe volum; fiecare bloc liber conţine un pointer la urmãtorul bloc
liber; ultimul bloc liber conţine un indicator de sfârşit de listã; alocarea unui bloc se face cu
scoaterea lui din listã (de obicei de la unul din capetele listei); eliberarea unui bloc se face cu
inserarea blocului în listã; dezavantajul este cã pentru consultarea listei, de exemplu pentru a
determina numãrul blocurilor libere din disc, trebuie încãrcate în memoria internã atâtea blocuri
câte se consultã;
metodã mai eficientã este evidenţa printr-o listã înlãnţuitã şi indexatã a ocupãrii
volumului; în primul bloc liber din volum se memoreazã câte adrese de blocuri libere încap; acest
bloc se numeşte bloc de index; dacã numãrul blocurilor libere depãşeşte capacitatea blocului de
index, pe ultima poziţie din blocul de index se memoreazã adresa unui nou bloc de index, şamd;
în directorul volumului se memoreazã un pointer cãtre primul bloc de index; alocarea de blocuri
libere ca şi inserarea unor blocuri eliberate în blocurile de index se realizeazã la nivelul ultimului
bloc de index.
Alocarea spaţiului pe disc
alocarea este contiguã atunci când fişierul ocupã un set de adrese consecutive în disc;
pentru a face posibil accesul la fişier, în descriptorul de fişier trebuiesc precizate: adresa de
început a fişierului şi lungimea fişierului; în cazul utilizãrii alocãrii contigue poate sã aparã, în
timp, o fragmentare a discului şi necesitatea compactãrii datelor din volum;
alocarea înlãnţuitã se realizeazã când blocurile fişierului alcãtuiesc o listã înlãnţuitã;
acest mod de alocare permite numai accesul secvenţial la fişier; în descriptorul de fişier se
memoreazã adresa primului bloc al fişierului, pentru a permite citirea fişierului şi adresa
ultimului bloc, pentru a permite extinderea fişierului;
alocarea indexatã foloseşte un bloc suplimentar, numit bloc de index, care se genereazã
odatã cu fişierul; în blocul de index se memoreazã, în ordinea alocãrii lor, adresele blocurilor
fişierului; pentru fişiere mari, blocurile de index se pot înlãnţui; aceastã alocare permite accesul
direct la un bloc de date din fişier; în descriptorul de fişier se memoreazã adresa primului bloc de
index şi numãrul de blocuri alocate fişierului.
lucrãrile sunt organizate de la început în fire de aşteptare şi fiecare fir de aşteptare are
alocatã câte o partiţie de memorie. În acest caz, operatorul uman stabileşte alcãtuirea firelor de
aşteptare, înainte de lansarea în execuţie a loturilor de lucrãri. Sistemul de operare încarcã fiecare
proces pe care îl genereazã în partiţia de memorie care corespunde firului de aşteptare din care
face parte lucrarea. Procesul ocupã aceastã partiţie pe toatã durata execuţiei sale şi o elibereazã la
distrugerea sa. În funcţie de spaţiul de memorie care îi este necesar, un proces va ocupa într-o
mãsurã mai mare sau mai micã partiţia care i-a fost afectatã. Rezultã cã acest mod de alocare a
memoriei realizeazã o utilizare mai eficientã a memoriei interne decât în cazul monoprogramãrii,
dar încã mai pot exista partiţii utilizate ineficient. În funcţie de numãrul şi durata de execuţie a
lucrãrilor din fiecare fir de aşteptare, se poate ajunge, la limitã, în situaţia în care toate lucrãrile
rãmase în sistem, pentru a fi executate, aparţin unui singur fir de aşteptare; în acest caz,
multiprogramarea este, practic, inefectivã. Pentru a evita astfel de situaţii, firele de aşteptare se
pot organiza în clase, realizându-se punerea în comun a partiţiilor alocate firelor de aşteptare ale
unei clase pentru toate lucrãrile din clasa respectivã;
prin organizarea unei singure cozi pentru toate partiţiile, caz în care, alocarea unei partiţii
pentru un nou proces este realizatã de sistemul de operare. Aceastã metodã permite alegerea celei
mai potrivite partiţii pentru a fi alocatã unui proces, dar implicã o activitate suplimentarã pentru
sistemul de operare; când dimensiunea partiţiilor libere este prea micã pentru procesul care
urmeazã a fi generat în sistem, acesta trebuie sã aştepte eliberarea unei partiţii suficient de mari
care sã permitã încãrcarea lui, pentru execuţie. Una dintre problemele generate de alocarea cu
partiţii fixe se referã la fixarea lungimii partiţiilor: alegerea unor dimensiuni mari pentru partiţii
oferã mai uşor variante de alocare a unei partiţii, pentru lucrãrile mari; în acelaşi timp, însã, scade
numãrul partiţiilor din sistem, deci scade numãrul proceselor în execuţie, la un moment dat.
d. alocarea realã cu partiţii variabile, sau alocarea dinamicã, permite o utilizare mai
economicã şi mai puţin rigidã a memoriei interne; acest mod de organizare a memoriei interne
presupune împãrţirea memoriei în partiţii al cãror numãr şi dimensiune se stabilesc în funcţie de
necesitãţi şi se modificã automat. O partiţie se caracterizeazã prin adresa şi lungimea sa. Iniţial,
în memoria internã existã o singurã partiţie liberã. În momentul în care un proces este generat în
sistem, pentru a fi lansat în execuţie i se alocã, într-o partiţie liberã, o zonã de lungime suficient
de mare încât sã cuprindã cea mai lungã ramurã a sa. Restul partiţiei, rãmas liber, genereazã o
altã partiţie liberã, în care poate fi încãrcat un alt proces, şamd. În momentul eliberãrii unei
partiţii, aceasta poate fi alocatã unui alt proces care solicitã o partiţie de aceeaşi dimensiune, sau
mai micã. Se observã cã, pentru o sesiune de lucru mai îndelungatã, tendinţa este de creştere a
numãrului de partiţii, ocupate sau nu, în paralel cu scãderea lungimii lor. Aceasta înseamnã cã,
în timp, sistemul poate încãrca, spre execuţie, procese care solicitã un spaţiu de memorie din ce
în ce mai mic. Fenomenul acesta se numeştefragmentarea internã a memoriei şi constituie
principalul inconvenient al alocãrii cu partiţii variabile. Pentru înlãturarea acestui efect, în
momentul în care un proces nu poate fi încãrcat într-o partiţie liberã de memorie, sistemul de
operare poate acţiona în mai multe moduri:
procesul aşteaptã pânã la eliberarea unei partiţii suficient de mari;
se încearcã reconstituirea unei partiţii libere mai mari, din mai multe partiţii libere
adiacente (nu toate sistemele de operare pot realiza aceastã operaţie);
se iniţiazã efectuarea unei operaţii de compactare a memoriei, care constã în deplasarea
partiţiilor active cãtre partiţia monitor şi crearea unei partiţii libere compacte, dupã ultima
partiţie ocupatã. Compactarea memoriei este o operaţie costisitoare (afecteazã timpul de execuţie
al proceselor) şi de aceea se poate recurge la soluţii de compactare parţialã a memoriei (doar
pentru eliberarea unei partiţii de lungime convenabilã) sau de mutare a unui proces într-o partiţie
mai micã, pentru eliberarea partiţiei mai mari pentru alt proces. Între alocarea cu partiţii fixe şi
cea cu partiţii variabile nu existã diferenţe hard de implementare; alocarea cu partiţii variabile se
realizeazã cu funcţii suplimentare ale sistemului de operare.
Memoria virtuală
Conceptul unui singur nivel de memorie- denumită memorie virtuală- oferă utilizatorului
iluzia că memoria internă are o capacitate foarte mare, partea de hardware realizand
automattransferul informaţiei din memoria internă în memoria externă şi invers.
Alocarea virtuala a memoriei interne permite extinderea logicã a memoriei interne, prin
utilizarea memoriei externe.
Alocarea virtualã se bazeazã pe urmãtoarele principii:
programul care se executã este încãrcat integral în memoria externã, numitã memorie virtualã,
respectând convenţiile de încãrcare în memoria internã, adicã:
în locaţii succesive
la adrese relocabile, numite adrese virtuale;
în timpul execuţiei programului au loc schimburi permanente între memoria internã şi
memoria externã, la nivelul unor unitãţi de schimb numite pagini sau segmente, în funcţie de
tehnica de organizare a memoriei virtuale folositã;
pentru a putea identifica entitãţile din program, prin intermediul adresei virtuale, se
realizeazã transformarea adresei virtuale în adresã fizicã, prin intermediul funcţiei de mapare; se
spune cã are loc proiecţia spaţiului virtual peste cel real; pentru a mãri viteza acestei operaţii,
funcţia de mapare se implementeazã hardware;
între douã transferuri succesive între memoria internã şi memoria externã, se executã
secvenţa de instrucţiuni încãrcatã în memoria internã, conform principiului vecinãtãţii: în
majoritatea timpului, execuţia unui program se desfãşoarã într-o vecinãtate apropiatã a
instrucţiunii curente.
Unitatea de transfer intre memoria internă şi cea externă este pagina, aceasta reprezentand
o entitate a memoriei de dimensiune fixă de 512, 1024, 2048 sau 4096 kbytes; procesul de
deplasare al paginilor între memoria internă şi memoria externă este referit ca transfer de
pagini.
O adresă folosită de programator se numeşte adresă virtuală, iar adresa reală unde
este emorată se numeşte adresă fizică (dimensiunea spaţiului de adrese virtuale este mult
mai maredecat imensiunea spaţiului de adrese reale).
Funcţia de translatare a unei adrese virtuale ai in adresă reală bj se poate defini astfel:
ft = 0 dacă informaţia de la adresa virtuală solicitată (ai) nu este in acel moment rezidentă in
memoria internă;
ft = bj dacă adresa virtuală ai găseşte rezidentă adresa reală bj in memoria internă.
Dacă ft(ai) = 0 se emite un semnal de nerezidenţă şi se generează o intrerupere care are ca
efect plasarea din memoria externă in memoria internă, a informaţiei referite de procesor
prin adresa virtuală ai. La terminarea intreruperii (care lansează in execuţie algoritmii de
transfer, plasare şi reamplasare) ft(ai) va fi nenulă, avand loc o nouă iniţiere a activităţii
intrerupte. Dispozitivul de translatare este redat în fig.3.3.