Zadanie koncentruje się wokół problemu producenta i konsumenta, który jest znany również pod nazwą problemu ograniczonego bufora (bounded buffer problem). Jeden lub więcej producentów (wątków lub procesów) wytwarza elementy (dane), które są przetwarzane przez jednego lub więcej konsumentów (wątków lub procesów). Elementy są przesyłane pomiędzy producentami i konsumentami z wykorzystaniem jakieś formy komunikacji międzyprocesowej.

W zadaniu będą wykorzystane programy pochodzące z podręcznika W.R. Stevensa „UNIX. Programowanie usług sieciowych. Tom 2 - Komunikacja międzyprocesowa”, które można ściągnąć ze strony:

http://www.kohala.com/start/unpv22e/unpv22e.tar.gz

  1. Zapoznaj się z programem źródłowym prodcons1.c w katalogu
    ~witold/Stevens/unpv22e-Solaris-SPARC/mutex
    
    na diablo. Przeanalizuj funkcje produce i consume (jak również funkcję main) żeby zrozumieć ideę tego przykładowego programu. W szczególności, uzasadnij, że program jest jakimś rozwiązaniem problemu producenta i konsumenta. Na razie zignoruj zmienną synchronizacyjną mutex.

    Pytania kontrolne:

  2. Przekopiuj wszystkie programy źródłowe prodcons*.c oraz pliki unpipc.h i Makefile do swojego katalogu. Popraw pliki Makefile i unpipc.h w taki sposób, żeby programy kompilowały się poprawnie w Twoim katalogu. Skompiluj wszystkie programy uruchamiając make.

  3. Uruchom program prodcons1 i eksperymentując z jego argumentami wywołania, poznaj jego działanie. Upewnij się, że jest ono zgodne z teoretyczną analizą. Porównaj programy źródłowe prodcons1.c i prodcons2.c. Uruchom program prodcons2. Wyjaśnij otrzymane wyniki.

    Pytania kontrolne:

  4. Porównaj programy źródłowe prodcons2.c i prodcons3.c. Uruchom oba kilkakrotnie, żeby ocenić praktyczne znaczenie zmian wprowadzonych w prodcons3.c. Użyj w tym celu funkcji times (man -s 2 times). W szczególności, można posłużyć się przykładem zamieszczonym na stronie
     http://www.opengroup.org/onlinepubs/009695399/functions/times.html
    

    Pytania kontrolne:

  5. Podobnie jak w poprzednim punkcie, eksperymentując porównaj skutki różnic programów prodcons3.c i prodcons4.c. Przeczytaj opis funkcji sched_yield i biblioteki rozszerzeń czasu rzeczywistego librt.

  6. Zapoznaj się z programem prodcons5.c i wykorzystaniem zmiennej warunkowej cond do sygnalizacji wątku oczekującego na muteksie.

    Pytania kontrolne:

  7. Zapoznaj się z programem prodcons6.c i porównaj z prodcons5.c. W szczególności, porównaj struktury danych oraz funkcje produce i consume w obu programach. Rozstrzygnij, w którym z programów możliwy jest jednoczesny zapis danych w tablicy buff przez wątki „producentow” i odczyt przez wątek „konsumenta” ?