next up previous contents
Next: Funkcja try_to_swap_out() Up: Listy active_list, inactive_dirty_list oraz Previous: inactive_dirty_list   Spis tresci

inactive_clean_list's

Każda strona należy do pewnej strefy (page->zone), związanej z algorytmem bliźniaków. Strefy posiadają listy nieaktywnych czystych stron czyli zone->inactive_clean_list. Strony, które znajdują się na takiej liście mogą w każdej chwili zostać zwolnione, ponieważ albo zostały one zapisane na urządzeniu swappującym, albo są mapami plików, które można w każdej chwili ściągnąć z dysku jeżeli ktoś się do nich odwoła. Czyli są to strony gotowe do zwolnienia, ale zajmujące jeszcze miejsce w pamięci. W tej sytuacji jeżeli np. algorytm bliźniaków będzie potrzebował przy alokowaniu pamięci wolnych stron, w którejś strefie wywołuje funkcję reclaim_page(zone), która zwraca stronę gotową do zwolnienia (czyli wywołania __free_page(page)). Funkcja reclaim_page() (plik mm/vmscan.c) wykonuje następujące czynności:
struct page * reclaim_page(zone_t *zone)

  for each in zone->inactive_clean_list do
     jeżeli strona ma ustawiony bit PG_referenced
        wstaw stronę na listę active_list
        continue;
     jeżeli strona ma ustawiony bit PG_dirty
        wstaw stronę na listę inactive_dirty_list
        continue;
     del_page_from_inactive_clean_list(page)
/* usuwamy stronę z list; teraz już do żadnej nie należy */
     jeżeli strona ma swoje cache
/* niszczymy dodatkowe struktury związane ze swappowaniem strony */
        __delete_from_swap_cache(page);
        return page;

     if (page->mapping)
/* strona jest mapą pliku, więc trzeba ustawić odpowiednie informacje w strukturach danych inodów */
        __remove_inode_page(page);
        return page;

Poniższy diagram pokazuje zależności między listami i rodzaje migracji stron między nimi:



Łukasz Heldt 2001-12-18