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.

8.4.5 Zasoby dwóch typówUżyjemy następujących semaforów: WOLNE_A i WOLNE_B do pamiętania, ile jestwolnych zasobów każdego typu (ponadto WOLNE_A sluży do wstrzymywania procesów grupy1, gdy nie ma wolnych zasobów typu A); CZEKA_A i CZEKA_B do liczenia czekającychprocesów odpowiednio grupy 1 i 2; A_LUB_B do wstrzymywania procesów grupy 2, gdy niema dla nich wolnych zasobów; ZWOLNIONE_A i ZWOLNIONE_B do liczenia, ile zasobówkażdego typu zwolniono, gdy czekał proces grupy 2; WYK do wzajemnego wykluczaniapodczas wykonywania procedur przydzielania i zwalniania zasobów. Powody wprowadzeniasemaforów ZWOLNIONE_A i ZWOLNIONE_B są takie same, jak semaforów WYBRAŁ wimplementacji semafora typu OR.const M = ?;N = ?;var WOLNE_A, WOLNE_B: semaphore := (M, N);CZEKA_A: semaphore := 0; {ile czeka na A}CZEKA_AB: semaphore := 0; {ile czeka na A lub B}A_LUB_B: semaphore := 0; {do wstrzymywania czekających na A lub B}ZWOLNIONE_A, ZWOLNIONE_B: semaphore := (0, 0);WYK: semaphore := 1; {do wzajemnego wykluczania}procedure przydziel (grupa: 1..3; var typ: A..B; var dostał: boolean);beginP(WYK);case grupa of1: if not nP(WOLNE_A) then begin[ V(CZEKA_A), V(WYK) ];P(WOLNE_A)end;2: if [ nP(WOLNE_A), V(WYK) ] then typ := Aelseif [ nP(WOLNE_B), V(WYK) ] then typ := Belse beginC V(CZEKA_AB), V(WYK) ] ;P(A_LUB_B);if nP(ZWOLNIONE_A) then typ := Aelseif nP(ZWOLNIONE_B) then typ := Bend;3: begindostał := true;if nP(WOLNE_A) then typ := Aelseif nP(WOLNE_B) then typ := Belse dostał := false;V(WYK)endendend;procedure zwolnienie (typ: A..B);beginP(WYK);case typ ofA: if not [ nP(CZEKA_A), V(WOLNE_A) ] thenif not [ nP(CZEKA_AB), V(A_LUB_B), V(ZWOLNIONE_A) ]then V(WOLNE_A);B: if not [ nP(CZEKA_AB), V(A_LUB_B), V(ZWOLNIONE_B) ]225

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

Saved successfully!

Ooh no, something went wrong!