Sunteți pe pagina 1din 28

8

Gestiunea memoriei

Gestiunea memoriei (II)

Gestiunea memoriei fizice n Linux


Gestiunea memoriei virtuale n Linux
Bibliografie
UTLK: capitolele 8, 9

Gestiunea memoriei fizice n Linux

Algoritmi i structuri de date ce menin starea memoriei fizice


Se face la nivel de pagin
(Relativ) independent de gestiunea memoriei virtuale
Fiecare pagina fizic are asociat un descriptor: struct page
n zona lowmem se ine un vector de astfel de descriptori (mem_map)
(descritorul de pagin conine: un contor de utilizare al paginii, flag-uri,
poziia n swap sau n fiier, buferele coninute de pagin, poziia n
"page cache", etc.)

Zone (fizice) de memorie

Zona DMA: 0 - 16Mb


Zona Normal (LowMem): 16Mb - 896Mb
Zona HighMem: 896Mb 4Gb/64Gb
Non-Uniform Memory Access
Memoria fizic este mparit ntre mai multe noduri
exist un spaiu comun de adrese fizice
accesul la memoria local este mai rapid

Fiecare nod
are procesorul propriu
are zone de memorie proprii: DMA, NORMAL, HIGHMEM

Alocarea de pagini

alloc_pages(gfp_mask, order)

Aloc 2^order PAGINI contigue i ntoarce un descriptor de


pagin pentru prima pagin alocat
alloc_page(gfp_mask)

Funcii mai folositoare (ntorc adresa liniar a paginii/primei


pagini)
__get_free_pages(gfp_mask, order)
__get_free_page(gfp_mask)
__get_zero_page(gfp_mask)
__get_dma_pages(gfp_mask, order)

De ce alocare n puteri ale lui 2?

Algoritmii de alocare obinuii sunt liniari


O posibil soluie: paging
Uneori kernelul chiar are nevoie de memorie fizic contigu (pentru DMA)
Dac s-ar folosi paging, tabela de pagini s-ar modifica => penalizri la accesul la memorie
Dac s-ar folosi paging nu s-ar mai putea folosi paginare extins (pagini de 4Mb/2Mb)
Anumite arhitecturi (MIPS) mapeaz o parte din spaiul liniar de adres kernel n memoria fizic
(i.e. pe acea zon nu se folosete paginare)

Algoritmul buddy

Blocurile sunt grupate n liste de dimensiune fix


Blocurile au ca dimensiune puterile lui 2, aliniate corespunztor cu dimensiunea
Alocarea se face numai n blocuri de puteri ale lui 2
La alocarea unui bloc (dimensiune N)
Dac exist un bloc de dimensiune N se aloc
Dac nu, se sparge un bloc de dimensiune 2N n dou blocuri de dimensiune N,
unul se aloc, altul se pune n lista cu blocuri de dimensiune N
La dealocarea unui bloc (dimensiune N)
Dac exist blocuri adiacente n memoria fizic de aceeai dimensiune N, iar
primul este aliniat la 2N, cele dou blocuri se coaguleaz ntr-un bloc de
dimensiune 2N
Se ncearc iterativ s se coaguleze ct mai multe blocuri

Implementarea algorimului buddy n Linux

Sunt folosite 11 liste pentru blocuri de 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024
PAGINI
Fiecare zon de memorie are alocatorul buddy propriu
Fiecare zona are asociat un vector de descriptori de blocuri libere, cte o intrare
pentru fiecare dimensiune de bloc
Descriptorul de blocuri libere conine numrul de pagini libere i capul listei de blocuri
libere
Blocurile sunt nlnuite cu ajutorul cmpului lru din descriptorul de pagini
Paginile libere folosite de buddy au flagul PG_buddy setat
Descriptorul de pagina menine dimensiunea blocului n cmpul private pentru a
putea face uor verificrile necesare pentru coagularea a dou blocuri libere ce sunt
adiacente

Alocarea de blocuri cu dimensiune mic

Sistemul buddy este folosit n kernel pentru a aloca pagini


Multe componente din kernel au nevoie de blocuri de dimensiune mult
mai mic dect dimensiunea unei pagini
Soluie: folosirea de blocuri mai mici cu dimensiune variabil
Probleme: fragmentare extern

Soluie: folosirea unor blocuri de dimensiune fix, dar mai mici


Probleme: ct de mic/mare s fie dimensiunea ?
Soluie: crearea mai multor zone cu blocuri de mai multe dimensiuni, distribuite
geometric: 32, 64, ..., 131 056

Alocatorul slab

Zonele de memorie alocate/dezalocate sunt vzute ca


"obiecte"
Fiecare tip de "obiect" are un constructor i un destructor
Obiectele dealocate sunt pstrate ntr-un cache, astfel c la
urmatoarea folosire a lor nu mai trebuie reiniializate i nu
mai trebuie apelat algoritmul buddy
n Linux nu (prea) se folosesc constructori/destructori din
motive de eficien

De ce slab?

