Przejdźmy do opisu funkcji:
static void swap_out(unsigned int priority, int gfp_mask)
realizującej jedną sesję wymiany stron. Funkcja ta dostaje dwa parametry.
Parametr priority mówi jak bardzo zależy wołającemu
na zwolnieniu pamięci dzięki wymianie stron. Gdy wołającym jest
kswapd, to priority=6, czyli chce on żeby zwolnić troszeczkę
pamięci. Gdy jest to funkcja __alloc_pages, to
priority=1, czyli trzeba zwolnić jak najwięcej się da!
Drugim parametrem są flagi gfp_mask. Parametr ten nie jest używany
w ciele funkcji.
Funkcja zaczyna wymianę stron od bieżącego procesu (procesu
current), gdyż to on właśnie zażądał pamięci, i to przez
niego dochodzi do wymiany, więc należy go ukarać! Wobec czego zostaje
on potraktowany funkcją swap_out_mm (której opis jest parę
punktów dalej).
Gdy swap_out zakończy wymianę stron procesowi bieżącemu,
to ustala liczbę zarządców pamięci, którzy będą uczestniczyć w wymianie
w następnym kroku. Liczba ta (nazwijmy ją: (counter)) ustalana
jest według wzoru:
counter = (mmlist_nr « SWAP_MM_SHIFT) » priority
przy czym:
- mmlist_nr - ilość zarządców2pamięci w systemie;
- SWAP_MM_SHIFT - stała równa 4;
- priority - parametr funkcji swap_out.
Wymianę stron zaczynamy od zarządcy, który jest pierwszy na
globalnej liście zarządców pamięci (struktur mm_struct).
Dla tego zarządcy i kolejnych counter-1 zarządców z listy,
robimy co następuje:
- traktujemy go funkcją swap_out_mm wymieniającą mu strony;
- przeczepiamy go na koniec wspomnianej listy zarządców.
Widać więc, że wymianę zaczynamy od zarządcy pamięci, którego ramki
najdłużej nie podlegały wymianie.
Tomasz Szymko 27 listopada 2001