Programowanie współbieżne i rozproszone/PWR Ćwiczenia 8: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Mengel (dyskusja | edycje)
Nie podano opisu zmian
 
Mengel (dyskusja | edycje)
Nie podano opisu zmian
Linia 1: Linia 1:
; Zadanie
; Zadanie
Zaimplementuj semafor dwustronnie ograniczony
Zaimplementuj semafor dwustronnie ograniczony


  var S : semaphore := K;      {wartosc poczatkowa, 0 <= K <= N}
  var S : semaphore := K;      {wartosc poczatkowa, 0 <= K <= N}
Linia 16: Linia 16:


; Zadanie
; Zadanie
Zaimplementuj semafor uogólniony. Zwróć uwagę na zachowanie własności żywotności.
Zaimplementuj semafor uogólniony. Zwróć uwagę na zachowanie własności żywotności.


  procedure PG(n : integer);  {operacja P na semaforze uogolnionym}
  procedure PG(n : integer);  {operacja P na semaforze uogolnionym}
Linia 43: Linia 43:
     V(mutex);
     V(mutex);
  end;
  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;

Wersja z 13:05, 3 paź 2006

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;