Opis funkcji swap_out

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:

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