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;