Instrukcja do laboratorium Systemów Operacyjnych
(semestr drugi)
wiczenie szóste
Ć
Temat: Pami dzielona
ęć
Opracowanie:
mgr in . Arkadiusz Chrobot
ż
dr in . Grzegorz ukawski
ż
Ł
Wprowadzenie
1. Pami dzielona
ęć
Pamięć dzielona (ang. shared memory), nazywana również w literaturze polskiej
pami ci
ę ą wspólną lub pami ci
ę ą wspó dzielon ,
ł
ą
s u y
ł ż
do szybkiej komunikacji
mi dzy
ę
procesami. Szybkość zyskiwana jest dzi ki
ę
ograniczeniu do minimum roli
j dra
ą
w obs udze
ł
wymiany danych, co pozwala zaoszcz dzi
ę
ć czas zwi zany
ą
z prze czaniem
łą
kontekstu. Zasada dzia ania
ł
tego rodka
ś
komunikacji opiera się na
pomy le
ś
wspó dzielenia
ł
przez procesy pewnego obszaru pami ci
ę
w przestrzeni adre-
sowej u ytkownika.
ż
Zwykle przestrzenie adresowe procesów są dok adnie
ł
od-
separowane, tak aby procesy nie mog y
ł
wzajemnie uszkodzić się nadpisuj c
ą sobie
dane lub kod. Dzi ki
ę
odpowiednim wywo aniom
ł
systemowym procesy u ytkownika
ż
mogą za
da
żą
ć przydzielenia im przez j dro
ą
fragmentu pami ci,
ę
który b d
ę ą mog y
ł
wspó dzieli .
ł
ć W takim przypadku system nie kontroluje operacji, które są wykony-
wane w tej pami ci,
ę
a dba jedynie aby aden
ż
z komunikuj cych
ą
się procesów nie
próbował odczytywać lub zapisywać pami ci
ę
le
cej
żą
poza wyznaczonym obszarem.
Zaletą takiego rozwi zania
ą
jest szybkość dzia ania
ł
i atwo
ł
ść obs ugi
ł
(procesy mogą
korzystać z tej pami ci
ę
w taki sam sposób jak z pami ci
ę
która jest im przydzielana
przez funkcję malloc()), natomiast wadą jest brak synchronizacji komunikacji,
o któr musi zadba programista aplikacji.
ą
ć
2. Funkcje i struktury danych
funkcja shmget() - funkcja ta zwraca identyfikator pami ci
ę
dzielonej zwi zanej
ą
z warto ci
ś ą klucza, który mo e
ż być wygenerowany przez funkcję ftok(). Je li
ś
obszar pami ci
ę
dzielonej istniał to zwracany jest tylko jego identyfikator,
w przeciwnym
razie
najpierw
jest
tworzony
obszar
pami ci
ę
dzielonej
o rozmiarze podanym w wywo aniu
ł
funkcji
1
, a dopiero potem zwracany jest
jego identyfikator. Funkcja ta pobiera również flagi zwi zane
ą
z prawami
dost pu
ę
do pami ci
ę
dzielonej oraz ze sposobem jej tworzenia i obs ugi.
ł
Szczegó y: man shmget.
ł
funkcja shmat() - funkcja ta przy cza
łą
obszar pami ci
ę
dzielonej okre lony
ś
po-
przez podany jej w argumentach identyfikator do przestrzeni adresowej proce-
su, który ją wywo a .
ł ł Jako drugi argument jest pobierany przez tę funkcję ad-
res pocz tkowy
ą
od którego ma być do czona
łą
pamięć dzielona. Je li
ś jest on rów-
1 Dok adniej:
ł
o podanym w argumencie wywo ania
ł
rozmiarze zaokr glonym
ą
do wielokrotno ci
ś
rozmiaru strony.
2
ny NULL, to system wybierze dowolny nieu ywany
ż
adres, natomiast, je li
ś
ma
on okre lon
ś
ą inną warto ,
ść
a argument okre laj cy
ś
ą
flagi ma wartość
SHM_RND, to adres pod który b dzie
ę
przy czona
łą
pamięć dzielona równy
b dzie
ę
adresowi podanemu w argumencie wywo ania
ł
zaokr glonemu
ą
w dół do
wielokrotno ci
ś
warto ci
ś
sta ej
ł
SHMLBA (obecnie ta sta a
ł
jest równa sta ej
ł
PAGE_SIZE, czyli w przypadku architektur Intela 4K). Oprócz opisanej powy-
ej
ż
warto ci
ś
argument flag mo e
ż
również przyjąć wartość SHM_RDONLY,
która oznacza,
e
ż
przy czony
łą
obszar pami ci
ę
dzielonej b dzie
ę
przeznaczony
tylko do czytania. Je li
ś
wywo anie
ł
funkcji się powiedzie to zwróci ona adres
pod którym b dzie
ę
do czona
łą
pamięć dzielona, w przeciwnym przypadku
zwróci warto -1. Szczegó y: man shmat.
ść
ł
funkcja shmdt() - funkcja ta od cza
łą
obszar pami ci
ę
dzielonej o podanym w ar-
gumencie adresie od przestrzeni adresowej procesu, który ją wywo a .
ł ł Je li
ś wy-
wo anie
ł
zako czy
ń
się sukcesem zwracane jest zero, w przeciwnym przypadku
-1. Szczegó y: man shmdt.
ł
funkcja shmctl() - funkcja zarz dzaj ca
ą
ą
pami ci
ę ą dzielon .
ą Obszar pami ci
ę
dzielonej na którym ma zostać wykonana operacja jest okre lony
ś
poprzez iden-
tyfikator podany w argumencie wywo ania
ł
funkcji. Drugim argumentem jest
rodzaj operacji: IPC_STAT pozwala na uzyskanie informacji o podanym ob-
szarze, IPC_SET pozwala zmodyfikować niektóre cechy zwi zane
ą
z danym ob-
szarem pami ci
ę
dzielonej, a IPC_RMID powoduje usuni cie
ę
podanego obszaru
pami ci
ę
dzielonej. Pozosta e
ł operacje albo są dost pne
ę
z poziomu u ytkownika
ż
uprzywilejowanego (SHM_LOCK i SHM_UNLOCK), albo mogą zostać w przy-
sz o ci
ł ś
zmodyfikowane lub usuni cie
ę
(SHM_STAT, SHM_INFO, IPC_INFO).
Szczegó y: man shmctl.
ł
Zadania
1. Zademonstruj u ycie przez program prywatnego obszaru pami ci dzielonej.
ż
ę
2. Stwórz obszar pami ci
ę
dzielonej, z którego b d
ę ą korzystać trzy procesy. Zorganizuj
dost p
ę do tej pami ci
ę
tak, aby procesy mia y
ł do niej dost p
ę w ci le
ś ś
okre lonej
ś
kolej-
no ci. Postaraj si nie u ywa semaforów.
ś
ę
ż
ć
3. Pokaż rozwi zanie
ą
problemu czytelników i pisarzy na przyk adzie
ł
operacji zapisu
i odczytu do pami ci
ę
dzielonej. Uwzgl dnij
ę
obydwa warianty problemu: czekaj cy
ą
pisarze i czekaj cy
ą
czytelnicy. Do synchronizacji komunikacji u yj
ż
semaforów. Do
wypisywania na ekran komunikatów zamiast funkcji printf() u yj
ż
funkcji write()
3
(man 2 write).
4. Napisz dwa programy, które b d
ę ą komunikować się poprzez pamięć dzielon .
ą
W trakcie
dzia ania
ł
programów
(np.
po
dwóch
wys anych
ł
i
odebranych
komunikatach) niech program b d cy
ę ą
w a cicielem
ł ś
pami ci
ę
zamieni jej prawa do-
st pu, tak, aby tylko on móg z niej korzysta . Poka co si wtedy stanie.
ę
ł
ć
ż
ę
5. Zademonstruj dzia anie flagi SHM_RDONLY.
ł
6. Stwórz trzy procesy, które b d
ę ą wymienia y
ł mi dzy
ę
sobą dane poprzez dwa obszary
pami ci
ę
dzielonej (np. niech proces drugi po redniczy
ś
w wymianie danych pomi dzy
ę
pierwszym i drugim obszarem pami ci dzielonej).
ę
7. U yj
ż
flagi IPC_STAT dla funkcji shmctl() celem uzyskania informacji na temat u y
ż -
wanego przez proces obszaru pami ci dzielonej.
ę
Uwaga: We wszystkich programach po zako czeniu
ń
ich dzia ania
ł
wszystkie obszary
pami ci
ę
dzielonej muszą być usuni te.
ę
Je li
ś
program korzysta z innych zasobów
IPC, to one równie musz zosta usuni te.
ż
ą
ć
ę
4