Next: Zadania
Up: Algorytm alokowania spójnych bloków
Previous: Wejście
Stara się ona zrealizować zamówienie na ramek. Oto jak to ona robi
(kod źródłowy omawianych funkcji dostępny w mm/page_alloc.c). Gdy będę mówił o przeszukiwaniu
stref w poszukiwaniu wolnej pamięci będę miał na myśli przeszukiwanie
stref od tej o najmniejszym numerze wzwyż.
- przeszukaj strefy w poszukiwaniu dużej6
ilości wolnej pamięci, jeżeli
znaleziono takową spróbuj w niej zaalokować potrzebną pamięć wykorzystująca algorytm Buddy wywołując
funkcję rmqueue(). Jeżeli znaleziono odpowiedzni blok - zwracamy
wskaźnik do zaalokowanej ramki i kończymy
- przeszukaj i spróbuj zaalokować pamięć w strefach o dużej7 ilości
wolnych stron + nieaktywnych czystych stron (funkcja
__alloc_pages_limit()). Jeśli sukces - kończymy
- powtórz powyższy krok, ale z małym8 limitem wolnych + nieaktywnych czystych
stron
- budzimy kswapd w nadzieji, że poprawi sytuację. Oddajemy
przy tym procesor
- przeszukujemy i próbujemy zaalokować pamięć w strefach o minimalnej
ilości wolnych + nieaktywnych czystych ramek. Jeśli znaleźliśmy blok - wychodzimy
- jeżeli dotarliśmy do tego momentu to jesteśmy rzeczywiście ubodzy w pamięć
albo zamówienie jest duże. Teraz czyścimy brudne strony i staramy się przydzielić
pamięć. Jeśli sukces - kończymy
- teraz już praktycznie ostatnia szansa. Wykorzystywana jest m.in. funkcja
try_to_free_pages(), jeżeli są jeszcze jakieś szanse na wolną
pamięć to próbujemy powtórzyć cały proces alokacji raz jeszcze jeśli nie
ma już nic wolnego - kończymy z błędem
Next: Zadania
Up: Algorytm alokowania spójnych bloków
Previous: Wejście
Kuba Gorski
2001-12-12