29.04.2015 Views

Mechanizmy komunikacji

Mechanizmy komunikacji

Mechanizmy komunikacji

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Mechanizmy</strong> <strong>komunikacji</strong><br />

• spotkania symetryczne (język CSP)<br />

• spotkania asymetryczne (Ada)<br />

• przestrzenie krotek (Linda)<br />

• potoki, komunikaty i kanały (Unix)


Język CSP<br />

Hoare (1978r.) Communicating Sequential Processes<br />

Nowy język do zapisu procesów współbieżnych<br />

• prostota – 4 instrukcje proste (przypisanie, pusta,<br />

wejścia, wyjścia)<br />

• 2 instrukcje strukturalne (alternatywa, pętla)<br />

• mechanizm spotkań symetrycznych<br />

• możliwe równoległe wykonywanie instrukcji w<br />

ramach procesu<br />

• możliwość parametryzowania procesów


Program w CSP<br />

[ P1:: || P2:: || ... ||<br />

Pn:: ]<br />

II – oznacza równoległość procesów<br />

P1, P2, ..., Pn – etykiety procesów<br />

Możliwość parametryzowania procesów:<br />

P(k:1..N):: <br />

daje w wyniku N procesów P(1),...,P(N).


Instrukcje języka CSP (1)<br />

Instrukcja przypisania<br />

• zwykła x := n<br />

• jednoczesna (x,y,z) := (2a+1, b+c, a-2c)<br />

Instrukcja pusta – słowo kluczowe skip<br />

(niezbędna przy wykorzystaniu alternatywy)


Instrukcje języka CSP (2)<br />

Alternatywa – uogólnienie instrukcji warunkowej<br />

[ D1->I1 [] D2->I2 [] ... [] Dn->In ]<br />

• Di – dozory (ciągi warunków logicznych oddzielonych średnikami –<br />

operator and)<br />

• Ii – niepuste ciągi instrukcji oddzielone średnikami – operator następstwa<br />

Wykonanie:<br />

- równoczesne obliczenie wszystkich dozorów<br />

- wybranie jednego z dozorów spełnionych (niedeterministyczne)<br />

- wykonanie następujących po nim instrukcji<br />

Brak spełnionych dozorów zatrzymuje wykonywanie programu (błąd)


Instrukcja alternatywy<br />

Przykład:<br />

[x=1->x:=x+3 [] x>4->y:=2x [] xx:=abs(x)]<br />

Możliwość parametryzowania – przykład:<br />

(p:1..5) x y:=f p (x)<br />

Efekt instrukcji warunkowej if w then I:<br />

[ w -> I [] not w -> skip ]


Instrukcje języka CSP (3)<br />

Instrukcja pętli - *alternatywa<br />

*[ D1->I1 [] D2->I2 [] ... [] Dn->In ]<br />

Wykonywana tak długo, aż nie będzie spełniony żaden dozór<br />

Wykonanie równoległe instrukcji<br />

I1 || I2 || ... || In<br />

comment –słowo kluczowe oznaczające komentarz


Komunikacja między procesami<br />

Mechanizm spotkania symetrycznego:<br />

• nadawca A – instrukcja wyjścia B!X(y1...yn)<br />

• odbiorca B – instrukcja wejścia A?X(z1...zn)<br />

Procesy muszą wzajemnie znać swoje nazwy.<br />

Pominięcie wyrażeń y i z w instrukcjach daje mechanizm<br />

synchronizacji


Idea spotkania<br />

Proces A<br />

Proces B<br />

B!paczka(5,3,6,8)<br />

A?paczka(x1,x2,x3,x4)<br />

Instrukcje wykonywane tylko wspólnie (czekanie na drugiego)


Problem producenta-konsumenta<br />

(bez bufora)<br />

[ PRODUCENT:: p:porcja;<br />

*[true -> produkuj(p); KONSUMENT!p];<br />

|| KONSUMENT:: p:porcja;<br />

*[PRODUCENT?p -> konsumuj(p);] ]<br />

porcja – typ przekazywanego elementu<br />

Instrukcja wejścia Q?.. w dozorach procesu P:<br />

• true –jeśli Q czeka na wykonanie odpowiedniej instrukcji wyjścia P!...<br />

• false –jeśli Q nie istnieje<br />

• zawiesza P do chwili, gdy Q dojdzie do instrukcji wyjścia<br />

W jednym dozorze może wystąpić tylko jedna instrukcja wejścia i<br />

musi być to ostatnia instrukcja dozoru!


Problem producenta-konsumenta<br />

(z buforem jednoelementowym)<br />

