Sunteți pe pagina 1din 87

Administrarea memoriei.

Introducere
Odat cu apariia microprocesoarelor cu posibiliti de management al memoriei on-chip i cu ieftinirea RAM-ului, multe din tehinicile de management al memoriei au migrat de la mainframe-uri la microcalculatoare. Un management al memoriei mai sofisticat nseamn un multitasking mai rapid i mai sigur. Un manager de memorie este un proces, de obicei aparinnd sistemului de operare care ofer servicii de gestionare a memoriei de lucru altor procese. Datoria sa este de a aloca i de a elibera zone de memorie, de a transfera cod i date ntre memoria principal i cea secundar, de a proteja un proces de altul, i de a coordona accesul la zone de date comune mai multor procese. Cu toate c multe dintre sarcinile unui manager de memorie sunt uor de realizat n software, considerente de performan dicteaz adesea folosirea unui anumit memory management hardware. Anumite funcii (precum protecia) necesit asisten din partea unitii de management al memoriei (Memory Management Unit MMU). Un manager de memorie software ofer cel puin dou funcii: alocarea i eliberarea memoriei. Pentru a aloca memorie, procesul care o solicit specific mrimea dorit a blocului de memorie. Managerul de memorie returneaz procesului adresa blocului alocat. Atunci cnd se elibereaz memorie, procesul furnizeaz adresa blocului de memorie (cteodat i lungimea blocului), iar managerul de memorie l returneaz ca bloc de memorie disponibil n sistem. n continuare vor fi prezentate diferite metode de a gestiona memoria. Algoritmii de management al memoriei variaz de la main-bar primitiv pn la strategiile de

segmentare i paginare. Fiecare metod are avantajele i dezavantajele sale. Selecia unei anumite scheme de management al memoriei pentru un anumit sistem depinde de muli factori, cel mai important fiind configuraia hardware a sistemului. Aa cum vom vedea, fiecare algoritm necesit propriul su suport hardware.

1.Algoritmi fundamentali
Algoritmii de management al memoriei discutai n capitolul de fa necesit ndeplinirea unei singure condiii: ntregul proces trebuie s se afle n memoria fizic nainte ca procesul s fie executat. Aceast restricie limiteaz mrimea unui proces la dimensiunea memoriei fizice.

1.1Generaliti
Memoria este un element de baz n funcionarea unui sistem de calcul. Memoria este un tablou de dimensiuni mari de octei (byte) sau de cuvinte (word) fiecare cu propria sa adres. CPUul i extrage (fetch) instruciunile din memorie i citete i scrie datele n memorie. Un proces trebuie s fie ncrcat n memorie pentru a putea fi executat. De obicei procesul se afl pe disc sub forma unui fiier executabil codificat binar. Mulimea proceselor de pe disc care ateapt s fie ncrcate n memorie formeaz coada de intrare. Procedura normal este aceea de a selecta un proces din coada de intrare i de a-l ncrca n memorie. Aceast tehnic poate necesita adrese relocabile sau linkeditarea referinelor externe la puncte de intrare. n timp ce procesul se execut, el

acceseaz instruciuni i date din memorie. Eventual, procesul i termin execuia i spaiul de memorie alocat lui este declarat disponibil. Un proces utilizator se poate afla la orice adres a memoriei fizice. Astfel, cu toate c spaiul de adrese al PC-ului ncepe la adresa 00000, prima adres a unui proces utilizator nu trebuie s fie neaprat 00000. Acest aranjament afecteaz adresele pe care un program utilizator le poate folosi. n cele mai multe cazuri, un program utilizator va parcurge anumii pai (dintre care unii pot fi opionali) nainte de a-i ncepe execuia (Figura 2.1). Adresele pot fi reprezentate n diferite feluri de-a lungul acestor pai. Adresele din programul surs sunt n general simbolice (de exemplu I). Un compilator va translata aceste adrese simbolice n adrese relocabile (ca de exemplu 14 octei de la nceputul modului curent). Editorul de legturi sau ncrctorul va translata aceste adrese n adrese absolute (de exemplu 74014). Fiecare translatare este o funcie care se aplic de la un spaiu de adrese la altul. Un ciclu tipic de execuie a unei instruciuni, de exemplu, va extrage mai nti instruciunea din memorie. Instruciunea este decodat, apoi eventual operanzii sunt extrai din memorie. Dup ce instruciunea a fost executat asupra operanzilor, rezultatul va fi eventual scris n memorie. Este interesant de remarcat este faptul c unitatea de gestiune a memoriei (MMU) vede numai un ir de adrese de memorie; nu tie cum sunt acestea generate (pointerul de intruciuni, indexare etc.) sau pentru ce au fost generate (instruciuni sau date). Corespunztor, putem ignora modul cum o adres de memorie a fost generat de un program. Ne intereseaz numai succesiunea de adrese generate de un program.

1.1.1Crearea adreselor
Metoda clasic de translatare a adreselor instruciunilor i datelor n forma final presupune urmtorii pai: La momentul compilrii. Dac se tie la momentul compilrii ce spaiu de memorie va ocupa procesul, atunci poate fi generat cod absolut. De exemplu, dac se tie a priori c un proces utilizator va fi ncrcat n memorie ncepnd de la locaia R, atunci codul generat de compilator va ncepe de la adresa aceasta i se va extinde spre adrese

mai mari. Dac ulterior locaia de nceput schimbat, atunci se recompileaz acest cod.

trebuie

La momentul ncrcrii. Dac nu se tie la momentul compilrii ce spaiu de memorie va ocupa procesul, atuci compilatorul va trebui s genereze cod relocabil. n acest caz, obinerea adresei finale este amnat pn la momentul ncrcrii. Dac adresa de nceput se schimb, trebuie numai s rencrcm codul utilizator pentru a ncorpora aceast valoare schimbat.

Figura 2.1 La momentul execuiei. Dac procesul poate fi mutat la Pai n procesarea unui program utilizator

1.1.2ncrcare dinamic
Pentru a obine o utilizare mai eficient a spaiului de memorie, putem profita de ncrcarea dinamic. ncrcarea dinamic presupune c o rutin nu este ncrcat pn nu este efectiv apelat. Toate rutinele sunt meninute pe disc ntr-un format de ncrcare relocabil. Programul principal este ncrcat n memorie i executat. Cnd o rutin trebuie s apeleze alt rutin, rutina apelant mai nti cerceteaz dac cealalt rutin a fost ncrcat. Dac nu a fost ncrcat, ncrctorul este apelat pentru a ncrca rutina dorit n memorie i a actualiza tabelele interne pentru a reflecta acest lucru. Apoi controlul este cedat rutinei ncrcate. Avantajul ncrcrii dinamice este acela c o rutin nefolosit nu este niciodat ncrcat. Aceast schem este folosit atunci cnd cod de dimensiuni mari este necesar pentru a gestiona cazuri mai rare, precum diferite rutine de eroare. n acest caz, cu toate c dimensiunea total a programului poate fi mare, poriunea care este actualmente folosit (i deci ncrcat) este mult mai mic. ncrcarea dinamic nu necesit un suport special din partea sistemului de operare. Este responsabilitatea programatorilor proiectarea programelor astfel nct s profite de acest schem.

1.1.3Legare dinamic
De menionat c Figura 2.1 nfieaz de asemenea bibliotecile legate dinamic (dynamically linked libraries), aa-numitele dll-uri. Unele sisteme de operare suport numai legare static, n care bibliotecile sunt tratate ca oricare alt modul obiect i sunt combinate de ncrctor n imaginea executabil a programului. Conceptul legrii dinamice este similar celui de ncrcare dinamic. n loc de a amna ncrcarea pn la momentul execuiei, este amnat legarea. Aceast caracteristic este speculat de obicei de bibliotecile sistem, ca de exemplu bibliotecile de subrutine scrise pentru un anumit limbaj de programare. Fr aceast posibilitate, toate programele de pe un sistem trebuie s aib o copie a bibliotecilor de limbaj (sau cel puin a rutinelor folosite) inclus n imaginea executabil. Aceast condiie duce la utilizarea ineficient att a spaiului de

pe disc, ct i a memoriei principale. Cu legarea dinamic, pentru fiecare referin la o rutin de bibliotec, este inclus n imaginea executabil o zon de cod de mici dimensiuni care indic modul n care poate fi localizat rutina la care s-a fcut apelul. Cnd acest cod este executat, el se nlocuiete pe sine cu adresa rutinei, dup care execut rutina. Astfel, ulterior, cnd acest segment este executat, rutina de bibliotec este accesat direct, fr nici un cost datorat legrii dinamice. Folosind aceast metod, toate procesele care folosesc o bibliotec a unui limbaj execut numai o copie a rutinelor de bibliotec. Sistemul poate fi folosit i pentru actualizarea bibliotecilor (ca de exemplu corectarea erorilor descoperite ulterior). O bibliotec poate fi nlocuit de o versiune nou i toate programele care apeleaz biblioteca vor folosi automat versiunea nou. Fr legarea dinamic, toate aceste programe trebuiau re-linkeditate pentru a obine accesul la noua bibliotec. Pentru ca astfel de programe s nu execute versiuni noi, incompatibile de biblioteci, informaii de versiune sunt incluse att n program ct i n bibliotec. Mai mult de o versiune de bibliotec poate fi ncrcat n memorie, i fiecare program va folosi aceste informaii de versiune pentru a decide care copie a bibliotecii s o foloseasc. Schimbri minore vor conserva numrul de versiune, n timp ce schimbri majore vor incrementa numrul versiunii. Astfel, numai programele care sunt compilate cu noua versiune a bibliotecii vor fi afectate de schimbri incompatibile incorporate n ea. Celelalte programe, link-editate nainte ca noua versiune a bibliotecii s fie instalat, vor continua s foloseasc versiunea veche. Acest sistem este cunoscut i sub numele de biblioteci partajate.

1.1.4Overlay-uri
Din moment ce ntregul spaiu logic al unui proces trebuie s fie n memoria fizic nainte ca procesul s se poat executa, mrimea unui proces este limitat la mrimea memoriei fizice. Pentru a depi aceast restricie, dac un proces este mai mare dect memoria alocat lui, se folosete cteodat o tehnic numit overlay. Ideea overlay-urilor este de a pstra n memorie numai acele instruciuni i date care sunt folosite la un moment dat. Cnd alte instruciuni devin necesare, ele sunt ncrcate n spaiul care a fost anterior ocupat de instruciunile 9

de care acum nu mai este nevoie i care au fost nlocuite. De exemplu, s considerm un asamblor n doi pai. La pasul 1 el construiete tabela de simboluri i apoi n timpul pasului 2 genereaz codul. S presupunem c dimensiunea zonelor de memorie este dup cum urmeaz: 70K Pasul 1 Pasul 2 Tabela de simboluri 80K 20K

30K Rutinele comune Pentru a ncrca totul odat ar fi nevoie de 200K de memorie. Dac numai 150K sunt disponibili acest proces nu poate fi executat. Totui se remarc faptul c pasul 1 i pasul 2 nu trebuie s se afle simultan n memorie. Se vor putea defini astfel dou overlay-uri: A) - tabela de simboluri, rutinele comune la pasul 1, i (B) - tabela de simboluri, rutinele comune la pasul 2. Mai trebuie programat un driver de overlay (10K) i se pornete execuia cu overly-ul A n memorie. Cnd se termin pasul 1, se execut un salt la driverul de overlay care va citi overlay-ul B n memorie, suprascriind overlay-ul A, i apoi transfer controlul pasului 2. Overlay-ul A are nevoie de numai 120K, n vreme ce overlay-ul B necesit 130K (Figura 2.1). Poate fi rulat acum asamblorul n cei 150K disponibili. Totui, va rula puin mai ncet deoarece vor interveni operaii de intrare-ieire pentru a citi overlay-ul B n memorie peste overlay-ul A. Codul pentru overlay-ul A i codul pentru overlay-ul B este pstrat pe disc n imagini executabile, i sunt citite de driverul de overlay la nevoie. Pentru a construi un overlay sunt necesari algoritmi relocare i linkeditare speciali. Ca i la ncrcarea dinamic, overlay-urile nu necesit nici un suport special din partea sistemului de operare. Ei pot fi complet implementai de ctre programator, citind din fiiere n memorie i apoi executnd un salt la acea zon de memorie. Programatorul, pe de alt parte, trebuie s proiecteze i s programeze efectiv structura overlay-urilor. Aceast sarcin poate fi foarte dificil, necesitnd cunotine complete despre structura unui program, codul su, i structurile sale de date. Din moment ce programul este prin definiie mare (pentru programele mici nu este nevoie a se crea overlay-uri), pentru a

10

putea utiliza aceast tehnic programatorul trebuie s cunoasc n amnunt funcionarea ntregului program, lucru dificil de cele mai multe ori. Din acest motiv folosirea overlay-urilor este limitat n mod curent la microcalculatoare i alte sisteme care au cantiti limitate de memorie fizic i crora le lipsete suportul hardware pentru tehnici mai avansate. Tehnicile automate pentru a rula programe mari n zone de memorie limitate sunt evident preferabile. Figura 2.8 Overlayuri pentru un asamblor n doi pai

1.2Swapping
Un proces trebuie s fie ncrcat memorie pentru a putea fi executat. Un proces, totui, poate fi scos temporar (swapped) din memorie ntr-un mediu de stocare secundar (backing store), i apoi adus din nou n memorie pentru a-i continua execuia. O variant a acestei tehnici de swapping este folosit pentru algoritmii de mutitasking bazai pe nivele de prioritate. Dac un proces cu prioritate mai mare sosete i cere controlul

11

CPU-ului, atunci managerul de memorie poate elimina procesul mai puin prioritar pentru a ncrca i a executa procesul cu prioritate mai mare. Cnd procesul de prioritate mai mare i termin execuia, procesul mai puin prioritar poate fi transferat napoi n memorie pentru a-i continua execuia. Aceast variant de swapping mai este denumit uneori roll-out, roll-in. Ar fi normal ca un proces care a fost transferat n mediul secundar, s fie ulterior adus n acelai spaiu de memorie pe care l-a ocupat anterior. Aceast restricie este dat de metoda de formare a adreselor. Dac adresele finale sunt obinute la momentul asamblrii sau ncrcrii, atunci procesul nu poate fi mutat n locaii diferite. Dac adresele finale sunt obinute la momentul execuiei, atunci este posibil ca procesul s fie adus n memorie n alt spaiu de adrese. Metoda swapping necesit un mediu de stocare secundar (backing store). Mediul de stocare secundar este de obicei un disc rapid. Acesta trebuie s fie destul de mare pentru a putea cuprinde copii ale tuturor imaginilor din memorie ale tuturor proceselor i trebuie s permit acces direct la aceste imagini. Sistemul ine evidena printr-o coad de intrare ce conine lista tuturor proceselor ale cror imagini sunt n mediul de stocare secundar sau n memorie i sunt gata s ruleze. Ori de cte ori scheduler-ul decide s execute un process, el apeleaz rutina dispecer. Dispecerul verific dac urmtorul proces din coada de intrare se afl n memorie. Dac procesul nu se afl n memorie, i nu exist nici o regiune liber de memorie, dispecerul salveaz pe disc un proces care n acel moment se afl n memorie i n spatiul care fusese ocupat de acesta ncarc procesul dorit. Apoi el rencarc regitrii cu valorile salvate la momentul cnd acest proces a fost ntrerupt i transfer controlul acestui proces. Este evident c timpul necesar unui astfel de transfer ctre mediul secundar este mare. Pentru a nelege ce nseamn acest lucru, s presupunem c un proces utilizator are mrimea de 100K i mediul de stocare secundar este un disc lent cu o rat de transfer de 1 megabyte pe secund. Transferul n cauz al procesului de 100K va lua un timp de: 100K / 1000K pe secund = 1/10 secunde = 100 milisecunde Dac presupunem c timpul necesar poziionrii capetelor de citire-scriere la locaia dorit este de 8 milisecunde, atunci timpul necesar transferului este 108 milisecunde. Din moment

12

ce trebuie s realizm acest transfer de dou ori - odat spre disc i alt dat spre memorie, timpul total luat de un swap va fi de 216 milisecunde. Pentru o utilizare eficent a CPU-ului, este de dorit ca timpul afectat execuiei unui astfel de proces s fie mare relativ la timpul de swap. De remarcat c marea parte a timpului de swap este timpul de transfer. Timpul total de transfer este direct proporional cu cantitatea de memorie care trebuie eliberat. Dac avem un PC cu 1 Mbyte de memorie RAM i un sistem de operare (rezident) ce ocup 100K, mrimea maxim a unui proces este de 900K. Totui, majoritatea proceselor utilizator vor fi mult mai mici dect aceast cantitate - s spunem 100K. Un proces de 100K ar putea fi scos n 108 milisecunde numai, n raport cu 908 milisecunde pentru 900K. n consecin ar fi util dac am ti exact ct ocup un proces utilizator, nu numai ct ar putea folosi. Astfel vom scoate numai ce este folosit, reducnd timpul de swap. Pentru ca aceast schem s fie funcional, utilizatorul trebuie s informeze sistemul de operare despre orice schimbri n necesarul de memorie. Astfel, un proces cu un necesar dinamic de memorie, va realiza apeluri sistem (alocare de memorie i eliberare de memorie) pentru a informa sistemul de operare despre schimbrile necesare. Mai exist i alte constrngeri pentru swapping. Dac vrem s nlocuim un proces, trebuie s fim siguri c este disponibil pentru aceasta. O situaie particular creeaz orice activitate de I/O. Este posibil s dorim s nlocuim un proces care ateapt o operaie de I/O. Dac operaia de I/O nesincronizat acceseaz n memoria utilizator bufferele, atunci procesul nu poate fi nlocuit. S presupunem c operaia de I/O ntrzie deoarece perifericul a fost ocupat. Atunci, dac am vrea s scoatem procesul P1 i n spaiul ocupat de acesta s aducem procesul P2, operaia de I/O va ncerca s foloseasc memoria care acum aparine procesului P2. Cele dou soluii importante ale acestei probleme sunt: (1) niciodat nu se va realiza swap asupra unui proces n timpul unei activiti de I/O, sau (2) s se execute operaia numai n bufferele sistemului de operare. Transferurile ntre bufferele sistemului de operare i memoria procesului se vor realiza numai cnd procesul este readus n memorie. O versiune modificat de swapping a fost folosit la primele versiuni de UNIX. Swapping-ul era iniial inactiv, dar

13

pornea dac rulau multe procese care foloseau o mare cantitate de memorie. Swapping-ul era oprit dac gradul de solicitare a sistemului scdea. Astzi swapping-ul standard este folosit n foarte puine sisteme.

1.3Alocarea unei singure partiii


Cea mai simpl schem de management al memoriei este absena tuturor restriciilor. Utilizatorul are controlul complet al spaiului de memorie. Acest punct de vedere are anumite avantaje certe. Ofer flexibilitate maxim utilizatorului: utilizatorul poate controla folosirea memoriei oricum dorete. Are simplitate maxim i cost minim. Nu este nevoie de hardware special pentru acest tip de management al memoriei. Nici nu este nevoie de un software al sistemului de operare. Din nefericire i dezavantajul este evident: nu ofer nici un serviciu. Utilizatorul are controlul complet al PC-ului, dar sistemul de operare nu are control asupra ntreruperilor, nici mecanisme pentru a procesa apelurile sistem sau erorile i nu are spaiu pentru a oferi mutiprogramare. Aceast strategie este folosit de obicei n sistemele dedicate n care utilizatorul are nevoie de simplitate i flexibilitate i i va programa propriile sale rutine. Cea de-a doua schem simpl este de a mpri memoria n dou partiii, una pentru utilizator i alta pentru sistemul de operare rezident. Este posibil s se plaseze sistemul de operare fie n memoria inferioar, fie n memoria superioar. Factorul determinant care afecteaz aceast decizie este n general locaia tabelei vectorilor de ntrerupere. De vreme ce tabela vectorilor de ntrerupere este n general n memoria inferioar, este mai comod s se plaseze sistemul de operare n memoria joas. Vom analiza n continuare numai situaia n care sistemul de operare se gsete n memoria inferioar (Figura 2.3), cellalt caz fiind similar.

14

Figura 2.3 Sistem cu un singur utilizator

