next up previous
Next: Zadania Up: Algorytm alokowania spójnych bloków Previous: Wejście

__alloc_pages()

Stara się ona zrealizować zamówienie na $2^k$ 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ż.
  1. 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
  2. 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
  3. powtórz powyższy krok, ale z małym8 limitem wolnych + nieaktywnych czystych stron
  4. budzimy kswapd w nadzieji, że poprawi sytuację. Oddajemy przy tym procesor
  5. przeszukujemy i próbujemy zaalokować pamięć w strefach o minimalnej ilości wolnych + nieaktywnych czystych ramek. Jeśli znaleźliśmy blok - wychodzimy
  6. 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
  7. 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 up previous
Next: Zadania Up: Algorytm alokowania spójnych bloków Previous: Wejście
Kuba Gorski 2001-12-12