Systemy Operacyjne Zestaw 5.

Transkrypt

Systemy Operacyjne Zestaw 5.
Systemy Operacyjne
Zestaw 5. - Pamięć dzielona
Grupa nr 1
27 IV 2009
Napisać odpowiedni plik Makefile oraz README dotyczący wszystkich programów w tym zestawie.
1
libshmem.so
Napisać bibliotekę dynamiczną (dzieloną) libshmem.so zawierającą implementacje następujących funkcji obsługujących pamięć dzieloną:
int shmCreate(int id, int size); Funkcja tworzy pamięć dzieloną o rozmiarze size. Klucz można utworzyc używając ftok(".", id). Funkcja zwraca identyfikator pamięci dzielonej shmid.
int shmOpen(int id); Funkcja uzyskuje dostęp do pamięci dzielonej i zwraca
identyfikator pamięci dzielonej.
void shmRm(int shmid); Usuwa dany segment pamięci dzielonej shmid.
void* shmAt(int shmid); Dowiązuje segment pamięci dzielonej shmid. Zwraca adres odwzorowania.
void shmDt(void *adres); Usuwa dowiązanie do segmentu pamięci dzielonej
dowiązanej pod adres.
int shmSize(int shmid) Zwraca rozmiar pamięci dzielonej shmid. Proszę użyć
funkcji systemowej shmctl z komendą IPC_STAT.
void shmInfo(int shmid) Wypisuje informacje o pamięci dzielonej: prawa
dostępu, rozmiar, pid twórcy, liczbę dowiązań. Proszę użyć funkcji systemowej shmctl z komendą IPC_STAT.
Funkcje mają korzystać z odpowiednich funkcji systemowych i obsługiwać wszystkie możliwe błędy przez nie zwracane (wypisać odpowiedni komunikat (perror)
i zakończyć działanie (exit)).
Należy napisać odpowiedni plik nagłówkowy shmem.h!!
Aby utworzyć bibliotekę dzieloną libshmem.so należy:
• Skompilować plik źródłowy shmem.c do pliku obiektowego shmem.o z opcją
-fPIC (Position-Independent Code):
gcc -c -O -fPIC shmem.c
• Utworzyć bibliotekę dzieloną libshsem.so:
gcc -shared -o libshmem.so shmem.o
• Aby użyć własnej biblioteki libshmem.so należy dodać ją opcją -l :
gcc shmemuse.c -L. -lshmem
1
• Aby wykonać program używający biblioteki dzielonej należy dadać do
zmiennej środowiskowej LD_LIBRARY_PATH ścieżkę do katalogu zawierającego bibliotekę:
export LD_LIBRARY_PATH=.
Powyższe operacje mają być wykonywane automatycznie w pliku Makefile.
2
shmuse
Napisać program shmuse.x, który używa biblioteki libshmem.so. Program przyjmuje jednoliterowy argument i ewentualnie drugi argument:
./shmuse.x c size Tworzy segment pamięci dzielonej o rozmiarze size.
./shmuse.x d Usuwa segment pamięci dzielonej
./shmuse.x r Wypisuje zawartość pamięci dzielonej na standardowe wyjście.
./shmuse.x w < input.txt Kopiuje zawartość standardowego wejścia do pamięci dzielonej. Sprawdzić rozmiar segmentu.
./shmuse.x i Wypisuje informacje o pamięci dzielonej.
./shmuse.x Wypisuje informacje o użyciu tego programu.
3
producent, konsument
Przy pomocy pamięci dzielonej oraz semaforów systemu UNIX zaimplementować problem „Producenta i Konsumenta” dla N -elementowego bufora cyklicznego (tzn. po dojściu do końca bufora wracamy na jego początek) umieszczonego
w pamięci dzielonej, gdzie elementem bufora jest pewna ustalona porcja bajtów.
Dla zademonstrowania, że nie doszło do utraty ani zwielokrotnienia towaru,
niech Producent pobiera „surowiec” (np. porcje bajtow lub liczby typu int) z
pliku tekstowego magazyn.txt i wstawia go jako towar do bufora, a Konsument
niech umieszcza pobrany z bufora towar w innym pliku tekstowym schowek.txt.
Po zakonczeniu działania programów (wyczerpaniu zasobów „surowca”) oba pliki tekstowe powinny być identyczne. Oba procesy niech drukują odpowiednie
komunikaty na ekranie, w tym towar, który przesyłają.
Do zasymulowania róznych szybkości działania programów użyc funkcji sleep
np. z losowym czasem usypiania.
Należy użyć dwóch semaforów, pierwszy blokuje zapis (producent) gdy bufor
cykliczny jest pełny, drugi blokuje odczyt (konsument) gdy bufor cykliczny jest
pusty.
Strukura bufora cyklicznego, która znajduje się w pamięci dzielonej może mieć
postać:
struct cykliczny {
int size;
//
int beg;
//
int end;
//
towar buf[]; //
};
Całkowity rozmiar bufora
Pierwszy element do odczytu
Element za ostatnim zapisanym elementem
Dane, własny typ ’towar’ może być równoważny np. ’int’
Należy użyć własnych bibliotek libsem.a i libshmem.so.
4
Dodatkowe
Zaimplementować uogólnienie zadania 3. na przypadek wielu producentów i
wielu konsumentów.
Andrzej Görlich
[email protected]
http://th.if.uj.edu.pl/˜atg/SO