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
 
(Nie pokazano 1 pośredniej wersji utworzonej przez tego samego użytkownika)
Linia 1: Linia 1:
== Inne rodzaje semaforów ==
; Zadanie
; Zadanie
Zaimplementuj semafor dwustronnie ograniczony
Zaimplementuj semafor dwustronnie ograniczony
Linia 43: Linia 44:
     V(mutex);
     V(mutex);
  end;
  end;
== Czytelnicy i pisarze ==


; Zadanie
; Zadanie
Linia 52: Linia 55:
     Pisarze    : semaphore := 0;         
     Pisarze    : semaphore := 0;         


process Czytelnik;
process Czytelnik;
begin
begin
   while true do begin
   while true do begin
     wlasne_sprawy;
     wlasne_sprawy;
     P(Ochrona);
     P(mutex);
     jest_cz:= jest_cz + 1;            {licznik wszystkich czytelnikow}
     if ilupisze + czekapis > 0 then
     if jest_p = 0 then begin {nie ma pisarza, mozna czytac}
     begin
       akt_cz:= akt_cz + 1;           {licznik czytelnikow w czytelni}
       czekaczyt := czekaczyt+1;
       V(Ochrona)
       V(mutex);
    end
       P(Czytelnicy);
    else begin                {sa pisarze ... }
       czekaczyt := czekaczyt-1 {dziedziczenie s.k}
       V(Ochrona);
       P(Czytelnicy)          { ... czytelnicy czekaja}
     end;
     end;
    iluczyt := iluczyt + 1;
    if czekaczyt > 0 then
      V(Czytelnicy)
    else
      V(mutex);
     CZYTAM;
     CZYTAM;
     P(Ochrona);
     P(mutex);
     akt_cz:= akt_cz - 1;  jest_cz:= jest_cz - 1;
     iluczyt := iluczyt - 1
     if akt_cz = 0 then       {wychodzi ostatni czytelnik}
     if (iluczyt = 0) and (czekapis > 0) then  
       while jest_p > akt_p do begin {wpuszczamy wszystkich pisarzy}
       V(Pisarze)
        akt_p:= akt_p + 1;           {zaznaczajac, ze sa oni aktywni}
    else
        V(Pisarze);
      V(mutex)
       end;
  end
     V(Ochrona)
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
end;
end;

Aktualna wersja na dzień 13:18, 3 paź 2006

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;