Dac sistemul de operare se afl n memoria inferioar i un proces utilizator se execut n memoria superioar, trebuie s protejm codul i datele sistemului de operare de schimbri (accidentale sau intenionate) din partea procesului utilizator. Aceast protecie trebuie s fie oferit de hardware i poate fi implementat folosind o schem cu restricii relativ la baza i limita segmentelor. De remarcat c din moment ce avem un singur proces utilizator, registrul de limit nu este neaprat necesar. O alt problem ce trebuie rezolvat este ncrcarea proceselor utilizator. Cu toate c spaiul de adresare al PC-ului ncepe la 00000, prima adres a programului utilizator nu este 00000, ci adresa care se gsete n registrul de baz. Dac adresa de baz este cunoscut la momentul compilrii, se poate genera cod absolut. Acest cod va ocupa n memorie o zon ncepnd de la valoarea care se gsete n registrul de baz i se va extinde spre adrese mai mari. Dac adresa de baz se schimb ulterior, acest cod trebuie recompilat. Ca o alternativ, compilatorul poate genera cod relocabil. n acest caz, formarea adresei finale este amnat pn la momentul ncrcrii. Dac adresa de baz se schimb, codul utilizator trebuie numai rencrcat pentru ca valoarea schimbat s fie incorporat. Dificultatea aceastei scheme este aceea c valoarea de baz trebuie s fie static n timpul execuiei programului. Evident, dac adresele utilizator sunt create folosind registrul de baz, atunci dac acesta se schimb, adresele nou generate 15

vor fi invalide. Astfel, adresa de baz se poate schimba numai atunci cnd nici un proces utilizator nu se afl n execuie. Exist cazuri totui, cnd este de dorit schimbarea dimensiunii spaiului ocupat de sistemului de operare (i deci a registrului de baz) n timpul execuiei. De exemplu, sistemul de operare conine un spaiu pentru buffere i cod pentru drivere de periferice. Dac un driver de periferic (sau alt serviciu al sistemului de operare) nu mai este folosit, nu este recomandat s se pstreze aceste buffere i cod n memorie, din vreme ce putem folosi acest spaiu pentru alte scopuri. Un astfel de cod se mai numete cod tranzitoriu al sistemului de operare (transient code); el este ncrcat i descrcat dup nevoie. Astfel, folosind sau nu acest cod, dimensiunea spaiului alocat sistemului de operare se schimb n timpul execuiei programelor (Command.com sub DOS are o astfel de poriune). Exist dou posibiliti de a modifica schema de baz pe care am prezentat-o pentru a permite ca dimensiunea spaiului alocat sistemului de operare s se schimbe dinamic. Prima posibilitate este de a ncrca procesul utilizator n memoria nalt, ncepnd de la cea mai mare adres disponibil spre adrese mai mici. Avantajul este acela c tot spaiul nefolosit este n mijloc i fie utilizatorul, fie sistemul de operare se pot extinde n acest spaiu nefolosit, dac este necesar. Un punct de vedere mai general este de a amna formarea adresei finale pn la momentul execuiei. Aceast schem necesit un suport hardware modest ca n Figura 2. Registrul de baz este numit acum registru de relocare. Valoarea din registrul de baz este adunat la fiecare adres generat de programul utilizator. De exemplu, dac valoarea din registrul de baz este 14.000, o ncercare din partea utilizatorului de a accesa locaia 0 este dinamic relocat la locaia 14.000; un acces la adresa 346 este relocat la locaia 14.346. De remarcat c programul utilizator nu vede niciodat adresa fizic real. Programul poate crea un pointer la adresa 346, poate s-l salveze n memorie, s-l maipuleze, s-l compare cu alte adrese - toate acestea cu numrul 346. Numai cnd este folosit ca o adres de memorie este relocat relativ la registrul de baz. Programul utilizator lucreaz cu adrese logice. Maparea hardware a memoriei convertete adresele logice n adrese fizice. Acest sistem al formrii adresei finale a fost prezentat n . Pentru acest tip de hardware, o schimbare a locaiei de

16

nceput a programului necesit numai o schimbare a registrului de baz i mutarea ntregii memorii utilizator n zona potrivit. Aceast metod poate necesita deplasarea unei mari zone de memorie, dar permite ca baza s fie schimbat oricnd. De remarcat c acum avem dou tipuri de adrese: adrese logice (n intervalul 0 - max) i adrese fizice (n intervalul R + 0 - R + max pentru o valoare de baz R). Utilizatorul genereaz numai adrese logice i crede c procesul ruleaz n locaiile de la 0 la max. Sistemul de operare cunoate situaia de fapt i poate accesa direct memoria fizic. Toate informaiile transferate de la programul utilizator la sistemul de operare (ca de exemplu adrese de buffere n apeluri sistem) trebuie relocate explicit de ctre sistemul de operare nainte de a fi folosite. Aceast cerin este important n special pentru adresele transferate perifericelor de I/O. Programul utilizator folosete numai adrese logice. Acestea trebuie s fie mapate n adrese fizice nainte de a fi folosite. Figura 2.4 Relocare dinamic folosind un registru de relocare

Conceptul de spaiu de adrese logice care este construit separat pe un spaiu de adrese fizice este fundamental n gestiunea memoriei.

1.4Alocarea de partiii multiple


ntr-un sistem cu multiprogramare, mai multe procese diferite se afl n memorie i CPU-ul este oferit pe rnd fiecrui proces.

17

Sarcina managerului de memoriei este de a aloca memorie diferitelor procese care se afl n coada de intrare i care ateapt s fie aduse n memorie i executate. Una din cele mai simple scheme pentru alocarea memoriei este de a o mpri ntr-un numr de partiii de mrime fix. Fiecare partiie poate conine exact un proces. Astfel gradul de multiprogramare este dat de numrul de partiii. Cnd o partiie este liber, este selectat un proces din coada de intrare i ncrcat n partiia liber. Cnd procesul se termin, partiia devine disponibil pentru alt proces. Aceast schem a fost iniial folosit de sistemul de operare IBM OS/360 (numit MFT), dar astzi este considerat ca fiind depit. Schema descris n continuare este o generalizare a schemei cu partiii fixe.

1.4.1Schema de baz
Sistemul de operare pstreaz o tabel indicnd care pri din memorie sunt disponibile i care sunt ocupate. Iniial toat memoria este disponibil pentru procesele utilizator, i este considerat ca un bloc mare de memorie continu. Cnd un proces sosete i are nevoie de memorie, se va cuta un spaiu destul de mare pentru a pstra acest proces. Dac este gsit unul, alocm numai atta memorie ct este necesar, pstrnd restul disponibil pentru solicitri ulterioare. De exemplu, s presupunem c avem 2560K de memorie disponibil i un sistem de operare de 400K. Acest situaie las 2160K disponibili pentru procesele utilizator. Fiind dat coada de intare:
Proces P1 P2 P3 P4 P5 Memorie 600K 1000K 300K 700K 500K Timp 10 5 20 8 15

i un algoritm pentru scheduler cu cuante de timp, putem aloca memorie imediat proceselor P1 , P2 , P3 crend harta de memorie din Figura 2.5(a). Exist o zon liber de 260K care nu poate fi folosit de

18

nici unul din procesele care mai rmn n coada de intrare. Folosind un algoritm pentru planificare cu acordare de timp, procesul P2 se va termina la momentul 14, elibernd memoria alocat lui. Aceast situaie este ilustrat n Figura 2.5(b). Acum, privind coada de intrare trebuie s programm procesul P4 pentru CPU ceea ce produce harta din Figura 2.5(c). Procesul P1 se va termina la momentul 28 i va produce harta din Figura 2.5(d); procesul P5 este apoi programat, avnd drept consecin harta din Figura 2.5(e). Acest exemplu ilustreaz cteva aspecte. Exist n orice moment un set de zone libere, de mrimi diferite, mprtiate n memorie. Cnd un proces sosete i are nevoie de memorie, cutm n acest ir o zon suficient de mare pentru acest proces. Dac zona gsit este prea mare, ea va fi mprit n dou: o parte este alocat procesului, iar cealalt este napoiat irului de zone libere. Cnd un proces se termin, el elibereaz blocul su de memorie, care este apoi trecut n irul de zone libere. Dac noua zon eliberat este adiacent cu alte zone libere, se vor reuni cele dou blocuri pentru a forma unul singur. n acest moment se verific dac exist vreun proces care ateapt s-i fie alocat memorie i dac aceast zon nou creat ar putea s satisfac vreuna dintre cererile existente.

19

Figura 2.5 Alocarea memoriei pentru un scheduler de termen lung

P4

Aceasta este o aplicaie particular a problemei alocriimeninerii dinamice, care este aceea de a satisface o cerere de mrime n dintr-o list de zone libere. Setul de zone libere este cercetat pentru a determina care zon este mai adecvat pentru alocare. First-fit, best-fit, worst-fit sunt cele mai comune strategii folosite pentru a selecta o zon liber dintr-un set de blocuri libere disponibile. First-fit. Aloc primul bloc care este suficient de mare. Cutarea poate ncepe fie de la nceputul listei de blocuri, fie de la poziia pe care cutarea s-a oprit ultima dat. Cutarea se oprete imediat ce a fost gsit o zon suficient de mare. Best-fit. Aloc cel mai mic bloc care este suficient de mare. Cutarea se face n ntreaga list n cazul n care aceasta nu este pstrat ordonat dup mrimea blocurilor. Acest strategie va produce cea mai mic zon liber (datorat fragmentrii blocului liber iniial n dou pri) dup alocarea unui proces.

20

Worst-fit. Aloc cea mai mare zon. Din nou, trebuie cutat ntreaga list, dac nu este sortat dup mrime. Strategia produce cea mai mare zon liber dup alocare, care ar putea fi mai de folos dect cea mai mic zon din cazul algoritmului best-fit. Prin simulare s-a artat c first-fit i best-fit sunt mai eficiente din punctul de vedere al fragmentrii i timpului. Dintre first-fit i best-fit, nici unul nu este n mod clar mai bun ca cellalt din punctul de vedere al fragmentrii, dar first-fit este mai rapid. Aceti algoritmi sufer de fragmentare extern. Pe msur ce procesele sunt ncrcate i descrcate din memorie, spaiul de memorie liber este mprit n mici blocuri. Fragmentarea extern apare atunci cnd exist suficient spaiu liber pentru a satisface o cerere, dar nu este continuu. n funcie de cantitatea de memorie existent n sistem i de mrimea medie a unui proces, fragmentarea extern poate fi o problem major sau una minor. Odat ce un bloc de memorie a fost alocat unui proces, procesul poate fi ncrcat n acest spaiu i executat. Protecia memoriei este absolut necesar atunci cnd cteva procese se afl simultan n memorie. Aceast protecie poate fi dat de folosirea regitrilor de baz i de limit. Aceti regitrii permit relocare dinamic la momentul execuiei. Registrul de baz conine cea mai mic adres fizic disponibil n blocul alocat; registrul de limit conine intervalul de adrese logice permis (de exemplu baza poate fi 100.040, iar limita 74.600). Cu regitrii de baz i de limit, fiecare adres logic trebuie s fie mai mic dect valoarea registrului de limit; se va reloca dinamic adresa logic adunnd-o pe aceasta la valoarea registrului de baz. Aceast adres relocat este trimis n memorie. Cnd planificatorul selecteaz un proces, dispecerul ncarc regitrii de limit i de baz cu valorile corecte. Din vreme ce fiecare adres generat de CPU este controlat pe baza acestor regitrii, se poate proteja codul i datele altor programe utilizator de procesul care ruleaz la momentul curent. O alt problem este urmtoarea: s presupunem o zon liber de 18.464 octei; s mai presupunem c urmtorul proces solicit 18.462 octei. Dac alocm memorie n dimensiune de exact mrimea blocului, vom rmne cu o zon liber de 2 octei. Dac am vrea s inventariem i aceast zon ca liber,

21

cantitatea de memorie necesar pentru a realiza aceasta va fi mai mare dect zona n cauz. O soluie des utilizat este aceea de a aloca zone de dimensiuni mici ca parte a unei singure cereri. Astfel, memoria alocat poate fi puin mai mare ca memoria necesar. Diferena dintre dimensiunile acestor zone de memorie se numete fragmentare intern - memorie care este n interiorul unei partiii, dar nu este folosit.

1.4.2Planificarea pe termen lung


Pe msur ce procesele intr n sistem, ele sunt puse n coada de intrare. Planificatorul pe tremen lung ia cunotin despre necesitile fiecrui proces i dimensiunea memoriei disponibile pentru a decide crui proces s-i aloce memorie. Cnd unui proces i este alocat un spaiu, procesul este ncrcat n memorie (i relocat dac este necesar). Atunci poate concura pentru CPU. Cnd un proces se termin, el va elibera memoria, iar planificatorul va decide crui alt proces s-i aloce aceast memorie. n orice moment exist o list de blocuri disponibile de mrimi diferite i coada de intrare. Planificatorul poate ordona coada de intrare n funcie de algoritmul de planificare. Memoria este alocat proceselor pn cnd, n final, unui proces nu i se mai pot oferi resurse (nici o zon de memorie nu este destul de mare pentru a primi procesul). Se poate atunci atepta pn cnd un bloc de memorie suficient de mare este disponibil, sau poate cuta n coada de intrare pentru a vedea dac nu cumva poate aloca memorie altui proces de prioritate mai mic. Cu aceast schem poate exista fragmentare intern foarte mic sau zero, de vreme ce partiiile sunt create de mrimea cerut de proces. Totui, putem avea fragmentare extern. Figura 2.5, prezint dou astfel de situaii. n Figura 2.5(a) exist o fragmentare extern total de 260K, un spaiu care este prea mic pentru a satisface cererile oricruia dintre procesele care mai rmn, P4, P5. n Figura 2.5 (c), totui, avem o fragmentare extern total de 560K (= 300K + 260K). Acest spaiu ar fi destul de larg pentru a rula procesul P5 (care necesit 500K), dar nu este continuu. Spaiul de memorie liber este fragmentat n dou blocuri, prea mici pentru a satisface cererea procesului P5.

22

Aceast problem a fragmentrii poate fi foarte grav. n cel mai ru caz, avem un bloc de memorie disponibil (pierdut) ntre orice dou procese. Dac toat aceast memorie ar fi fost dintr-o singur bucat, am fi putut rula ceva mai multe procese. Oricum, oricare algoritm s-ar folosi, fragmentarea extern rmne o problem.

1.4.3Compactarea
O soluie la problema fragmentrii externe este compactarea. Metoda presupune modificarea hrii memoriei astfel nct toate zonele libere s formeze un bloc mare. De exemplu, harta memoriei din Figura 2.5 poate fi compactat, ca n Figura 2.6. Aceste trei zone libere, de mrimi 100K, 300K, 260K pot fi compactate ntr-una singur de mrime 660K. Figura 2.6 Compactare

Compactarea nu este totdeauna posibil. De remarcat c n Figura 2.6 au fost mutate procesele P4 i P3. Pentru ca aceste procese s poat rula la noua locaie, toate adresele interne trebuie relocate. Dac relocarea este static i este realizat la momentul asamblrii sau ncrcrii, compactarea nu se poate realiza; Compactarea este posibil numai dac relocarea este dinamic, i este realizat la momentul execuiei. Dac

23

adresele sunt relocate dinamic, relocarea necesit numai mutarea codului i datelor i schimbarea valorii registrului de baz pentru a reflecta noua situaie. Cnd compactarea este posibil, trebuie s-i calculm costul. Cea mai simpl metod de compactare este mutarea tuturor proceselor spre sfritul memoriei; toate zonele libere se vor deplasa n sesul opus, producnd o zon mare de memorie disponibil. Aceast metod poate fi destul de costisitoare. S considerm alocarea memoriei din Figura 2.7. Dac am folosi acest algoritm simplu, ar trebui s mutm procesele P3 i P4, cu un total de 600K deplasai. n situaia iniial, am putea muta pur i simplu procesul P4 naintea procesului P3, mutnd numai 400K, sau am putea muta procesul P3 dup procesul P4 mutnd numai 200K. De remarcat c zona de memorie liber nu este la sfritul memoriei, ci n mijlocul ei. Dac coada de intrare ar fi coninut un proces care necesita 450K, puteam satisface aceast cerere particular mutnd procesul P2 n alt parte (de exemplu dup procesul P4). Cu toate c aceast soluie nu creeaz o singur zon de memorie disponibil, ea satisface o cerere imediat. Swapping-ul poate fi de asemenea combinat cu compactarea. Un proces ntre diferite moduri de spre mediul Figura 2.7 Comparaie poate fi scos din memorie secundar i apoi memoriei Cnd procesul este scos, memoria compacatre a adus napoi. ocupat de el este eliberat i poate fi folosit pentru un alt proces.

24

Cnd procesul trebuie s fie readus n memorie, pot apare cteva probleme. Dac se folosete relocare static, procesul trebuie adus n memorie la aceeai locaie pe care o ocupa nainte. Aceast constrngere poate impune ca alte procese s fie scoase n mediul secundar. Dac este folosit relocarea dinamic (precum cea cu regitrii de baz i limit), atunci procesul poate fi readus n memorie n alte locaii. n acest caz, gsim o zon liber, compactm dac este necesar, apoi readucem procesul n memorie. O variant de compactare este aceea de a scoate spre mediul secundar numai acele procese care trebuie mutate, iar apoi s fie readuse n memorie la locaii diferite.

1.5Regitrii de baz multipli


Principala problem care apare n schema partiiilor de mrime variabil este fragmentarea extern. O cale de a reduce dimensiunea medie a fragmentrii externe este de a mpri cantitatea de memorie de care are nevoie un proces n cteva pri. Fiecare parte este mai mic dect ntregul, i este astfel mai uor de gsit un spaiu liber n care s ncap. Pentru a aplica aceast idee trebuie s fie disponibili regitri de baz multipli cu un mecanism de translatare din spaiul adreselor logice n cel al adreselor fizice. O cale de a realiza aceasta este de a mpri memoria n dou pri disjuncte. Sistemul va avea dou perechi de regitri de baz i de limit. Memoria este mprit n dou prin folosirea sau nu a celui mai semnificativ bit al unei adrese. Jumtatea inferioar este relocat i limitat de prima pereche de regitri baz-limit; Cea de-a doua jumtate este relocat i limitat de a doua pereche de regitrii baz-limit. Prin convenie, asambloarele i compilatoarele pun valorile readonly (ca instruciunile i constantele) n memoria nalt, iar variabilele n memoria joas. Bii de protecie sunt asociai cu fiecare pereche de regitri i pot consolida natura read-only a memoriei superioare. Acest aranjament permite programelor s fie mprite mai multor procese utilizator, fiecare cu segmentul su separat de memorie inferioar. O alt cale de a realiza aceasta este de a separa

25

programul n dou pri: cod i date. Procesorul tie cnd vrea o instruciune (instruction fetch) sau o dat din memorie (data fetch). Deci, dou perechi de regitrii baz-limit sunt disponibile: una pentru instruciuni i alta pentru date. Registrul baz-limit pentru instruciuni este n mod automat read-only, deci programele pot fi folosite n comun de mai multe procese utilizator diferite. n aceast schem, separnd instruciunile i datele i relocndu-le separat, putem oferi programele ncrcate mai multor utilizatori. Astfel, am folosi mai bine memoria, reducnd i fragmentarea i folosirea de copii ale aceluiai cod - cod folosit n mod curent precum compilatoare, editoare .a.m.d.

1.6Paginarea
Schema partiiilor de mrime variabil sufer de fragmentare extern. n general, aceast situaie apare cnd memoria disponibil nu este continu, ci se gsete n mai multe blocuri mprtiate. De vreme ce memoria alocat unui anumit proces trebuie s fie continu, aceast memorie nu poate fi folosit. Aceast problem are dou soluii generale. Compactarea schimb alocarea memoriei pentru a face spaiul liber de memorie continuu, deci utilizabil. Paginarea permite ca memoria unui proces s nu fie continu, permind astfel ca procesului s-i fie alocat memorie oriunde aceasta este disponibil. Paginarea evit problema dificil a aranjrii blocurilor de memorie de mrime variabil n memorie, problem ridicat de majoritatea schemelor anterioare. Cnd blocuri de cod i date trebuie scoase ctre memoria secundar, trebuie s se gseasc spaiu n aceasta. Problema fragmentrii care apare n gestiunea memoriei principale se ntlnete i la memoria secundar, cu excepia faptului c accesul aici este mult mai lent, deci compactarea este aproape imposibil. Datorit avantajelor sale asupra celorlalte metode, paginarea este des folosit n proiectarea sistemelor de operare.

