Do spisu tresci tematu 4

4.4 Pamiec dzielona

Spis tresci


Wstep

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,

  1. albo: uaktualniamy tablice stron procesu, aby umozliwic dostep do tej strony- gdy jest ona juz w pamieci
  2. albo: czytamy te strone z urzadzenia wymiany (funkcja read_swap_page) i zapisujemy do ramki zajetej przy uzyciu funkcji get_free_page a nastepnie kasujemy ja z urzadzenia wymiany (funkcja swap_free) i tak jak poprzednio uaktualniamy tablice stron procesu- gdy strona jest nieobecna w 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.


Bibliografia

Niemal wylacznie pliki zrodlowe Linuxa. Przede wszystkim:

  1. ipc/shm.c
  2. include/ipc.h
  3. include/shm.h


Autor: Piotr Pekala