Systemy Operacyjne : Pamięć : Działanie demona kswapd

Łukasz Bolikowski


Sprawdzanie braku nieaktywnych stron odbywa się za pomocą funkcji inactive_shortage(). Zwraca ona niezerową wartość (= niedobór), gdy zachodzi choć jeden z następujących warunków:


Sprawdzanie braku wolnych stron (funkcja free_shortage()) daje w wyniku niezerową wartość (= niedobór), gdy spełniony jest choć jeden z następujących warunków:


Próba zwolnienia stron (funkcja do_try_to_free_pages) działa tak:

  1. jeśli brakuje wolnych stron (free shortage), to:
    1. "wypierz" strony, tzn. zamień strony inactive dirty na inactive clean
    2. przytnij pamięci podręczne dcache oraz icache używane przez system plików
  2. jeśli brakuje nieaktywnych stron (inactive shortage), to próbuj do skutku (tzn. dopóki jest niedobór), ale maks. 64 razy, wyrzucić jakieś strony na dysk (funkcja swap_out)
  3. usuń niepotrzebne tafle (patrz rozdziały o kmalloc i kfree)

Przeliczanie statystyk polega na:

  1. zmniejszeniu memory_pressure o 1/64
  2. przetworzeniu pierwszej 1/16 wszytkich stron na liście aktywnych stron (lista LRU - na początku najrzadziej używane):
    1. czy strona była używana od ostatniego sprawdzania:
      • tak: dodaj PAGE_AGE_ADV (= 3 w 2.4.7) do page->age, ale nie przekrocz PAGE_AGE_MAX (= 64 w 2.4.7)
      • nie: page->age /= 2
    2. czy page->age > 0:
      • tak: przenieś na koniec listy stron aktywnych
      • nie: deaktywuj stronę

Sprawdzenie, czy brakuje pamięci w systemie odbywa się za pomocą funkcji out_of_memory(), która zwraca 1 (= brak pamięci), o ile jednocześnie spełnione są wszystkie wymienione warunki:


Wybór procesu do zabicia i sama "egzekucja" są wykonywane przez funkcję oom_kill(). Dla każdego procesu wywołuje funkcję badness, wybiera proces, który dostał największe noty, daje mu wysoki priorytet (counter ustawiony na 5*HZ, czyli 500 na i386) aby zdążył po sobie posprzątać, a następnie wysyła sygnał SIGKILL, lub SIGTERM (w przypadku procesów korzystających z urządzeń we/wy).

Funkcja badness przyznaje punkty w następujący sposób:



© 2001 Łukasz Bolikowski, Jakub Górski, Jakub Kowalski, Janusz Kuligowski, Tomasz Szymko