next up previous contents
Next: Podsumowanie wiadomości o kswapd Up: Pamięć w systemie Linux Previous: Podsumowanie wiedzy o listach   Spis tresci

kswapd (Kernel Swap Daemon)

Wiemy już w jaki sposób strony przechowywane są na listach oraz kiedy zostają zapisane na dysk. Wiemy również jak działa algorytm postarzania stron w Linux-ie i które funkcję są z nim związane.

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:
nr_free_pages() freepages.min
nr_free_pages() + nr_inactive_clean_pages() freepages.low
w tej sytuacji musimy zabić jakiś proces, aby utrzymać pracę systemu */
      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())


Subsections
next up previous contents
Next: Podsumowanie wiadomości o kswapd Up: Pamięć w systemie Linux Previous: Podsumowanie wiedzy o listach   Spis tresci
Łukasz Heldt 2001-12-18