Obszary pamięci wirtualnej

Mimo iż proces może zaadresować 3GB pamięci, to jednak nie dostaje on od razu całej pamięci. Dostaje ją po kawałku w miarę zgłaszanych potrzeb, a podstawową jednostką przydziału pamięci dla procesu jest obszar pamięci wirtualnej (ang. VMA - Virtual Memory Area). Obszar taki, ze względu na stosowane w Linuxie stronicowanie, jest wielokrotnością strony.

Strukturą danych umożliwiającą procesowi zapamiętać jeden przydział VMA jest struktura vm_area_struct nazywana deskryptorem obszaru VMA.  Procesowi można przydzielić maksymalnie 65536 bloków VMA, co jest określone przez stałą MAX_MAP_COUNT w pliku sched.h.

Rysunek 3: Bloki VMA.

Wszystkie przydzielone bloki VMA proces pamięta w liście posortowanej ze względu na adresy początkowe bloków. Gdy ilość bloków VMA przekroczy 32 (wartość ta jest określona stałą AVL_MIN_MAP_COUNT), wtedy z VMA jest budowane drzewo AVL ze względu na adres początku VMA. Od tej pory, aż do zakończenia działania9, proces trzyma wszystkie swoje bloki VMA w drzewie AVL i na wspomnianej liście będącej w zasadzie infiksową fastrygą AVL'a.

Skoro jest trzymane drzewo10, to po co jeszcze trzymać listę? Otóż są przypadki gdy trzeba przejrzeć wszystkie przydzielone VMA (np. przy zwalnianiu pamięci procesu) i wtedy przejście listy będzie dużo szybsze od, zapewne rekurencyjnego, przeglądania całego drzewa AVL.

Omawiane drzewo AVL nie może przekroczyć wysokości11 równej stałej avl_maxheight = 41. Jak widać drzewo to może pomieścić dużo więcej węzłów niż ich będzie w rzeczywistości, a może ich być co najwyżej (65536) nie zależnie od platformy sprzętowej12.

Poprzez VMA jest również realizowane mapowanie plików dyskowych do pamięci. Zainteresowanych odsyłam do prezentacji poświęconej mapowaniu plików.


Tomasz Szymko 27 listopada 2001