Kernelul tinde s aloce/dealoce succesiv acelai tip de structuri de date (de exemplu
PCB-uri); folosirea cache-ului din slab reduce frecvena operatiilor (mai costisitoare)
de alocare/dealocare
Multe cereri de alocare frecvente folosesc aceeai dimensiune pentru fiecare alocare:
pentru aceste tipuri se pot crea zone speciale, care s conin blocuri de dimensiunea
dorit => se reduce astfel fragmentarea interna
Pentru cereri ce nu folosesc aceai dimensiune la alocare (mult mai puin frecvente)
se poate folosi n continuare abordarea geometric (i cache)
Reduce foot-print-ul pentru alocare/dealocare pentru c nu se mai caut pagini libere
ci sunt luate direct din cache-uri (cache-urile de obiecte sunt concentrate ntr-o zon
de memorie i sunt mult mai mici dect structurile folosite de buddy)
Distribuie obiectele n memorie astfel nct s acopere uniform liniile de cache

Arhitectura alocatorului slab

Alocatorul slab este format din


Mai multe cache-uri
Fiecare cache are mai multe slab-uri
Fiecare slab menine mai multe obiecte alocate / libere

Descriptorii de cache

Un nume folosit pentru informaii ctre user-space


Funcii pentru iniializarea / deiniializarea obiectelor cache-ului
Dimensiunea obiectelor
Diverse flaguri statice / dinamice
Dimensiunea slab-urilor (structurile care conin efectiv obiectele) n
pagini (puteri ale lui 2)
Msti GFP pentru alocarea dintr-o zon specific
Mai multe slab-uri: pline, libere sau parial pline

Descriptorii de slab

Numrul de obiecte alocate


Zona de memorie n care se in obiectele
Zona de memorie ctre primul obiect liber
Descriptorii de slab sunt inuti fie
n cadrul slab-ului ce l descriu (dac dimensiunea obiectelor e mai
mic de 512, sau dac fragmentarea intern lasa loc pentru
descriptorul de slab)
n cadrul unor cache-uri generale folosite de ctre alocatorul slab

Arhitectura detaliat slab

Cache-urile generale / specifice

Cache-urile generale sunt folosite de alocatorul slab pentru


A aloca memorie pentru descriptorii de cache sau slab
A menine 26 de cache-uri generale cu dimensiunea obiectelor de 32, 64, 128,
..., 131 072 (cte unul pentru zona normal i unul pentru zona DMA);
kmalloc() aloc memorie din aceste cache-uri

Cache-urile specifice sunt create de ctre restul kernelului la


cerere

Descriptorii de obiecte

Descriptorii de obiecte

Descriptorul de obiect este folosit doar atunci cnd obiectul este


liber
Este de fapt un ntreg care indic urmtorul obiect liber
Ultimul obiect liber are valoarea BUFCTL_END
Descriptori de obiecte
Interni - inui n slab
Externi - inui n cache-urile generale

Colorarea slab-ului

Gestiunea memoriei virtuale

Memoria virtual este folosit


n user-space
n kernel-space

Alocarea unei zone de memorie n spaiul de adres (kernel


sau user) implic
alocarea unei pagini fizice
alocarea unei zone din spaiul de adres
n tabelele de pagini
n structuri interne, meninute de sistemul de operare

Descrierea spaiului de adres

Descriptor
spaiu de adres

Descriptor
zon

Descriptor
zon

Descriptor
zon

Descriptor
zon

Descriptor
zon

Descriptor
zon

Tabela
de
pagini

Descrierea spaiului de adres (2)

Tabela de pagini este folosit


de procesor (CISC)
de nucleu - cutare pagin i adaugare n TLB (RISC)
Descriptorul spaiului de adres este folosit de sistemul de operare pentru
a menine informaii mai high level
Fiecare descriptor de zon specific dac zona este mapat peste un
fiier, este mapat read-only, este mapat copy-on-write, etc.

Alocarea de memorie virtual

1. Cutarea unei zone libere n descriptorul spaiului de adres


2. Alocarea de pagini fizice pentru descriptorul zonei
3. Inserarea n descriptorul spaiului de adres a descriptorului zonei
4. Alocarea de pagini fizice pentru tabelele de pagini
5. Iniializarea tabelei de pagini astfel nct s indice ctre zona alocat
6. Alocarea la cerere de pagini fizice pentru zona alocat (i eventual
pentru noi tabele de pagin)

Dezalocarea de memorie virtual

1. tergerea descriptorului zonei din descriptorul spaiului de adres


2. Eliberarea paginii fizice asociat cu descriptorul zonei
3. Invalidarea tuturor ntrarilor din tabelele de pagini asociate cu zona
de dealocat
4. Invalidarea TLB-ului pentru zona delocat
5. Eliberarea paginilor asociate cu tabelele de pagini construite pentru
zona dealocat

Gestiunea memorie virtuale n Linux

n kernel-space
pentru apeluri vmalloc
descriptorul de zon: struct vm_struct
descriptorul spaiului de adres: list simplu nlnuit de descriptori
de zon

n user-space
descriptorul de zon: struct vm_area_struct
descriptorul spaiului de adres: arbore red-black

Tratarea page fault-urilor n Linux

Evacuarea paginilor n Linux

Algoritm de tip LRU


se menin doua liste: cu paginile active i cu paginile inactive
atunci cnd sistemul are nevoie de pagini, se elibereaz pagini, n ordine, din:
diversele cache-uri: buffer cache, dcache, icache
lista de pagini inactive
lista de pagini active

kswapd
kernel thread care evacueaz paginile
este activat atunci cnd numrul de pagini libere scade sub o limit

ntrebri

S-ar putea să vă placă și