Programowanie współbieżne i rozproszone/PWR Ćwiczenia 8

From Studia Informatyczne

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;