26

Figura 1.8 Paginarea hardware

1.6.1Hardware
Memoria fizic este mprit n blocuri de mrime fix numite frame-uri. Memoria logic este de asemenea mprit n blocuri de aceeai mrime, numite pagini. Cnd un proces este gata de a fi executat, paginile sale sunt ncrcate din mediul secundar n orice frame-uri disponibile. Mediul secundar este de asemenea mprit n blocuri de mrime fix care sunt de aceeai mrime ca frame-urile memoriei.

27

Suportul hardware pentru paginare este ilustrat n Figura 1.8. Fiecare adres generat de CPU este mprit n dou pri: un numr de pagin (p) i un offset n acea pagin (d). Numrul de pagin este folosit ca un index ntr-o tabel de pagini. Tabela de pagini conine adresa de baz a fiecrei pagini n memoria fizic. Aceast adres de pagin este combinat cu offsetul de pagin Figura 1.8 Exemplu de paginare

pentru a defini adresa n memoria fizic. Mrimea unei pagini (ca i mrimea frame-ului) este definit de ctre hardware. Mrimea paginii este de obicei o putere a lui 2 variind ntre 512 cuvinte i 2048 cuvinte pe pagin, depinznd de arhitectura sistemului. Alegerea ca putere 28

a lui 2 a mrimii paginii face ca translatarea adresei logice ntrun numr de pagin s fie uoar. Dac mrimea unei pagini este 2n uniti de adresare (octei sau cuvinte), atunci cei mai puin semnificativi n bii vor desemna numrul paginii. S considerm de exemplu alocarea memoriei din Figura 1.8. Folosind o mrime a paginii de 4 cuvinte, i o memorie fizic de 32 de cuvinte (8 pagini) vom arta un exemplu de mapare a spaiului de adrese logice n spaiul adreselor fizice. Adresa logic 0 este pagina 0, offset 0. Observm n tabela de pagini c pagina 0 este n frame-ul 5. Astfel, adresa logic 0 este mapat n adresa fizic 20 (20= 5 * 4 + 0). Adresa logic 3 (pagina 0, offsetul 3) este mapat n adresa fizic 23 (23= 5 * 4 + 3). Adresa logic 13 este mapat n adresa fizic 9. De remarcat c paginarea nsi este o form de relocare dinamic. Fiecare adres logic este translatat de ctre paginarea hardware ntr-o adres fizic. Paginarea este similar utilizrii unui set de regitri de baz, unul pentru fiecare frame de memorie.

1.6.2Planificare pe termen lung


Schema de management al memoriei influeneaz schedulerul de termen lung. Cnd un proces sosete i trebuie executat, schedulerul de termen lung i citete mrimea. Mrimea unui proces este exprimat n pagini. Schedulerul de termen lung cerceteaz apoi memoria disponibil, care este pstrat ca o list de frame-uri nealocate. Fiecare pagin utilizator are nevoie de un frame. Astfel, dac procesul necesit n pagini, trebuie s fie n frame-uri disponibile. Dac exist n frame-uri disponibile, schedulerul de termen lung i le aloc acestui proces. O pagin este deci alocat ntr-un frame, iar numrul frame-ului este trecut n tabela de pagini a procesului. Cnd folosim schema de paginare, nu avem fragmentare extern. Orice frame liber poate fi alocat unui proces care are nevoie de el. Totui, s-ar putea s avem totui fragmentare intern. De remarcat c frame-urile sunt alocate ca uniti. Dac se ntmpl ca un proces s nu se ncadreze ntr-un numr ntreg de pagini, atunci ultimul frame alocat lui nu va fi complet folosit. n cel mai ru caz, un proces ar avea nevoie de n pagini i un cuvnt. i vor fi alocate n+1 frame-uri, rezultnd ntr-o

29

fragmentare intern de aproape un frame. Fiecare sistem de operareare propriile sale metode de a implementa tabelele de pagini. Cele mai multe aloc o tabel de pagini per proces. Un pointer la tabela de pagini este memorat mpreun cu alte informaii (de exemplu pointerul de instruciuni) n blocul de control al procesului. Cnd dispecerul trebuie s porneasc procesul, el trebuie s rencarce regitrii utilizator i s definesc corect valorile tabelei de pagini.

1.6.3Implementarea tabelei de pagini


Implementarea hardware a tabelei de pagini poate fi fcut n diferite moduri. n cel mai simplu caz, tabela de pagini este implementat ntr-un set de regitri dedicai. Aceti regitri trebuie s fie dotai cu o logic foarte rapid pentru a permite ca translatarea adreselor n paginare s fie foarte eficient. De vreme ce fiecare adres trebuie s treac prin mecanismul de paginare, eficiena este o problem major. Dispecerul rencarc aceti regitri aa cum rencarc i ceilali regitri. Instruciunile de ncrcare sau modificare a tabelei de pagini sunt desigur privilegiate, deci numai sistemul de operare poate schimba harta memoriei. Folosirea regitrilor pentru implementarea tabelei de pagini este satisfctoare dac tabela de pagini este destul de mic (de exemplu, 256 intrri). Calculatoarele noi permit tabelei de pagini s fie foarte mare (de exemplu 1 milion de intrri). Pentru aceste maini, folosirea regitrilor pentru implementarea tabelei de pagini nu este rezonabil. Aici, tabela de pagini este pstrat n memorie i un pointer la nceputul ei este reinut ntr-un registru - registrul de baz al tabelei de pagini (Page Table Base Register). Schimbarea tabelelor de pagini nseamn numai schimbrile acestui registru. Problema major a acestei variante este timpul necesar accesrii unei locaii de memorie utilizator. Dac vrem s accesm locia i, trebuie mai nti s citim o intrare n tabela de pagini folosind registrul PTBR. Aceast aciune nseamn un acces la memorie. Ne va furniza numrul frame-ului, care este combinat cu offsetul de pagin pentru a produce adresa actual. Putem atunci s accesm locaia dorit de memorie. Cu aceast schem, dou accese la memorie sunt necesare pentru a accesa un cuvnt (unul pentru intrarea n tabela de pagini, altul pentru cuvnt). Astfel, accesul la memorie este ncetinit de dou ori. Aceast ntrziere 30

este intolerabil n cele mai multe circumstane. Soluia standard a acestei probleme este de a se folosi o memorie hardware mic, special, numit regitrii asociativi sau buffer de translatare (Translation Lookaside Buffer). Un set de regitrii asociativi este construit dintr-o memorie special de mare vitez. Fiecare registru const din dou componente: o cheie i o valoare. O valoare care trebuie verificat dac se gsete sau nu ntr-un set de regitrii asociativi este comparat simultan cu toate cheile din acest set. Cutarea este foarte rapid; hardware-ul este totui foarte scump. Regitri asociativi sunt folosii n felul urmtor: regitri asociativi conin numai cteva dintre ntrrile n tabelele de pagini; cnd CPU-ul genereaz o adres logic, numrul su de pagin este cutat n setul de regitri asociativi care conin numerele de pagini i numerele corespunztoare de frame-uri; dac numrul de pagin este gsit n setul de regitri asoiativi, numrul su de frame este imediat disponibil i este folosit pentru a accesa memoria; toat aceast activitate consum un timp mai mare cu aproximativ 10% dect o referin ne mapat. Dac numrul de pagin nu este gsit n setul de regitri asociativi, trebuie realizat o referire la tabela de pagini (care se gsete n memorie). Cnd numrul de frame este obinut, l putem folosi pentru a accesa memoria. n plus, vom memora numrul de pagin i numrul de frame corespunztor n regitri asociativi, astfel nct ele vor fi gsite foarte repede la urmtoarea referire la memorie. Procentul de ncercri n care un numr de pagin este gsit n setul de regitri asociativi este numit hit ratio. O valoare a acestuia de 80% nseamn c am gsit numrul dorit de pagin n 80% din cazuri. Dac a cuta n regitri asociativi necesit un timp de 20 nanosecunde i 100 de nanosecunde pentru a accesa memoria, atunci un acces mapat la memorie va lua 120 de nanosecunde cnd numrul de pagin se afl n regitrii asociativi. Dac numrul de pagin nu se afl n setul de regitrii asociativi (20 nanosecunde), nti trebuie s accesm memoria pentru a gsi n tabela de pagini numrul de pagin dorit (100 nanosecunde), apoi s accesm cuvntul de memorie dorit (100 nanosecunde), toat aceast aciune cernd un timp de 220 nanosecunde. Pentru a gsi timpul efectiv de accesare a memoriei, trebuie evaluat probabilitatea fiecrui caz: timpul efectiv de accesare 31 = 0,80 120 + 0,20 220

= 140 nanosecunde n acest exemplu avem o ncetinire de 29% a referirilor la memorie (de la 100 la 140 nanosecunde). Pentru un hit ratio de 90%, avem: timpul efectiv de accesare = 0,90 120 + 0,10 220 = 130 nanosecunde Aceast rat mai mare produce o ncetinire de 23% n referirile la memorie. Aceast rat depinde de numrul de regitrii asociativi. Cu un numr ntre 16 i 512 regitri asociativi, poate fi obinut o rat de la 80 la 98 de procente. Procesorul Motorola 68030 are un TLB de 22 cu intrri. Procesorul Intel 80486 are 32 de regitri i o rat de 98%.

1.6.4Pagini partajate
Un alt avantaj al paginrii este posibilitatea partajrii codului. Aceast variant este important ntr-un mediu cu partajarea timpului. S considerm un sistem ce suport 40 de utilizatori, fiecare utiliznd un editor de text. Dac editorul de text este format din 150K de cod i 50K de date, am avea nevoie de 8000K pentru a servi toi utilizatorii. Dac codul este reentrant, el poate fi mprit utilizatorilor aa cum se vede n Figura 1.9. Aici avem un editor de trei pagini (fiecare de 50K; mrimea mare a paginii este considerat pentru a simplifica figura) fiind mprite celor trei procese. Fiecare proces are pagina sa de date.

32

Figura 1.9 Partajarea codului ntrun mediu cu paginare

Codul reentrant (numit i cod pur) este codul care nu se modific pe sine. Dac codul este reentrant, atunci el nu se schimb niciodat pe parcursul execiei. Astfel, dou sau mai multe procese pot executa acelai cod n acelai timp. Fiecare proces are copia sa proprie a regitrilor i mediul su propriu de stocare a datelor pentru a pstra datele pe timpul execuiei. Zonele de date vor fi evident diferite pentru dou procese diferite. Numai o singur copie a editorului trebuie pstrat n memoria fizic. Fiecare tabel de pagini a proceselor utilizator reflect aceeai copie fizic a editorului, dar paginile de date sunt mappate n frame-uri diferite. Astfel, pentru a susine 40 de utilizatori, avem nevoie de numai o copie a editorului (150K), plus 40 de frame-uri de date (una per utilizator). Spaiul total este de 2150K n loc de 8000K - o utilizare evident mai eficient a memoriei. Alte programe utilizate des pot fi de asemenea partajate: compilatoare, sisteme de ferestre, sisteme de baze de date

33

.a.m.d. Pentru a fi partajabile, codul trebuie s fie reentrant. Natura read-only a codului nu trebuie lsat n seama corectitudinii codului; sistemul de operare trebuie s verifice aceasta.

1.6.5Protecia
Protecia memoriei ntr-un mediu cu paginare este ndeplinit de bii de protecie asociai cu fiecare frame. n mod uzual, aceti bii sunt pstrai n tabelele de pagini. Un bit poate defini o pagin ca fiind pentru citire-scriere sau numai pentru citire. Fiecare referire la memorie trece prin tabela de pagini pentru a gsi frame-ul corect. n acelai timp n care adresa fizic este prelucrat, biii de protecie pot fi verificai pentru a vedea dac nu exist vreo ncercare de scriere ntr-o pagin care este numai pentru citire. O astfel de ncercare cauzeaz un semnal hardware ctre sistemul de operare (violare a proteciei memoriei). Aceast idee a proteciei sistemului poate fi uor dezvoltat pentru a permite o protecie fin. Se poate crea hardware pentru a oferi protecie pentru paginile care sunt numai pentru citire, pentru citire-scriere sau numai pentru execuie. Oferind bii separai (hardware) pentru fiecare tip de acces, orice combinaie de acetia poate fi folosit, o ncercare ilegal ducnd la informarea sistemul de operare. Este rar ntlnit un proces care s foloseasc ntregul su interval de adrese. De fapt, majoritatea proceselor folosesc numai un mic interval din spaiul de adrese afectat lor. Ar fi o inutil n aceste cazuri s se creeze tabele de pagini cu intrri pentru tot spaiul de adresare. Cele mai multe din aceste intrri nu vor fi folosite, i vor ocupa spaiu de memorie inutil. Anumite sisteme ofer hardware n forma unui registru de lungime a tabelei de pagini (PTLR), pentru a indica mrimea tabelei de pagini. Aceast valoare este verificat pentru fiecare adres logic pentru a fi siguri c adresa se afl n intervalul valid de valori pentru acel proces. Eecul acestui test duce la informarea sistemului de operare.

1.6.6Dou moduri de a vedea memoria


Un aspect important al paginrii este separarea clar ntre 34

modul n care vede memoria utilizatorul i memoria fizic existent. Programul utilizator crede c memoria este un spaiu continuu, coninnd numai acel program. De fapt, programul utilizator este mprtiat n memoria fizic, care conine de asemenrea i alte programe. Adresele logice sunt translatate n adrese fizice. Aceast mapare este transparent pentru utilizator i este controlat de sistemul de operare. De vreme ce sistemul de operare controlez memoria, el trebuie s fie atent la detaliile de alocare a memoriei: care poriuni de memorie sunt alocate, care sunt libere, cte frameuri sunt disponibile .a.m.d. Aceast informaie este n general pstrat ntr-o structur de date numit tabel de frame-uri. Tabela de frame-uri are o intrare pentru fiecare frame, indicnd dac acesta din urm este liber sau alocat i, dac este alocat, care este pagina corespunztoare i crui proces aparine. n plus, sistemul de operare trebuie s fie atent ca programele utilizator s opereze n spaiul utilizator, i toate adresele logice s fie mapate pentru a produce adrese fizice. Dac un utilizator realizeaz un apel sistem pentru o operaie de I/O, oferind o adres ca parametru (un buffer, de exemplu), aceast adres trebuie mapat pentru a produce adresa fizic corect. Sistemul de operare menine o copie a tabelei de pagini pentru fiecare utilizator, aa cum reine copii pentru contorul de instruciuni i coninutul regitrilor. Aceast copie este folosit pentru a translata adresa logic ntr-o adres fizic ori de cte ori sistemul de operare trebuie s realizeze aceasta. Este de asemenea folosit de dispecer pentru a defini tabela de pagini pentru un proces atunci cnd i este alocat procesorul.

1.7Segmentarea
Un aspect important al managementului memoriei care provine din paginare este diferena ntre modul n care utilizatorul vede memoria i memoria fizic existent. Memoria pe care o vede utilizatorul este doar mapat n memoria fizic.

1.7.1Modul n care utilizatorul vede memoria


Utilizatorul, nu dorete s vad memoria ca un tablou liniar de cuvinte. El prefer s vad memoria ca o colecie de 35

segmente de mrimi variabile, ntre care nu exist o ordonare. Programatorul dorete s-i vad programul ca un set de subrutine, proceduri, funcii sau module. Pot fi de asemenea structuri de date variate: tablouri, tabele, stive, variabile etc. Fiecare dintre aceste module sau date este referit printr-un nume. Programatorul nu-i face probleme n privina adreselor la care datele sale se afl. Fiecare dintre segmente are o mrime variabil definit de programator. Elementele dintr-un segment sunt identificate prin offsetul lor de la nceputul segmentului: prima instruciune din program, a 17-a intrare n tabela de simboluri, a 5-a instruciune a funciei sqrt etc. Segmentarea este o schem de management al memoriei care suport aceast vedere a utilizatorului asupra memoriei. Spaiul adreselor logice este o colecie de segmente. Fiecare segment are numele i lungimea sa. Adresele specific att numele segmentului ct i offsetul n interiorul segmentului. Utilizatorul specific deci o adres prin dou cantiti: un nume de segment i un offset (n contrast cu paginarea unde utilizatorul specific numai o singur cantitate - o adres care este mprit de hardware ntr-un numr de pagin i un offset - aceasta fiind invizibil programatorului). Pentru simplificarea implementrii, segmentele sunt numerotate i referite printr-un numr de segment n loc de un nume de segment. n mod normal, programul utilizator este asamblat (sau compilat) i asamblorul (compilatorul) construiete automat segmentele reflectnd programul de intrare. Un compilator Pascal poate crea segmente separate pentru (1) variabilele globale; (2) stiva de apel a procedurilor pentru a stoca parametrii i adresele de retur; (3) poriunea de cod a fiecrei proceduri sau funcii; (4) variabilele locale fiecrei proceduri sau funcii. Procesorul Intel 8086 suport segmentarea ca singura sa schem de management al memoriei. Programele n acest mediu sunt de obicei mprite n segmente de cod, date, stiv.

1.7.2Hardware
Cu toate c utilizatorul acceseaz obiectele din program cu o adres bi-dimensional, memoria fizic actual este evident un tablou unidimensional de cuvinte. Astfel, trebuie s definim o metod pentru a transfera adresele utilizator bidimensionale n adrese fizice unidimensionale. Aceast mapare este realizat 36

pe baza unei tabele de segmente. O adres logic const din dou pri: un numr de segment - n i un offset n acel segment - d. Numrul de segment este folosit ca un index n tabela de segmente. Fiecare intrare din tabela de segmente conine adresa de baz a segmentului i limita segmentului. Offsetul d al adresei logice trebuie s se afle n intervalul 0 - limita segmetului. Dac nu se ntmpl aceasta, se semnaleaz de ctre hardware eroarea ctre sistemului de operare (adresa logic ncearc s acceseze o locaie n afara segmentului). Dac acest offset este legal, el este adunat la adresa de baz pentru a produce adresa dorit n memoria fizic. Tabela segmentelor este deci un tablou de perechi adres de baz - limit a segmentului.

1.7.3Implementarea tabelei de segmente


Segmentarea este strns legat de modelele de partiionare a memoriei prezentate anterior, principala diferen fiind aceea c un program poate consta din mai multe segmente. Segmentarea este totui un concept mai complex. Ca i tabela de pagini, tabela de segmente poate fi memorat fie n regitri rapizi, fie n memorie. O tabel de segmente pstrat n regitri poate fi refereniat rapid; compararea limitei i adunarea la valoarea de baz pot fi efectuate simultan pentru a economisi timp. n cazul n care un program const dintr-un numr mare de segmente, nu este avantajos s se pstreze tabela de segmente n regitri i deci trebuie pstrat n memorie. Registrul de baz al tabelei de segmente (Segment Table Base Register) pointeaz la nceputul tabelei de segmente. De asemenea, de vreme ce numrul segmentelor unui program poate varia foarte mult, este folosit i un registru de lungime a tabelei de segmente (Segment Table Length Register). Pentru o adres logic (s,d) verificm mai nti dac numrul de segment este legal ( s < STLR ). Apoi, adunm numrul de segment la STBR rezultnd ( s + STBR ) adresa din memorie a intrrii corespunztoare n tabela de segmente. Aceast intrare este citit din memorie i se procedeaz dup cum urmeaz: se compar offsetul cu limita segmentului i se calculeaz adresa fizic a cuvntului dorit ca suma dintre offset i adresa de baz. Aa cum se ntmpl i la paginare, segmentarea necesit dou referiri la memorie pentru o adres logic, ncetinind deci viteza sistemului de dou ori. Soluia evident este s se 37

foloseasc un set de regitri asociativi care s rein cele mai utilizate intrri din tabela de segmente. Din nou, un set relativ mic de regitri asociativi poate n general s reduc timpul necesar pentru accesarea memoriei, ncetinirea nefiind mai mare de 10 sau 15 procente dect n cazul unui acces nemapat.

