4.4 Pamiec dzielona
Ten dokument nie opisuje bynajmniej pamieci dzielonej jako mechanizmu komunikacji miedzy procesami. Takie informacje mozna znalezc w czesci dotyczacej IPC. Tutaj zajme sie jedynie algorytmami wymiany stron pamieci dzielonej miedzy pamiecia fizyczna i dyskiem lub innymi urzadzeniami wymiany.
Konkretnie mowiac zajme sie dwoma funkcjami z pliku shm.c, a mianowicie: shm_swap_in oraz shm_swap.
Funkcja shm_swap
Argumenty: int prio - priorytet zwolnienia strony int dma - czy korzystac z DMA (0-Nie, w p.p.-Tak) Rezultat: 1 - Sukces (ramka zostala zwolniona) nie 1- Porazka Dzialanie:
Pierwszym krokiem jest zajecie (za pomoca funkcji get_swap_page) ramki na urzadzeniu wymiany. Jesli to sie powiedzie to przegladamy tablice shm_segs w poszukiwaniu segmentu, ktorego ramki wolno nam wymieniac. A zatem nie interesuja nas segmenty z ustawionymi bitami SHM_LOCKED, IPC_UNUSED lub IPC_NOID. Kolejnym krokiem jest przeszukiwanie cyklicznej listy przylaczen (czyli struktur vm_area_struct) dla wybranego segmentu w poszukiwaniu ostatnio nie uzywanej ramki. Jesli taka ramka nie zostanie znaleziona to szukamy innego segmentu "wymienialnego".
Gdy mamy juz ramke do wymienienia, zapisujemy jej kopie na dysku lub innym urzadzeniu wymiany (uzywajac funkcji write_swap_page), nastepnie zwalniamy ja (funkcja free_page) i aktualizujemy rozne wartosci (shm_rss- ilosc stron pamieci dzielonej w pamieci fizycznej, shm_swp- ilosc stron pamieci dzielonej na urzadzeniu wymiany, swap_successes- zmienna uzywana chyba wylacznie do statystyk, bit PRESENT w tablicy stron i t.d.).
Jak nie trudno zauwazyc, algorytm ten jest bardzo zblizony do zwyklego algorytmu wymiany ramek. Glowna roznica polega na innym dostepie do ramek Zamiast tablicy procesow korzystamy z tablicy shm_segs.
Funkcja shm_swap_in
Argumenty: struct vm_area_struct * shm unsigned long offset unsigned long code Rezultat: pte_t - pozycja w tablicy stron procesu gdy odniesiono Sukces BAD_PAGE - w przypadku Porazki Dzialanie:
Po sprawdzeniu wielu warunkow poczatkowych takich jak zakres i sensownosc parametrow zaczynamy czesc wlasciwa algorytmu. Jesli wszystko bylo dobrze, to w zaleznosci od otrzymanych parametrow i zajetosci pamieci,
Konczac uaktualniamy kilka zmiennych jadra (m.in. shm_swp, shm_rss) i zwracamy nowa pozycje strony.
Oprocz tego funkcja zawiera kilka dodatkowych instrukcji warunkowych majacych na celu, jak przypuszczam, uniemozliwienie wyscigu kilku procesow. Poniewaz w kodzie wystepuja instrukcje mogace powodowac oczekiwanie procesu na zakonczenie realizacji zadan dostepu do dysku (np. get_free_page, read_swap_page) mechanizm ten jest konieczny.
Niemal wylacznie pliki zrodlowe Linuxa. Przede wszystkim:
Autor: Piotr Pekala