[ Pobierz całość w formacie PDF ]
.4.4 Pamiec dzielonaDo spisu tresci tematu 44.4 Pamiec dzielonaSpis tresciWstepFunkcja shm_swapFunkcja shm_swap_inBibliografiaWstepTen dokument nie opisuje bynajmniej pamieci dzielonej jako mechanizmukomunikacji miedzy procesami.Takie informacje mozna znalezc w czesci dotyczacejIPC.Tutaj zajme sie jedynie algorytmamiwymiany stron pamieci dzielonej miedzy pamiecia fizyczna i dyskiem lubinnymi urzadzeniami wymiany.Konkretnie mowiac zajme sie dwoma funkcjami z pliku shm.c,a mianowicie: shm_swap_in oraz shm_swap.Funkcja shm_swapArgumenty: int prio - priorytet zwolnienia stronyint dma - czy korzystac z DMA (0-Nie, w p.p.-Tak)Rezultat: 1 - Sukces (ramka zostala zwolniona)nie 1- PorazkaDzialanie:Pierwszym krokiem jest zajecie (za pomoca funkcji get_swap_page)ramki na urzadzeniu wymiany.Jesli to sie powiedzie to przegladamy tabliceshm_segs wposzukiwaniu segmentu, ktorego ramki wolno nam wymieniac.A zatem nie interesujanas segmenty z ustawionymi bitami SHM_LOCKED, IPC_UNUSED lub IPC_NOID.Kolejnym krokiem jest przeszukiwanie cyklicznej listy przylaczen (czylistruktur vm_area_struct) dla wybranego segmentu w poszukiwaniu ostatnionie uzywanej ramki.Jesli taka ramka nie zostanie znaleziona to szukamyinnego segmentu "wymienialnego".Gdy mamy juz ramke do wymienienia, zapisujemy jej kopie na dysku lubinnym urzadzeniu wymiany (uzywajac funkcji write_swap_page), nastepniezwalniamy ja (funkcja free_page) i aktualizujemy rozne wartosci (shm_rss-ilosc stron pamieci dzielonej w pamieci fizycznej, shm_swp- ilosc stronpamieci dzielonej na urzadzeniu wymiany, swap_successes- zmienna uzywanachyba wylacznie do statystyk, bit PRESENT w tablicy stron i t.d.).Jak nie trudno zauwazyc, algorytm ten jest bardzo zblizony do zwyklegoalgorytmu wymiany ramek.Glowna roznicapolega na innym dostepie do ramek Zamiast tablicy procesow korzystamy ztablicy shm_segs.Funkcja shm_swap_inArgumenty: struct vm_area_struct * shmunsigned long offsetunsigned long codeRezultat: pte_t - pozycja w tablicy stron procesu gdy odniesiono SukcesBAD_PAGE - w przypadku PorazkiDzialanie:Po sprawdzeniu wielu warunkow poczatkowych takich jak zakres i sensownoscparametrow zaczynamy czesc wlasciwa algorytmu.Jesli wszystko bylo dobrze,to w zaleznosci od otrzymanych parametrow i zajetosci pamieci,albo: uaktualniamy tablice stron procesu, aby umozliwic dostep do tejstrony- gdy jest ona juz w pamiecialbo: czytamy te strone z urzadzenia wymiany (funkcja read_swap_page)i zapisujemy do ramki zajetej przy uzyciu funkcji get_free_pagea nastepnie kasujemy ja z urzadzenia wymiany (funkcja swap_free) i tak jakpoprzednio uaktualniamy tablice stron procesu- gdy strona jest nieobecna wpamieci.Konczac uaktualniamy kilka zmiennych jadra(m.in.shm_swp, shm_rss) i zwracamy nowa pozycje strony.Oprocz tego funkcja zawiera kilka dodatkowych instrukcji warunkowychmajacych na celu, jak przypuszczam, uniemozliwienie wyscigu kilkuprocesow.Poniewaz w kodzie wystepuja instrukcjemogace powodowac oczekiwanie procesu na zakonczenie realizacji zadan dostepudo dysku (np.get_free_page, read_swap_page) mechanizm ten jest konieczny.BibliografiaNiemal wylacznie pliki zrodlowe Linuxa.Przede wszystkim:ipc/shm.cinclude/ipc.hinclude/shm.hAutor: Piotr Pekala
[ Pobierz całość w formacie PDF ]