1.7.4Protecie i partajare
Un avantaj particular al segmentrii este posibilitatea de a oferi protecie la nivel de segment. De vreme ce segmentele reprezint o poriune definit semantic a unui program, este de preferat ca toate referirile n cadrul unui segment s fie folosite n acelai fel. Deci vom avea segmente care vor conine instruciuni, iar altele vor conine date. ntr-o arhitectur modern, instruciunile nu sunt reentrante, deci segmentele care conin instruciuni pot fi definite ca read-only. Maparea hardware a memoriei va verifica biii de protecie asociai cu fiecare intrare n tabela de segmente, pentru a preveni referiri ilegale, ca de exemplu acelea de a ncerca a se scrie ntr-un segment read-only sau acelea de a ncerca s se foloseasc un segment de cod ca unul de date. Definind un tablou ntr-un segment destinat numai lui, hardware-ul de management al memoriei va verifica automat dac indexarea este legal. Astfel, multe erori des ntlnite n programe vor fi detectate de ctre hardware nainte de a putea cauza probleme serioase. Alt avantaj al segmentrii este posibilitatea partajrii codului i datelor. Fiecare proces are propria sa tabel de segmente asociat cu blocul de control al procesului, pe care dispecerul o folosete pentru a defini tabela de segmente hardware cnd acestui proces i este alocat CPU-ul. Segmentele sunt partajate cnd intrri ale tabelelor de segmente aprinnd mai multor procese diferite pointeaz ctre aceleai locaii n memoria fizic. Partajarea poate fi deci definit i la nivel de segment. Astfel, orice informaie poate fi partajat dac este definit n cadrul unui segment. Mai multe segmente pot fi partajate, deci un program compus din mai multe segmente poate fi partajat. De exemplu, s considerm c se folosete un editor de text ntr-un sistem cu partajarea timpului. Editorul complet poate fi mare, fiind compus din mai multe segmente. Aceste segmente pot fi partajate ntre mai multe procese utilizator, limitnd memoria fizic necesar pentru a susine activitile de 38

editare. n loc de n copii ale editorului, nu este necesar dect una singur. Pentru fiecare utilizator, avem totui nevoie de segmente separate pentru a stoca variabilele locale. Aceste segmente, evident nu vor fi partajate. Este de asemenea posibil s se partajeze numai pri din programe. De exemplu, subrutinele mai des utilizate, pot fi partajate diferitelor procese utilizator, dac ele sunt definite ca segmente partajabile i read-only. De exemplu, dou programe pot folosi aceeai rutin sqrt, i nu este nevoie a se crea dect o copie fizic a rutinei. Cu toate c aceast partajare pare simpl, pot apare probleme. Segmentele de cod conin de obicei referiri la ele nsele. De exemplu, un salt condiionat are n mod normal o adres de transfer. Adresa de transfer este un numr de segment i un offset. Numrul de segment va fi numrul segmentului de cod. Dac ncercm s partajm acest proces, toate procesele care folosesc aceast copie trebuie s lucreze cu acelai numr de segment. De exemplu, dac dorim s partajm rutina sqrt, i un proces definete pentru acest segment numrul 4, iar altul vrea s-i atribuie numrul 17, cum se va referi rutina sqrt la ea nsi? De vreme ce exist o singur copie fizic a rutinei sqrt, ea trebuie s se refere la ea nsi n acelai mod pentru ambele procese utilizator - trebuie s aib un numr de segment unic. Pe msur ce numrul de utilizatori care folosesc aceeai copie crete, crete i dificultatea de a gsi un numr de segment acceptabil. Segmentele de date read-only (fr pointeri) pot fi partajate cu numere de segment diferite, aa cum pot segmentele de cod care nu se refer la ele nsele direct, ci indirect. De exemplu, ramificrile condiionale care specific adresa unei ramuri ca un offset de la contorul de locaii curent sau relativ la un registru coninnd numrul segmentului curent vor permite ca instruciunile s evite referiri directe la numrul curent de segment.

1.7.5Fragmentarea
Schedulerul de termen lung trebuie s gseasc i s aloce memorie pentru toate segmentele unui proces utilizator. Aceast situaie este similar celei ntlnite la paginare, cu

39

excepia faptului c segmentele sunt de mrime variabil; paginile sunt toate de aceeai mrime. Astfel, ca la schema cu partiii de mrime variabil, alocarea memoriei este o problem de stocare-alocare dinamic, de obicei rezolvat cu un algoritm first-fit sau best-fit. Segmentarea poate cauza atunci fragmentare extern - toate blocurile memoriei libere sunt prea mici pentru a cuprinde segmentul. n acest caz, procesul poate s atepte pn cnd mai mult memorie devine disponibil, sau poate fi folosit compactarea pentru a crea un bloc de memorie liber mai mare. De vreme ce segmentarea este prin natura sa un algoritm de relocare dinamic, putem compacta memoria oricnd dorim. Dac schedulerul nu-i poate da controlul CPU-ului unui proces datorit unei probleme de alocare, el poate (sau nu) s caute n lista de intrare un proces mai mic, de prioritate mai mic pentru a-l rula pe acesta.

1.8Concluzii
Algoritmii de management al memoriei pentru sisteme de operare care ofer multiprogramare, variaz de la sistemul monoutilizator la ideea segmentrii paginate. Alegerea unui anumit sistem este dat de hardware-ul disponibil. Fiecare adres de memorie generat de CPU este verificat i posibil mapat n memoria fizic. Verificarea nu poate fi implementat eficient n software. Algoritmii de management al memoriei prezentai difer prin multe aspecte. Lista urmtoare ncearc s compare strategii diferite de management al memoriei. Suportul hardware. Un simplu registru de baz sau un registru pereche baz-limit este suficient pentru scheme cu o singur i mai multe partiii, pe cnd segmentarea i paginarea necesit maparea tabelelor pentru a defini harta de adrese. Performan. Pe msur ce algoritmul devine mai complex, timpul necesar pentru a mapa o adres logic ntr-o adres fizic crete. Pentru sistemele simple, este necesar adunarea sau compararea adreselor logice operaii care sunt rapide. Paginarea i segmentarea pot fi aproape la fel de rapide dac tabelele sunt implementate n regitri rapizi. Dac tabela este n memorie, totui, 40

accesul utilizatorului la memorie poate fi ncetinit substanial. Un set de regitri asociativi poate reduce degradarea performanei la un nivel acceptabil. Fragmentarea. Un sistem multitasking va avea performane mai bune cu un nivel de parogramare mai avansat. Pentru o mulime dat de procese, putem mri nivelul de multiprogramare numai ncrcnd mai multe procese n memorie. Pentru a ndeplini aceast sarcin, trebuie s reducem risipa de memorie datorat fragmentrii. Sistemele cu uniti de alocare de dimensiuni fixe (schema cu o singur partiie i paginarea) sufer de fragmentare intern. Sistemele cu uniti de alocare de mrimi variabile, precum schema cu partiii de mrime variabil i segmentarea sufer de fragmentare extern. Reloacarea. O soluie a problemei fragmentrii externe este compactarea. Compactarea implic deplasarea unui program n memorie fr ca programul s-i dea seama de aceasta. Acest sistem implic relocarea dinamic a adreselor logice la momentul execuiei. Dac adresele sunt relocate numai la momentul ncrcrii, memoria nu poate fi compactat. Swapping. Orice algoritm poate fi mbuntit folosind swapping-ul. La intervale determinate de sistemul de operare, de obicei dictate de politicile de planificare a CPU-ului, procesele sunt copiate din memoria principal n memoria secundar, iar mai trziu sunt copiate napoi n memoria principal. Aceast schem permite rularea mai multor procese dect ar fi ncput n memoria fizic la un anumit moment. Partajarea. O alt modalitate prin care se poate mri gradul de multiprogramare este partajarea codului i datelor a diferite procese. Partajarea necesit n general ca fie segmentarea, fie paginarea s fie folosite, pentru a oferi mici blocuri de informaie (pagini sau segmente) care pot fi partajate. Partajarea este o metod prin care se pot rula multe procese, dar programele i datele partajate trebuie manipulate cu atenie. Protecia. Dac paginarea sau segmentarea este folosit, seciuni diferite ale unui program utilizator pot fi declarate ca numai pentru citire, numai pentru execuie, sau numai pentru citire-scriere. Aceast restricie este

41

necesar oferind verificri simple n momentul execuiei pentru erori comune de programare.

42

2.Memoria virtual
n capitolul anterior am discutat diferite strategii de gestiune a memoriei. Toate aceste strategii au acelai scop - s pstreze ct mai multe procese n memorie pentru a oferi un nivel sporit de multiprogramare. Dezavantajul principal este c ntregul program trebuie s fie n memorie nainte ca acesta s poat fi executat. Memoria virtual este o tehnic care permite proceselor s fie executate nefiind n ntregime n memoria principal. Principalul avantaj al acestei scheme este acela c programele pot fi mai mari dect memoria fizic. Aceast tehnic nglobeaz memoria fizic ntr-un tablou de stocare foarte mare i uniform, separnd memoria logic vzut de utilizator, de memoria fizic. Aceasta elibereaz programatorul de procuprile privind limitrile datorate memoriei. Memoria virtual nu este uor de implementat, i poate degrada performana sistemului dac dac nu este folosit cu atenie. n acest capitol vom discuta despre memoria virtual sub forma paginrii la cerere, i vom examina complexitatea i costul.

2.1Generaliti
Algoritmii de management al memoriei prezentai n

43

capitolul anterior presupun c ntregul spaiu al adreselor logice ale unui proces trebuie s se afle n memoria fizic nainte ca un proces s se poat executa. Aceast restricie pare rezonabil i necesar, dar limiteaz mrimea unui program la dimensiunea memoriei fizice. De fapt, analize statistice efectuate asupra programelor au artat c n multe cazuri, nu este folosit ntregul program (cod i date) pe parcursul execuiei sale. De exemplu: Programele dispun de obicei de instruciuni pentru a gestiona situaii de eroare neobinuite. De vreme ce aceste erori apar rareori sau deloc, acest cod nu este aproape niciodat executat. Tablourile, listele i tabelele aloc de obicei mai mult memorie dect au nevoie. Un tablou poate fi declarat de 100 pe 100 de elemente, dar el este rareori mai mare de 10 pe 10 elemente. O tabel de simboluri a unui asamblor poate avea loc pentru 3000 de simboluri, media de simboluri a unui program fiind de aproximativ 200 de simboluri. Anumite opiuni i posibiliti ale unui program sunt rareori folosite, ca de exemplu comanda unui editor de text de a converti textul selectat din caractere mici n caractere mari. Posibilitatea de a executa un program care este numai parial n memorie ar avea mai multe avantaje: Un program n-ar mai fi limitat la dimensiunea memoriei disponibile. Programatori vor fi capabili s scrie programe pentru un spaiu foarte mare de memorie virtual, simplificnd activitatea de programare. De vreme ce fiecare program utilizator va ocupa mai puin memorie fizic, vor putea rula mai multe programe n acelai timp, cu o cretere corespunztoare a utilizrii CPU-ului, fr creterea timpului de rspuns. Mai puine operaii de I/O vor fi necesare pentru a aduce n memorie i a transfera n mediul secundar un program utilizator, deci fiecare program utilizator va rula mai repede. Memoria virtual permite separarea memoriei logice utilizator de memoria fizic. Aceast separare permite ca o 44

mare cantitate de memorie virtual s fie oferit programelor utilizator, cnd numai o cantitate mic de memorie fizic este disponibil. Memoria virtual face activitatea de programare mult mai uoar, de vreme ce programatorul nu trebuie s mai implementeze restricii n ceea ce privete memoria fizic disponibil. Un rezultat al adoptrii mecanismului memoriei virtuale a fost dispariia overlay-urilor. Memoria virtual este implementat n mod uzual prin paginarea la cerere. Poate fi de asemenea implementat ntr-un sistem cu segmentare. Anumite sisteme ofer o schem de segmentare paginat, unde segmentele sunt sparte n pagini. Astfel, utilizatorul nu vede dect segmentarea, dar sistemul de operare poate implementa i paginarea fr ca utilizatorul s poat constata aceasta. Segmentarea la cerere poate fi de asemenea folosit pentru a furniza memorie virtual. Sistemul de operare IBM OS/2 folosete cererea de segmentare. Totui, algoritmii de nlocuire a segmentelor au o complexitate mai mare dect cei de nlocuire a paginilor deoarece segmentele au mrime variabil.

2.2Paginarea la cerere
Un sistem cu paginare la cerere este similar unui sistem cu paginare i swapping. Procesul se afl n memoria secundar (care este de obicei un disc). Cnd vrem s executm un proces, l copiem (swap) n memorie. n loc s copiem ntregul proces, vom folosi un swapper lene. Un swapper lene nu ncarc niciodat o pagin n memorie dac nu a fost solicitat. De vreme ce vedem acum un proces ca o secven de pagini, n locul unui spaiu mare i continuu de adresare, folosirea termenului swap este tehnic incorect. Un swapper manipuleaz ntregul proces, pe cnd un pager este procupat numai de paginile individuale ale unui proces. Ar trebui deci s folosim termenul de pager n loc de swapper atunci cnd discutm despre cu paginarea la cerere. Cnd un proces trebuie s fie ncrcat n memorie, pagerul ghicete ce pagini vor fi folosite. n loc s copieze ntregul proces n memorie, pagerul nu va aduce dect paginile necesare. Astfel, el evit s aduc n memorie pagini care nu vor fi oricum folosite, micornd timpul de swap i cantitatea de memorie fizic necesar. 45

Aceast schem necesit suport hardware. Un singur bit este adugat la fiecare intrare n tabela de pagini: bitul validinvalid. Valoarea valid a acestui bit semnific faptul c pagina corespunztoare se afl n memorie. Dac bitul este setat pe invalid, nseamn c pagina se afl pe disc. O intrare n tabela de pagini pentru o pagin care este copiat n memorie este setat valid, dar o intrare pentru o pagin care este lsat pe disc este setat invalid. Setarea unei pagini ca fiind invalid nu are nici un efect dac procesul nu ncearc s acceseze acea pagin. Deci, dac ghicim corect i ncrcm n memorie numai acele pagini de care este nevoie la momentul respectiv, procesul va rula ca i cum ar avea toate paginile n memorie. n timp ce procesul se execut i acceseaz pagini care sunt rezidente n memorie, execuia se desfoar normal. Dar ce se ntmpl cnd procesul ncearc s foloseasc o pagin care nu a fost copiat n memorie? Dac nu ghicim bine, i procesul ncearc s acceseze o pagin care nu a fost copiat n memorie, atunci va fi generat un semnal hardware - fault de pagin, ctre sistemul de operare. Hardware-ul de paginare, accesnd tabela de pagini pentru a translata adresa, va nota c pentru acea intrare este setat bitul valid-invalid i va avertiza sistemul de operare (eroare - adres invalid). n mod normal, o eroare de adres invalid este rezultatul folosirii de adrese de memorie ilegale (cum ar fi un index ilegal n cadrul unui tablou). ntr-un astfel de caz procesul trebuie terminat imediat operaia. n cazul prezentat, eroarea este rezultatul eecului sistemului de operare de aduce n memorie paginile valide ale unui proces, ntr-o ncercare de a minimiza transferul de la disc i de a limita necesarul de memorie. Pentru a corecta aceast situaie, procedura este urmtoarea (Figura 2.1): 1.Verificm o tabel intern pentru acest proces (de obicei pstrat cu blocul de control al procesului) pentru a vedea dac accesul la memorie a fost valid sau invalid. 2.Dac a fost invalid, terminm procesul. Dac a fost o referire valid, dar pagina nu a fost adus nc n memorie, se trece la ncrcarea paginii. 3. Se detecteaz frame-ul liber (lund unul din lista frame-urilor libere, de exemplu). 4.Realizm o operaie de citire de pe disc pentru a aduce pagina dorit n noul frame alocat.

46

5.Cnd operaia de citire de pe disc s-a ncheiat, modificm tabela intern pstrat pentru acest proces i tabela de pagini pentru a indica faptul c ultima este acum n memorie. 6. Lansm n execuie instruciunea care a fost ntrerupt prin eroarea de adres ilegal. Procesul poate accesa acum pagina ca i cum ar fi fost de la nceput n memorie. Este important de remarcat c din moment ce salvm starea (regitri, codul instruciunii, contorul de instruciuni) procesului ntrerupt, se poate relua procesul din exact aceeai stare i poziie, cu excepia faptului c pagina dorit este acum n memorie i este accesibil. n acest fel se poate executa un proces, chiar dac poriuni din el nu sunt (nc) n memorie. Algoritmul este deci, pe scurt urmtorul: cnd un proces ncearc s acceseze locaii care nu sunt n memorie, hardwareul sesizeaz sistemului de operare (page fault). Sistemul de operare citete pagina dorit i reia procesul ca i cum pagina ar fi fost mereu n memorie.

47

Figura 2.1 Pai n gestionarea unui fault de pagin

n cazul extrem, putem lansa un proces fr pagini n memorie. Procesul va produce imediat un fault de pagin pentru pagina cu prima instruciune. Dup ce aceast pagin a fost adus n memorie, procesul continu s se execute, continund eventual s produc fault-uri de pagin pn cnd toate paginile de care are nevoie sunt n memorie. n acest punct, el se poate executa fr s mai produc erori de pagin. Aceasta este paginarea la cerere, pur: niciodat o pagin nu este ncrcat pn cnd nu este solicitat. Teoretic, anumite programe pot accesa pagini noi cu fiecare nou instruciune, cauznd, un fault de pagin per instruciune. Performana sistemului ar fi n acest caz inacceptabil. Din fericire, analize efectuate asupra proceselor

48

n curs de execuie arat c acest comportament este foarte rar, paginarea la cerere avnd un nivel de performan acceptabil. Hardware-ul pentru paginarea la cerere este acelai ca pentru paginare i swapping: Tabela de pagini. Aceast tabel are posibilitatea de a marca o intrare ca fiind valid sau invalid printr-un bit special sau o valoare special a biilor de protecie. Memoria secundar. Aceast memorie reine paginile care nu sunt n memoria principal. Memoria secundar este de obicei un disc de mare vitez. Acest spaiu este cunoscut i ca backing store sau ca spaiul de swap. n plus fa de acest suport hardware, mai este nevoie i de un software special, aa cum vom vedea mai jos. Mai trebuie impuse anumite constrngeri arhitecturale. Astfel, esenial este posibilitatea de a putea relua orice instruciune dup un fault de pagin. n cele mai multe cazuri aceast cerin este uor de indeplinit. Un fault de pagin poate aprea la orice referire de memorie. Dac fault-ul de pagin apare la extragerea unei instruciuni, putem extrage din nou instruciunea. Dac un fault de pagin apare cnd extragem un operand, trebuie s reextragem instruciunea, s o decodm din nou, i apoi s extragem operandul. n cel mai defavorabil caz, considernd o instruciune ce implic trei adrese precum ADD A,B,C (adun A la B i memoreaz rezultatul n C), paii pentru a executa aceast instruciune vor fi: 1. Extrage i decodeaz instruciunea ADD. 2. Extrage A. 3. Extrage B. 4. Adun A la B. 5. Memoreaz suma n C. Dac un fault de pagin a aprut ncercnd s memorm pe C (pentru c C se afl ntr-o pagin care nu este n memorie), vom fi nevoii s gsim pagina respectiv, s o aducem n memorie, s corectm tabela de pagini, i s repornim instruciunea. Restartarea va necesita extragerea din nou a instruciunii, decodarea ei, extragerea operanzilor i apoi efectuarea operaiei de adunare. Oricum, n realitate efortul de

49

