Teraz poznamy wątek jądra systemu, który jest odpowiedzialny za utrzymywanie stanu wolnych stron na bezpiecznym poziomie; czyli de facto inicjowanie przedstawionych wcześniej funkcji.
Kswapd jest wątkiem jądra uruchamianym przy starcie systemu. Jego zadaniem jest
utrzymanie stanu wolnych (lub nieaktywnych) stron na poziomie powyżej freepages.high.
Jeżeli ilość wolnych stron spadnie poniżej tej liczby, wtedy wątek uruchamia funkcję
do_try_to_free_pages()
, która ma poprawić sytuację systemu, znajdując strony
do wyswappowania lub inicjując ich zapis na dysk.
Dodatkowo wątek nie może doprowadzić do sytuacji, gdzie ilość wolnych stron spada poniżej
freepages.min.
Generalnie kswapd wykonuje poniższy kod (plik mm/vmscan.c):
int kswapd(void *unused) for(;;) if (inactive_shortage() || free_shortage())/* oznacza to, że ilość wolnych lub nieaktywnych stron spadła poniżej freepages.high, więc próbujemy zwolnić jakieś strony */
do_try_to_free_pages();/* Co sekundę ... */
jeżeli minął kwant czasu (HZ)/* Odświeżamy wiek stron */
refill_inactive_scan(); if (!free_shortage() || !inactive_shortage())/* Jeżeli stan wolnych i nieaktywnych stron utrzymuje się na stanie powyżej freepages.high to idziemy spać na HZ czasu (sekundę) */
interruptible_sleep_on(HZ); else if (out_of_memory())/* To oznacza, że nie udało nam się zwolnić wystarczającej liczby stron czyli:
oom_kill();
Funkcje inactive_shortage() oraz free_shortage() zwracają ilość brakujących stron do stanu freepages.high, przy czym inactive_shortage() liczy tylko strony nieaktywne (ich ilość musi być większa niż freepages.high + inactive_target, gdzie to drugie zależy od wielkości pamięci). Funkcja free_shortage() liczy strony wolne oraz nieaktywne czyste (ich liczba musi być większa niż freepages.high).
Kod funkcji do_try_to_free_pages() (plik mm/vmscan.c):
static int do_try_to_free_pages(unsigned int gfp_mask, int user) if (free_shortage())/* Jeżeli brakuje stron wolnych oraz nieaktywnych czystych (inactive_clean_list) to wywołujemy page_launder(), aby zwiększył ilość stron nieaktywnych czystych */
page_launder(); if (inactive_shortage())/* Jeżeli nadal mamy zbyt mało wolnych stron to wywołujemy funkcję refill_inactive(), która ma zwiększyć ilość stron nieaktywnych */
refill_inactive();
Kod funkcji refill_inactive() (plik mm/vmscan.c):
static int refill_inactive(unsigned int gfp_mask, int user) count = inactive_shortage(); maxtry = 1 << DEF_PRIORITY (== 6); do {/* Chodzi po pamięci procesów i deaktywuje ich strony */
swap_out();/* Dodatkowo ponadprogramowo postarza strony, aby szybko odzyskać odpowiednio bezpieczną ilość stron nieaktywnych */
count -= refill_inactive_scan(count); if (count <= 0 || --maxtry <= 0) break; while (inactive_shortage())