W celu najlepszego zobrazowania tego, co się dzieje, przed i po wywołaniach funkcji zajmujących i zwalniających semafor powinny znaleźć się wywołania funkcji printf, drukującej na standardowe wyjście informacje o tym, co dany proces zrobił lub zamierza zrobić (np. próbuje zająć semafor lub informuje, że mu się to właśnie udało).
Inny sposób wykonania programu to utworzenie w pamięci współdzielonej bufor danych wykorzystywanego przez kilka procesów -- jedne z nich zapisują do bufora pewne informacje, inne odczytują je i drukują na standardowym wyjściu, korzystając z semaforów w celu synchronizacji dostępu.
Szczególną uwagę należy zwrócić na sposób synchronizacji procesów, tzn. sposób przekazania informacji, że pierwszy proces zapisał informacje do bufora, wobec czego drugi proces może je z tego bufora odczytać.
Szczegółowe propozycje projektów:
Wspólną pamięć należy w procesach wykorzystać do trzymania
stanu grupy procesów, na przykład definiując ją jako char
stan[6]="mmmmm";
. Każdy z filozofów modyfikuje wyłącznie
jeden ustalony bajt pamięci wspólnej (np. filozof 2 zapisuje
swój stan za pomocą jednego znaku w stan[2]). Każdy filozof
zapisuje tam co aktualnie robi - czy medytuje, czy czeka/będzie
czekał na widelce, czy je. Każdy z filozofów informuje też na
ekran co ma zamiar zrobić (np. że wqłaśnie rozpoczyna jedzenie),
przy okazji drukując też stan pozostałych.
Kilka procesów dostaje się do wspólnego konta - komórki pamięci wspólnej, dokonując wpłat i wypłat. Można uruchomić na przykład 5 procesów, z których dwa będą próbowały 100 razy wypłacić 300 zł z konta, a 3 -- stukrotnie wypłacić po 200 zł z konta. Zakładając jakąś wartość początkową, stan końcowy konta też powinien być przewidywalny. Operacja wpłaty/wypłaty powinna być zrealizowana z losowym czasem trwania np. w taki sposób:
i = *konto; i += 200; printf("wpłacam 200 na konto, stan konta: %d\n", i); usleep(... losowy czas od 0.1 do 0.5 sekundy); *konto = i;
z zachowaniem odpowiednich mechanizmów ochrony dostępu do sekcji krytycznej. Podobnie jak w problemie filozofow można dodatkowo stworzyć zmienną stanu (tym razem jednak tablicę kilku liczb typu int, a nie znaków), w której każdy proces będzie zwiększał swoją komórkę, zaznaczając ile razy był w sekcji krytycznej (dokonał wpłaty lub wypłaty).