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.

algorytm procesu SEG o wczytanym numerze. Jak widać, system będzie działał poprawnieniezależnie od tego, czy współbieżnie uruchomi się jeden, dwa, czy sześćprocesów SEG.7.4.3 GłosowanieW odróżnieniu od rozwiązania w CSP z p. 5.4.5 nie potrzebujemy procesu SIEĆ, aletakże nie trzeba wyróżniać procesu pomocniczego LICZ. Nie ma tu bowiemniebezpieczeństwa powstania blokady, gdyż procesy nie synchronizują się ze sobą przyprzekazywaniu głosów. Podany niżej proces P powstał przez włączenie do procesu P z p.5.4.5 instrukcji liczenia glosów. Głosy odczytuje się za pomocą operacji READ, aby umożliwićodczytanie tego samego glosu także innym procesom. Przy odczytywaniu wskazuje się numergłosującego i numer kolejny tury.const N = ?; {liczba procesów}process P(i:l..N);var T: array[l..N] of integer;j,min,tura: integer;koniec: boolean;beginfor j := 1 to N do T[j] := 1;tura := 0;repeattura := tura + 1;OUTPUT(i, tura, glosuj(T));for j := 1 to N do T[j] := 0;for j := 1 to N do beginREAD(j, tura, k:integer);T[k] := T[k] + 1end;min := 1;{szukanie niezerowego minimum}while T[min] = 0 do min := min + 1;for j := min+1 to N doif T[j] > 0 thenif T[j] < T[min] then min := j;koniec := T[min] = N;T[min] := 0until koniecend;Po zakończeniu głosowania w przestrzeni zostaną krotki opisujące głosy każdegoprocesu w każdej turze. Moglibyśmy zażyczyć sobie, aby ostatni proces odczytujący głosusuwał krotkę z przestrzeni operacją INPUT. Niestety proces nie wie, czyjest ostatnimodczytującym dany głos. Potrzebnabyłaby więc dodatkowa synchronizacja. Można równieżwymagać, aby krotkę z glosem usuwał ten proces, który wyslał ją w przestrzeń. Wolno mu tojednak zrobić dopiero wtedy, gdy ma już pewność, że wszystkie inne procesy odczytały jegoglos. Pewność tę proces może mieć jednak dopiero wtedy, gdy zbierze wszystkie głosy znastępnej tury. Tak więc na końcu pętli while można umieścić instrukcję:if tura > 0 then INPUT(i, tura-l, j:integer)Pozostanie nadal problem usunięcia krotki z ostatnim glosem każdego procesu. Jestpotrzebna dodatkowa synchronizacja procesów po zakończeniu głosowania. (Przykład takiejsynchronizacji omawiamy w rozwiązaniu 7.4.8.)197

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

Saved successfully!

Ooh no, something went wrong!