repetare nu este chiar att de mare (mai puin de o instruciune complet se va repeta) i reluarea este necesar numai cnd apare un fault de pagin. O dificultate major apare cnd o instruciune poate modifica cteva locaii diferite. De exemplu, considernd maina IBM System 360/370, instruciunea MVC (mut caracter) a acesteia, poate muta 256 de octei dintr-o locaie n alta (posibil suprapuse). Dac fiecare bloc (surs sau destinaie) depete graniele unei pagini, un fault de pagin poate apare dup ce instruciunea s-a executat parial. n plus, dac blocurile surs i destinaie se suprapun, blocul surs poate fi modificat, situaie n care nu mai putem relua pur i simplu instruciunea. Aceast problem poate fi rezolvat n dou moduri diferite. Prima soluie ar fi ca rutina s se execute ateptnd s ntlneasc sfriturile ambelor blocuri. Dac trebuie s apar un fault de pagin, va apare n aceast faz, nainte ca ceva s fi fost modificat. Mutarea se poate executa dac nu va apare nici un fault de pagin. Cealalt soluie folosete regitri temporari pentru a reine valorile locaiilor suprascrise. Dac va apare un fault de pagin, toate vechile valori vor fi scrise la loc, nainte de a ntiina sistemul de operare. Aceast aciune readuce memoria la starea de dinainte ca instruciunea s se fi executat, deci instruciunea se poate relua. O problem arhitectural similar apare la mainile care folosesc moduri speciale de adresare incluznd modurile de autoincrementare i autodecrementare (de exemplu PDP-11). Aceste moduri de adresare folosesc registri ca pointeri i incrementeaz sau decrementeaz automat registrul, dup cum le este indicat. Autodecrementarea decrementeaz registrul nainte de a-i folosi coninutul ca operand de adresare; autoincrementarea automat incrementeaz registrul dup ce i-a folosit coninutul ca operand de adresare. Astfel, instruciunea: MOV (R2)+,-(R3) copiaz coninutul locaiei la care pointeaz registrul 2 n locaia spre care pointeaz registrul 3. Registrul 2 este incrementat (cu 2 pentru un cuvnt deoarece PDP-11 este un calculator bazat pe adresarea de octei) dup ce a fost folosit ca pointer; registrul 3 este decrementat (cu 2) nainte s fie folosit ca pointer. Ce s-ar ntmpla dac ar aprea un fault de pagin ncercnd s scriem la locaia spre care pointeaz registrul 3?

50

Pentru a relua instruciunea trebuie s resetm cei doi regitri la valorile pe care le-au avut nainte de a porni execuia instruciunii. O soluie este de a crea un registru special de stare pentru a nregistra numrul registrului i cantitatea cu care a fost modificat fiecare registru care s-a schimbat n timpul execuiei unei instruciuni. Acest registru de stare permite sistemului de operare s relizeze un undo asupra efectelor unei instruciuni executate parial i care a cauzat un fault de pagin. Acestea nu sunt singurele probleme arhitecturale ce reies din adugarea paginrii la o arhitectur existent pentru a permite paginarea la cerere, dar ele nfieaz unele dintre dificultile majore. Paginarea este introdus ntre CPU i memorie ntr-un calculator i trebuie s fie perfect transparent pentru procesul utilizator.

2.3Performana paginrii la cerere


Paginarea la cerere poate avea un efect semnificativ asupra performanei unui sistem de calcul. Pentru a vedea de ce, s calculm timpul mediu efectiv de acces, ma (pentru majoritatea calculatoarelor, acesta are o valoare ntre 10 i 200 nanosecunde). Atta timp ct nu avem fault-uri de pagin, timpul efectiv de acces este egal cu timpul de acces la memorie. Dac, totui apare un fault de pagin, trebuie s citim pagina solicitat de pe disc i apoi s accesm cuvntul dorit. Fie p probabilitatea unui fault de pagin (0 p 1). Presupunem c p este aproape de zero (dorim s fie numai cteva fault-uri de pagin). Timpul efectiv de accesare este atunci: timpul efectiv de accesare = (1 - p) ma + p timpul unui fault de pagin Pentru a calcula timpul efectiv de accesare trebuie s tim ct timp este necesar pentru a deservi un fault de pagin. Un fault de pagin cauzeaz apariia urmtoarelor evenimente: 1.Sesizare ctre sistemul de operare. 2.Salvarea regitrilor utilizator i starea procesului.

51

3.Test pentru a determina dac ntreruperea a fost un fault de pagin. 4.Test pentru a verifica dac referirea la pagin a fost legal i poziia paginii pe disc. 5.Citirea paginii de pe disc ntr-un frame liber: a.Ateapt ntr-o coad pentru acest periferic pn cnd cererea de citire este satisfcut. b.Ateapt pentru citire/scriere. poziionarea capetelor de

c.ncepe transferul paginii ntr-un frame liber. 6.n timp ce ateapt aloc CPU-ul unui eventual alt utilizator. 7.ntreruperea de la disc (operaia de I/O terminat) 8.Salveaz regitrii i starea procesului pentru alt utilizator. 9.Determin dac ntreruperea este de la disc. 10.Corecteaz tabela de pagini i celelalte tabele pentru a nfia faptul c pagina dorit este acum n memorie. 11.Ateapt ca CPU-ul s-i fie alocat din nou acestui proces. 12.Restaureaz regitrii utilizator, starea procesului, i noua tabel de pagini, apoi continu instruciunea ntrerupt. Nu totdeauna este necesar parcurgerea tuturor acestor pai. De exemplu, la pasul 5 am presupus c CPU-ul este alocat altui proces n timpul activitii de I/O. Acest aranjament permite multiprogramrii s menin gradul de utilizare al CPUului, dar necesit un timp adiional pentru a continua rutina de tratare a fault-ului de pagin cnd activitatea de I/O este terminat. n orice caz, suntem n faa a trei componente majore ale timpului de servire a unui fault de pagin: Execut ntreruperea de fault de pagin Citete pagina ntr-un frame. Repornete procesul. Prima i a treia sarcin pot fi reduse, cu o programare atent, la cteva sute de instruciuni. Aceste instruciuni pot lua de la 1 la 100 microsecunde fiecare. Timpul de citire a paginii

52

probabil va lua 24 milisecunde. O micare tipic de mutare a capetelor are o ntrziere de 8 milisecunde, o poziionare necesit 15 milisecunde, i transferul ia un timp de 1 milisecund. Astfel, timpul total ar fi de 25 milisecunde, incluznd timpul hardware-ului i software-ului. S nu uitm c acum analizm numai timpul n care perifericul ne furnizeaz pagina. Dac o coad de procese ateapt pentru periferic (alte procese care au cauzat fault-uri de pagin), trebuie s mai adunm timpul de ateptare la coad, adic trebuie s adunm timpul n care trebuie s ateptm perifericul de paginare s se elibereze pentru a putea servi cererea noastr, mrind timpul de swap i mai mult. Dac lum un timp mediu al unui fault de pagin de 25 de milisecunde, i un timp de acces la memorie de 100 nanosecunde, atunci timpul efectiv de accesare n nanosecunde este: timpul efectiv de accesare = (1 - p) 100 + p (25 milisecunde) = (1 - p) 100 + p 25.000.000 = 100 + 24.999.900 p. Rezult astfel c timpul efectiv de acces este direct proporional cu rata fauturilor de pagin. Dac un acces dintr-o mie cauzeaz un fault de pagin, timpul efectiv de accesare este 25 microsecunde. Calculatorul va fi ncetinit printr-un factor de 250 din cauza paginrii la cerere. Dac am dori mai puin de 10% degradare, ne trebuie: 110 > 100 + 25.000.000 p, 10 > 25.000.000 p, p < 0,0000004. Deci, pentru a pstra diminuarea vitezei datorat paginrii la un nivel rezonabil, trebuie s avem mai puin de un fault de pagin la 2.500.000 accesri ale memoriei. Este foarte important s fie meninut rata fault-urilor de pagin la un nivel sczut ntr-un sistem cu paginare la cerere. Altfel, timpul efectiv de acces crete, ncetinind dramatic execuia proceselor. Un alt aspect important al paginrii la cerere este manipularea i folosirea integral a spaiului de swap. Operaiile de I/O cu discul pentru zona de swap sunt n general mai rapide 53

dect cele cu sistemului de fiiere. Este mai rapid deoarece spaiul de swap este alocat n blocuri mult mai largi i cutrile de fiiere sau metodele de alocare indirect nu sunt folosite.

2.4nlocuirea paginii
n prezentarea anterioar, fault-ul de pagin nu este o problem att de mare, de vreme ce fiecare pagin este faultat de cele mai multe ori doar odat, atunci cnd este referit. Aceast prezentare nu este totdeauna adevrat. S ne gndim c, dac un proces de 10 pagini folosete numai jumtate dintre ele, atunci sistemul paginrii la cerere elimin activitile de I/O pentru a ncrca cele 5 pagini care nu sunt folosite niciodat. Putem de asemenea s mrim gradul de multiprogramare rulnd de dou ori mai multe procese. Astfel, dac avem 40 de frame-uri, putem rula 8 procese, n loc de 4 cte ar fi trebuit s ruleze dac fiecare necesita 10 frame-uri (dintre care cinci nu sunt folosite niciodat). Dac cretem gradul de multiprogramare, supraalocm memoria. Dac rulm 6 procese, fiecare de cte 10 pagini, dar momentan folosim numai cinci pagini, avem o utilizare mai eficient a CPU-ului i nc 10 frame-uri disponibile. Este posibil totui, ca fiecare dintre aceste procese, pentru un set particular de date, s ncerce subit s foloseasc toate cele 10 pagini ale sale, rezultnd o necesitate de 60 de frame-uri, cnd numai 40 sunt disponibile. Cu toate c aceast situaie are o probabilitate de apariie mic, ea devine mai des ntlnit atunci cnd crete gradul de multiprogramare, respectiv cnd cantitatea de memorie folosit este mai aproape de dimensiunea memoriei fizice existente n sistem. (n exemplul nostru, de ce s ne oprim la un nivel de multiprogramare de ase, cnd putem ajunge la un nivel de apte sau opt) Supraalocarea poate apare n felul urmtor. n timp ce un program utilizator se execut, apare un fault de pagin. Hardware-ul sesizeaz sistemului de operare iar aceasta va cerceta tabelele interne pentru a verifica dac este un fault de pagin sau o referire ilegal. Sistemul de operare va determina unde se gsete pe disc aceast pagin i apoi descoper c nu exist nici un frame liber n lista frame-urilor libere; toat memoria este folosit. Sistemul de operare are cteva alternative n acest 54

moment. Ar putea s termine procesul utilizator. Totui, paginarea la cerere este ceva ce sistemul de operare utilizeaz pentru a mbunti utilizarea hardware-ului. Utilizatorii n-ar trebui s fie preocupai c programele lor ruleaz pe un sistem ce susine paginarea. Paginarea ar trebui s fie logic transparent utilizatorului i deci aceast opiune nu reprezint cea mai bun alegere. Putem scoate n spaiul de swap un proces utilizator, elibernd toate frame-urile sale, reducnd nivelul de multiprogramare. Aceasta este o idee bun uneori, i vom reveni asupra ei ntr-o seciune ulterioar, dar mai nti vom discuta o alt posibilitate: nlocuirea paginii. Algoritmul de nlocuire a paginii este urmtorul: Dac nu este liber nici un frame, gsim unul care nu este folosit i-l eliberm. Putem elibera un frame scriind coninutul su pe disc i schimbnd coninutul tabelei de pagini (i tuturor celorlalte tabele) pentru a indica faptul c pagina nu mai este n memorie. Frame-ul eliberat poate fi folosit acum pentru procesul care a generat fault. Rutina care gestioneaz un fault de pagin este acum modificat pentru a include nlocuirea paginii: 1.Gsete locaia paginii dorite pe disc. 2.Gsete un frame liber: a.Dac exist un frame liber, folosete-l. b.Altfel, folosete un algoritm de nlocuire a paginii pentru a selecta o pagin victim. c.Scrie pagina victim pe disc; modific tabelele de pagini i frame-uri corespunztor. 3.Citete pagina dorit n noul frame liber; schimb tabelele de pagini i frame-uri. 4.Reia procesul utilizator. De remarcat c, dac nu exist nici un frame liber, dou transferuri de pagin (unul spre disc i unul dinspre disc) sunt efectuate. Aceast situaie dubleaz timpul deservirii unui fault de pagin i va crete corespunztor timpul efectiv de accesare. Acest neajuns poate fi eliminat folosind un bit de modificare (dirty bit). Fiecare pagin sau frame poate avea un bit de modificare asociat, recunoscut de hardware. Un bit de modificare pentru o pagin este setat de hardware ori de cte ori orice octet sau 55

cuvnt este scris n acea pagin, indicnd faptul c pagina a fost modificat. Cnd selectm o pagin pentru nlocuire, examinm bitul su de modificare. Dac bitul este setat, tim c pagina a fost modificat de cnd a fost citit de pe disc. n aceast situaie, trebuie s scriem pagina pe disc. Dac bitul de modificare nu este setat, nseamn c pagina nu a fost modificat de cnd a fost citit n memorie. n consecin, dac pagina de pe disc nu a fost suprascris (cu o alt pagin, de exemplu), putem evita scrierea paginii din memorie pe disc; ea este deja acolo. Aceast tehnic se aplic de asemenea paginilor read-only (de exemplu pagini de cod). Asemenea pagini nu pot fi modificate; astfel, ele pot fi pur i simplu descrcate din memorie la nevoie. Aceast tehnic poate reduce semnificativ timpul de deservire a unui fault de pagin, de vreme ce reduce timpul afectat operaiilor de I/O la jumtate dac pagina nu a fost modificat. Tehnica de nlocuire a paginii este o tehnic de baz pentru paginarea la cerere. Ea completeaz separarea dintre memoria logic i cea fizic. Cu acest mecanism, o memorie virtual foarte mare poate fi oferit programatorilor pe un sistem cu o memorie fizic mic. Cu paginarea clasic (nu cea la cerere), adresele utilizator erau mapate n memoria fizic, permind ca cele dou adrese s fie diferite. Cu paginarea la cerere, mrimea spaiului logic de adrese nu mai este constrns de mrimea memoriei fizice. Dac avem un proces utilizator de 20 de pagini, l putem executa n 10 frame-uri folosind paginarea la cerere i utiliznd un algoritm de selectare a unei pagini victim pentru a gsi un frame liber ori de cte ori este necesar. Dac o pagin trebuie s fie nlocuit, coninutul su va fi scris pe disc. O referire ulterioar la aceast pagin va cauza un fault de pagin. n acest moment, pagina va fi readus n memorie nlocuind (probabil) o alt pagin. Trebuie rezolvate dou probleme majore ale paginrii la cerere: Trebuie s dezvoltm un algoritm de alocare a frame-urilor i un algoritm de nlocuire a paginilor. Dac avem mai multe procese n memorie, trebuie s decidem cte frame-uri alocm fiecrui proces. Apoi, cnd apare necesitatea de nlocuire a unei pagini, trebuie s selectm frame-urile care trebuie schimbate. De vreme ce operaiile de I/O cu discul sunt aa costisitoare, mbuntiri mici ale metodelor de paginare la cerere pot face sistemele mult mai performante.

56

2.5Algoritmi de nlocuire a paginii


Exist muli algoritmi de nlocuire a paginii. Probabil fiecare sistem de operare are propria sa schem (unic) de nlocuire. n general se prefer algoritmul cu o rat a fault-ului de pagin minim. Evaluarea unui algoritm se face punndu-l s ruleze pe un anumit ir de referiri la memorie i calculnd numrul fault-urilor de pagin. irul de referiri la memorie se numete irul referinelor. Putem genera aleator iruri de referine (de exemplu cu un generator de numere aleatoare) sau urmrind activitatea unui sistem i memornd adresa fiecrei referiri la memorie. Cea dea doua soluie va produce un numr foarte mare de date (de ordinul a un milion de adrese pe secund). Pentru a reduce numrul datelor, remarcm dou lucruri. nti, pentru o anumit mrime a paginii (mrimea paginii este fixat de ctre hardware), trebuie s considerm numai numrul paginii, nu adresa ntreag. Apoi, dac avem o referire la pagina p, atunci orice referire imediat la pagina p nu va cauza un fault de pagin. Pagina p va fi n memorie dup prima referire; accesrile imediat urmtoare nu vor genera fault. De exemplu, dac urmrim un proces particular, putem nregistra urmtorul ir de adrese: 0100, 0432, 0101, 0612, 0102, 0103, 0104, 0101, 0611, 0102, 0103, 0104, 0101, 0610, 0102, 0103, 0104, 0101, 0609, 0102, 0105, 0105 care la 100 octei pe pagin se reduce la: 1, 4, 1, 6, 1, 6, 1, 6, 1, 6, 1 Pentru a determina numrul fault-urilor de pagin pentru un anumit ir de referine i un anumit algoritm de nlocuire a paginii, este necesar s cunoatem numrul de frame-uri libere. Evident, pe msur ce numrul de frame-uri libere crete, numrul fault-urilor de pagin va descrete. Pentru irul de referine anterior, de exemplu, dac am avea trei sau mai multe frame-uri libere, am avea numai trei fault-uri, un fault pentru prima referire n fiecare pagin. Pe de alt parte, cu numai un frame liber, am avea o nlocuire cu fiecare referire rezultnd un numr de 11 fault-uri. n general, ne ateptm la o curb ca cea din Figura 2.8. Pe msur ce numrul de frame-uri crete,

57

numrul de fault-uri de pagin scade pn la un nivel minim. Figura 2.8

Pentru a ilustra algoritmii de nlocuire a paginii, vom folosi irul de referine urmtor: 7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1 pentru o memorie de trei frame-uri.

2.5.1Algoritmul FIFO
Cel mai simplu algoritm de nlocuire a paginii este un algoritm ce folosete o coad (first-in, first-out). Un algoritm FIFO de nlocuire a paginii asociaz fiecrei pagini momentul de timp la care a fost adus n memorie. Cnd o pagin trebuie nlocuit, este aleas cea mai veche. De remarcat c nu este strict necesar s se nregistreze timpul cnd o pagin a fost ncrcat n memorie. Putem crea o coad FIFO coninnd toate paginile din memorie. nlocuim pagina de la nceputul listei. Cnd o pagin este adus n memorie, o inserm la sfritul cozii. Pentru irul de referiri dat ca exemplu, cele trei frame-uri libere sunt iniial goale. Primele trei referiri produc fault-uri de pagin (7, 0 ,1) i paginile sunt aduse n aceste trei frame-uri libere. Urmtoarea referire (2) nlocuiete pagina 7, de vreme ce pagina 7 a fost adus prima. De vreme ce 0 este urmtoarea referire i 0 este deja n memorie, nu avem fault pentru aceast. Prima referire a paginii 3 are ca efect nlocuirea paginii 0, de vreme ce a fost prima dintre cele 3 pagini care se gsesc n memorie (0, 1, 2) care a fost ncrcat. Aceast nlocuire nseamn c urmtoarea referire, la 0, va faulta. Pagina 1 este atunci nlocuit cu pagina 0. Acest proces continu ca n Figura 2.8. 58

Algoritmul FIFO de nlocuire a paginii este uor de neles i de implementat. Totui, performana sa nu este bun mereu. Pagina nlocuit poate fi un modul de iniializare care a fost folosit cu mult timp n urm i nu mai este de folos. Pe de alt parte, poate fi o variabil care a fost iniializat de la nceput i este constant folosit. Figura 2.8 Algoritmul FIFO de nlocuire a paginii

De remarcat c, chiar dac alegem pentru nlocuire o pagin care este n uz, totul funcioneaz corect. Dup ce scoatem afar pagina care era n uz pentru a aduce una nou, aproape imediat va avea loc un fault pentru pagina des folosit. Alte pagini vor fi scoase afar pentru a aduce pagina activ din nou n memorie. Astfel, o alegere proast de nlocuire a paginii crete rata fault-urilor de pagin i ncetinete execuia procesului, dar nu cauzeaz o execuie incorect.

Pentru a exemplifica problemele care apar la un algoritm FIFO de nlocuire a paginii, considerm irul de referiri: 1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5 Figura 2.8 arat graficul numrului de fault-uri n funcie de numrul de frame-uri disponibile. Remarcm c numrul de fault-uri (10) pentru patru frame-uri este mai mare dect numrul fault-urilor (nou) pentru trei frame-uri ! Acest rezultat neateptat este cunoscut sub numele de anomalia lui Belady. Anomalia lui Belady reflect faptul c, pentru anumii algoritmi de nlocuire a paginii, rata fault-urilor de pagin crete pe msur ce crete i numrul de frame-uri alocate. Ne-am atepta ca dndu-i mai mult memorie unui proces s-i mbunteasc performanele. Din nefericire aceast presupunere nu este mereu adevrat.

59

Figura 2.8 Anomalia lui Belady

numrul de faulturi de pagin

14 12 10 8 6 4 2 0 0 1 2 3 4 5 6 numrul de frameuri

