Następna Poprzednia Spis | Linux, jądro 2.4.7 |
Główne zadanie: utrzymać liczbę gotowych do zwolnienia stron pamięci na odpowiednim poziomie poprzez ich wymianę.
Wątek kswapd budzi się sam co sekundę, robi, co do niego należy i zasypia. Może być jednak zbudzony wcześniej przez funkcję __page_alloc (spełniającą życzenia alokacji stron z systemu bliźniaków), jeśli stwierdzi ona, iż liczba wolnych stron spadła poniżej minimalnego poziomu.
A oto algorytm jego działania:
kswapd() powtarzaj jeśli liczba wolnych i nieaktywnych stron jest zbyt niska rób /* spróbuj zwolnić najmniej używane strony */ do_try_to_free_pages(GFP_KSWAPD, 0); jeśli od ostatniego uaktualnienia wieku stron mineła 1 sek. rób /* aktualizuj wiek stron, wyłapując nieużywane */ refill_inactive_scan(DEF_PRIORITY, 0); jeśli liczba wolnych lub nieaktywnych stron jest zadowalająca rób /* śpij przez sekundę */ interruptible_sleep_on_timeout(&kswapd_wait, HZ); wpp jeśli nie ma szans na zwolnienie żadnej strony rób /* zabijamy proces, który najbardziej zasługuje na śmierć */ oom_kill();Aby dowiedzieć się więcej o funkcji
refill_inactive_scan()
i algorytmie postarzania stron, który stosuje, zajrzyj do rozdziału
2.2 Mechanizm postarzania stron.do_try_to_free_pages()
zawarty jest zaś w rozdziale
2.3 Gdy zaczyna brakować pamięci.Kernel Reclaim Daemon - wątek jądra tworzony w momencie startu systemu.
Główne zadanie: zwrócić do systemu bliźniaków strony pamięci zawarte na liście inactive_clean_list. Tym samym
zapewnić obecność ustalonej liczby wolnych stron w każdej strefie pamięci (poziom ten ustala pole pages_low deskryptora strefy pamięci).
Warto podkreślić leniwość przy zwalnianiu stron do systemu bliźniaków - ta nieskomplikowana i nie zabierająca zbyt wiele czasu czynność wykonywana jest dopiero wtedy, gdy jest to naprawdę potrzebne.
Wywoływany przez funkcję __alloc_pages() (zdefiniowaną w page_alloc.c) gdy stwierdzi ona, iż liczba wolnych stron w pewnej strefie pamięci spadła poniżej dopuszczalnego minimalnego poziomu.
Algorytm działania demona jest następujący:
kreclaimd()1 powtarzaj { /* śpij, dopóki nie zostaniesz zbudzony */ interruptible_sleep_on(&kreclaimd_wait); dla każdej strefy pamięci zone rób /* dopóki liczba stron w strefie jest zbyt niska */ dopóki (zone->free_pages < zone->pages_low) rób { /* znajdź stronę do zwolnienia */ strona_do_zwolnienia = reclaim_page(zone); /* zwolnij stronę do systemy bliźniaków */ __free_page(strona_do_zwolnienia); } }
Funkcja reclaim_page()
wywoływana przez kreclaimd()
znajduje i zwraca nieaktywną niezabrudzoną stronę, którą można zwolnić do systemu bliźniaków, usuwając ją od razu z pamięci podręcznych.
Parametr zone określa strefę pamięci, w której należy znaleźć stronę do zwolnienia.
reclaim_page(zone_t * zone) dla każdej strony z listy zone->inactive_clean_list rób jeśli strona nie jest 'nieaktywną niezabrudzoną' rób przenieś stronę na odpowiednią listę (active_list lub inactive_dirty_list) wpp { /* ten przypadek ma miejsce znacznie częściej */ jeśli strona jest w pamięci podręcznej wymiany rób /* usuń deskryptor strony z pamięci podręcznej wymiany */ __delete_from_swap_cache(page); jeśli strona odwzorowuje plik rób /* usuń deskryptor strony z pamięci podręcznej stron */ __remove_inode_page(page); return znaleziona strona }
Źródła omawianych tutaj struktur i funkcji można znaleźć w pliku:
mm/vmscan.c
Następna Poprzednia Spis | Autor: Tomasz Pylak, 2001 |