Creeaza.com - informatii profesionale despre


Simplitatea lucrurilor complicate - Referate profesionale unice
Acasa » scoala » informatica » calculatoare
Mecanisme de gestionare a memoriei

Mecanisme de gestionare a memoriei


Mecanisme de gestionare a memoriei

Sub sistemul de operare DOS, fiecare program avea incorporat in fisierul executabil coduri pentru functiile de baza. Acest principiu functiona perfect, deoarece sub DOS intotdeauna rula un singur program care stapinea in exclusivitate memoria.



Sub Windows mai multe programe trebuie sa-si partajeze memoria disponibila, deoarece sistemul este cunoscut ca fiind un mare consumator de memorie RAM. Daca proiectantii de aplicatii ar fi incorporat fiecarui program codurile de baza pentru administrarea memoriei, a ferestrelor, afisarea caracterilor, imprimarea etc. memoria de lucru nu ar fi suficienta pentru incarcarea aplicatiilor.

Sub Windows exista patru principii de gestionare a memoriei interne, in sensul economisirii ei:

principiul DLL

principiul segmentelor de cod retrase

principiul replicarii instantelor active

principiul memorarii virtuale

GESTIONAREA MEMORIEI

Prin definitie, un sistem de operare ofera cel putin trei servicii fundamentale: managementul timpului de procesor, managementul memoriei si managementul operatiilor de intrare/iesire. Sa exploram rapid cateva concepte de baza si sa vedem cum pot fi accesate functionalitatile de management al memoriei in Windows.

Procesul este un concept fundamental in toate sistemele de operare. In esenta, un proces este un program in curs de executie. Fiecare proces este asociat cu un spatiu de adrese, concept care reprezinta multimea locatiilor de memorie care pot fi adresate in cadrul acelui proces.

In versiunile pe 32 de biti ale Windows, fiecare proces are acces la un spatiu de adrese de 232 de adrese distincte. Cum unitatea elementara de adresare este octetul, asta inseamna ca programele pe 32 de biti pot accesa maxim 4 GB de memorie. Similar, in versiunile pe 64 de biti, fiecare proces are la dispozitie (ati ghicit) 264 adrese distincte. Daca unitatea elementara de adresare este tot octetul, asta inseamna ca un proces pe 64 de biti are la dispozitie o cantitate totala de memorie de 16.777.216 TB. Destul de mult, cu alte cuvinte. Pentru simplitate, vom folosi in exemple adrese pe 32 de biti, dar toate lucrurile discutate se aplica si in medii pe 64 de biti.

In Windows, adresele utilizate in cadrul unui program sunt virtuale. Ele sunt relative la procesul din care sunt folosite si pentru fiecare acces la memorie, microprocesorul se ocupa de translatarea lor in adrese fizice. Operatia de translatare se realizeaza in hardware cu ajutorul unor tabele mentinute in nucleul sistemului de operare pentru fiecare proces in parte.

O implicatie importanta a acestui fapt este aceea ca un proces nu poate accesa memoria celorlalte procese din sistem. (Desigur, mecanisme de comunicatie a datelor si chiar de partajare directa a memoriei exista, dar ele trebuie invocate in mod explicit). Cu alte cuvinte, doua procese pot utiliza intern adresa virtuala 0x12345678, dar aceasta adresa se va mapa pe adrese fizice diferite de la un proces la altul. (Si de la aceasta regula exista exceptii, despre care vom discuta cu alta ocazie).

Inainte de a continua, mai trebuie mentionate doua aspecte importante. In primul rand, sistemul de operare nu face translatarea pentru fiecare adresa in parte, pentru ca mentinerea tabelelor ar fi o operatie extrem de costisitoare. Spatiul de adrese este impartit in pagini a caror dimensiune depinde de obicei de suportul oferit de hardware. Pentru arhitectura x86, paginile au 4 KB. Cu alte cuvinte, in cadrul unei adrese pe 32 de biti, primii 20 de biti indica pagina pe care ne aflam, iar ultimii 12 biti indica pozitia in cadrul paginii. Aceasta abordare are o varietate de implicatii. In timp vom mai discuta despre o parte din ele.

In al doilea rand, chiar daca am spus ca procesele pe 32 de biti au acces la 4 GB de memorie, asta nu implica automat ca aplicatiile pot folosi toata aceasta memorie. La proiectarea sistemului de operare s-a hotarat ca nucleul isi rezerva 2 GB pentru uz intern, iar aplicatiile pot folosi 2 GB din spatiul de adrese. In versiunea pe 64 de biti, aplicatiile au acces la un spatiu de adrese de 8 TB (8.192 GB) pentru arhitectura x64 si de 7 TB pentru IA-64.

