15.04.2014 Views

Programowanie współbieżne. Systemy czasu rzeczywistego - Helion

Programowanie współbieżne. Systemy czasu rzeczywistego - Helion

Programowanie współbieżne. Systemy czasu rzeczywistego - Helion

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!