Calculatoare
Alocarea memoriei - alocarea de memorie in limbaje de programareAlocarea memoriei este efectuata de catre alocatorul de memorie care tine contabilitatea zonelor libere si ocupate din memorie, satisface cererea pentru noi zone si reutilizeaza zonele eliberate. Alocarea memoriei se face ierarhic; la baza acestei ierarhii se afla sistemul de operare care furnizeaza utilizatorilor portiuni de memorie iar utilizatorul, la randul sau, gestioneaza portiunea primita de la SO dupa necesitatile sale 1. Alocarea de memorie in limbaje de programareExista o clasificare a limbajelor de programare din punct de vedere al alocarii de memorie: 1) Limbaje care nu pot aloca memorie. Este cazul limbajelor mai vechi (Fortran, Cobol). In aceste limbaje, utilizatorul nu poate aloca dinamic memorie in momentul executiei ci inaintea executiei programului. 2) Limbaje cu alocare si delocare explicita. Aceste limbaje permit utilizatorului sa ceara, pe parcursul executiei, noi zone de memorie si sa returneze memoria utilizata. Este cazul functiilor new si free in PASCAL si new si delete sau malloc si free din C si C++. 3) Limbaje cu colectoare de gunoaie (garbage collection). In aceste limbaje, utilizatorul nu specifica niciodata cand vrea sa elibereze o zona de memorie. Compilatorul si o serie de functii care se executa simultan cu programul deduc singure care dintre zone nu sunt necesare si le recupereaza. Mentionam ca majoritatea alocatoarelor din nucleele sistemelor de operare comerciale sunt de tipul 1) si 2). Exista si nuclee ale sistemelor de operare cu alocatoare de tipul 3), cum ar fi sistemele Mach sau Digital. 2. Caracteristici ale alocatoarelorVom prezenta cateva caracteristici ale alocatoarelor dupa care se poate evalua calitatea acestora. 1) Timp de operatie. Este timpul necesar unei operatii de alocare/dealocare. Acest timp depinde de tipul alocatorului, fiecare alocator trebuind sa execute un numar de operatii pentru fiecare functie. Cu cat memoria disponibila este mai mare cu atat timpul de executie a unui apel este mai mare.
2) Fragmentarea. O problema cu care se confrunta alocatoarele este faptul ca aproape niciodata ele nu pot folosi intreaga memorie disponibila, pentru ca mici fragmente de memorie raman neutilizate. Aceste pierderi apar in urma impartirii spatiului disponibil de memorie in fragmente neocupate in totalitate de programe. Fragmentarea poate fi : -fragmentare externa; -fragmentare interna; Fragmentarea externa apare ori de cate ori exista o partitie de memorie disponibila, dar nici un program nu incape in ea. Singurul mod de a reduce fragmentarea externa este compactarea spatiului liber din memorie prin mutarea blocurilor dintr-o zona in alta. Fragmentarea interna este data de cantitatea de memorie neutilizata intr-o partitie blocata ( ocupata partial de un program). Pentru a nu avea fragmentare interna ideal ar fi ca fiecare program sa aiba exact dimensiunea partitiei de memorie in care este incarcat, lucru aproape imposibil. 3)-Concurenta. Aceasta caracteristica se refera la gradul de acces concurent la memorie. Este cazul mai ales la sistemele cu multiprocesor, cu memorie partajata. Un alocator bine scris va permite un grad mai ridicat de concurenta, pentru a exploata mai bine resursele sistemului. 4)-Grad de utilizare. Pe langa faptul ca memoria este fragmentata, alocatorul insusi mentine propriile structuri de date pentru gestiune. Aceste structuri ocupa un loc in memorie, reducand utilizarea ei efectiva. 3. Tipuri de alocareIn sistemul de gestiune a memoriei exista doua tipuri de adrese: -adrese fizice; -adrese logice. Adresele fizice sunt adresele efective ale memoriei fizice. Se stie ca pentru a adresa o memorie fizica cu o capacitate de n octeti este necesar un numar de adrese egal cu log2n . Adresele logice, sau virtuale, sunt adresele din cadrul programului incarcat. De obicei, in marea majoritate a alocatoarelor, in momentul incarcarii unui program sau chiar al compilarii lui, adresele fizice coincid cu cele logice. In momentul executiei acestea nu mai coincid. Translatarea adreselor logice in adrese fizice este executata de catre hardware-ul de mapare al memoriei. Alocarea memoriei se poate face in doua feluri: Alocarea contigua inseamna alocarea, pentru un proces, a unei singure portiuni de memorie fizica, portiune continua; (elemente contigue inseamna elemente care se ating spatial sau temporal). Alocarea necontigua inseamna alocarea, pentru un proces, a mai multor portiuni separate din memoria fizica. Alocarea memoriei se mai face in functie de cum este privita memoria. Exista doua tipuri de memorie: -memorie reala; -memorie virtuala. Memoria reala consta numai in memoria interna a sistemului si este limitata de capacitatea ei. Memoria virtuala vede ca un tot unitar memoria interna si cea externa si se permite executia unui proces chiar daca acesta nu se afla integral in memoria interna.
|