[ PRODUCENT:: p:porcja;<br />

*[true -> produkuj(p); BUFOR!p];<br />

|| BUFOR:: p:porcja;<br />

*[PRODUCENT?p -> KONSUMENT!p;]<br />

|| KONSUMENT:: p:porcja;<br />

*[BUFOR?p -> konsumuj(p);] ]<br />

W CSP procesy nie mogą komunikować się przez wspólną pamięć –<br />

konieczne wprowadzenie procesu BUFOR<br />

Bufor N-elementowy?<br />

ćwiczenie<br />

Modelowanie procesów<br />

współbieżnych 11


Język Ada<br />

Język programowania głównie systemów czasu<br />

rzeczywistego (przeważnie współbieżnych)<br />

Bardzo rozbudowany, złożona skrajnia<br />

Brak pełnego kompilatora dla PC (kłopotliwa realizacja<br />

współbieżności)<br />

Standard zapisu programów współbieżnych w publikacjach<br />

naukowych


Mechanizm spotkań asymetrycznych<br />

Wzorowane na spotkaniach z CSP<br />

Dodatkowe obliczenia wykonywane w jednym z procesów<br />

(proces obsługujący – serwer)<br />

Serwer udostępnia procesowi obsługiwanemu (klientowi)<br />

różne miejsca spotkań, widoczne w postaci wejść<br />

(entries).<br />

Klient musi znać nazwę serwera, serwer nie zna klientów.


Przykład – serwer liczący pierwiastek<br />

task (proces) A<br />

task (proces) B<br />

...<br />

entry SQRT(n in:Integer; y: out real);<br />

B.PRW(5,y)<br />

accept PRW(n in:Integer; y: out real);<br />

end;<br />

y:=sqrt(n);<br />

Modelowanie procesów<br />

współbieżnych 14


Problem czytelników i pisarzy<br />

package czytelnia is<br />

(package – pakiet deklaracji danych i procedur<br />

udostępnianych innym)<br />

procedure czytanie(x: out Integer);<br />

procedure pisanie(x: in Integer);<br />

end;<br />

package body czytelnia is<br />

książka: Integer;<br />

task PORTIER is<br />

(task definiuje proces)<br />

entry ZACZYNAM;<br />

entry KOŃCZĘ;<br />

entry PISZĘ(x: in Integer);<br />

end;<br />

procedure czytanie(x: out Integer) is<br />

PORTIER.ZACZYNAM;<br />

x:=książka;<br />

PORTIER.KOŃCZĘ;<br />

end czytanie;<br />

procedure pisanie(x: in Integer) is<br />

PORTIER.PISZĘ(x);<br />

end pisanie;


Problem czytelników i pisarzy cd.<br />

task body PORTIER is<br />

ilu_czyta: Integer:=0;<br />

liczba czytających<br />

begin loop<br />

select<br />

count – liczba procesów<br />

czekających na spotkanie<br />

when PISZĘ’count = 0 =><br />

w tym wejściu<br />

accept ZACZYNAM;<br />

ilu_czyta:=ilu_czyta+1;<br />

or<br />

accept KOŃCZĘ;<br />

ilu_czyta:=ilu_czyta-1;<br />

or<br />

when ilu_czyta = 0 =><br />

accept PISZĘ(x: in Integer) do<br />

książka := x;<br />

end PISZĘ;<br />

loop<br />

select<br />

accept ZACZYNAM;<br />

ilu_czyta:=ilu_czyta+1;<br />

else exit;<br />

end select;<br />

end loop; end select; end loop; end PORTIER;


Przestrzeń krotek w Lindzie (1)<br />

Linda – idea <strong>komunikacji</strong>, której realizację można włączyć<br />

do dowolnego języka programowania<br />

Podstawowe pojęcia:<br />

krotka –ciąg danych, z których każdy ma określony typ.<br />

Dane nie muszą być określone.<br />

sygnatura krotki –ciąg typów poszczególnych elementów<br />

krotki<br />

Procesy realizują się w środowisku – przestrzeni krotek.<br />

operacje INPUT, OUTPUT, READ, TRY_INPUT, TRY_OUTPUT<br />

Nie narzuca powiązań czasowych ani w przestrzeni<br />

adresowej (procesy nie muszą się znać)


Przestrzeń krotek w Lindzie (2)<br />

Proces A<br />

Przestrzeń krotek<br />

Proces B<br />

(4, 2)<br />

(6, 1.3)<br />

OUTPUT(‘A’)<br />

(‘B’)<br />

(‘S’)<br />

INPUT(5, x:real)<br />

(‘a’, true, 1)<br />

(5, 2.71)


Problem 5 filozofów


