Pozostaje jedynie pytanie w jaki sposób strony pojawiają się na listach?
Strona może dostać się na listy tylko poprzez funkcję try_to_swap_out()
2.
Dokładniej wywołuje się funkcję swap_out(), która działa w następujący sposób:
Jeżeli proces current alokował pamięć (czyli current->mm > 0)
swap_out_mm(current->mm)
Przechodzimy listę init_mm.mmlist (przy czym zapamiętujemy ostatnią
pozycję)
wykonujemy swap_out_mm(mm)
Funkcja swap_out_mm() przechodząc przez swoje obszary (coraz niżej) vma - swap_out_vma(),
pgd - swap_out_pgd() (page directories), pmd - swap_out_pmd(), pte - swap_out_pte()
(page table entry), page wykonuje wreszcie try_to_swap_out().
W sumie funkcja wykona przynajmniej mm->rss >> 4
, prób przeniesienia strony do inactive_dirty_list.
Teraz przyjrzyjmy się co robi funkcja try_to_swap_out():
page->age += 3
) i wychodzimy,
bo strona była niedawno odwiedzana3.
page->age == 0
) lub nie.
Dodatkowo ustawiamy pte tej strony, aby wskazywało na swap entry, które mamy związane ze stroną4.
Zmniejsza się ilość odwołań do strony (page->count--
), przy czym
swap_cache liczy się jako kolejny proces używający tej strony5.
Poza tym zmniejszamy ilość stron zajmowanych przez proces (mm->rss--
).
entry = get_swap_page();
add_to_swap_cache(page, entry);
PG_swap_cache
(patrz wyżej)
Czyli funkcja try_to_swap_out()
oprócz wrzucania stron na listy zajmuje
się ich postarzaniem, zgodnie z ustawieniem bitu _PAGE_BIT_ACCESSED
w
page table enrty. Ten bit jest ustawiany sprzętowo za każdym razem, gdy
proces odwoła się do strony. Funkcja czyści ten bit, aby następnym razem móc
przekonać się czy strona była używana od ostatniego jej sprawdzania.