12.07.2015 Views

Spis treœci - Patrz

Spis treœci - Patrz

Spis treœci - Patrz

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

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

l: integer := N; {wartość semafora}c: integer := 0; {ile czeka na S}procedure PG(n:integer);beginPB(CHROŃ);while l < n do beginc := c + 1; {będzie czekać na S}VB(CHROŃ); {opuszcza sekcję kryt.}P(S);{czeka}PB(CHROŃ) {wraca do sekcji kryt.}end;l := l - n; {już może zmniejszyć}VB(CHROŃ) {opuszcza sekcję kryt.}end;procedure VG(n: integer);beginPB(CHROŃ);l := l + n; {dodaje}while c > O do beginV(S);{wpuszcza wszystkich}c := c - l {czekających na S}end;VB(CHROŃ)end;W przedstawionym rozwiązaniu proces wykonujący VG podnosi semafor S tyle razy, ilewynosi wartość zmiennej c. (Zauważmy, że nie musi ona być równa liczbie procesówwstrzymanych na semaforze S, gdyż procesy wykonujące procedurę PG mogą dowolnie długoprzechodzić od instrukcji c := c + 1 do instrukcji P(S). Z tego powodu użyto tu semaforaogólnego a nie binarnego.) Wszystkie zwolnione w ten sposób procesy będą następniewstrzymane na semaforze CHROŃ, który w chwili wykonywania VB(S) jest opuszczony. Powykonaniu VB(CHROŃ) w procedurze VG któryś z tych procesów będzie mógł sprawdzić swójwarunek w pętli. Przypominamy, że z definicji semafora nie wynika jednoznacznie, który tobędzie proces. Może się tak zdarzyć, że pewien proces, który wywołał PG z dużą wartością nnigdy nie będzie tym pierwszym, a więc nigdy nie będzie mógł skończyć swojej operacji PG.Warto podkreślić, iż fakt, że realizacja semafora jest żywotna, nie ma tu nic do rzeczy.Gwarantuje ona bowiem jedynie, że jeśli proces jest wstrzymany na semaforze, na którymdostatecznie dużo razy wykonuje się operację VB, to kiedyś jego operacja PB się zakończy. Wtym jednak przypadku procesy za każdym razem są wstrzymywane na nowo na semaforzeCHROŃ w nieznanej kolejności i każdy z nich w końcu zostaje wznowiony.Zaproponowane rozwiązanie nie wyklucza zatem zagłodzenia procesów. Nic dziwnego,procesy czekające na odpowiednią wartość zmiennej l są tu wybierane „na chybił trafił". Abyuniknąć zagłodzenia, trzeba wprowadzić pewne uporządkowanie. Wśród procesówczekających na odpowiednią wartość zmiennej l wyróżnimy ten pierwszy i będziemywstrzymywać go na oddzielnym semaforze PIERWSZY. Zmienna logiczna jest będzie mówiła,czy jakiś proces jest wstrzymany na tym semaforze, zmienna ile — jaka wartość zmiennej ljest temu procesowi potrzebna. Zmienna logiczna przechodzi będzie wskazywać, czy w danejchwili jakiś proces przechodzi spod semafora S pod semafor PIERWSZY. Pozostałe zmiennebędą miały to samo znaczenie, co poprzednio. (Zauważmy, że w tym przypadku semafor Smoże być semaforem binarnym.)const N = ?;{wartość początkowa}47

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

Saved successfully!

Ooh no, something went wrong!