next up previous contents
Next: About this document ... Up: kswapd (Kernel Swap Daemon) Previous: kswapd (Kernel Swap Daemon)   Spis tresci

Podsumowanie wiadomości o kswapd

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:

Natomiast postarzanie już tylko na podstawie bitu PG_referenced, ale tylko na liście active_list.

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.


next up previous contents
Next: About this document ... Up: kswapd (Kernel Swap Daemon) Previous: kswapd (Kernel Swap Daemon)   Spis tresci
Łukasz Heldt 2001-12-18