Odwrotne odwzorowanie stron
Przypomnienie pojęć
Pamięć fizyczna podzielona jest na ramki (jednakowego rozmiaru).
Logiczna przestrzeń adresowa każdego procesu dzieli się na strony, o rozmiarze takim jak ramki.
Każdy proces posiada tablicę stron odwzorowującą adresy logiczne w adresy fizyczne (funkcja strony -> ramki).
Kiedy proces chce zajrzeć w miejsce w pamięci, które nie znajduje się w żadnej ramce, w wolną ramkę ładujemy potrzebne mu dane.
Zwalnianie ramek
System stara się utrzymywać pewną liczbę wolnych ramek, mniej używane odsyłając na dysk.
Jeżeli jednak chcemy zwolnić jakąś ramkę, procesy z niej korzystające muszą o tym wiedzieć.
Jedyną dostępną możliwością w Linuksie 2.4 było w takim przypadku przejrzenie tablic stron wszystkich procesów,
w celu odszukania tych odwołujących się do zwalnianej ramki i uaktualnienia bitu poprawności odwołania.
W jądrze Linuksa 2.6 dodatkowo z każdą ramką związana jest lista stron (wpisów w tablicach procesów),
które są w nią odwzorowywane.
Taka struktura pozwala na natychmiastowy dostęp do wpisów, które trzeba uaktualnić.
Na rysunku wygląda to tak:
(źródło: www-106.ibm.com/developerworks/linux/library/l-mem26/?ca=dgr-lnxw95MemManage26)
Struktury
Pojedyncza ramka (strona fizyczna), jest reprezentowana następująco:
struct page {
page_flags_t flags; /* atomic flags, some possibly updated asynchronously */
atomic_t count; /* Usage count, see below. */
struct list_head list; /* ->mapping has some page lists. */
struct address_space *mapping; /* The inode (or ...) we belong to. */
unsigned long index; /* Our offset within mapping. */
struct list_head lru; /* Pageout list, eg. active_list;
protected by zone->lru_lock !! */
union {
struct pte_chain *chain;/* Reverse pte mapping pointer. */
* protected by PG_chainlock */
pte_addr_t direct;
} pte;
unsigned long private; /* mapping-private opaque data */
.............
};
Nowością w stosunku do jądra wesji 2.4 jest w tutaj unia pte.
Znajduje się tutaj lista wskaźników do wpisów w tabliach stron (PTE = Page Table Entry)
lub pojedynczy taki wskaźnik, gdy ramka znajduje się dokładnie w jednej stronie (taka optymalizacja).
Zalety
- Szybkie, w czasie O(liczba stron w odwzorowaniu), wyszukiwanie wpisów w tablicach stron, w których pojawia się dana ramka jest niezwykle przydatne przy zwalnianiu ramek.
- Ważne w momencie kiedy wiele procesów współdzieli pewne obszary pamięci.
Wady
- Jest to rozwiązanie kosztowne pamięciowo, ponieważ pamiętamy odwzorowania w obydwie strony.
- Musimy utrzymywać unię pte, co wymaga dodatkowego nakładu pracy przy każdym zamapowaniu i odmapowaniu pamięci przez każdy korzystający z ramki proces.
Literatura:
Autor: Paweł Wrzeszcz, pw209308@zodiac.mimuw.edu.pl