Kernel Swap Daemon ma zadanie utrzymania poziomu wolnych stron powyżej freepages.high, aby system mógł alokować pamięć dla kolejnych procesów. Żeby odbywało się to efektywnie i sprawiedliwie kswapd trzyma strony na listach nieaktywnych (inactive_dirty_list oraz inactive_clean_list), które w razie potrzeby będzie zwalniał w pierwszej kolejności. Wątek utrzymuje ilość stron nieaktywnych na poziomie nie mniejszym niż freepages.high + inactive_target7. Przyjrzyjmy się zmiennej inactive_target8 :
#define inactive_target min((memory_pressure >> 6), \ (num_physpages / 4))
Pojawia się tu zmienna memory_pressure. Mówi ona o tym ile stron system alokuje (lub zabiera procesom),
tzn. w funkcji __alloc_pages()
oraz reclaim_page()
jest zwiększana, a w __free_pages_ok()
jest zmniejszana o jeden.
Dodatkowo kswapd zmniejsza wartość tej zmiennej o połowę co sekundę (recalculate_vm_stats()
).
Na podstawie memory_pressure można określić jakie jest zapotrzebowanie systemu na wolne strony w danym
momencie.
Jeżeli system dużo alokuje, wtedy kswapd będzie dużo deaktywował (aż ilość zdeaktywowanych stron
spadnie poniżej inactive_shortage()
), dzięki czemu będzie przygotowany na ewentualne
zapotrzebowanie systemu na wolne strony. Istotne jest, że wątek ma przygotowaną dużą ilość stron,
które kwalifikują się do wyrzucenia w pierwszej kolejności, czyli nie były ostatnio długo wykorzystywane.
Jeżeli proces odwoła się do strony to przechodzi ona z list nieaktywnych na listę aktywną,
czyli nie jest brana pod uwagę przy wyrzucaniu stron na dysk (w funkcji page_launder()
oraz
reclaim_page()
).
Jak widać funkcja refill_inactive()
jest wykonywana dosyć często (np. w porównaniu z
page_launder()
, którego wywołuje się dopiero, gdy faktycznie brakuje wolnej pamięci).
Funkcja refill_inactive()
wywołuje swap_out()
, która przechodzi po stronach procesów
i wywołując try_to_swap_out()
postarza je zgodnie z ustawianym sprzętowo bitem _PAGE_BIT_ACCESSED.
Postarzanie stron odbywa się na podstawie dwóch bitów:
W ten sposób system faktycznie dba o to, aby wyrzucać te strony, których wiek spadł do zera i aby mieć w pogotowiu wystarczającą ilość takich stron.