Ta prezentacja dotyczy mechanizmów wykorzystywanych przez funkcje
kmalloc
oraz kfree
.
Operacje przydziału pamięci dla jądra występują dość często i muszą być w związku z tym wykonywane efektywnie.
Ogólna idea pamięci przydziału pamięci w jądrze opiera się na alokatorze płytowym. Pamięć jest fizycznie alokowana i inicjowana całymi płytami (ang. slab). Wówczas utworzenie i zwolnienie obiektu nie wymaga na ogół fizycznego przydziału pamięci, wystarczy użyć pamięci z płyty.
Zarządzając swoją pamięcią jądro używa trójpoziomowych struktur danych:
W obrębie jednego cache trzymane są dowiązanie do płyt z obiektami tego samego rozmiaru.
Do przydziału pamięci przez kmalloc używane jest 13 cache - każdy przeznaczony dla obiektów o rozmiarze będącym kolejną potęgą dwójki: 32B, 64B, 128B, 256B, ..., 128kB. W tym rozwiązaniu fragmentacja wewnętrzna nie przekracza nigdy 50%.
Płyty w obrębie jednego cache trzymane są na uporządkowanej liście:
Ważniejsze pola w strukturze kmem_cache_s
:
c_name
c_firstp, c_lastp
c_freep
s_nextp
pierwszego deskryptora
płyty zawierającej przynajmniej jeden wolny obiekt
c_num
c_gfporder
c_nextp
Płyta zarządza ciągłym obszarem pamięci, do którego można wrzucić pewną ilość obiektów o konkretnym rozmiarze j.w.
Ważniejsze pola w strukturze kmem_slab_s
:
s_inuse
s_mem
s_freep
s_nextp, s_prevp
Rysunek poniżej przedstawia powiązania pomiędzy cache'ami i płytami.
Deskryptory pomagają utrzymywać listę wolnych miejsc na płycie.
Deskryptory obiektów są trzymane w dwóch miejscach w zależności od rozmiaru obiektów przechowywanych na płycie.
Ważniejsze pola w strukturze kmem_bufctl_s
:
buf_next_p
buf_slabp
Rysunki poniżej przedstawiają organizację deskryptorów obiektów w zależności od rozmiaru obiektów przechowywanych na płycie.
Na systemach wieloprocesorowych każdy cache ma krótką tablicę dla poszczególnych procesorów. Większość żądań przydziału i zwalniania pamięci może być obsłużona przy pomocy tej tablicy. Wymiana pomiędzy globalną cache i tą tablicą występuje tylko kiedy tablica się przepełni. W ten sposób ograniczona jest liczba operacji spin-lock (operacji na semaforach).
Przedstawiłem:
kmalloc
oraz
kfree
Prezentację można pobrać ze strony http://rainbow.mimuw.edu.pl/~la181249/university/so/kmalloc_and_kfree.html