Następna Poprzednia Spis Linux, jądro 2.4.7

3. Demony systemowe - kswapd i kreclaimd

3.1 Kernel Swap Daemon

Kernel Swap Daemon (kswapd) to wątek jądra tworzony w momencie startu systemu.

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.
Algorytm działania funkcji do_try_to_free_pages() zawarty jest zaś w rozdziale 2.3 Gdy zaczyna brakować pamięci.

3.2 Kernel Reclaim Daemon

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
		}

3.3 Źródła

Źródła omawianych tutaj struktur i funkcji można znaleźć w pliku:

mm/vmscan.c 


Następna Poprzednia Spis Autor: Tomasz Pylak, 2001