Systemy Operacyjne : Pamięć : Działanie demona kswapd
Łukasz Bolikowski
Sprawdzanie braku nieaktywnych stron odbywa się za pomocą funkcji
inactive_shortage(). Zwraca ona niezerową wartość (= niedobór), gdy zachodzi choć
jeden z następujących warunków:
-
suma wolnych, nieaktywnych czystych i nieaktywnych brudnych stron
jest mniejsza niż suma
zmiennych freepages.high i inactive_target
-
w którejkolwiek ze stref suma wolnych, nieaktywnych czystych
i nieaktywnych brudnych stron w strefie jest mniejsza niż
zone->pages_high
Sprawdzanie braku wolnych stron (funkcja free_shortage()) daje w wyniku
niezerową wartość (= niedobór), gdy spełniony jest choć jeden z następujących
warunków:
-
liczba wolnych i nieaktywnych czystych stron jest mniejsza niż freepages.high
-
w którejkolwiej strefie liczba wolnych i nieaktywnych czystych stron jest mniejsza niż
zone->pages_min
Próba zwolnienia stron (funkcja do_try_to_free_pages) działa tak:
- jeśli brakuje wolnych stron (free shortage), to:
- "wypierz" strony, tzn. zamień strony inactive dirty na inactive clean
- przytnij pamięci podręczne dcache oraz icache używane przez system plików
- jeśli brakuje nieaktywnych stron (inactive shortage), to próbuj do skutku (tzn. dopóki jest niedobór), ale maks. 64 razy,
wyrzucić jakieś strony na dysk (funkcja swap_out)
- usuń niepotrzebne tafle (patrz rozdziały o kmalloc i kfree)
Przeliczanie statystyk polega na:
-
zmniejszeniu memory_pressure o 1/64
-
przetworzeniu pierwszej 1/16 wszytkich stron na liście aktywnych stron
(lista LRU - na początku najrzadziej używane):
- czy strona była używana od ostatniego sprawdzania:
- tak: dodaj PAGE_AGE_ADV (= 3 w 2.4.7) do page->age, ale nie przekrocz PAGE_AGE_MAX (= 64 w 2.4.7)
- nie: page->age /= 2
- czy page->age > 0:
- tak: przenieś na koniec listy stron aktywnych
- nie: deaktywuj stronę
Sprawdzenie, czy brakuje pamięci w systemie odbywa się za pomocą funkcji out_of_memory(),
która zwraca 1 (= brak pamięci), o ile jednocześnie spełnione są wszystkie wymienione warunki:
- nr_free_pages <= freepages.min
- nr_free_pages() + nr_inactive_clean_pages() <= freepages.low
- nie mamy wolnego miejsca na wymianę stron (swap space)
Wybór procesu do zabicia i sama "egzekucja" są wykonywane przez funkcję oom_kill(). Dla każdego procesu
wywołuje funkcję badness, wybiera proces, który dostał największe noty, daje mu wysoki priorytet
(counter ustawiony na 5*HZ, czyli 500 na i386) aby zdążył po sobie posprzątać, a następnie
wysyła sygnał SIGKILL, lub SIGTERM (w przypadku procesów korzystających z urządzeń we/wy).
Funkcja badness przyznaje punkty w następujący sposób:
- podstawą jest ilość używanej pamięci
- dzieli się ją przez pierwiastek z ilości czasu działania i pierwiastek ze zużytego czasu procesora
(jeśli dużo zrobił, to żal wyrzucać)
- jeśli nice procesu jest dodatni, to wynik mnożymy przez 2
- jeśli właścicielem jest root, to wynik dzielimy przez 4
- jeśli proces korzysta z urządzeń we/wy, to wynik dzielimy przez 4
poprzednia strona |
spis treści |
następna strona
© 2001 Łukasz Bolikowski, Jakub Górski, Jakub Kowalski, Janusz Kuligowski, Tomasz Szymko