12.07.2015 Views

Spis treœci - Patrz

Spis treœci - Patrz

Spis treœci - Patrz

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Rozwiązanie poprawne.Rozwiązanie poprawne jest dokładnie takie samo, jak w przypadku semaforów Dijkstry(por. 3.2.4). Wykonywanie kolejnych operacji P musi odbywać się sekwencyjnie. Jakpamiętamy z rozdz. 2, jednoczesne podnoszenie widelców prowadzi do zagłodzenia filozofów.Warto zauważyć, że gdyby wszystkie operacje P były wykonywane jednocześnie, tzn.[P(LOKAJ), P(WIDELEC[i]), P(WIDELEC[(i+l) mod 5])],to wartość semafora LOKAJ mogłaby zmniejszyć się co najwyżej do 2, gdyż tylko dwóchfilozofów może jednocześnie jeść. Jednak nawet rozwiązanie z następującą sekwencjąoperacji:P(LOKAJ);[ P(WIDELEC[i]), P(WIDELEC[(i+l) mod 5]) ],nie chroni przed efektem spisku (por. 2.6.3).8.2.5 Implementacja monitora ograniczonegoJak wynika z poprzednich przykładów, mechanizm semaforów w Unixie jest bardzomocny. Rozwiązania wielu problemów można zapisać znacznie prościej i krócej niż zapomocą standardowych semaforów. Semafory w Unixie są jednak nadal obarczone wszystkimiwadami semaforów standardowych. Często jest znacznie wygodniej rozwiązać problemużywając mechanizmu monitorów, a potem przetłumaczyć rozwiązanie na operacjesemaforowe. Takie tłumaczenie jest całkowicie mechaniczne, jeżeli potrafimyzaimplementować monitor za pomocą semaforów. Oczywiście można to zrobić używającstandardowych semaforów, ale wykorzystanie możliwości semaforów dostępnych w Unixieułatwia rozwiązanie problemn. Przedstawimy implementację monitora z pojedynczą zmiennątypu condition i operacją signal wykonywaną jedynie bezpośrednio przed wyjściem procesu zmonitora. Implementacja monitora bez tego ostatniego ograniczenia jest treściąjednego zzadań. Warto porównać to rozwiązanie z rozwiązaniem za pomocą klasycznych semaforów,przedstawionym w [BenA89].Treść każdej procedury eksportowanej przez monitor musi być poprzedzonawywołaniem procedury wejście i musi ją kończyć albo wywołanie procedury signal (gdyostatnią instrukcją procedury eksportowanej jest signal), albo wywołanie procedury wyjście(gdy tak nie jest).var W: semaphore := 1; {do wzajemnego wykluczania}L: semaphore := 0; {do liczenia procesów czekających na warunek}C: semaphore := 0; {do oczekiwania na warunek}procedure wejście;beginP(W)end;procedure wait;begin[ V(W), V(L) ];P(C)end;216

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!