Próba 1<br />

Program filozofy;<br />

var widelec:array[0..4] of (*binary*) semaphore;<br />

i:integer;<br />

procedure filozof(i:integer);<br />

begin<br />

repeat<br />

myśl;<br />

wait(widelec[i]);<br />

wait(widelec[(i+1)mod 5]);<br />

jedz;<br />

signal(widelec[i]);<br />

signal(widelec[(i+1)mod 5]);<br />

forever<br />

end;<br />

begin<br />

(program główny)<br />

for i:=0 to 4 do widelec[i]:=1;<br />

cobegin<br />

filozof(0); filozof(1); filozof(2); filozof(3); filozof(4);<br />

coend<br />

end.<br />

Modelowanie procesów<br />

współbieżnych 20


Próba 1 – komentarz<br />

Semafory zapewniają wzajemne wykluczanie przy<br />

dostępie do widelców<br />

Zapewnione bezpieczeństwo (jedzenie po<br />

zakończeniu oczekiwania na 2 widelce-semafory)<br />

Możliwość blokady<br />

Jeśli filozofowie się zsynchronizują i równocześnie biorą<br />

lewe widelce


Program filozofy;<br />

monitor mon_widelec;<br />

var<br />

Próba 2<br />

widelec:array[0..4] of integer;<br />

można_jesc:array[0..4] of condition;<br />

i:integer;<br />

liczba widelców dostępnych<br />

danemu filozofowi<br />

procedure weź_widelec(i:integer)<br />

begin<br />

if widelec[i]2 then wait(można_jesc[i]);<br />

widelec[(i+1)mod 5]:=widelec[(i+1)mod 5]-1;<br />

widelec[(i-1)mod 5]:=widelec[(i-1)mod 5]-1;<br />

end;<br />

procedure odłóż_widelec(i:integer)<br />

begin<br />

widelec[(i+1)mod 5]:=widelec[(i+1)mod 5]+1;<br />

widelec[(i-1)mod 5]:=widelec[(i-1)mod 5]+1;<br />

if widelec[(i+1)mod 5]=2 then signal(można_jesc[(i+1)mod 5]);<br />

if widelec[(i-1)mod 5]=2 then signal(można_jesc[(i-1)mod 5]);<br />

end;<br />

Modelowanie procesów<br />

współbieżnych 22


Próba 2 cd.<br />

procedure filozof(i:integer);<br />

begin<br />

repeat<br />

myśl;<br />

weź_widelec[i];<br />

jedz;<br />

odłóż_widelec[i];<br />

forever<br />

end;<br />

begin<br />

(program główny)<br />

for i:=0 to 4 do widelec[i]:=2;<br />

cobegin<br />

filozof(0);<br />

filozof(1);<br />

filozof(2);<br />

filozof(3);<br />

filozof(4);<br />

coend<br />

end.<br />

Modelowanie procesów<br />

współbieżnych 23


Próba 2 – komentarz<br />

Zastosowanie monitora<br />

Filozof bierze widelce, gdy oba są dostępne<br />

Zapewnione wzajemne wykluczanie i bezpieczeństwo<br />

Niemożliwa blokada<br />

Możliwe zagłodzenie<br />

Jeśli dwaj filozofowie „zmówią się” i nie dopuszczą<br />

siedzącego między nimi do jedzenia


Rozwiązanie poprawne<br />

Oparte na pierwszej próbie<br />

Dodatkowy semafor odgradzający lokaj gwarantuje,<br />

że co najwyżej czterech filozofów próbuje wziąć<br />

widelce.<br />

Rozwiązanie nie dopuszcza blokady i zagłodzenia


Rozwiązanie poprawne - kod<br />

Program filozofy;<br />

var widelec:array[0..4] of (*binary*) semaphore;<br />

lokaj: semaphore;<br />

i:integer;<br />

procedure filozof(i:integer);<br />

begin<br />

repeat<br />

myśl;<br />

wait(lokaj);<br />

wait(widelec[i]);<br />

begin<br />

(program główny)<br />

wait(widelec[(i+1)mod 5]); lokaj:=4;<br />

jedz;<br />

signal(widelec[i]);<br />

signal(widelec[(i+1)mod 5]);<br />

signal(lokaj);<br />

forever<br />

end;<br />

for i:=0 to 4 do widelec[i]:=1;<br />

cobegin<br />

filozof(0);<br />

filozof(1);<br />

filozof(2);<br />

filozof(3);<br />

filozof(4);<br />

coend<br />

end.<br />

Modelowanie procesów<br />

współbieżnych 26

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

Saved successfully!

Ooh no, something went wrong!