Mechanizmy komunikacji

Transkrypt

Mechanizmy komunikacji
Mechanizmy komunikacji
spotkania symetryczne (język CSP)
z spotkania asymetryczne (Ada)
z przestrzenie krotek (Linda)
z potoki, komunikaty i kanały (Unix)
z
Język CSP
Hoare (1978r.) Communicating Sequential Processes
Nowy język do zapisu procesów współbieżnych
z prostota – 4 instrukcje proste (przypisanie, pusta,
wejścia, wyjścia)
z 2 instrukcje strukturalne (alternatywa, pętla)
z mechanizm spotkań symetrycznych
z możliwe równoległe wykonywanie instrukcji w
ramach procesu
z możliwość parametryzowania procesów
Program w CSP
[ P1::<treść procesu P1> || P2::<treść P2> || ... ||
Pn::<treść Pn> ]
II – oznacza równoległość procesów
P1, P2, ..., Pn – etykiety procesów
Możliwość parametryzowania procesów:
P(k:1..N):: <treść zależna od zmiennej związanej k>
daje w wyniku N procesów P(1),...,P(N).
Instrukcje języka CSP (1)
Instrukcja przypisania
• zwykła
x := n
• jednoczesna (x,y,z) := (2a+1, b+c, a-2c)
Instrukcja pusta – słowo kluczowe skip
(niezbędna przy wykorzystaniu alternatywy)
Instrukcje języka CSP (2)
Alternatywa – uogólnienie instrukcji warunkowej
[ D1->I1 [] D2->I2 [] ... [] Dn->In ]
•
•
Di – dozory (ciągi warunków logicznych oddzielonych średnikami –
operator and)
Ii – niepuste ciągi instrukcji oddzielone średnikami – operator następstwa
Wykonanie:
- równoczesne obliczenie wszystkich dozorów
- wybranie jednego z dozorów spełnionych (niedeterministyczne)
- wykonanie następujących po nim instrukcji
Brak spełnionych dozorów zatrzymuje wykonywanie programu (błąd)
Instrukcja alternatywy
Przykład:
[x=1->x:=x+3 [] x>4->y:=2x [] x<0->x:=abs(x)]
Możliwość parametryzowania – przykład:
(p:1..5) x<2*p -> y:=fp(x)
Efekt instrukcji warunkowej if w then I:
[ w -> I [] not w -> skip ]
Instrukcje języka CSP (3)
Instrukcja pętli - *alternatywa
*[ D1->I1 [] D2->I2 [] ... [] Dn->In ]
Wykonywana tak długo, aż nie będzie spełniony żaden dozór
Wykonanie równoległe instrukcji
I1 || I2 || ... || In
comment – słowo kluczowe oznaczające komentarz
Komunikacja między procesami
Mechanizm spotkania symetrycznego:
nadawca A – instrukcja wyjścia B!X(y1...yn)
• odbiorca B – instrukcja wejścia A?X(z1...zn)
•
Procesy muszą wzajemnie znać swoje nazwy.
Pominięcie wyrażeń y i z w instrukcjach daje mechanizm
synchronizacji
Idea spotkania
Proces A
Proces B
B!paczka(5,3,6,8)
A?paczka(x1,x2,x3,x4)
Instrukcje wykonywane tylko wspólnie (czekanie na drugiego)
Problem producenta-konsumenta
(bez bufora)
[ PRODUCENT::
p:porcja;
*[true -> produkuj(p); KONSUMENT!p];
|| KONSUMENT::
p:porcja;
*[PRODUCENT?p -> konsumuj(p);]
]
porcja – typ przekazywanego elementu
Instrukcja wejścia Q?.. w dozorach procesu P:
• true – jeśli Q czeka na wykonanie odpowiedniej instrukcji wyjścia P!...
• false – jeśli Q nie istnieje
• zawiesza P do chwili, gdy Q dojdzie do instrukcji wyjścia
W jednym dozorze może wystąpić tylko jedna instrukcja wejścia i
musi być to ostatnia instrukcja dozoru!
Problem producenta-konsumenta
(z buforem jednoelementowym)
[ PRODUCENT::
p:porcja;
*[true -> produkuj(p); BUFOR!p];
|| BUFOR::
p:porcja;
*[PRODUCENT?p -> KONSUMENT!p;]
|| KONSUMENT::
p:porcja;
*[BUFOR?p -> konsumuj(p);]
]
W CSP procesy nie mogą komunikować się przez wspólną pamięć –
konieczne wprowadzenie procesu BUFOR
Bufor N-elementowy?
ćwiczenie
Modelowanie procesów
współbieżnych
11
Język Ada
Język programowania głównie systemów czasu
rzeczywistego (przeważnie współbieżnych)
Bardzo rozbudowany, złożona skrajnia
Brak pełnego kompilatora dla PC (kłopotliwa realizacja
współbieżności)
Standard zapisu programów współbieżnych w publikacjach
naukowych
Mechanizm spotkań asymetrycznych
Wzorowane na spotkaniach z CSP
Dodatkowe obliczenia wykonywane w jednym z procesów
(proces obsługujący – serwer)
Serwer udostępnia procesowi obsługiwanemu (klientowi)
różne miejsca spotkań, widoczne w postaci wejść
(entries).
Klient musi znać nazwę serwera, serwer nie zna klientów.
Przykład – serwer liczący pierwiastek
task (proces) A
B.PRW(5,y)
task (proces) B
...
entry SQRT(n in:Integer; y: out real);
accept PRW(n in:Integer; y: out real);
y:=sqrt(n);
end;
Modelowanie procesów
współbieżnych
14
Problem czytelników i pisarzy
(package – pakiet deklaracji danych i procedur
udostępnianych innym)
procedure czytanie(x: out Integer);
procedure pisanie(x: in Integer);
end;
package czytelnia is
package body czytelnia is
książka: Integer;
task PORTIER is
(task definiuje proces)
entry ZACZYNAM;
entry KOŃCZĘ;
entry PISZĘ(x: in Integer);
end;
procedure czytanie(x: out Integer) is
PORTIER.ZACZYNAM;
x:=książka;
procedure pisanie(x: in Integer) is
PORTIER.KOŃCZĘ;
PORTIER.PISZĘ(x);
end czytanie;
end pisanie;
Problem czytelników i pisarzy cd.
task body PORTIER is
ilu_czyta: Integer:=0;
liczba czytających
begin loop
count – liczba procesów
select
czekających na spotkanie
when PISZĘ’count = 0 =>
w tym wejściu
accept ZACZYNAM;
ilu_czyta:=ilu_czyta+1;
or
accept KOŃCZĘ;
ilu_czyta:=ilu_czyta-1;
or
when ilu_czyta = 0 =>
accept PISZĘ(x: in Integer) do
książka := x;
end PISZĘ;
loop
select
accept ZACZYNAM;
ilu_czyta:=ilu_czyta+1;
else exit;
end select;
end loop; end select; end loop; end PORTIER;
Przestrzeń krotek w Lindzie (1)
Linda – idea komunikacji, której realizację można włączyć
do dowolnego języka programowania
Podstawowe pojęcia:
krotka – ciąg danych, z których każdy ma określony typ.
Dane nie muszą być określone.
sygnatura krotki – ciąg typów poszczególnych elementów
krotki
Procesy realizują się w środowisku – przestrzeni krotek.
operacje INPUT, OUTPUT, READ, TRY_INPUT, TRY_OUTPUT
Nie narzuca powiązań czasowych ani w przestrzeni
adresowej (procesy nie muszą się znać)
Przestrzeń krotek w Lindzie (2)
Proces A
Przestrzeń krotek
Proces B
(4, 2)
(6, 1.3)
OUTPUT(‘A’)
(‘B’)
(‘a’, true, 1)
INPUT(5, x:real)
(‘S’)
(5, 2.71)
Problem 5 filozofów
Próba 1
Program filozofy;
var
widelec:array[0..4] of (*binary*) semaphore;
i:integer;
procedure filozof(i:integer);
begin
repeat
myśl;
wait(widelec[i]);
wait(widelec[(i+1)mod 5]);
jedz;
signal(widelec[i]);
signal(widelec[(i+1)mod 5]);
forever
end;
begin
(program główny)
for i:=0 to 4 do widelec[i]:=1;
cobegin
filozof(0); filozof(1); filozof(2); filozof(3); filozof(4);
coend
end.
Modelowanie procesów
współbieżnych
20
Próba 1 – komentarz
Semafory zapewniają wzajemne wykluczanie przy
dostępie do widelców
Zapewnione bezpieczeństwo (jedzenie po
zakończeniu oczekiwania na 2 widelce-semafory)
Możliwość blokady
Jeśli filozofowie się zsynchronizują i równocześnie biorą
lewe widelce
Próba 2
Program filozofy;
liczba widelców
monitor mon_widelec;
danemu
var
widelec:array[0..4] of integer;
można_jesc:array[0..4] of condition;
i:integer;
procedure weź_widelec(i:integer)
begin
if widelec[i]<>2 then wait(można_jesc[i]);
widelec[(i+1)mod 5]:=widelec[(i+1)mod 5]-1;
widelec[(i-1)mod 5]:=widelec[(i-1)mod 5]-1;
end;
procedure odłóż_widelec(i:integer)
begin
widelec[(i+1)mod 5]:=widelec[(i+1)mod 5]+1;
widelec[(i-1)mod 5]:=widelec[(i-1)mod 5]+1;
if widelec[(i+1)mod 5]=2 then signal(można_jesc[(i+1)mod
if widelec[(i-1)mod 5]=2 then signal(można_jesc[(i-1)mod
end;
Modelowanie procesów
współbieżnych
dostępnych
filozofowi
5]);
5]);
22
Próba 2 cd.
procedure filozof(i:integer);
begin
repeat
myśl;
weź_widelec[i];
jedz;
odłóż_widelec[i];
forever
end;
begin
(program główny)
for i:=0 to 4 do widelec[i]:=2;
cobegin
filozof(0);
filozof(1);
filozof(2);
filozof(3);
filozof(4);
coend
end.
Modelowanie procesów
współbieżnych
23
Próba 2 – komentarz
Zastosowanie monitora
Filozof bierze widelce, gdy oba są dostępne
Zapewnione wzajemne wykluczanie i bezpieczeństwo
Niemożliwa blokada
Możliwe zagłodzenie
Jeśli dwaj filozofowie „zmówią się” i nie dopuszczą
siedzącego między nimi do jedzenia
Rozwiązanie poprawne
Oparte na pierwszej próbie
Dodatkowy semafor odgradzający lokaj gwarantuje,
że co najwyżej czterech filozofów próbuje wziąć
widelce.
Rozwiązanie nie dopuszcza blokady i zagłodzenia
Rozwiązanie poprawne - kod
Program filozofy;
var
widelec:array[0..4] of (*binary*) semaphore;
lokaj: semaphore;
i:integer;
procedure filozof(i:integer);
begin
repeat
myśl;
wait(lokaj);
begin
(program główny)
wait(widelec[i]);
lokaj:=4;
wait(widelec[(i+1)mod 5]);
for i:=0 to 4 do widelec[i]:=1;
jedz;
cobegin
signal(widelec[i]);
filozof(0);
signal(widelec[(i+1)mod 5]);
filozof(1);
signal(lokaj);
filozof(2);
forever
filozof(3);
end;
filozof(4);
coend
end.
Modelowanie procesów
współbieżnych
26