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
-
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:
- Do czego służy tablica shared.buff?
- Jaka jest rola zmiennych shared.nput i shared.nval?
- W jakiej kolejności produkowane są wartości w tablicy shared.buff?
- Wyjaśnij znaczenie następujących wyrażeń:
- Set_concurrency(nthreads);
- Pthread_create(&tid_produce[i], NULL, produce, &count[i]);
- Pthread_join(tid_produce[i], NULL);
-
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.
-
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:
- Wyjaśnij znaczenie i rolę następujących wyrażeń:
- Pthread_mutex_lock(&shared.mutex);
- Pthread_mutex_unlock(&shared.mutex);
- Jak działa synchronizacja za pomocą mutexu?
- Co zyskuje program dzięki współbieżności, wątkom i synchronizacji?
- Czy możnaby łatwo zrównoleglić operację consume na kilka wątków? Jak?
- Co zyskalibyśmy w takim przypadku?
-
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:
- Na czym polega i jak działa zmiana wprowadzona w programie
prodcons3.c? Przeprowadź szczegółową analizę działania funkcji
consume_wait i wyjaśnij jej rolę w funkcji consume.
- Jak działa funkcja times? W jakich jednostkach zlicza ona czas
wykorzystania procesora? Jak można przeliczyć go na sekundy?
-
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.
-
Zapoznaj się z programem prodcons5.c i wykorzystaniem zmiennej
warunkowej cond do sygnalizacji wątku oczekującego na muteksie.
Pytania kontrolne:
- Jaki jest znaczenie zmiennych nready.nput, nready.nval i nready.nready?
- Wyjaśnij znaczenie następujących wyrażeń:
- Pthread_cond_signal(&nready.cond);
- Pthread_cond_wait(&nready.cond, &nready.mutex);
- Czy jest jakaś korzyść z wykorzystania zmiennej warunkowej w
programie prodcons5.c w porównaniu z programem prodcons3.c?
- Na czym ona polega?
-
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 ?