2.5.2Algoritmul Optimal
O consecin a descoperirii anomaliei lui Belady a fost cutarea unui algoritm optim. Un algoritm optim de nlocuire a paginii are cea mai mic rat a fault-urilor dintre toi algoritmii. Un algoritm optim nu sufer de anomalia lui Belady. Un algoritm optim de nlocuire a paginii exist, i a fost denuumit OPT sau MIN. Se enun simplu: nlocuiete pagina care nu va fi folosit cea mai mare perioad de timp. Utilizarea acestui algoritm de nlocuire a paginii garanteaz cea mai mic rat de fault-uri pentru un numr dat de frame-uri. De exemplu, n irul nostru de referiri, algoritmul optimal de nlocuire a paginii va produce numai opt fault-uri de pagin, aa cum arat Figura 2.8. Primele trei referiri vor cauza fault-uri 60

de pagin care vor avea ca urmare ocuparea celor trei frame-uri libere. Referirea paginii 2 nlocuiete pagina 7 deoarece pagina 7 nu va fi folosit pn la referirea 18, n timp ce pagina 0 va fi folosit la a 5-a referire, iar pagina 1 la cea de-a 14-a. Referirea la pagina 3 nlocuiete pagina 1, de vreme ce pagina 1 va fi ultima din cele trei care va fi referit. Cu numai 9 fault-uri de pagin, algoritmul optimal este mult mai bun dect algoritmul FIFO, care a avut 15 fault-uri. (Dac nu lum n considerare cele trei fault-uri prezente n cazul tuturor algoritmilor, atunci algoritmul optimal este de dou ori mai bun dect algoritmul FIFO). De fapt, nici un algoritm de nlocuire a paginii nu va putea deservi acest ir de referiri, avnd disponibile trei frameuri, cu mai puin de nou fault-uri. Figura 2.8 Algoritmul optimal de nlocuire a paginii

Din pcate, algoritmul optimal este imposibil de implementat de vreme ce necesit cunotine ce se vor obine n viitor despre irul de referiri. Ca urmare, algoritmul optimal este folosit numai pentru comparaii.

2.5.3Algoritmul LRU
Dac algoritmul optimal nu poate fi implementat, exist o aproximaie a lui care poate fi. Deosebirea important ntre algoritmii FIFO i OPT este aceea c algoritmul FIFO folosete momentul de timp cnd pagina a fost adus n memorie. Algoritmul OPT folosete momentul cnd pagina va fi folosit. Dac folosim trecutul apropiat ca o aproximare pentru viitorul apropiat, atunci vom nlocui pagina care nu a fost folosit de cea mai lung perioad de timp (Figura 2.8). Acesta este algoritmul LRU (Last Recently Used). nlocuirea LRU asociaz fiecrei pagini momentul de timp cnd pagina a fost folosit ultima oar. Cnd trebuie aleas o pagin victim, algoritmul LRU va alege pagina care nu a fost folosit cea mai mare perioad de timp. Acesta este algoritmul 61

optimal de nlocuire a paginii, dar prin analiza a ceea ce s-a ntmplat, n loc s se uite n viitor. (Dac notm SR inversul irului de referenieri S, atunci rata de fault a algoritmului OPT pe irul S este aceeai cu cea obinut pe irul SR. Similar, rata de fault a algoritmului LRU pe irul S este aceeai ca cea obinut pe irul SR). Rezultatul aplicrii metodei LRU pe irul de referiri dat ca exemplu este prezentat n Figura 2.8. Algoritmul LRU produce 12 fault-uri. De remarcat c primele 5 fault-uri sunt aceleai ca la algoritmul optimal. Cnd apare referirea la pagina 4, algoritmul LRU vede c din cele trei frame-uri de memorie, pagina 2 nu a fost folosit de cea mai mare perioad de timp. Cea mai recent folosit pagin este pagina 0, apoi urmeaz pagina 3. Astfel, algoritmul LRU nlocuiete pagina 2, netiind c imediat va fi folosit. Cnd va apare fault-ul pentru aceast pagin, algoritmul LRU nlocuiete pagina 3 de vreme ce din cele trei pagini din memorie (0, 3, 4), pagina 3 este cea care nu a fost folosit recent. n ciuda acestor probleme, algoritmul LRU cu 12 fault-uri este mult mai bun dect algoritmul FIFO cu 15 fault-uri. Figura 2.8 Algoritmul LRU de nlocuire a paginii

Strategia LRU este des folosit n algoritmii de nlocuire a paginii i este considerat a fi destul de bun. Problema major este cum s implementm algoritmul LRU. Un algoritm LRU de nlocuire a paginii poate necesita o asisten hardware substanial. Problema este de a determina o ordine pentru frame-uri pe baza momentului de timp la care au fost folosite ultima oar. Sunt posibile dou implementri: Contoare. n cazul cel mai simplu asociem fiecrei intrri n tabela de pagini un registru ce va memora momentul de timp la care a fost folosit o pagin i-l legm la un ceas sau contor. Contorul este incrementat pentru fiecare referire la memorie. Ori de cte ori este realizat un acces la o pagin, coninutul registrului de ceas este copiat n registrul pentru timp al intrrii n tabela de pagini

62

corespunztoare acesteia. n acest fel avem timpul ultimei referiri la fiecare pagin. Vom nlocui pagina cu cea mai mic valoare a timpului. Aceast schem necesit cutare n tabela de pagini pentru a gsi pagina dorit (pagina pe care o selecteaz algoritmul LRU). Trebuie luate n considerare i posibilele suprancrcri (depiri) ale registrului de ceas. Stiva. O alt posibilitate pentru a implementa tabela de pagini este de a pstra o stiv cu numere de pagini. Ori de cte ori o pagin este referit, ea este scoas din stiv i pus n vrful ei. n felul acesta, mereu n vrful stivei sunt paginile cele mai folosite iar la baza stivei este pagina LRU. De vreme ce intrrile trebuie scoase din mijlocul stivei, aceast metod este mai bine implementat printr-o list dublu nlnuit cu pointeri la ambele capete. Atunci scoaterea unei intrri din mijlocul stivei i punerea ei n vrful stivei necesit schimbarea n cel mai ru caz a ase pointeri. Fiecare actualizare a stivei este costisitoare, dar nu este nevoie a se cuta n list pentru nlocuirea paginii; unul din pointerii care gestioneaz lista va pointa la baza stivei, unde se gsete pagina LRU. Aceast idee este n mod particular potrivit pentru implementarea algoritmilor LRU de nlocuire a paginii la nivel software. Nici nlocuirea optimal, nici cea LRU nu sufer de anomalia lui Belady. Exist o clas de algoritmi de nlocuire a paginii numii algoritmi de tip stiv, care nu prezint aceast anomalie. Un algoritm de tip stiv este un algoritm pentru care se poate arta c setul de pagini din memorie penru n frame-uri este totdeauna un subset al setului de pagini care ar fi n memorie dac ar exista n+1 frame-uri. Pentru nlocuirea LRU, setul de pagini din memorie va fi mereu setul celor mai utilizate n pagini. Dac numrul de pagini crete, aceste n pagini vor fi, totui, cele mai referite pagini i astfel vor fi nc n memorie. De remarcat c nici una din implementrile LRU nu poate fi realizat fr asisten hardware. Actualizarea regitrilor de timp sau a stivei trebuie fcute pentru fiecare acces la memorie. Dac am folosi o ntrerupere pentru fiecare referire pentru a permite software-ului s actualizeze aceste structuri de date, s-ar ncetini fiecare acces la memorie printr-un factor de cel puin 10, deci ar ncetini fiecare proces utilizator printr-un factor de 10. Puine sisteme ar tolera un astfel de 63

comportament al managerului de memorie.

2.5.4Algoritmi de aproximare LRU


Sunt puine sistemele ce ofer suportul hardware pentru o nlocuire real a paginii de tip LRU. Anumite sisteme nu ofer nici un suport hardware i aici trebuie folosii ali algoritmi de nlocuire a paginii (de exemplu FIFO). Multe sisteme ofer un anumit ajutor, sub forma unui bit numit bit de referire. Un bit de referire este setat de hardware ori de cte ori pagina este referit (fie o citire, fie o scriere la orice adres din pagin). Biii de referire sunt asociai cu fiecare intrare n tabela de pagini. Iniial toi biii de referire sunt setai pe zero de ctre sistemul de operare. Pe msur ce un proces utilizator se execut, bitul asociat fiecrei pagini este setat pe 1 de ctre hardware. Dup un anumit timp, putem determina care pagini au fost folosite i care pagini nu au fost folosite examinnd biii de referire. Nu vom ti ordinea n care au fost folosite aceste pagini, vom ti numai care pagini au fost folosite i care nu. Aceast informaie de ordonare parial este folositoare multor algoritmi de nlocuire a paginii care aproximeaz algoritmul LRU.

Algoritmul biilor de referire adiionali


Putem obine informaii de ordonare adiionale nregistrnd biii de referire la intervale regulate de timp. Putem pstra un octet pentru fiecare pagin, ntr-o tabel, n memorie. La intervale regulate (s zicem 100 milisecunde) o ntrerupere transfer contrlolul sistemului de operare. Sistemul de operare mut bitul de referire al fiecrei pagini n cel mai semnificativ bit din octetul asociat acesteia, ceilali bii ai acestui octet deplasndu-i la stnga cu o poziie - descrcnd (pierznd) deci bitul cel mai puin semnificativ al octetului. Aceti registri de deplasare pe 8 bii conin istoricul utilizrii paginii pentru ultimele 8 perioade de timp. Dac registrul de deplasare conine 00000000, atunci pagina nu a fost folosit de opt perioade de timp; o pagin care a fost folosit n fiecare perioad cel puin o dat are o valoare a registrului de deplasare de 11111111. O pagin cu o valoare a registrului de deplasare de 11000100 a fost folosit mai recent dect una cu o valoare a

64

registrului de deplasare de 01110111. Dac interpretm aceti regitri pe 8 bii ca ntregi fr semn, pagina cu cel mai mic numr este pagina LRU i poate fi nlocuit. De remarcat c nu exit nici o garanie c aceste numere pot fi unice. Putem fie nlocui (scoate n mediul secundar) toate paginile cu cea mai mic valoare, sau s folosim o selecie FIFO asupra lor. Numrul biilor istoricului poate varia, desigur, i va fi ales (innd cont de hardware-ul disponibil) un numr care s fac actualizarea ct mai rapid cu putin. n cazul extrem, numrul poate fi redus la zero, lsnd numai bitul de referire. Algoritmul care realizeaz aceasta se numete algoritmul celei de-a doua anse.

Algoritmul celei de-a doua anse


Algorimul schemei celei de-a doua anse este un algoritm de nlocuire FIFO. Cnd a fost selectat o pagin se verific bitul su de referire. Dac acesta are valoarea 0, vom nlocui aceast pagin. Dac bitul de referire este 1, i dm acestei pagini o a doua ans i ne continum cutarea. Cnd o pagin primete o a doua ans, bitul su de referire este pus pe 0 i timpul su de sosire este setat la valoarea timpului curent. Astfel, o pagin creia i s-a dat o a doua ans nu va fi nlocuit pn cnd toate celelate pagini vor fi nlocuite (sau pn cnd celorlalte pagini nu li s-a dat i lor o a doua ans). n plus, dac o pagin este destul de des folosit pentru ca bitul su de referire s fie mereu setat, ea nu va fi nlocuit niciodat. O metod pentru implementarea algoritmului celei de-a doua anse este de a se folosi o coad circular. Un pointer va indica care este pagina care va fi nlocuit. Cnd este nevoie de un frame, pointerul nainteaz pn cnd gsete o pagin cu bitul de referire pus pe 0. Pe msur ce nainteaz, el setaz pe 0 biii de referire. n cel mai ru caz, cnd toi biii de referire sunt setai, pointerul va parcurge toat coada, dnd tuturor paginilor o a doua ans. El va seta pe 0 toi biii de referire dac acetia (toi) au fost 1. nlocuirea celei de-a doua anse va degenera n nlocuire FIFO dac toi biii sunt setai.

Algoritmul LFU
Un algoritm LFU (least frequently used) de nlocuire a paginii pstraz un contor al numrului de referiri care au fost fcute n fiecare pagin. Pagina cu cea mai mic valoare a contorului

65

este nlocuit. Motivul acestei selecii este acela c o pagin des folosit trebuie s aibe o valoare a contorului foarte mare. Acest algoritm nu poate rezolva corect situaia n care o pagin este folosit foarte mult n timpul iniializrii unui proces, dar apoi nu mai este folosit deloc. De vreme ce a fost foarte mult folosit, ea va avea un contor cu o valoare foarte mare i va rmne n memorie chiar dac nu mai este folositoare. O soluie totui exist i este aceea de a deplasa contorul cu o poziie spre dreapta la intervale regulate de timp.

Algoritmul MFU
Un alt algoritm de nlocuire a paginii este algoritmul MFU (most frequently used), care este bazat pe argumentul c o pagin cu o valoare minim a contorului a fost adus recent n memorie i va fi folosit imediat. Aa cum este de ateptat, nici nlocuirea LFU, nici cea MFU nu este des ntlnit. Implementarea acestor algoritmi este costisitoare i nu aproximeaz foarte bine algoritmul optimal.

Algoritmi adiionali
Mai exist muli ali algoritmi care pot fi folosii pentru nlocuirea paginii. De exemplu, dac considerm i bitul de referire i bitul de modificare ca o pereche ordonat, avem urmtoarele situaii: 1.(0,0) - nici folosit nici modificat 2.(0,1) - nefolosit (recent), dar modificat 3.(1,0) - folosit, dar nemodificat 4.(1,1) - folosit i modificat Cnd apare necesitatea unei nlocuiri, fiecare pagin se gsete ntr-una din aceste clase. Vom nlocui o pagin (oricare) care se gsete n clasa cu numrul de ordine cel mai mic i este nevid. Dac exist mai multe pagini n prima clas, putem folosi o nlocuire FIFO sau alegem aleator una dintre ele.

2.5.5Algoritmi ad-hoc
La un algoritm de nlocuire a paginii sunt folosite deseori proceduri adiionale. De exemplu, sistemele pstreaz adesea 66

cteva frame-uri libere. Cnd apare un fault, un frame victim este selectat ca mai nainte. Pagina dorit este citit ntr-un frame liber (din cele pstrate de sistemul de operare) nainte ca victima s fie scris n mediul secundar. Aceast procedur permite procesului s ruleze ct mai repede cu putin, neateptnd ca pagina victim s fie scris n mediul secundar. Dup ce victima a fost scris, frame-ul pe care-l ocupa este adugat listei de frame-uri libere, pstrate de sistemul de operare. O extensie a acestei idei este aceea de a menine o list a paginilor modificate. Ori de cte ori dispozitivul de paginare este liber, o pagin modificat este selectat i scris n mediul secundar. Bitul su de modificare este apoi resetat. Aceast schem crete probabilitatea ca o pagin s fie nemodificat atunci cnd este selectat pentru nlocuire i nu va fi nevoie s mai fie scris n mediul secundar. O alt variant este aceea de pstra un anumit numr de frame-uri libere i de a ine cont de ce pagin a fost alocat n fiecare frame. De vreme ce coninutul frame-urilor nu este modificat prin scrierea paginii pe disc, vechea pagin poate fi refolosit direct din lista frame-urilor libere dac este necesar nainte ca frame-ul s fie refolosit. Nu este necesar nici o operaie de I/O. Cnd apare un fault de pagin, mai nti cutm dac pagina dorit se afl n lista frame-urilor libere. Dac nu se afl aici, trebuie s selectm un frame din lista frame-urilor libere i s o citim aici. Aceast tehnic este folosit n sistemele VAX/VMS mpreun cu un algoritm de nlocuire de tip FIFO. Cnd algoritmul FIFO nlocuiete greit o pagin (care este nc n folosin), aceasta este imediat disponibil din bufferul frameurilor libere i nu mai este necesar nici o operaie de I/O. Bufferul frame-urilor libere ofer un anumit spor performaei algoritmului FIFO de nlocuire a paginii care este relativ sczut, algoritmul fiind preferat deoarece este uor i simplu de implementat.

2.6Alocarea frame-urilor
Cum alocm o cantitate fix de memorie liber diferitelor procese? Dac avem, s spunem 93 de frame-uri libere i dou procese, cte frame-uri alocm fiecrui proces? 67

Cazul cel mai simplu al memoriei virtuale este sistemul monoutilizator. S considerm un sistem monoutilizator cu 128K de memorie mprit n pagini de 1K. Astfel, sunt 128 de frame-uri. Sistemul de operare poate ocupa, de exemplu, 35K, lsnd 93 de frame-uri libere pentru procesele utilizator. Folosind tehnica paginrii la cerere pur, toate cele 93 de frame-uri libere vor fi iniial puse ntr-o list a frame-urilor libere. Cnd un proces utilizator i ncepe execuia, va genera o secven de fault-uri de pagin. Primele 93 de fault-uri vor avea ca efect alocarea cte a unui frame din lista frame-urilor libere. Cnd lista frame-urilor libere s-a consumat, va fi folosit un algoritm de nlocuire a paginii pentru a selecta una din cele 93 de pagini de memorie pentru a fi nlocuit de a 9 4-a, .a.m.d. Cnd procesul i termin execuia, cele 93 de frame-uri vor fi plasate din nou n lista frame-urilor libere. Exist multe variaii ale acestei strategii simple. Putem cere ca sistemul de operare s aloce tot spaiul bufferelor i tabelelor din lista frame-urilor libere. Cnd acest spaiu nu este folosit de sistemul de operare, poate fi folosit pentru a susine paginarea proceselor utilizator. Putem ncerca s pstrm mereu trei frame-uri din lista frame-urilor libere. Astfel, cnd un fault de pagin apare, exist un frame liber n care poate fi citit pagina dorit. n timp ce pagina dorit este citit n acest frame, poate fi selectat o pagin pentru nlocuire, care este apoi scris pe disc pe msur ce procesul utilizator i continu execuia. i alte variante sunt posibile, dar strategia de baz este aceeai: procesului utilizator i este alocat orice frame liber. O alt problem apare cnd paginarea este folosit mpreun cu multiprogramarea. Multiprogramarea permite existena n memorie a dou sau mai multe procese n acelai timp.

2.6.1Numrul minim de frame-uri


Exist, desigur, diferite constrngeri la strategiile pentru alocarea frame-urilor. Nu putem aloca mai multe pagini dect numrul total de pagini disponibile (cel puin atta timp ct nu exist pagini partajate). Exist de asemenea un numr minim de frame-uri care pot fi alocate. Evident, pe msur ce numrul de pagini alocate fiecrui proces descrete, numul fault-urilor de pagin crete, ncetinind execuia procesului. 68

n afar de performaa precar datorat alocrii unui numr redus de frame-uri, exist un numr minim de frame-uri care trebuie alocate. Numrul acesta este definit de arhitectura setului de instruciuni. De remarcat c atunci cnd apare un fault de pagin nainte ca execuia instruciunii s se fi terminat, instruciunea trebuie restartat. n consecin, trebuie s avem destule frame-uri pentru a reine toate paginile diferite pe care o instruciune le poate referi. De exemplu, s ne nchipuim o main n care toate instruciunile care acceseaz memoria pot genera numai o adres de memorie. Astfel, avem nevoie de cel puin un frame pentru instruciune i unul pentru referina la memorie. n plus, dac este permis o adresare indirect de un nivel (de exemplu, o instruciune ncrcat din pagina 16 poate referi o adres din pagina 0 care este o referire indirect la pagina 23), atunci paginarea necesit cel puin trei frame-uri per proces. Numrul minim de frame-uri este definit de arhitectura sistemului. De exemplu, instruciunea move a mainii PDP-11 poate ocupa mai mult de un cuvnt pentru anumite moduri de adresare, i astfel, instruciunea nsi poate fi coninut n dou pagini. n plus, fiecare din operanzii si poate fi o referire indirect, dnd un total de ase frame-uri. Cel mai ru caz pentru maina IBM 370 este probabil instruciunea move character. Instruciunea aceasta ocup ase octei i poate deci fi coninut n dou pagini. Blocul surs de caractere precum i aria destinaie pot fi (ambele) coninute n dou pagini. Aceast situaie necesit ase frame-uri. (De fapt cel mai ru caz este acela cnd instruciunea move character este operandul unei instruciuni execute care poate fi coninut n dou pagini; n acest caz am avea nevoie de opt frame-uri.) Scenariul cel mai nefavorabil apare n arhitecturi care permit diferite nivele de indirectare (de exemplu, fiecare cuvnt de 16 bii poate conine o adres de 15 bii plus un indicator de indirectare de 1 bit). Teoretic, o simpl instruciune load poate referi o adres indirect care poate referi o adres indirect (n alt pagin) care poate de asemenea referi o adres indirect (n alt pagin) .a.m.d., pn cnd fiecare pagin din memoria virtual a fost atins. Astfel, n cel mai ru caz, ntreaga memorie virtual trebuie s fie n memoria fizic. Pentru a diminua aceast dificultate, trebuie s stabilim o limit pentru nivelele de indirectare (de exemplu s limitm o instruciune la cel mult 16 nivele de indirectare). Cnd prima indirectare apare, un contor este setat la valoarea 16; contorul este apoi 69