Inarmati cu aceste informatii de baza, sa discutam putin despre alocatoarele de memorie din Windows.

Primul si cel mai important alocator se ocupa de managementul spatiului virtual de adrese. Functiile care permit interactiunea cu acest alocator au nume care incep cu Virtual (VirtualAlloc, VirtualAllocEx, VirtualFree etc). Cu ajutorul acestui alocator pot fi efectuate diferite operatii care opereaza la nivel de pagina.

Un prim exemplu de operatie este rezervarea unui interval din spatiul virtual de adrese al procesului. O rezervare este exact ce ii spune numele. Ea nu consuma pagini fizice din memoria sistemului, dar previne utilizarea blocului respectiv de adrese pentru alte operatii. Evident, o rezervare nu influenteaza cu nimic alocarile din alte procese. O rezervare permite unui proces sa puna deoparte un interval de adrese pentru o structura de date care initial este mica si poate creste dupa necesitati. Rezervarea unui interval se face cu ajutorul functiei VirtualAlloc prin transmiterea valorii MEM_RESERVE pentru parametrul flAllocationType.


Maparea unui set de pagini rezervate este o alta operatie importanta in lucrul cu pagini. Prin mapare un interval de adrese rezervate anterior este asociat cu un set de pagini fizice. Daca rezervarea nu conduce la alocarea efectiva de memorie, maparea consuma pagini din memoria sistemului. Aceasta operatie se realizeaza tot cu VirtualAlloc, prin transmiterea valorii MEM_COMMIT pentru parametrul flAllocationType. Rezervarea si maparea pot fi realizate intr-o singura operatie, combinand cele doua valori cu un "SAU" pe biti.

In cazul in care cele doua operatii se fac separat, maparea se poate face treptat, in functie de necesitati. Cu alte cuvinte, este posibil ca un proces sa-si rezerve un spatiu de adrese in valoare de 12 MB din care mapeaza apoi blocuri mai mici (prima data 256 KB, apoi 128 KB, apoi 1 MB samd). Cifrele sunt alese aproape arbitrar; ele nu sunt complet arbitrare deoarece cantitatile de memorie cerute trebuie sa satisfaca niste proprietati legate de granularitatea alocarilor si de dimensiunea paginii pe sistemul pe care ruleaza.

La mapare, paginile primesc un set de atribute de protectie. Programul specifica daca paginile sunt accesibile pentru citire, scriere sau executie. Aceste atribute pot fi modificate ulterior cu ajutorul functiei VirtualProtect, tinand cont de niste limitari impuse de atributele stabilite la mapare.

Paginile mapate pot fi eliberate cu ajutorul functiei VirtualFree, folosind valoarea MEM_DECOMMIT pentru argumentul dwFreeType. O rezervare poate fi stearsa cu totul apeland aceeasi functie cu valoarea MEM_RELEASE pentru parametrul dwFreeType. La stergerea unei mapari, trebuie specificate pagini valide. In caz contrar, operatia de eliberare esueaza. La stergerea unei rezervari, trebuie specificat un interval de adrese obtinut anterior prin VirtualAlloc, dar nu conteaza daca intervalul contine pagini mapate, rezervate sau un amestec.

Interfata de management al memoriei virtuale din Windows mai ofera si alte functionalitati pentru interogarea proprietatilor paginilor si manipularea lor, dar nu vom intra in detalii. Trebuie retinut doar ca pe acest alocator se construiesc toate celelalte functii de alocare disponibile la diverse niveluri.

Al doilea alocator important din Windows ofera functionalitate de heap si este accesibil (surpriza) prin intermediul unui set de functii al caror nume incepe cu Heap. Daca functiile pentru managementul memoriei virtuale lucreaza cu blocuri de pagini, functiile pentru heap sunt utilizate in alocarea unor blocuri relativ mici de memorie.

Fiecare proces dispune implicit de un heap accesibil prin intermediul functiei GetProcessHeap. Aplicatiile pot crea heapuri suplimentare apeland HeapCreate si pot specifica dimensiunea initiala a heapului si, eventual, dimensiunea maxima a acestuia.

Alocarea propriu-zisa de memorie se face cu HeapAlloc, care returneaza un bloc contiguu de memorie de marimea ceruta in cazul in care un astfel de bloc este disponibil. Redimensionarea blocurilor alocate anterior se poate face cu HeapReAlloc, iar eliberarea memoriei alocate se face cu HeapFree. Daca un heap nu mai este necesar, el poate fi eliberat cu un apel catre HeapDestroy.

