Bufor ma miejsce na N elementów. Zapisywane są w nim
Transkrypt
Bufor ma miejsce na N elementów. Zapisywane są w nim
Bufor ma miejsce na N elementów. Zapisywane są w nim pojedyncze litery i odstępy (spacje). Procesy zapisują do bufora wyrazy składające się z liter (max. M liter). Wyraz kończy się spacją. Zapisać można tylko pełne słowo wraz ze spacją końcową (jeżeli w buforze nie zmieści się pełne słowo + spacja, to zapis nie może być dokonany). Pełne słowa są odbierane przez procesy czytające, przy czym parametrem odczytu jest maksymalna wielkość słowa która może zostać odczytana. Należy użyć monitorów. type bufor_slow=monitor (N:int); var buf:array[0..N-1] of char; //bufor pusty,pelny:array[2..M+1] of condition; //czekamy na warunkach wolny,zajety:0..N-1; //jak to w buforze ile:0..N; //ile znaków w buforze procedure put (s:string); var L,i:natural; begin s:=s+' '; //dodajemy spację L:=dlugosc(s); //funkcja zwraca długość słowa if (L>M+1) then exit; //nie spełnia warunków zadania if L>(N-ile) then pelny[L].wait; //staje gdy za mało miejsca for i:=1 to : do begin //wstawia słowo buf[wolny]:=s[i]; wolny:=(wolny+1) mod N end; repeat znal:=false; //na razie brak chętnych L:=dlugosc_w_buf; //funkcja zwraca długść //pierwszego słowa z buforze if L>0 then for i:=2 to L do //szukamy od najkrótszych if not znal and not pusty[i].empty then begin znal:=true; pusty[i].signal //znaleziono chętnego end until not znal //jeżeli znaleziono chętnego o może być następny ale dla niego znów pobieramy //długość pierwszego słowa end; procedure get (dl:int; vat buf:dstring); begin if (dl>M) then exit; //nie spełnia warunków zadania L:=dlugosc_w_buf; //funkcja zwraca długść pierwszego słowa z buforze (ze spacją); L=0 bufor pusty if (L=0) or (dl<L-1) then pusty[dl].wait; //staje gdy bufor pusty lub za długie słowo L:=dlugosc_w_buf; //teraz już L nie może być 0 for i:=1 to L do begin //wyjmuje słowo (bez spacji) if i<L then buf[wolny]:=s[i]; wolny:=(wolny+1) mod N end; repeat znal:=false; //na razie brak chętnych L:=ile_miejsca; //fukcja zwraca ilość wolnego w buforze if L>M+1 then L:=M+1; //potrzebujemy tylko maksymalnie M+1 wolnego miejsca if L>0 then for i:=2 to L do //szukamy od najkrótszych if not znal and not pelny[i].empty then begin znal:=true; pelny[i].signal //znaleziono chętnego end until not znal //jeżeli znaleziono chętnego to może być następny ale dla niego znów zbadamy //ilość wolnego miejsca end; begin ile:=0; wolny:=0; zajety:=0 end.