Programowanie współbieżne i rozproszone/PWR Ćwiczenia 8
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
- 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;
- 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(Ochrona);
jest_cz:= jest_cz + 1; {licznik wszystkich czytelnikow}
if jest_p = 0 then begin {nie ma pisarza, mozna czytac}
akt_cz:= akt_cz + 1; {licznik czytelnikow w czytelni}
V(Ochrona)
end
else begin {sa pisarze ... }
V(Ochrona);
P(Czytelnicy) { ... czytelnicy czekaja}
end;
CZYTAM;
P(Ochrona);
akt_cz:= akt_cz - 1; jest_cz:= jest_cz - 1;
if akt_cz = 0 then {wychodzi ostatni czytelnik}
while jest_p > akt_p do begin {wpuszczamy wszystkich pisarzy}
akt_p:= akt_p + 1; {zaznaczajac, ze sa oni aktywni}
V(Pisarze);
end;
V(Ochrona)
end
end;