Prin natura implementarii, un heap functioneaza optim atunci cand blocurile alocate au dimensiuni egale. In cazul in care o aplicatie aloca un numar extrem de mare de blocuri de dimensiuni variate, fragmentarea heapului poate reprezenta o problema serioasa. Prin fragmentare se intelege situatia cand memoria libera din heap este impartita in multe blocuri de dimensiuni mici. De exemplu, o cerere pentru alocarea unui bloc de 50 KB de memorie dintr-un heap care dispune de 512 KB de memorie va esua daca aceasta memorie este imprastiata sub forma multor blocuri de cate 32 KB. Pentru a preveni fragmentarea, poate fi utilizat un mod special de functionare a heapului, numit heap cu fragmentare scazuta.

Functiile de heap ofera si alte functionalitati, ceva mai avansate. De exemplu, in mod implicit accesul la heap este serializat, dar pot fi create heapuri fara serializare daca se stie ca aplicatia nu solicita memorie din acelasi heap in mod concurent, din mai multe fire de executie. De asemenea, implicit HeapAlloc returneaza NULL daca nu poate satisface cererea de alocare primita, dar heapul poate fi configurat sa ridice o exceptie in aceasta situatie.

Pe langa functiile Heap, Windows mai contine doua interfete de alocare, numite generic Global si Local. Aceste interfete exista doar pentru compatibilitatea cu platforma Windows pe 16 biti si sunt implementate intern prin apeluri Heap.

Peste alocatoarele de baza, sunt implementate multe alte interfete de management al memoriei. COM are un alocator propriu numit CoTaskMemAlloc. Biblioteca standard C contine alocatoarele bazate pe malloc, iar biblioteca standard C++ vine cu operatorul new. Diferite alte biblioteci implementeaza alocatoare proprii in functie de necesitatile specifice, iar in NET alocarea si managementul memoriei sunt abstractizate pentru a inlesni dezvoltarea aplicatiilor.

Mecanismul memoriei virtuale (mecanismul SWAP)

Managerul de memorie din Windows poate pune la dispozitia programelor mai multa memorie interna decit exista fizic pe calculator. Sistemul reuseste acest lucru transferind blocuri de informatii din memorie pe hard disc, aducindu-le eventual inapoi in memorie. Astfel, sistemul simuleaza memoria RAM cu memoria externa de pe hard disc, procesul fiind cunoscut sub forma memoriei virtuale. Segmentele transferate pe disc sunt cele mai putin utilizate.

In cazul mecanismului SWAP al memoriei virtuale, nu se mai face diferenta intre segmentele de cod si de date, prin transfer neexistind nici o pierdere de informatii.

Subliniez faptul ca aceste fisiere se pot crea nu numai pe discul local ci si pe o unitate de disc in retea sau pe un RAM-DRIVE. In primul caz are loc o incetinire a sistemului deoarece, la fiecare apelare a mecanismului SWAP, se apeleaza reteaua, iar in al doilea caz, dezavantajul care apare este ca fiecare byte ocupat de RAM-DRIVE ii va lipsi memoriei de lucru.

In ceea ce priveste dimensionarea acestor fisiere SWAP, se impune sa se aleaga o cale de mijloc deoarece, daca spatiul alocat acestora este prea mare, atunci sistemul este frinat, in caz contrar nu mai functioneaza. In general, se afirma ca fisierul SWAP ar trebui sa fie mai mare de doua ori decit memoria de lucru fizica. Daca exista o modalitate de lucru suficienta si se simte o lipsa acuta de spatiu pe discul hard, atunci se poate renunta la tot mecanismul SWAP.

Exista cel putin doua modalitati de abordare a acestui mecanism si anume in mod standard si in mod extins. In primul caz Windows nu poate folosi mecanismul SWAP pentru propriile aplicatii, fiind disponibil exclusiv pentru programele DOS; datele se pot scrie in fisiere temporare doar daca se porneste un program DOS. In al doilea caz, mecanismul SWAP da rezultate mult mai bune deoarece se pot scrie segmentele de memorie si cind nu e vorba de o aplicatie MS-DOS. Aceste segmente se salveaza pe hard disc atunci cind unei aplicatii Windows nu-I mai ajunge memoria disponibila. In acest fel, administrarea memoriei este preluata de Windows care va colabora cu unitatea centrala.