decrementat pentru fiecare refereniere succesiv a acestei instruciuni. Dac contorul este decrementat ctre 0, atunci procesul va fi ntrerupt semnalizndu-se o eroare (indirectare excesiv). Aceast limitare reduce numrul maxim al referirilor pe care le poate genera o instruciune la 17, necesitnd acelai numr de frame-uri. Numrul minim de frame-uri este deci definit de arhitectura hardware, pe cnd numrul maxim de frame-uri este definit de cantitatea de memorie fizic disponibil. Nu am definit totui, pn acum, numrul de frame-uri care trebuie alocat unui anumit proces.

2.6.2Algoritmi de alocare
Cel mai simplu mod de a mpri m frame-uri la n procese este de a-i da fiecruia o cantitate de memorie egal cu a celorlalte, respectiv m/n. De exemplu, dac sunt 93 de frame-uri libere i cinci procese, fiecare proces va primi 18 frame-uri. Cele 3 frame-uri libere care mai rmn pot fi folosite drept un buffer de frame-uri libere. Aceast schem se numete alocare egal. Putem totui porni de la ideea c c diferite procese vor avea nevoie de cantiti diferite de memorie. Dac singurele procese din memorie sunt un mic program de aplicaie creat de un student, avnd 10K i un sistem interactiv de baze de date n mrime de 127K, nu are sens s alocm fiecruia 31 de frameuri. Procesul creat de student nu va avea nevoie dect, s zicem, 10 frame-uri, iar celelalte 21 de frame-uri vor fi pur i simplu irosite. Pentru a rezolva aceast problem, putem folosi alocarea proporional. Vom aloca memorie disponibil fiecrui proces dup cerinele sale. Fie si mrimea memoriei virtuale a procesului pi i definim: S = si Atunci, dac numrul de frame-uri disponibile este m, vom aloca ai frame-uri procesului pi unde ai este aproximativ: ai =si / S m Desigur, trebuie s ajustm cantitile ai pentru a fi numere

70

ntregi, mai mari dect numrul minim de frame-uri impus de setul de instruciuni, suma lor nedepind m. Pentru o alocare proporional, putem mpri 62 de frame-uri la dou procese, unul de 10 pagini i altul de 127 pagini, alocnd 4 frame-uri i respectiv 57 de frame-uri, din moment ce: 10/137 62 4, 127/137 62 57 n acest fel, ambelor procese le este alocat un numr de frame-uri dup necesitile fiecruia. i n alocarea egal, i n cea proporional, desigur, numrul de frame-uri alocat fiecrui proces poate varia n funcie de gradul de multiprogramare. Dac nivelul de multiprogramare este crescut, fiecare proces va pierde cteva frame-uri pentru a furniza memoria disponibil noilor procese. Pe de alt parte, dac nivelul de multiprogramare descrete, frame-urile care au fost alocate proceselor care au prsit memoria, pot fi mprite proceselor care au mai rmas. De remarcat c i n alocarea egal i n cea proporional, un proces cu o prioritate mai mare este tratat la fel ca un proces de prioritate mic. Datorit definiiei sale, am vrea poate s-i dm procesului cu prioritate mai mare mai mult memorie, pentru a-i mri viteza de execuie, n detrimentul procesului cu prioritate mai mic. O soluie este folosirea unei alocri proporionale, unde raia de frame-uri depinde nu de mrimea relativ a proceselor, ci de prioritile proceselor, sau i de una i de cealalt. O alt modalitate este de a permite procesului cu prioritatea mai mare de a selecta frame-uri dintre cele ale procesului cu prioritate mai mic pentru nlocuire. Un proces poate alege frame-uri pentru nlocuire dintre cele ale sale sau dintre cele ale proceselor mai puin prioritare. Aceast idee permite unui proces de prioritate mai mare s-i sporeasc numrul de frame-uri pe cheltuiala procesului de prioritate mai mic.

71

2.7Thrasing
Dac numrul de frame-uri alocate unui proces scade sub numrul minim permis de arhitectura sistemului, trebuie s oprim execuia procesului. Trebuie atunci s scoatem n mediul secundar toate paginile sale care au mai rmas, elibernd frame-urile pe care le ocupa. S privim comportamentul unui proces care nu are destule frame-uri. Cu toate c, tehnic vorbind, este posibil s se reduc numrul de frame-uri la minim, de obicei exist un numr mai mare de pagini care se afl n folosin. Dac procesul nu are numrul de frame-uri necesar, el va genera fault foarte repede. n acest moment, el trebuie s nlocuiasc unele pagini. Totui, de vreme ce toate paginile sale sunt folosite, el trebuie s nlocuiasc o pagin de care va avea nevoie imediat. n consecin foarte repede el va genera fault, i apoi din nou, i din nou .a.m.d. Procesul va continua s genereze fault, nlocuind paginile pentru care va genera apoi imediat fault. Aceast activitate foarte intens a paginrii se numete thrashing. Un proces creeaz fenomenul de thrashing dac el consum mai mult timp paginnd dect executnd.

2.7.1Cauza fenomenului thrashing


Thrashing-ul creeaz probleme serioase de performan. S considerm scenariul care urmeaz, care este bazat pe comportamentul unor sisteme de paginare recente. Sistemul de operare monitorizeaz activitatea CPU-ului. Dac utilizarea CPU-ului este prea sczut, va crete gradul de multiprogramare, introducnd noi procese n sistem. Va fi folosit un algoritm global de nlocuire a paginii pentru a nlocui paginile care nu sunt folosite des (sau deloc) de ctre procesele crora le aparin. Metodele de nlocuire global i local sunt discutate n seciunea . S presupunem acum c un proces intr ntr-o nou faz n execuia sa i are nevoie de mai multe frame-uri. ncepe s genereze fault i s ia frame-uri care aparin altor procese. Aceste procese au nevoie de aceste pagini, i, ele vor genera fault de asemenea, lund frame-uri de la alte procese. Aceste procese care genereaz fault trebuie s foloseasc perifericul de paginare pentru a elibera i a aduce pagini. n timp ce coada

72

pentru perifericul de paginare crete, coada de intrare se golete. Pe msur ce procesele ateapt pentru perifericul de paginare, gradul de utilizare a CPU-ului descrete. Schedulerul vede c activitatea CPU-ului scade i ca urmare crete gradul de multiprogramare. Procesele noi ncearc s porneasc lund pagini de la alte procese care ruleaz, cauznd mai multe fault-uri de pagin i o mai mare coad pentru perifericul de paginare. Ca urmare, utilizarea CPUului scade i mai mult, iar scheduler-ul ncearc s creasc gradul de multiprogramare i mai mult. Fenomenul de thrashing a aprut i performana sistemului este foarte sczut. Rata fault-urilor de pagin crete extraordinar de repede. n consecin timpul efectiv de acces la memorie crete. Nici un program nu-i poate termina sarcinile deoarece i peterce tot timpul paginnd. Acest fenomen este nfiat n Figura 2.8. Graficul utilizrii CPU-ului este realizat n funcie de gradul de multiprogramare. Pe msur ce gradul de multiprogramare crete, utilizarea CPUului crete i ea, mai ncet, pn cnd atinge un maxim. Dac gradul de multiprogramare crete i mai mult, fenomenul de thrashing i face apariia, iar utilizarea CPU-ului scade vertiginos. n acest punct, pentru a crete utilizarea CPU-ului i a opri fenomenul de thrashing, trebuie s scdem gradul de multiprogramare. Efectele thrashing-ului pot fi limitate folosind un algoritm local (sau de prioritate) de nlocuire a paginii. Cu nlocuirea local, dac un proces face ca fenomenul de thrashing s apar, nu mai poate lua frame-uri de la alte procese cauznd apariia fenomenului i la acestea. Cererile de paginare ale acestui proces au ca efect nlocuirea paginilor aparinnd numai acestui proces cu cele solicitate. Timpul mediu de servire a unui fault de pagin va crete, fiind datorat lungimii mai mari a cozii de ateptare la perifericul de paginare. Astfel, timpul efectiv de acces va crete chiar i pentru procesele la care fenomenul de thrashing nu a aprut.

73

Figura 2.8 Thrashing

Pentru a preveni apariia fenomenului de thrashing, trebuie s-i oferim unui proces attea pagini cte are nevoie. Dar de unde putem ti de cte frame-uri sunt necesare? Exist cteva tehnici. Strategia setului de lucru (discutat n seciunea ) ncearc s determine cte pagini folosete un proces la un moment dat. Aceast idee definete modelul localizrii execuiei unui proces. Modelul localizrii se bazeaz pe constatarea c pe msur ce un proces se execut, referirile sale se mut dintr-o zon de memorie n alta. O astfel de zon este format dintr-un numr de pagini care sunt folosite mpreun. Un program este format n general din mai multe astfel de zone care pot s se suprapun. De exemplu, cnd este apelat o subrutin, ea creeaz o nou zon. n aceast zon, referirile la memorie sunt realizate de ctre instruciunile subrutinei, variabilele sale locale, i un subset al variabilelor globale. Cnd subrutina i ncheie execuia, referirile procesului prsesc aceast zon de vreme ce variabilele i instruciunile locale ale subrutinei nu mai sunt folosite. Programul se poate ntoarce n aceast zon mai trziu. Deci aceste zone de referine sunt definite de structura programului i de structurile de date. S presupunem c putem aloca suficiente frame-uri unui proces. El va genera fault pentru paginile din zona local n care realizeaz referirile pn cnd toate paginile de care are nevoie sunt n memorie; apoi nu va mai genera fault pn cnd i va schimba zona (local) referirilor; dac alocm mai puine frameuri dect ar trebui pentru a cuprinde paginile necesare,

74

procesul va genera fenomenul thrashing, de vreme ce nu are n memorie toate paginile pe care le folosete n mod curent.

2.7.2Modelul setului de lucru


Modelul setului de lucru este bazat pe caracterul local al referirilor. Acest model folosete un parametru, , pentru a defini frereastra setului de lucru. Ideea este de a examina cele mai recente referiri la diferite pagini. Setul de pagini n care s-au realizat cele mai recente referiri se numete setul de lucru. Dac o pagin este n folosin, ea va fi n setul de lucru. Dac nu mai este folosit, ea va fi scoas din setul de lucru la uniti de timp dup ultima referire n cadrul ei. Figura 2.8 Modelul setului de lucru

De exemplu, dndu-se secvena de referiri din n Figura 2.8, dac = 10 referiri la memorie, atunci setul de lucru la momentul t1 este {1, 2, 5, 6, 7}. La momentul t2 este {3, 4}. Acurateea setului de lucru depinde de selectarea lui . Dac este prea mic, nu va cuprinde ntreaga zon a referirilor; dac este prea mare, poate conine mai mult de o zon cu caracter local. n cazul extrem, dac este infinit, setul de lucru este ntreg programul. Cea mai important proprietate a setului de lucru este mrimea sa. Dac calculm mrimea fiecrui set de lucru WSSi, pentru fiecare proces din sistem, putem atunci considera D = WSSi, unde D este cererea total de frame-uri. Fiecare proces folosete la un anumit moment paginile din setul su de lucru. Astfel, procesul i are nevoie de WSSi frame-uri. Dac cererea total este mai mare dect numrul total de frame-uri disponibile (D > m), va 75

apare fenomenul de thrashing, de vreme ce anumite procese nu vor avea suficiente frame-uri. Folosirea setului de lucru este atunci simpl. Sistemul de operare monitorizeaz setul de lucru al fiecrui proces i aloc acestui set de lucru frame-uri suficiente pentru a cuprinde toate paginile necesare. Dac mai exist frame-uri disponibile suficiente, poate fi ncrcat un alt proces. Dac suma mrimilor seturilor de lucru crete, depind numrul total de frame-uri disponibile, sistemul de operare selecteaz un proces pentru a-l suspenda. Paginile procesului sunt scrise n mediul secundar, iar frame-urile sale sunt alocate altor procese. Procesul care a fost suspendat poate fi repornit mai trziu. Strategia setului de lucru previne thrashing-ul, pstrnd gradul de multiprogramare ct mai ridicat cu putin. Astfel, el optimizeaz utilizarea CPU-ului. Dificultatea care apare la modelul setului de lucru este pstrarea evidenei setului de lucru. Fereastra setului de lucru este o fereastr care se modific n timp. La fiecare referire, o nou referire apare i o alta dispare din fereastra de lucru. O pagin este n setul de lucru dac se afl n fereastra setului de lucru. Putem aproxima modelul setului de lucru dac avem la dispoziie o intrerupere de timp care apare la intervale regulate i un bit de referire. De exemplu, s presupunem c este 10.000 i putem genera o ntrerupere de timp la fiecare 5000 de referiri. Cnd a fost generat ntreruperea de timp, vom copia i seta pe zero fiecare bit de referire din fiecare pagin. Astfel, dac apare un fault de pagin, putem examina bitul de referire curent i cel pe care l-am copiat pentru a determina pentru o pagin dac pagina a fost folosit n ultimele de la 10.000 la 15.000 de referiri. Dac a fost folosit, cel puin unul din aceti bii va fi setat. Dac nu a fost folosit, aceti bii vor fi poziionai pe zero. Acele pagini care au cel puin un bit poziionat pe unu vor fi considerate ca fcnd parte din setul de lucru. De remarcat c un astfel de aranjament are unele neajunsuri deoarece nu putem spune unde, ntr-un interval de 5.000 de referiri, a aprut o referire. Putem mbunti soluia noastr crescnd numrul de bii ai istoricului i numrul de ntreruperi (de exemplu, 10 bii i o ntrerupere la fiecare 1.000 de referiri). Totui, costul acestor ntreruperi va fi i mai mare.

76

2.7.3Frecvena fault-urilor de pagin


Modelul setului de lucru are succes, iar cunotinele despre setul de lucru pot fi folositoare la prepaginare (seciunea ), dar este de fapt o cale greoaie de a controla fenomenul de thrashing. Strategia frecvenei fault-urilor de pagin (Page Fault Frequency) privete lucrurile mai direct. Problema este cum s evitm fenomenul de thrashing. Thrashing-ul are o rat a fault-urilor de pagin mare. Astfel, vom dori s controlm frecvena fault-urilor de pagin. Cnd este prea mare, tim c procesul are nevoie de mai multe frame-uri. Similar, dac frecvena fault-urilor de pagin este prea mic, atunci procesul are prea multe frame-uri. Putem stabili limite (superioar i inferioar) a frecvenei fault-urilor de pagin. Dac rata actual a fault-urilor de pagin depete limita superioar, alocm acestui proces mai multe frame-uri; dac rata fault-urilor de pagin scade sub limita inferioar, procesului i mai lum din frame-uri. Astfel, putem direct controla i preveni thrashing-ul. Dac rata fault-urilor de pagin crete i nu mai sunt frame-uri disponibile, trebuie s selectm un proces i s-l suspendm. Frame-urile disponibilizate sunt atunci distribuite altor procese (cu o rat a fault-urilor de pagin mare).

2.8Alte consideraii
Selectarea unui algoritm de nlocuire i a unei strategii de alocare sunt deciziile majore care trebuie luate pentru un sistem cu paginare. Din pcate acestea nu sunt singurele probleme.

2.8.1nlocuire global sau nlocuire local


Cu procese multiple concurnd pentru frame-uri, putem clasifica algoritmii de nlocuire n dou mari categorii: algoritmi de nlocuire global i algoritmi de nlocuire local. Un algoritm de nlocuire global permite unui proces s selecteze un frame din setul tuturor frame-urilor disponibile, chiar dac frame-ul respectiv este n acel moment alocat altui proces; un proces

77

poate lua un frame altui proces. nlocuirea local selecteaz un frame de care un proces are nevoie numai din setul de frameuri al acestuia. Cu o strategie de nlocuire local, numrul de frame-uri alocate unui proces nu se schimb. Cu o nlocuire global, se poate ntmpla ca un proces s selecteze numai frame-uri alocate altor procese, crescnd astfel numrul de frame-uri alocate lui (presupunnd c un alt proces nu va selecta un frame din cele ale procesului n discuie). O problem n cazul nlocuirii globale este aceea c un proces nu-i poate controla rata fault-urilor de pagin. Setul de pagini din memorie pentru un proces depinde nu numai de comportamentul paginrii pentru acest proces, dar i de comportamentul paginrii altor procese. Deci, acelai proces se poate derula foarte diferit (necesitnd 0,5 secunde pentru o execuie sau 10,3 secunde pentru o alt execuie) datorit circumstanelor externe. Aceasta nu se ntmpl la un algoritm de nlocuire local. Cu un algoritm de nlocuire local, setul de pagini din memorie al unui proces este afectat numai de comportamentul paginrii pentru acel proces. Dar, nlocuirea local poate stnjeni un proces nedisponibilizndu-i alte pagini, mai puin folosite. Astfel, nlocuirea global are ca rezultat, n general, un mai mare randament al sistemului.

2.8.2Prepaginare
O caracteristic evident a unui sistem cu paginare pur este numrul mare de fault-uri de pagin care apar la pornirea unui proces. Aceast situaie este rezultatul ncercrii de a intra n posesia zonei locale, iniale de memorie. Acelai lucru se poate ntmpla i n alte ocazii. De exemplu, cnd un proces care a fost scos n mediul secundar este repornit, toate paginile sale sunt pe disc i fiecare pagin este adus n memorie prin cte un fault de pagin. Prepaginarea este o ncercare de a evita aceast paginare iniial cu un nivel ridicat. Strategia este de a aduce n memorie, odat, toate paginile de care va fi nevoie. Cu modelul setului de lucru, de exemplu, pentru fiecare proces pstrm o list cu paginile din setul de lucru al acestui proces. Dac trebuie s suspendm un proces, salvm n primul rnd setul de lucru al acestui proces. Cnd un proces trebuie rencrcat, vom aduce n memorie n mod automat ntregul set 78

de lucru nainte de a porni procesul. Prepaginarea poate fi un avantaj n anumite cazuri. ntrebarea este dac costul prepaginrii este mai mic dect costul deservirii fault-urilor de pagin corespunztoare. Se poate ntmpla ca o bun parte din setul de pagini pe care tocmai le-am ncrcat s nu fie folosite. S presupunem c s pagini sunt prepaginate i o fraciune din aceste s pagini sunt folosite (0 1). ntrebarea este dac merit cele s fault-uri de pagin evitate costul prepaginrii a (1-) s pagini nefolosite. Dac este aproape de zero, prepaginarea pierde; dac este aproape de unu, prepaginarea ctig.

2.8.3Mrimea paginii
Proiectanii unui sistem de operare al unei maini deja existente nu pot, n general, s stabileasc mrimea paginii. Totui, n cazul proiectrii de noi maini trebuie luat o decizie privind mrimea optim a paginii. Aa cum era de ateptat, nu exist o singur mrime optim a paginii. Exist un set de factori care impun o varietate de mrimi. Mrimile paginii sunt invariabil puteri ale lui 2, n general variind de la 512 (29) la 16.384 (214) octei. Cum selectm o anumit mrime a paginii? Un factor de care trebuie inut seama este mrimea tabelei de pagini. Pentru un spaiu de memorie virtual dat, scznd mrimea paginii crete numrul paginilor, i deci mrimea tabelei de pagini. Pentru o memorie virtual de 4 Megaoctei (222) ar fi necesare 4096 de pagini de cte 1024 de octei sau numai 512 pagini de cte 8192 de octei. De vreme ce fiecare proces activ trebuie s aib copia sa a tabelei de pagini, vedem c o dimensiune mai mare a paginii este de preferat. Pe de alt parte, memoria este mai bine utilizat cu pagini mici. Dac unui proces i este alocat memorie pornind de la adresa 00000, continund atta ct are nevoie, memoria alocat acestuia nu va reprezenta probabil un numr ntreg de pagini. Astfel, o parte din ultima pagin este alocat dar nu este folosit (fragmentare intern). Presupunnd c exist independen ntre mrimea procesului i mrimea paginii, ne ateptm, n medie ca o jumtate din ultima pagin a fiecrui proces s fie irosit. Aceast pierdere va fi de numai 256 de octei pentru o pagin de 0,5Kb i de 4096 de octei pentru o

