Mechanizmy komunikacji
Mechanizmy komunikacji
Mechanizmy komunikacji
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