Programowanie wspóÅbieżne. Systemy czasu rzeczywistego - Helion
Programowanie wspóÅbieżne. Systemy czasu rzeczywistego - Helion
Programowanie wspóÅbieżne. Systemy czasu rzeczywistego - Helion
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
240 <strong>Programowanie</strong> wspóbiene. <strong>Systemy</strong> <strong>czasu</strong> <strong>rzeczywistego</strong><br />
8.2.2. Monitory<br />
Kolejne rozwizanie jest oparte na mechanizmie monitora. Wasno mechanizmu monitora<br />
pozwala w naturalny sposób zanegowa warunek czciowego przydziau. Filozofowie<br />
podnosz widelce tylko w przypadku, gdy oba s wolne.<br />
monitor Jadalnia;<br />
Wolne: array(0..4) of Integer range 0..2 := (others => 2);<br />
jedzenie: array(0..4) of Warunek;<br />
procedure BioreWidelce(I: Integer) is<br />
begin<br />
if Wolne(I) < 2 then wait(jedzenie(i));<br />
end if;<br />
Wolne((I + 4) mod 5) := Wolne((I + 4) mod 5) - 1;<br />
Wolne((I + 1) mod 5) := Wolne((I + 1) mod 5) - 1;<br />
end BioreWidelce;<br />
procedure OddajeWidelce(I: Integer) is<br />
begin<br />
Wolne((I + 4) mod 5) := Wolne((I + 4) mod 5) + 1;<br />
Wolne((I + 1) mod 5) := Wolne((I + 1) mod 5) + 1;<br />
if Wolne((I + 1) mod 5) = 2 then<br />
if not empty(Signal(jedzenie((I + 1) mod 5)))<br />
then Signal(jedzenie((I + 1) mod 5)); end if;<br />
end if;<br />
if Wolne((I + 4) mod 5) = 2 then<br />
if not empty(Signal(jedzenie((I + 4) mod 5)))<br />
Signal(jedzenie((I + 4) mod 5)); end if;<br />
end if;<br />
end OddajeWidelce;<br />
end Jadalnia;<br />
task type Filozof(Nr: Integer);<br />
task body Filozof is<br />
begin<br />
loop<br />
Filozof_myli;<br />
BioreWidelece(Nr);<br />
Filozof_myli;<br />
OddajeWidelce(Nr);<br />
end loop;<br />
end Filozof;<br />
I-ty element tablicy Wolne okrela liczb dostpnych widelców dla i-tego filozofa. Dodatkowo<br />
zdefiniowano tablic jedzenie typu Warunek, która stanowi deklaracj piciu<br />
zmiennych warunkowych. Zmienne warunkowe umoliwiaj zawieszenie procesów<br />
filozofa w oczekiwaniu na wolne widelce. Wykonanie powyszego programu jest nastpujce:<br />
i-ty filozof wywouje procedur monitora BioreWidelce i sprawdza w niej stan<br />
i-tego elementu tablicy Wolne. Jeeli nie s dostpne dwa widelce (Wolne(i) < 2), to wykonuje<br />
operacj wait(jedzenie(i)) i zostaje zawieszony w kolejce warunku jedzenie(i),<br />
a jednoczenie odblokowuje dostp do monitora dla innych procesów. Ssiadujcy filozof,<br />
który odoy drugi z brakujcych widelców, wykonuje operacj signal(jedzenie(i))<br />
i wznawia wykonanie procesu zawieszonego w kolejce do zmiennej warunkowej<br />
jedzenie(i). Krytyczna dla poprawnoci i efektywnoci powyszego rozwizania jest