Un fisier SWAP temporar poate pune la dispozitia sistemului Windows o memorie marita considerabil. Fisierele SWAP permanente spre deosebire de cele temporare nu se creeaza la pornirea sistemului Windows si nu se sterg la parasirea acestuia, ci au un loc rezervat chiar si atunci cind nu se ruleaza Windows. In primul caz viteza este destul de mica deoarece in anumite conditii Windows-ul nu poate scrie intregul fisier pe hard disc, iar in al doilea caz, se inregistreaza un insemnat cistig de viteza, dar se impune ca fisierul SWAP sa ocupe un loc nefragmentat pe discul local. In cazul fisierului permanent se poate activa si accesul la discul hard pe 32 de biti, ceea ce determina un transfer mai mare de date.

Mecanismul memoriei virtuale (mecanismul SWAP)

Managerul de memorie din Windows poate pune la dispozitia programelor mai multa memorie interna decit exista fizic pe calculator. Sistemul reuseste acest lucru transferind blocuri de informatii din memorie pe hard disc, aducindu-le eventual inapoi in memorie. Astfel, sistemul simuleaza memoria RAM cu memoria externa de pe hard disc, procesul fiind cunoscut sub forma memoriei virtuale. Segmentele transferate pe disc sunt cele mai putin utilizate.

In cazul mecanismului SWAP al memoriei virtuale, nu se mai face diferenta intre segmentele de cod si de date, prin transfer neexistind nici o pierdere de informatii.

Subliniez faptul ca aceste fisiere se pot crea nu numai pe discul local ci si pe o unitate de disc in retea sau pe un RAM-DRIVE. In primul caz are loc o incetinire a sistemului deoarece, la fiecare apelare a mecanismului SWAP, se apeleaza reteaua, iar in al doilea caz, dezavantajul care apare este ca fiecare byte ocupat de RAM-DRIVE ii va lipsi memoriei de lucru.

In ceea ce priveste dimensionarea acestor fisiere SWAP, se impune sa se aleaga o cale de mijloc deoarece, daca spatiul alocat acestora este prea mare, atunci sistemul este frinat, in caz contrar nu mai functioneaza. In general, se afirma ca fisierul SWAP ar trebui sa fie mai mare de doua ori decit memoria de lucru fizica. Daca exista o modalitate de lucru suficienta si se simte o lipsa acuta de spatiu pe discul hard, atunci se poate renunta la tot mecanismul SWAP.

Exista cel putin doua modalitati de abordare a acestui mecanism si anume in mod standard si in mod extins. In primul caz Windows nu poate folosi mecanismul SWAP pentru propriile aplicatii, fiind disponibil exclusiv pentru programele DOS; datele se pot scrie in fisiere temporare doar daca se porneste un program DOS. In al doilea caz, mecanismul SWAP da rezultate mult mai bune deoarece se pot scrie segmentele de memorie si cind nu e vorba de o aplicatie MS-DOS. Aceste segmente se salveaza pe hard disc atunci cind unei aplicatii Windows nu-i mai ajunge memoria disponibila. In acest fel, administrarea memoriei este preluata de Windows care va colabora cu unitatea centrala.

Un fisier SWAP temporar poate pune la dispozitia sistemului Windows o memorie marita considerabil. Fisierele SWAP permanente spre deosebire de cele temporare nu se creeaza la pornirea sistemului Windows si nu se sterg la parasirea acestuia, ci au un loc rezervat chiar si atunci cind nu se ruleaza Windows. In primul caz viteza este destul de mica deoarece in anumite conditii Windows-ul nu poate scrie intregul fisier pe hard disc, iar in al doilea caz, se inregistreaza un insemnat cistig de viteza, dar se impune ca fisierul SWAP sa ocupe un loc nefragmentat pe discul local. In cazul fisierului permanent se poate activa si accesul la discul hard pe 32 de biti, ceea ce determina un transfer mai mare de date.

Mutarea fisierului de memorie virtuala

(pagefile.sys) pe alta partitie

1. De pe contul de administrator pe server (contul de Windows), cu click dreapta pe

My computer, se alege Properties, tab-ul Advanced.

2. Se apas a butonul [Performance Options].

3. In fereastra deschis a se apas a butonul [Change].

4. Se selecteaz a drive-ul C: iar in campurile Initial size s i Maximum size se pune

valoarea 2 (vezi Figura 1.).





Politica de confidentialitate


creeaza logo.com Copyright © 2024 - Toate drepturile rezervate.
Toate documentele au caracter informativ cu scop educational.