79

pagin de 8Kb. Pentru a minimiza fragmentarea intern, preferm dimensiuni ct mai mici ale paginii. O alt problem este timpul necesar citirii sau scrierii unei pagini. Timpul necesar unei operaii de I/O este compus din tipul de poziionare, timpul de ntrziere, timpul de transfer. Timpul de transfer este proporional cu cantitatea de transferat (respectiv mrimea paginii), fapt ce ar fi un argument pentru folosirea paginilor de mrime ct mai mic. De remarcat c timpii de poziionare i ntrziere sunt foarte mari n comparaie cu timpul de transfer. Cu o rat de transfer de 5Mb/sec, timpul de transfer a 512Kb va fi de 0,2 milisecunde. Timpul de ntrziere va fi probabil de 8 milisecunde, iar timpul de poziionare 20 milisecunde. Din timpul total al operaiei de I/O (28,2 milisecunde), 1% este consumat de operaia de transfer propriu-zis. Dublnd mrimea paginii, timpul total de transfer va crete la 28,4 milisecunde. Va consuma un timp de 28,4 milisecunde citirea unei singure pagini de 1024 de octei i un timp de 56,4 milisecunde citirea aceeai pagini, dar n blocuri de 512Kb. Astfel, pentru a minimiza timpul de I/O, sunt preferabile pagini de dimensiuni ct mai mari. Cu pagini mai mici, totui, timpul total datorat intrrilor/ieirilor ar trebui s fie mai mic de vreme ce astfel am surprinde mai bine tendina de localizare a referirilor. O mrime mai mic a paginii permite fiecrei pagini s se ncadreze mai bine n zonele locale ale referirilor unui proces. De exemplu, s considerm un proces de mrime 200Kb din care n mod curent sunt folosii n execuie numai 100Kb. Dac am avea numai o pagin de dimensiuni mari, am fi nevoii s aducem n memorie ntreaga pagin, cu un total de 200Kb transferai i alocai. Dac am avea pagini de numai 1 octet, am putea aduce n memorie numai cei 100Kb care sunt folosii, rezultnd un transfer i o alocare a numai 100Kb. O mrime a paginii mai mic, ne ofer o rezoluie mai bun, permindu-ne s izolm numai memoria care este folosit. Cu pagini mari, trebuie s alocm i s transferm nu numai ce este folosit, dar i orice altceva ce se afl n pagin, indiferent dac este folosit sau nu. Astfel, folosirea paginilor mici ar trebui s duc la intrri-ieiri mai puine i o memorie alocat de dimensiuni mai mici. Pe de alt parte, trebuie remarcat c folosind pagini de numai 1 octet am avea un fault de pagin pentru fiecare octet. Un proces de 200Kb folosind numai jumtate din mrimea sa va genera numai un fault de pagin cu o mrime a paginii de 200Kb, i 102.400 de fault-uri de pagin pentru o mrime a 80

paginii de 1 octet. Fiecare fault de pagin necesit anumite activiti: salvarea regitrilor, nlocuirea paginii, ateptarea pentru perifericul de paginare, actualizarea tabelelor. Pentru a minimiza numrul fault-urilor de pagin, avem nevoie de pagini de dimensiuni ct mai mari. Tendina productorilor este spre pagini mari. Procesorul Intel 80486 are o mrime a paginii de 4Kb; procesorul Mototrola 68030 permite ca mrimea paginii s varieze de la 256 de octei la 32Kb. Evoluia spre dimensiuni mari ale paginii este probabil rezultatul apariiei procesoarelor rapide i al capacitii crescnde a memoriei. Fault-urile de pagin sunt mai costisitoare astzi pentru performana sistemului dect nainte. Este deci avantajos a mri dimensiunea paginii pentru a reduce apariia fault-urilor. Desigur, aceasta nseamn o mai mare fragmentare interioar. Mai sunt i ali factori care trebuie luai n considerare (ca de exemplu relaia ntre dimensiunea paginii i dimensiunea sectorului perifericului de paginare). Problema nu are un rezultat optim. Anumii factori (fragmentare intern, localizare) sunt argumente pentru o dimensiune a paginii mai mic, n vreme ce alii (mrimea tabelelor, timpul de I/O) sunt argumente pentru pagini mai mari. Dou sisteme pot folosi dou dimensiuni diferite ale paginii. Hardware-ul Multics (GE 645) permite pagini de 64 de cuvinte sau de 1024 de cuvinte. Dificultatea alegerii unei mrimi a paginii este ilustrat i de faptul c VMS a ales pentru IBM/370 pagina de 4Kb, iar pentru VM/1 de 2Kb.

2.8.4Structura programelor
Paginarea la cerere este destinat a fi transparent pentru programele utilizator. n cele mai multe cazuri pe utilizator nu-l intereseaz dac memoria este paginat sau nu. n alte cazuri, totui, performana sistemului poate fi mbuntit dac cunoatem unele lucruri despre paginarea pur i nu numai. Ca exemplu, s considerm dimensiunea paginii de 128 de cuvinte. Un program Pascal are o funcie care trebuie s iniializeze cu 0 fiecare element al unei matrici cu 128 de linii i 128 de coloane. Codul ce urmeaz este tipic:

81

var A:array [1..128,1..128] of integer; : : for j:=1 to 128 do for i:=1 to 128 do A[i,j]:=0; : :

De remarcat c matricea este memorat pe linii (A[1,1], A[1,2], ... ,A [1,128], A[2,1], A[2,2], ... , A[2,128]). Pentru pagini de 128 de cuvinte, fiecare linie va ocupa o pagin. Astfel, secvena de cod anterioar va da valoarea zero unui cuvnt din prima pagin, apoi unui cuvnt din a doua pagin .a.m.d. Dac sistemul de operare aloc mai puin de 128 de frame-uri ntregului program, atunci execuia sa va cauza 128 128 = 16.384 de fault-uri de pagin. Schimbnd secvena de cod astfel:
var A:array [1..128,1..128] of integer; : : for j:=1 to 128 do for i:=1 to 128 do A[i,j]:=0; : :

programul va iniializa cu zero toate cuvintele dintr-o pagin, apoi va trece la alt pagin, rezultnd un numr de numai 128 de faut-uri. O alegere atent a structurilor de date i de programare poate accentua caracterul de localizare i deci va avea ca efect un numr mai mic de fault-uri de pagin i un numr mai mic de pagini n setul de lucru. Stivele au un caracter de localizare accentuat deoarece accesul se va realiza mereu n vrful stivei. O tabel de dispersie, va mprtia referirile. Caracterul de localizare a referirilor este numai o msur a eficienei folosirii structurilor de date. Ali factori care au importan mare sunt viteza de cutare, numrul total de referiri la memorie, i numrul total de pagini referite. Compilatoarele i ncrctoarele pot avea un efect semnificativ asupra paginrii. Separnd datele de cod i genernd cod reentrant nseamn c paginile pot fi read-only i deci nu vor fi niciodat modificate. Paginile goale nu necesit scrierea n mediul secundar la o nlocuire. ncrctorul poate evita s plaseze rutinele peste graniele unei pagini, pstrnd fiecare rutin ntr-o pagin. Rutinele care se apelez reciproc destul de des pot fi plasate n aceeai pagin. Aceasta este o problem cunoscut: S se mpacheteze segmente ncrcate, n pagini de mrime fix astfel nct numrul referirilor nter82

pagin fie minimizat.

2.8.5Blocarea paginii
Folosind paginarea la cerere, avem nevoie cteodat s permitem ca anumite pagini s fie blocate n memorie. O astfel de situaie apare cnd operaii de I/O se desfoar spre sau de la memoria (virtual) utilizator. Trebuie s fim siguri c urmtoarea secven de evenimente este exculs: Un proces realizeaz o cerere de I/O iar aceasta este pus ntr-o coad de ateptare pentru periferic. ntre timp, CPU-ul este alocat altor procese. Aceste procese cauzeaz unele fault-uri de pagin, i, folosind un algoritm de nlocuire global a paginii unele dintre ele nlocuiesc pagina care coninea bufferul pentru procesul care atepta operaia de I/O. Pagina este scoas n mediul secundar. Mai trziu, perifericul ajunge s serveasc cererea procesului n discuie i va folosi adresa transmis. Dar acest frame este folosit acum de alt pagin aparinnd altui proces. Exist dou soluii la aceast problem. O soluie este s nu se foloseasc niciodat adrese din memoria utilizator pentru operaii de intrare-ieire. Datele vor fi mereu copiate din zone de memorie aparinnd sistemului de operare n memoria utilizator. Pentru a scrie un bloc pe disc, mai nti vom copia blocul n memoria sistem, apoi, de aici, va fi scris pe disc. Aceast copiere suplimentar poate fi inacceptabil din cauza timpului consumat. O alt soluie este s permitem ca paginile s fie blocate n memorie. Un bit de blocare este asociat cu fiecare frame. Dac frame-ul este blocat, el nu poate fi selectat pentru nlocuire. Cu aceast soluie, pentru a scrie un bloc pe disc, sunt blocate mai nti n memorie paginile care conin blocul. Sistemul de operare poate continua apoi ca de obicei, cu excepia c paginile blocate nu pot fi nlocuite. Dup ce operaia de intrare-ieire s-a terminat, paginile sunt deblocate. O alt folosire a bitului de blocare implic o nlocuire normal a paginii. S considerm urmtoarea secven de evenimente: Un proces de prioritate mic genereaz fault. Selectnd un frame pentru nlocuire, sistemul de paginare citete pagina dorit n memorie. Gata s-i continue execuia, procesul mai puin prioritar intr n coada de ateptare i

83

ateapt ca CPU-ul s-i fie alocat. De vreme ce este un proces mai puin prioritar, se poate s nu fie selectat un timp, de scheduler, pentru CPU. n timp ce procesul mai puin prioritar ateapt, un proces mai prioritar genereaz fault. Cutnd un frame pentru nlocuire, sistemul de paginare gsete o pagin care este n memorie i care nu a fost accesat sau modificat: pagina pe care procesul mai puin prioritar tocmai a adus-o n memorie. Pagina pare a fi perfect pentru nlocuire; nu este nevoie ca ea s fie scris n mediul secundar, i aparent nu a fost folosit de o bun bucat de timp. A decide dac un proces cu prioritate mare poate nlocui paginile unui proces mai puin prioritar este o problem de strategie. n fond, nu facem dect s ntrziem procesul mai puin prioritar n folosul procesului cu o prioritate mai mare. Pe de alt parte, irosim efortul depus pentru a aduce n memorie pagina procesului mai puin prioritar. Dac decidem s evitm nlocuirea unei pagini care tocmai a fost adus n memorie, pentru ca ea s poat fi folosit mcar o dat, atunci putem folosi bitul de blocare pentru a implementa acest mecanism. Cnd o pagin este selectat pentru nlocuire, bitul su de blocare este setat, pn cnd procesului care a faultat pentru aceast pagin i este din nou alocat CPU-ul.

2.8.6Tabela de pagini inversat


n mod obinuit, fiecare proces are o tabel de pagini asociat. Tabela de pagini are o intrare pentru fiecare pagin virtual pe care procesul o folosete. Sistemul de operare trebuie s translateze referirile generate de program n adresele fizice corespunztoare. Din moment ce tabela este sortat dup adresele virtuale, sistemul de operare poate calcula unde se gsete n tabel intrarea pentru adresa fizic asociat i s foloseasc aceast valoare direct. Unul din neajunsurile memoriei virtuale este dimensiunea tabelei de pagini. Spaiul de adrese al memoriei virtuale poate fi de ordinul gigaocteilor, rezultnd tabele cu milioane de intrri care consum cantiti mari de memorie fizic. Pentru a rezolva aceast problem, anumite sisteme de operare folosesc tabele de pagini inversate. Calculatorul IBM System/38 ca i staiile de lucru IBM RT i Hewlett-Packard Spectrum, sunt exemple de sisteme care folosesc o astfel de schem. O tabel de pagini inversat are o intrare pentru 84

fiecare pagin real de memorie. Fiecare intrare are asociat adresa virtual a paginii stocat n aceast locaie de memorie. Astfel, exist o singur tabel de pagini n sistem, i are o intrare pentru fiecare pagin de memorie fizic. Pentru a ilustra aceasta, vom descrie o versiune simplificat a tabelei de pagini inversat folosit de sistemul IBM RT. Fiecare adres virtual const din tripletul: <Identificator_proces, numr_de_pagin, offset> Fiecare intrare n tabela de pagini inversat este o pereche <identificator_proces, numr_de_pagin>. Cnd apare un acces la memorie, partea din adresa virtual <identificator_proces, numr_de_pagin> este oferit subsistemului de gestiune a memoriei. Tabela de`pagini inversat este atunci scanat pentru a gsi o intrare care s fie identic cu partea de adres virtual menionat. Dac o astfel de intrare este gsit - s spunem, intrarea i - atunci este generat adresa fizic <i, offset>. Dac nu este gsit o astfel de intrare, atuci apare un fault de pagin, rezultnd c fie a fost generat o adres ilegal, fie c pagina n chestiune nu este n memorie. Implementarea memoriei partajate n sisteme ce folosesc tabele de pagini inversate este de asemenea dificil. Memoria partajat este implementat de obicei ca dou adrese virtuale diferite care sunt mapate n aceeai adres fizic. Aceast metod standard nu poate fi folosit de vreme ce o pagin fizic nu poate avea dect o singur adres virtual corespunztoare.

2.9Segmentare la cerere
Cu toate c paginarea la cerere este considerat a oferi cel mai eficient sistem de memorie virtual, ea necesit un hardware special. Cnd acest hardware este srccios, sunt folosite mijloace mai puin eficiente. Un astfel de caz este segmentarea la cerere. Procesorul Intel 80286 nu ofer posibiliti de paginare, ci de segmentare. Sistemul de operare OS/2 care ruleaz pe acest procesor, folosete mijloacele hardware oferite de acest procesor pentru a implementa segmentarea la cerere ca unica aproximare posibil a paginrii la cerere. OS/2 aloc memoria n segmente n loc de pagini. El 85

gestioneaz segmentele cu ajutorul descriptorilor de segment, care conin informaii despre mrimea, proteciea i locaia segmentului. Un proces nu trebuie s aib n memorie toate segmentele sale pentru a putea fi executat. Astfel, un descriptor de segment conine un bit care se numete bit de validare, care indic dac segmentul se afl n memorie. Cnd un proces adreseaz unui segment coninnd fie cod, fie date, hardware-ul verific acest bit. Dac segmentul se afl n memorie procesul i continu execuia nestingherit. Dac segmentul nu este n memorie, hardware-ul semnaleaz aceasta sistemului de operare (fault de segment), la fel ca n implementrile paginrii la cerere. OS/2 atunci scoate n mediul secundar un segment i aduce n memorie segmentul dorit. Instruciunea ntrerupt (cea care a cuzat fault-ul de segment) poate fi acum reluat. Pentru a determina ce segment s nlocuiasc n cazul unui fault, OS/2 folosete un alt bit care se gsete ntr-un descriptor de segment numit bit de accesare. Un bit de accesare servete acelai scop ca bitul de referire ntr-un sistem de paginare la cerere. Este setat ori de cte ori orice octet din segment este fie citit, fie scris. Este implementat o coad coninnd o intrare pentru fiecare segment din memorie. Dup fiecare cuant de timp (stabilit de sistemul de operare) OS/2 plaseaz la nceputul cozii toate segmentele care au bitul de accesare setat. n acest fel, la nceputul cozii se afl cele mai folosite segmente. n plus, OS/2 ofer apeluri sistem pe care procesele le pot folosi pentru a informa sistemul despre segmentele care pot fi scoase n mediul secundar, sau trebuie s rmn mereu n memorie. Aceast informaie este folosit pentru a rearanja intrrile n coad. Cnd sistemul de operare este ntiinat de apariia unei referiri la un segment invalid, rutinele de management al memoriei determin mai nti dac exist suficient spaiu n memorie pentru a cuprinde segmentul. Se poate folosi tehnica compactrii memoriei pentru a diminua (elimina) fragmentarea extern. Dac, dup compactare nc nu este spaiu suficient pentru a ncrca segmentul, este realizat o nlocuire de segment. Segmentul de la sfritul cozii este ales pentru nlocuire i este scris n mediul secundar. Dac spaiul eliberat este destul de mare pentru a primi segmentul, atunci segmentul cerut este citit n memorie, descriptorul de segment al su este actualizat, i segmentul este plasat la nceputul cozii. Altfel este realizat o compactare a memoriei, i procedura este reluat.

86

2.10Concluzii
De multe ori se dorete execuia unui proces al crui spaiu de adrese logice este mai mare dect spaiul de adrese fizice disponibil. Programatorul poate realiza un astfel de proces prin folosirea overlay-urilor, dar aceasta este o problem dificil de programare. Memoria virtual este o tehnic ce permite ca un spaiu mare de adrese logice s fie mapat ntr-un spaiu de adrese fizice mai mic. Memoria virtual permite ca procese de dimensiuni foarte mari s ruleze, i de asemenea permite ca gradul de multiprogramare s fie mbuntit, crescnd nivelul de utilizare a CPU-ului. Paginarea la cerere pur nu aduce n memorie o pagin pn cnd acea pagin nu este referit. Prima referire cauzeaz un fault de pagin. Sistemul de operare consult o tabel de pagini pentru a vedea unde se afl pagina dorit n mediul secundar. El apoi gsete un frame liber i citete aici pagina din mediul secundar. Tabela de pagini este actualizat pentru a reflecta aceast schimbare, i instruciunea care a cauzat acest fault de pagin este reapelat. Aceast metod permite ca un proces s ruleze chiar dac ntreaga sa imagine executabil nu se afl n memorie. Atta timp ct rata fault-urilor de pagin este la un nivel rezonabil de sczut, performana este acceptabil. Paginarea la cerere poate fi folosit pentru a reduce numrul de frame-uri alocate unui proces. Aceasta permite mrirea gradului de multiprogramare (oferind mai multor procese spaiu n memorie) i - teoretic, cel puin - gradul de utilizare a CPU. Paginarea la cerere permite execuia unor procese ale cror necesiti de memorie depesc dimensiunea memoriei fizice totale. Aceste procese ruleaz n memorie virtual. Dac solicitrile totale de memorie depesc memoria fizic, atunci poate fi necesar nlocuirea paginilor din memorie, pentru a elibera frame-uri noilor pagini. Sunt folosii diferii algoritmi de nlocuire a paginii. Algoritmul FIFO de nlocuire a paginii este uor de implementat, dar sufer de anomalia lui Belady. Algoritmul optimal necesit cunotine despre evenimente ce vor avea loc. Algoritmul LRU este o aproximare a algoritmului optimal dar chiar i el poate fi greu de implementat. Cei mai muli algoritmi de nlocuire a paginii, ca de exemplu algoritmul celei de-a doua anse, sunt aproximri

87

ale nlocuirii LRU. n plus, pe lng un algoritm de nlocuire a paginii este necesar i o politic de alocare a frame-urilor. Alocarea poate fi fix, sugernd o nlocuire local a paginii, sau dinamic sugernd o nlocuire global a paginii. Modelul setului de lucru presupune c referirile proceselelor au tendine de localizare. Setul de lucru este setul de pagini din zona local curent. n mod corespunztor, fiecrui proces trebuie s i se aloce frameuri suficiente pentru setul su curent de lucru. Dac un proces nu are suficiente frame-uri pentru setul su de lucru, el va genera fenomenul de thrashing. A oferi frame-uri suficiente fiecrui proces pentru o evita fenomenul de thrashing poate avea ca efect mutarea unor procese n mediul secundar i apoi replanificarea lor pentru a avea acces la CPU.

88