next up previous contents
Next: Funkcja do_swap_page() Up: Algorytm postarzania stron Previous: inactive_clean_list's   Spis tresci

Funkcja try_to_swap_out()

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:

  1. Jeżeli proces current alokował pamięć (czyli current->mm > 0)
    swap_out_mm(current->mm)
  2. Przechodzimy listę init_mm.mmlist (przy czym zapamiętujemy ostatnią
    pozycję)
    /* lista init_mm.mmlist zawiera obszary pamięci procesów */
    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():

  1. Jeżeli jest ustawiony bit ACCESSED w pte to czyścimy ten bit, postarzamy stronę (page->age += 3) i wychodzimy, bo strona była niedawno odwiedzana3.
  2. Jeżeli strona ma już struktury związane ze swappowaniem (ustawiony bit PG_swap_cache), oznacza to, że prawdopodobnie jest już na którejś z list i wtedy w zależności od wieku strony deaktywujemy ją (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--).
  3. Wpp.

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.


next up previous contents
Next: Funkcja do_swap_page() Up: Algorytm postarzania stron Previous: inactive_clean_list's   Spis tresci
Łukasz Heldt 2001-12-18