Programowanie współbieżne i rozproszone/PWR Ćwiczenia 8
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Inne rodzaje semaforów
- Zadanie
Zaimplementuj semafor dwustronnie ograniczony
var S : semaphore := K; {wartosc poczatkowa, 0 <= K <= N} T : semaphore := N - K;
procedure PD; {operacja P na semaforze dwustronnie ograniczonym} begin P(S); V(T); end;
procedure VD; {operacja V na semaforze dwustronnie ograniczonym} begin P(T); V(S); end;
- Zadanie
Zaimplementuj semafor uogólniony. Zwróć uwagę na zachowanie własności żywotności.
procedure PG(n : integer); {operacja P na semaforze uogolnionym} begin P(pierwszy); P(mutex); if ile < n then begin naileczeka := n; V(mutex); P(czekaj); naileczeka := 0; end; ile := ile - n; V(mutex); V(pierwszy) end;
procedure VG(n : integer); {operacja V na semaforze uogolnionym} begin P(mutex); ile:= ile + n; if (naileczeka > 0) and (ile >= naileczeka) then V(czekaj) else V(mutex); end;
Czytelnicy i pisarze
- Zadanie
Rozwiąz problem czytelników i pisarzy.
var iluczyta, czekaczyt, ilupisze, czekapis : integer := (0, 0, 0, 0); mutex : binary semaphore := 1; Czytelnicy : semaphore := 0; Pisarze : semaphore := 0;
process Czytelnik; begin while true do begin wlasne_sprawy; P(mutex); if ilupisze + czekapis > 0 then begin czekaczyt := czekaczyt+1; V(mutex); P(Czytelnicy); czekaczyt := czekaczyt-1 {dziedziczenie s.k} end; iluczyt := iluczyt + 1; if czekaczyt > 0 then V(Czytelnicy) else V(mutex); CZYTAM; P(mutex); iluczyt := iluczyt - 1 if (iluczyt = 0) and (czekapis > 0) then V(Pisarze) else V(mutex) end end;
process Pisarz; begin while true do begin wlasne_sprawy; P(mutex); if ilupisze + iluczyta > 0 then begin czekapis := czekapis+1; V(mutex); P(Pisarze); czekapis := czekapis-1 {dziedziczenie s.k} end; ilupis := ilupis + 1; V(mutex); PISZE; P(mutex); ilupis := ilupis - 1; if czekaczyt > 0 then V(Czytelnicy) else if czekapis > 0 then V(Pisarze) else V(mutex) end end;