Zadanie z programowania współbieżnego dla MSUI w roku 2009/10
W systemie działa serwer i pewna liczba procesów. Każdy proces jest albo
ugodowy albo neutralny albo marudny. Typ procesu podaje się przy jego uruchomieniu
w linii poleceń: proces u, proces n lub proces m
Proces w pętli nieskończonej:
- wykonuje własne sprawy, czyli po prostu usypia na losowy czas --- od 1 do 10
sekund,
- następnie wypisuje na standardowy strumień diagnostyczny komunikat
"Proces %d, czekam na zasób.\n", zgłasza się do serwera i czeka, aż
serwer przydzieli mu zasoby,
- otrzymuje od serwera informacje o typie przydzielonego zasobu,
- korzysta z zasobu --- wypisuje na standardowy strumień diagnostyczny komunikat
o typie otrzymanego zasobu: "Proces %d, otrzymalem zasób %d.\n" i
pracuje z zasobem, czyli usypia na losowy czas --- od 1 do 10 sekund
- wypisuje na standardowy strumień diagnostyczny komunikat
"Proces %d, skonczylem\n" i oddaje zasób serwerowi.
- Wszystkie komunikaty są w formacie stosowanym w fprintf i mają zawierać PID
procesu. Poza tym procesy nie wypisują żadnych innych komunikatów.
Zarządzaniem procesami i zasobami zajmuje się serwer. Zarządza on zasobami dwóch typów:
lepszym i gorszym. Jest on wywoływany z dwoma parametrami: N - oznaczającym liczbę
dostępnych zasobów lepszych, M - oznaczającym liczbę dostępnych zasobów gorszych.
Serwer komunikuje się z procesami za pomocą kolejki (lub kolejek) komunikatów. W pierwszej
kolejności odbiera on komunikaty o zwrocie zasobów, które obsługuje sam. W następnej
kolejności odbiera komunikaty z prośbą o przydzielenie zasobu. Po odbiorze takiego komunikatu
serwer tworzy wątek odpowiedzialny za obsługę tego żądania i ponownie oczekuje na zlecenia
od procesów.
Wątek odpowiedzialny za obsługę żądań działa w następujący sposób:
- jeżeli żądanie pochodzi od procesu marudnego, wątek oczekuje aż będzie dostępny
przynajmniej jeden egzemplarz zasobu lepszego, po czym wysyła do procesu komunikat
z informacją o przydzieleniu mu zasobu i kończy się,
- jeżeli żądanie pochodzi od procesu neutralnego, wątek oczekuje aż będzie dostępny
przynajmniej jeden egzemplarz zasobu dowolnego typu (preferując jednak o ile to
możliwe zasoby lepsze), po czym wysyła do procesu komunikat
z informacją o typie przydzielonego zasobu i kończy się,
- jeżeli żądanie pochodzi od procesu ugodowego, wątek oczekuje aż będzie dostępny
przynajmniej jeden egzemplarz zasobu dowolnego typu (bez żadnych preferencji),
po czym wysyła do procesu komunikat z informacją o typie przydzielonego zasobu
i kończy się.
Zaimplementuj opisany powyżej schemat. Rozwiązanie powinno:
- zawierać co najmniej dwa pliki wykonywalne: serwer oraz proces,
- wykorzystywać do komunikacji między serwerem a procesami kolejki komunikatów IPC,
- wykorzystywać do synchronizacji wątków muteksy i zmienne warunkowe,
- dbać o to, aby przerwanie działania serwera za pomocą CTRl+C nie zostawiało
po sobie żadnych niezwolnionych zasobów IPC,
- zawierać prostą obsługę błędów - wystarczy, że proces wykryjący błąd
zakończy się.
Wszystkie pliki źródłowe oraz Makefile należy spakować do jednego pliku i wysłać go jako
załącznik na adres mengel@mimuw.edu.pl do dnia 14 czerwca 2010, godz. 23:59. Każdy rozpoczęty
tydzień spóźnienia skutkuje ,,premią'' w wysokości -2pkt.