next up previous contents
Next: Struktury danych Up: Algorytm ``bliźniaków'' Previous: Problem   Spis rzeczy

Rozwiązanie

Linux korzysta z systemu bliźniaków (ang. buddy system). Ramki w systemie dzielone są na pewną ilość list (obecnie 10), gdzie i'ta lista zawiera bloki o rozmiarze $2^i$ ramek (daje to obszary o rozmiarach od 1 do 512 ramek, czyli od 4Kb do 2Mb). Dodatkowo wprowadzony jest podział całej pomięci na strefy (ang. zones). Obecnie występują 3 strefy:
ZONE_DMA
- Pamięć dostępna dla transferów DMA (<16 Mb)
ZONE_NORMAL
- Pamięć na stałe odwzorowywana przez jądro (16-896 Mb)
ZONE_HIGHMEM
- Pamięć wysoka, dostępna jedynie dla trybu użytkownika (>896 Mb)

W ramach szybkiego przypomnienia: system bliźniaków polega na tym, że oraganizujemy wolne strony w ciągłe obszary o rozmiarze $2^i$. Na żądanie przydziału obszaru o długości $2^i$, jeśli dysponujemy dokładnie takim obszarem to go przydzielamy; jeśli nie szukamy obszaru o rozmiarze 2-krotnie większym większym (jeśli takiego nie będzie to próbujemy go utworzyć z obszarów większyc, postępując analogicznie) i jeśli taki znajdziemy dzielimy go na dwie części jedną z nich przydzielając, a drugą dołączając do wolnych obszarów rozmiaru $2^i$. Podobnie zwalniając obszar sprawdzamy czy jego bliźniak jest wolny. Jeśli tak łączymy bliźniaków w jeden obszar dwukrotnie większy i powtarzamy czynność rekurencyjnie dla nowo uzyskanego obszaru; jeśli nie po prostu dołączamy do wolnych obszarów rozmiaru $2^i$.


next up previous contents
Next: Struktury danych Up: Algorytm ``bliźniaków'' Previous: Problem   Spis rzeczy
Adam Koprowski 2001-12-18