Wspó
łbieżność w języku Ada
1
ADA-wspolbiezn-26
Współbieżność w jezyku ADA
1. Zadania
Podstawowym mechanizmem osi
ągania współbieżności w języku Ada są
zadania (ang.
Tasks). Zadanie jest procesem systemu operacyjnego.
Zadania wykonuj
ą się współbieżnie a gdy sprzęt na to pozwala mogą
wykonywa
ć się równolegle. Każde zadanie może statycznie lub
dynamicznie tworzy
ć inne zadania.
Tworzenie i kończenie zadań
Zadanie jest tworzone gdy zako
ńczy się opracowywanie jego deklaracji.
Zadanie jest ko
ńczone gdy:
•
Zadanie wykona
ło ostatnią instrukcję, instrukcję
terminate
, lub
wykonano na nim instrukcj
ę
abort
.
•
Spe
łnione są warunki do zakończenia zadania bez utraty spójności
aplikacji to znaczy wszystkie zadania zale
żne zakończyły się lub
oczekuj
ą na zakończenie.
1.1 Typ zadaniowy
Typ zadaniowy jest typem z
łożonym. Definicja typu składa się z dwóch
cz
ęści:
•
Specyfikacji (ang.
Specification)
•
Tre
ści (ang. Body).
Specyfikacja okre
śla :
•
Interfejs obiektu – czyli te elementy które maj
ą być widoczne na
zewn
ątrz (wejścia do zadania).
•
Elementy prywatne dla danego typu.
Tre
ść określa implementacje elementów określonych w interfejsie
(wej
ść) oraz innych działań wykonywanych przez zadanie.
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
2
ADA-wspolbiezn-26
Specyfikacja_typu_zadaniowego ::=
task type
Nazwa_typu [Wyró
żnik_typu]
[
is
{Deklaracja_wej
ścia | Klauzula_reprezentacji}
[
private
{Deklaracja_wej
ścia | Klauzula_reprezentacji} ]
end
[Nazwa_typu]];
Deklaracja_wej
ścia :=
entry
Nazwa_wej
ścia [(Zakres_dyskretny)] [(Parametry_formalne)]
Definicja 1-1 Specyfikacja typu zadaniowego
•
Wyró
żnik typu określa parametry przekazywane do tworzonych
instancji danego typu (np. numer procesu).
•
Wej
ścia określone w części publicznej mogą zostać wywołane przez
inne zadania. Wej
ścia zawierają po nazwie parametry formalne (takie
jak parametry procedury).
•
Klauzule reprezentacji okre
ślają szczegóły implementacyjne (adresy
fizyczne, priorytet)
•
Zakres_dyskretny umo
żliwia indeksowanie wejść
Specyfikacja typu zadaniowego okre
śla jego interfejs. Implementacja
opisana jest w tre
ści (ang. Body) zadania.
task bufor is
entry wstaw(x : in Integer);
entry wez(x : out Integer);
end bufor;
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
3
ADA-wspolbiezn-26
Tre
ść_zadania ::=
task body
Nazwa_zadania
is
[Deklaracje]
begin
{[Sekwencja_instrukcji1]
[Instrukcja_accept]
[Sekwencja_instrukcji2]}
[
exception
obs
ługa_wyjątków]
end
[Nazwa_zadania];
Instrukcja_accept :=
accept
Nazwa_wej
ścia [(Podtyp_dyskretny)] [(Parametry_formalne)]
[
do
Sekwencja_instrukcji2
end
[Nazwa_wej
ścia]];
Definicja 1-2 Wn
ętrze zadania
with Ada.Text_IO; use ada.text_io;
with Ada.Integer_Text_IO;
procedure task1 is
-- Specyfikacja typu intro_task
task type intro_task (message : Integer);
task body intro_task is -- Definicja tresci zadania
begin
for count IN 1..10 loop
Ada.Text_IO.put (Item => "Zadanie ");
Ada.Integer_Text_IO.put (Item => message, Width => 1);
Ada.Text_IO.new_line;
delay 1.0;
end loop;
end intro_task;
-- W odróznieniu od procedur zadania nie są wywoływane
-- Są one aktywowane gdy program startuje
Task_1 : intro_task (1);
Task_2 : intro_task (2);
Task_3 : intro_task (3);
begin
put_line("Zadanie glowne ");
end task1;
Przyk
ład 1-1 Zadania współbieżne
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
4
ADA-wspolbiezn-26
Wykonywane wspó
łbieżnie zadania mogą oddziaływać ze sobą.
Wyró
żnia się następujące sposoby oddziaływania zadań:
•
Aktywacja i zako
ńczenie zadania
•
Wywo
łanie przez zadanie synchronizowanego wejścia (ang. entry)
innego zadania. Jest to synchroniczna metoda komunikacji
mi
ędzyzadaniowej.
•
Wywo
łanie chronionego podprogramu wchodzącego w skład obiektu
chronionego. Podprogram taki zapewnia wy
łączny dostęp do
wspólnych danych gdy wykonywany jest w trybie odczyt / zapis lub
dost
ęp współbieżny gdy wykonywany jest odczytu. Jest to
asynchroniczna metoda komunikacji mi
ędzyzadaniowej.
•
Asynchroniczne przekazanie sterowania jako cz
ęść wyrażenia
select
. B
ędzie ono wznowione gdy zakończy się blok
entry
w
innym zadaniu lub up
łynie timeout.
•
Wykonanie wyra
żenia
abort
pozwalaj
ące jednemu zadaniu na
zako
ńczyć inne.
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
5
ADA-wspolbiezn-26
1.2 Stany zadania w języku Ada
Cykl
życia zadania składa się z trzech faz:
•
Aktywacji (ang.
Activation) – następuje po zakończeniu opracowania
cz
ęści zadania deklaracyjnej zadania.
•
Wykonania (ang.
Execution) – zadanie umieszczone w kolejce zadań
gotowych i b
ędzie wybierane przez procedurę szeregującą.
•
Zako
ńczenia (ang. Finalisation) – osiągnięcie ostatniej instrukcji,
zg
łoszenie wyjątku który nie może być obsłużony, wykonanie instrukcji
terminate
w ga
łęzi
select
, inne zadanie wykona
ło
abort
.
Uwaga!
Zadanie nie mo
że być zakończone dopóki istnieją jego niezakończone
zadania potomne.
non-existing
created
terminated
finalising
completed
activating
running
waiting child
activation
Opracowanie
zakończone
pomyślnie
utworzono
potomne
utwórz
potomne
Opracowanie
deklaracji
wyjatek w
deklaracji
usuwanie zadań
zależnych
koniec
usuwania
zakończenie
zadania
wyjątek w
trakcie
inicjaliacji
Rysunek 0-1 Wa
żniejsze stany zadania w języku Ada (tworzenie –
zako
ńczenie)
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
6
ADA-wspolbiezn-26
1.3 Awaryjne usunięcie zadania
Zadanie mo
że być awaryjnie usunięte przez inne zadanie poprzez
wykonanie instrukcji abort.
Instrukcja_abort :=
abort
NazwaZadania { NazwaZadania }
1.4 Opóźnienia i zadania cykliczne
W j
ęzyku Ada istnieje możliwość opóźnień relatywnych i absolutnych.
Instrukcja_Delay :=
delay
wyra
żenie_typu_Duration
Instrukcja_Delay_untlil := d
elay until
wyra
żenie_typu_Time
task body bufor is
begin
loop
delay 1.0; -- czekanie
end loop;
end bufor;
Opó
źnienie o czas T sekundę nie znaczy, że dokładnie po T zadanie
zostanie wznowione. Po tym czasie zyska status gotowo
ści a o
uruchomieniu decyduje procedura szereguj
ąca.
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
7
ADA-wspolbiezn-26
2. Spotkania
Komunikacja miedzyzadaniowa w Adzie odbywa si
ę za pomocą:
•
Komunikacja synchroniczna - mechanizmu spotka
ń (ang.
Rendezvous).
•
Komunikacja asynchroniczna - obiekty chronione
2.1 Mechanizm spotkań
Komunikacja mi
ędzyzadaniowa w Adzie jest komunikacją
niesymetryczn
ą, synchroniczną. Wyróżnia się dwa rodzaje zadań:
•
Zadanie przyjmuj
ące (serwer) – udostępnia wejścia wykonując
instrukcj
ę accept.
•
Zadanie wywo
łujące (klient) – wywołuje wejścia udostępniane przez
serwer.
Zadanie przyjmujące
Zadanie wywolujące
bufor
Buforc.Wstaw(x)
Wstaw
Pobierz
Buforc
x
Task Buforc is
entry Wstaw(x: in Integer);
entry Pobierz(x: out Integer);
end Buforc;
Zadania wywo
łujące mogą wywoływać wejścia używając notacji
kropkowej Nazwa_zadania.nazwa_wej
ścia(parametry).
Buforc.Wstaw(y); -- wywolanie wejscia 1
Buforc.Wez(z); -- wywolanie wejscia 2
Zadanie przyjmuj
ące musi wykonać instrukcję accept.
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
8
ADA-wspolbiezn-26
task body Buforc is
begin
...
-- wejscie 1
accept Wstaw(x: in Integer) do
...
end Wstaw;
-- wejscie 2
accept Pobierz(x: out Integer) do
...
end Pobierz;
...
end Buforc;
Semantyka spotkania:
Zadanie wywo
łujące przekazuje parametry do zadania przyjmującego i
zostaje zawieszone.
•
Zadanie przyjmuj
ące pobiera parametry z zadania wywołującego i
wykonuje instrukcje z tre
ści
accept
pomi
ędzy
do
i
end
.
•
Parametry wyj
ściowe
out
s
ą przekazywane do zadania
wywo
łującego.
•
Zadanie wywo
łujące jest wznawiane.
Zadanie przyjmujące Bufor
Zadanie wywolujące
accept Wstaw( x in Ineteger)
Bufor.Wstaw( x )
x
end Wstaw;
Przypadek 1 Wykonanie
accept
przed wywo
łaniem wejścia
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
9
ADA-wspolbiezn-26
Zadanie przyjmujące Bufor
Zadanie wywolujące
accept Wstaw( x in Ineteger)
Bufor.Wstaw( x )
x
end Wstaw;
Przypadek 2 Wywo
łaniem wejścia przed wykonaniem
accept
with Ada.Text_IO; use ada.text_io;
with Ada.Integer_Text_IO;
procedure task2 is
-- Specyfikacja typu intro_task
task type intro_task (message : Integer) is
entry start;
end intro_task;
task body intro_task is -- Definicja tresci zadania
begin
accept start; -- Wejscie do zadania
for count IN 1..10 loop
Ada.Text_IO.put (Item => "Zadanie ");
Ada.Integer_Text_IO.put (Item => message, Width => 1);
Ada.Text_IO.new_line;
delay 1.0;
end loop;
end intro_task;
-- W odróznieniu od procedur zadania nie są wywoływane
-- Są one aktywowane gdy program startuje
Task_1 : intro_task (1);
Task_2 : intro_task (2);
Task_3 : intro_task (3);
begin
put_line("Zadanie glowne ");
Task_1.start;
Task_2.start;
Task_3.start;
end task2;
Przyk
ład 2-1 Synchronizacja startu zadań
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
10
ADA-wspolbiezn-26
-- Przesylanie komunikatow jak w QNX
with ada.text_io;
use ada.text_io;
procedure komunikaty is
task odbiorca is
entry SendRec(x : in Integer; y: out Integer);
end odbiorca;
task body odbiorca is
maxi: constant Integer := 2;
idx : Integer := 0; -- pol ost. elementu
begin
loop
accept SendRec(x : in Integer; y : out Integer ) do
put_line("Accept:" & Integer'Image(x));
idx := idx + 1;
y := idx;
end SendRec;
end loop;
end odbiorca;
task nadawca is
end nadawca;
task body nadawca is
i,j : Integer := 0;
begin
loop
i := i + 1;
put_line("Wyslalem " & Integer'Image(i));
odbiorca.SendRec(i,j);
put_line("Odebralem " & Integer'Image(j));
delay 1.0;
end loop;
end nadawca;
begin
put_line("Start- komunikaty");
end komunikaty;
Przyk
ład 2-2 Przesyłanie komunikatów pomiędzy zadaniami (jak w QNX)
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
11
ADA-wspolbiezn-26
Zadanie przyjmuj
ące
odbiorca
Zadanie wywoluj
ące
nadawca
accept SendRec( x in, y out )
odbiorca.SendRec(x,y )
in x
end SendRec;
out y
blokada
odblokowanie
Rysunek 2-1 Przekazywanie danych i wyniku w spotkaniu.
zadanie wywolujące
zadanie przyjmujące
Ready
czekaj na
wykonanie accept
Ready
accept
odbiór danych
czekaj na
wywolanie
przekazanie wyniku
odbiorca.SendRec
odebranie wyniku
wykonanie accept
Rysunek 2-2 Ilustracja mechanizmu spotkania za pomoc
ą sieci Petriego
Ró
żnice pomiędzy wywołaniem procedury i wywołaniem wejścia:
1. Wej
ścia zadania wykonywane są w trybie wzajemnego wykluczania.
Nie obs
łużone jeszcze wywołania są kolejkowane.
2. Akceptacja wywo
łania może być opóźniona w czasie.
3. Zadanie przyjmuj
ące może zadecydować o przyjęciu lub odroczeniu
wywo
łania w zależności od swego wewnętrznego stanu
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
12
ADA-wspolbiezn-26
-- producent konsument rozwiązanie bledne
with ada.text_io;
use ada.text_io;
procedure prodkons1 is
task bufor is
entry wstaw(x : in Integer);
entry wez(x : out Integer);
end bufor;
task body bufor is
maxi: constant Integer := 2;
buf : array(1..maxi) of Integer;
idx : Integer := 0; -- pol ost. elementu
begin
loop
accept wstaw(x : in Integer) do
idx := idx + 1;
buf(idx) := x;
end wstaw;
accept wez(x : out Integer) do
x := buf(idx);
idx := idx - 1;
end wez;
end loop;
end bufor;
task producent is
end producent;
task body producent is
i : Integer := 0;
begin
loop
i := i + 1;
bufor.wstaw(i);
delay 1.0;
end loop;
end producent;
task konsument is
end konsument;
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
13
ADA-wspolbiezn-26
task body konsument is
i : Integer := 0;
begin
loop
bufor.wez(i);
delay 1.0;
end loop;
end konsument;
begin
put_line("Start");
end prodkons1;
Przyk
ład 2-3 Problem producenta konsumenta – rozwiązanie błędne
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
14
ADA-wspolbiezn-26
2.2 Instrukcja
select
W powy
ższym przykładzie serwer musi wykonywać instrukcje
accept
w takiej kolejno
ści jak klient wywołuje jego wejścia, co jest w praktyce
niemo
żliwe. Rozwiązaniem jest zastosowanie instrukcji
select
.
Instrukcja
select
wyst
ępuje w następujących formach:
1. Oczekiwanie selektywne – wybranie do obs
ługi jednego z
wywo
ływanych wejść
2. Terminowe wywo
łanie wejścia – przeterminowanie oczekiwania
klienta na spotkanie po wywo
łaniu wejścia
3. Warunkowe wywo
łanie wejścia – wykonanie innych instrukcji, gdy nie
jest mo
żliwe wywołanie wejścia
4. Asynchroniczna zmiana w
ątku sterowania – przerwanie wykonywania
zadania po up
ływie pewnego czasu lub wywołaniu spotkania.
Oczekiwanie selektywne
Oczekiwanie selektywne umo
żliwia:
•
oczekiwanie na wi
ęcej niż jedno spotkanie
•
oczekiwanie na rozpocz
ęcie spotkania przez ustalony czas
•
wycofanie si
ę z oferty spotkania, jeżeli nie może ono nastąpić
natychmiast,
•
zako
ńczenie zadania jeżeli nie istnieją klienci którzy wywołują jego
wej
ścia.
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
15
ADA-wspolbiezn-26
Instrukcja_oczekiwania_selektywnego ::=
select
[
when
wyra
żenie_logiczne => ]
-- dozór
accept
ident(parametry_formalne)
do
-- ga
łąź accept
instrukcje;
end
ident;
instrukcja | instrukcja_delay [instrukcja {...}] |
terminate
{
or
[
when
wyra
żenie_logiczne => ] -- dozór
accept
ident(parametry_formalne)
do
-- ga
łąź accept
instrukcje;
end
ident;
| instrukcja_delay [instrukcja {...}] }
[
else
instrukcja {...}]
-- ga
łąź else
end select
;
2.3 Czekanie na wiele spotkań
Zadanie bierne mo
że udostępniać wiele wejść.
•
Je
żeli w momencie wykonania
select
żadne zadanie nie wywołuje
wej
ścia to zadanie zawiesza się do momentu gdy wywołanie się
pojawi.
•
Je
żeli w momencie wykonania
select
istnieja zadania wywo
łujące
wej
ścia to jedno z nich zostanie wybrane.
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
16
ADA-wspolbiezn-26
task serwer is
entry E1(...);
entry E2(...);
end serwer
task body serwer is
...
begin
loop
select
accept E1(...) do
...
end E1;
or
accept E2(...) do
...
end E2;
end select;
end loop;
end serwer;
Przyk
ład 2-4 Oczekiwanie alternatywne w instrukcji
select
Pojedyncze rozga
łęzienie instrukcji
select
mo
że zawierać:
1. Instrukcji obs
ługi wejścia
accept
i ewentualnie instrukcji
wyst
ępujących po
accept
.
2. Sekwencj
ę instrukcji poprzedzoną instrukcją opóźnienia
delay
lub
delay
until
.
3. Instrukcj
ę
terminate
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
17
ADA-wspolbiezn-26
2.4 Gałęzie dozorowane
W ka
żdej gałęźi może być obecne wyrażenie logiczne nazywane
dozorem.
Instrukcja
select
rozpoczyna si
ę od obliczenia dozorów.
•
Ga
łęzie dla których wartość wyrażenia będzie true nazywamy
otwartymi, b
ędą one wzięte pod uwagę.
•
Ga
łęzie dla których wartości dozorów mają wartość false nazywa się
zamkni
ętymi i będą one pominiete.
task serwer is
entry E1(...);
entry E2(...);
end serwer
task body serwer is
...
begin
loop
select
when wyrażenie1 =>
accept E1(...) do
...
end E1;
or
accept E2(...) do
...
end E2;
end select;
end loop;
end serwer;
Przyk
ład 2-5 Oczekiwanie alternatywne w instrukcji
select
Dzia
łanie warunku w instrukcji
select
:
•
Gdy
wyrażenie1 przyjmuje wartość
true
, dane wej
ście jest
uwzgl
ędniane w instrukcji
select
.
•
Gdy
wyrażenie1 przyjmuje wartość
false
, dane wej
ście jest
pomijane.
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
18
ADA-wspolbiezn-26
-- producent konsument – rozw. poprawne
-- plik prodkons2.adb
with ada.text_io;
use ada.text_io;
procedure prodkons2 is
task bufor is
entry wstaw(x : in Integer);
entry wez(x : out Integer);
end bufor;
task body bufor is
maxi: constant Integer := 2;
--bufor na elementy
buf : array(1..maxi) of Integer;
-- polozenie ostatniego elementu
idx : Integer := 0;
begin
loop
select
when (idx < maxi + 1 ) =>
accept wstaw(x : in Integer) do
idx := idx + 1;
buf(idx) := x;
end wstaw;
or
when (idx >= 1) =>
accept wez(x : out Integer) do
x := buf(idx);
idx := idx - 1;
end wez;
or
delay 1.0; -- czekam
end select;
end loop;
end bufor;
task producent is
end producent;
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
19
ADA-wspolbiezn-26
task body producent is
i : Integer := 0;
begin
loop
i := i + 1;
bufor.wstaw(i);
put_line("PROD - do bufora " &
Integer'Image(i));
delay 1.0;
end loop;
end producent;
task konsument is
end konsument;
task body konsument is
i : Integer := 0;
begin
loop
bufor.wez(i);
put_line("KONS - z bufora " &
Integer'Image(i));
delay 1.0;
end loop;
end konsument;
begin
put_line("Start");
end prodkons2;
Przyk
ład 2-6 Problem producenta / konsumenta rozwiązanie poprawne
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
20
ADA-wspolbiezn-26
2.5 Przeterminowanie spotkań
Gdy serwer nie mo
że czekać bez końca na wywołanie wyjścia może
wprowadzi
ć przeterminowanie.
Do dyspozycji jest przeterminowanie:
•
wzgl
ędne
-
delay
opó
źnienie
•
bezwzgl
ędne
-
delay until
opó
źnienie
Dzia
łanie przeterminowania:
Gdy w ustalonym czasie
żadne zadanie nie wywoła wejścia, następuje
wyj
ście z instrukcji
select
.
task serwer is
entry E1(...);
end serwer
task body serwer is
...
begin
loop
select
accept E1(...) do
...
end E1;
or
delay 5.0 -- opóźnienie 5 sekund
end select;
end loop;
end serwer;
Przyk
ład 2-7 Przeterminowanie oferty spotkania w zadaniu przyjmującym
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
21
ADA-wspolbiezn-26
-- Przesylanie komunikatow jak w QNX
with ada.text_io;
use ada.text_io;
procedure komunikaty2 is
task odbiorca is
entry SendRec(x : in Integer; y: out Integer);
end odbiorca;
task body odbiorca is
idx : Integer := 0;
begin
loop
select
accept SendRec(x : in Integer; y : out Integer ) do
put_line("Odbior accept:" & Integer'Image(x));
idx := idx + 1;
y := idx;
end SendRec;
or
delay 1.0;
put_line("Odbiorca - timeout:");
end select;
end loop;
end odbiorca;
task producent is
end producent;
task body producent is
i,j : Integer := 0;
begin
loop
i := i + 1;
put_line("Producent - wyslalem " & Integer'Image(i));
odbiorca.SendRec(i,j);
put_line("Producent – odebr." & Integer'Image(j));
delay 2.0;
end loop;
end producent;
begin
put_line("Start- komunikaty2");
end komunikaty2;
Przyk
ład 2-8 Przykład przeterminowania odbierania komunikatów
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
22
ADA-wspolbiezn-26
2.6 Gałąź else
Ga
łąź
else
pozwala serwerowi wycofać ofertę spotkania, gdy brak jest
zada
ń-klientów już oczekujących na spotkanie. Gałąź
else
może
wyst
ąpić instrukcji
select
tylko raz i nie może być chroniona dozorem.
task body Z is
begin
loop
select
accept We1(...) do
...
end;
else
-- exit; -- zakoncz zadanie
null; -- wyjscie z intrukcji select
end select;
end loop;
Przyk
ład 2-9 Gałąź
else
w instrukcji
select
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
23
ADA-wspolbiezn-26
-- Przesylanie komunikatow jak w QNX - przeterminowanie
with ada.text_io;
use ada.text_io;
procedure komunikaty3 is
task odbiorca is
entry SendRec(x : in Integer; y: out Integer);
end odbiorca;
task body odbiorca is
idx,krok : Integer := 0;
begin
loop
select
accept SendRec(x : in Integer; y : out Integer ) do
put_line("Odbior-accept:" & Integer'Image(x));
idx := idx + 1;
y := idx;
end SendRec;
else
null;
end select;
krok := krok+1;
put_line("timeout:"& Integer'Image(krok));
delay 1.0;
end loop;
end odbiorca;
task producent is
end producent;
task body nadawca is
i,j : Integer := 0;
begin
loop
i := i + 1;
put_line("Prod - wyslalem " &
Integer'Image(i));
odbiorca.SendRec(i,j);
put_line("Prod - odebralem " & Integer'Image(j));
delay 2.0;
end loop;
end nadawca;
begin
put_line("Start- komunikaty3");
end komunikaty3;
Przyk
ład 2-10 Użycie gałęzi
else
w instrukcji
select
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
24
ADA-wspolbiezn-26
2.7 Przeterminowanie wywołania wejścia
Instrukcj
ę
select
umieszcza
ć można nie tylko po stronie serwera ale i
klienta.
Po stronie klienta instrukcja
select
s
łuży do:
•
Terminowego wywo
łania wejścia (z przeterminowaniem)
•
Warunkowego wywo
łania wejścia
Terminowe wywo
łanie wejścia z umożliwia wycofanie oferty spotkania
przez stron
ę wywołującą, gdy nie może ono zajść w określonym czasie.
Do realizacji takiego przeterminowania wykorzystuje si
ę
select
.
Terminowe_wywo
łanie_wejścia :=
select
Wywo
łanie_wejścia
[instrukcje1]
else
delay [until]
opó
źnienie;
[instrukcje2]
end select
;
Dzia
łanie terminowego wywołania wejścia:
•
Je
żeli w czasie określonym po
delay
nast
ąpi spotkanie to wykonana
b
ędzie sekwencja instrukcje1.
•
Je
żeli w czasie określonym po
delay
spotkanie nie nast
ąpi to
wykonana b
ędzie sekwencja instrukcje2.
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
25
ADA-wspolbiezn-26
-- Przesylanie komunikatow - ograniczone czekanie nadawcy
with ada.text_io; use ada.text_io;
procedure komunikaty4 is
task odbiorca is
entry Send(x : in Integer; y: out Integer);
end odbiorca;
task body odbiorca is
idx : Integer := 0; -- pol ost. elementu
begin
loop
accept Send(x : in Integer; y : out Integer ) do
put_line("Accept:" & Integer'Image(x));
idx := idx + 1;
y := idx;
delay 2.0;
end Send;
end loop;
end odbiorca;
task nadawca is end nadawca;
task body nadawca is
i,j : Integer := 0;
begin
loop
i := i + 1;
select
odbiorca.Send(i,j);
put_line("Nad. odebralem " & Integer'Image(j));
else
delay 1.0;
put_line("Nad. timeout" & Integer'Image(j));
end select;
end loop;
end nadawca;
begin
put_line("Start- komunikaty4");
end komunikaty4;
Przyk
ład 2-11 Ograniczone czekanie po stronie wywołującej
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
26
ADA-wspolbiezn-26
2.8 Warunkowe wywołanie wejścia
Warunkowe wywo
łanie wejścia umożliwia wycofanie oferty spotkania
przez stron
ę wywołującą, gdy nie może ono zajść natychmiast.
Warunkowe_wywo
łanie_wejścia :=
select
Wywo
łanie_wejścia
[instrukcje1]
else
[instrukcje2]
end select
;
Dzia
łanie warunkowego wywołania wejścia:
•
Je
żeli spotkanie jest w danym momencie możliwe to wykonana
b
ędzie sekwencja instrukcje1.
•
Je
żeli natychmiastowe spotkanie nie jest możliwe to wykonana
b
ędzie sekwencja instrukcje2.
select
odbiorca.Send(i,j);
else
put_line("Wysłanie teraz niemożliwe”);
end select;
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
27
ADA-wspolbiezn-26
2.9 Gałąź terminate
Istnieje mo
żliwość zakończenia zadania serwera, gdy nie ma klientów,
którzy chcieliby z tego zadania korzysta
ć. Temu celowi służy gałąź
terminate
.
•
Ga
łąź
terminate
wybierana jest gdy jednostka macierzysta i
wszystkie zadania potomne si
ę zakończyły.
•
Ga
łąź
terminate
mo
że być poprzedzona dozorem. Nie może
wyst
ępować jednocześnie z gałęzią
delay
lub
else
.
task body serwer is
begin
loop
select
accept We1(...) do
...
end;
or
terminate –- zakonczenie serwera
end select;
end loop;
end serwer;
Przyk
ład 2-12 Użycie instrukcji
terminate
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
28
ADA-wspolbiezn-26
2.10 Asynchroniczna zmiana wątku sterowania
Jest to forma instrukcji
select
nazywana ATC (ang.
Asynchronous
Transfer of Control). Składa się z części przerywającej i części
przerywanej.
Funkcj
ą tej instrukcji jest umożliwienie kontroli czasu wykonania się
cz
ęści przerywanej poprzez:
•
wywo
łanie wejścia
•
up
ływ czasu
Zmiana_w
ątku_sterowania :=
select
Wywo
łanie_wejścia | instrukcja_opóźnienia
[instrukcja1]
then abort
instrukcja_przerywana
end select
;
Po rozpocz
ęciu działania instrukcji
select
nast
ępuje wejście do części
przerywanej. Cz
ęść ta może być przerwana, gdy nastąpi jej przerwanie
poprzez wykonanie akcji okre
ślonej przez instrukcję wyzwalającą.
Instrukcj
ą wyzwalającą może być
•
instrukcja
delay
[
until
],
•
Zako
ńczenie wywołania wejścia
Je
żeli instrukcja przerywana zakończy się przed tym niż zajdzie
zdarzenie przerywaj
ące to wykonywana jest instrukcja1.
-- ustalanie limitu czasu wykonania
with ada.text_io;use ada.text_io;
procedure limit_czasu1 is
task odbiorca is
end odbiorca;
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
29
ADA-wspolbiezn-26
task body odbiorca is
i: Integer := 0;
begin
loop
select
delay 5.0;
then abort
loop -- czas wykonania odc. ograniczony
i := i+1;
delay 1.0;
end loop;
end select;
put_line("Wynik " & Integer'Image(i));
end loop;
end odbiorca;
begin
put_line("Start- limit_czasu1");
end limit_czasu1;
Przyk
ład 2-13 Przerywanie sekwencji instrukcji poprzez upływ czasu
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
30
ADA-wspolbiezn-26
2.11 Przykład – semafor liczący
-- Implementacja semafora liczącego za pomocą wejść
with ada.text_io;
use ada.text_io;
procedure semafor3 is
task semafor is
entry sem_init(val:in Integer);
entry sem_wait;
entry sem_post;
end semafor;
task body semafor is
count : Integer := 1; -- poczatku 1 jedn. zasobu
begin
loop
select
accept sem_init(val:in Integer) do
count := val;
end sem_init;
or
when count > 0 => accept sem_wait do
count :=count - 1; --pobierz zasób
put_line("sem_wait:" & Integer'Image(count));
end sem_wait;
or
accept sem_post do
count := count + 1;
put_line("sem_post:" & Integer'Image(count));
end sem_post;
end select;
end loop;
end semafor;
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
31
ADA-wspolbiezn-26
task proces1 is
end proces1;
task body proces1 is
begin
loop
semafor.sem_wait;
put_line("proces1: w sekcji");
delay 1.0;
semafor.sem_post;
end loop;
end proces1;
task proces2 is
end proces2;
task body proces2 is
begin
loop
semafor.sem_wait;
put_line("proces2: w sekcji");
delay 3.0;
semafor.sem_post;
end loop;
end proces2;
begin
put_line("main: start");
end semafor3;
Przyk
ład 2-14 Semafor liczący
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
32
ADA-wspolbiezn-26
3. Obiekty chronione
3.1 Zmienne dzielone
W j
ęzyku Ada83 synchronizowany dostęp do zmiennych dzielonych typu
skalarnego zapewnia
pragma shared
.
pragma Shared
(Nazwa_zmiennej_globalnej)
•
Ka
żde przypisanie do zmiennej dzielonej powoduje aktualizację
wszystkich jej kopii.
•
Zapewnione jest wzajemne wykluczanie zada
ń czytania oraz czytania
i pisania (jak w problemie czytelników i pisarzy).
Dzia
ła tylko dla typów skalarnych.
W j
ęzyku Ada95 synchronizowany dostęp do zmiennych dzielonych
zapewniony jest przez pragm
ę:
Pragma_zmiennej_dzielonej ::=
pragma
Nazwa_pragmy(Nazwa_zmiennej)
Nazwa_pragmy ::=
Volatil [_Components] |
Atomic [_Components]
•
Gdy nie ma sk
ładnika pragmy
Components
odnosi si
ę ona do
zmiennych dowolnego typu.
•
Gdy wyst
ępuje składnik
Components
odnosi si
ę ona do wszystkich
elementów typu z
łożonego (tablicy lub rekordu)
Pragma
Volatil
- kompilator nie umieszcza kopii zmiennej w
rejestrach lub pami
ęci.
Pragma
Atomic
- Operacje odczytu i zapisu s
ą traktowane jako
niepodzielne. Zapewnione wzajemne wykluczanie typu czytelnicy i
pisarze.
Pragmy te nie s
ą obowiązkową częścią języka (opisane są w Aneksie).
type
buf_t
is
array(1..maxi)
of
Integer;
pragma
Atomic_Components
(buf_t)
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
33
ADA-wspolbiezn-26
3.2 Synchronizacja dostępu do zmiennych dzielonych poprzez
obiekt chroniony
Obiekt chroniony jest jednostk
ą programową, która organizuje dostęp
zada
ń do zawartych w obiekcie danych dzielonych (ang. shared
variables). Obiekty chronione zapewniają możliwość komunikacji
asynchronicznej pomi
ędzy zadaniami. Zapewniają spełnienie warunku
wzajemnego wykluczania.
Zapis obiektu chronionego podobny jest do zapisu zadania. Sk
łada się z
specyfikacji i tre
ści.
Specyfikacja obiektu chronionego zawiera cz
ęść publiczną i prywatną.
•
Cz
ęść publiczna (poprzedzona słowem
protected
) zawiera:
deklaracje wej
ść, funkcji, procedur.
•
Cz
ęść prywatna (poprzedzona słowem
private
) zawiera:
deklaracje zmiennych dzielonych i opcjonalnie deklaracje
wewn
ętrznych wejść, funkcji, procedur.
•
Dost
ęp do obiektu chronionego możliwy jest tylko poprzez
wywo
łanie funkcji, procedur i wejść publicznych. Odbywa się on na
zasadzie wzajemnego wykluczania.
•
Wywo
łanie funkcji pozwala na odczyt danych współdzielonych (z
cz
ęści
private
) a wywo
łanie wejść i procedur na ich odczyt i
zapis.
Deklaracja_typu_obiektu_chronionego :=
protected
type
Nazwa_typu_chronionego [Wyró
żnik]
is
{ Specyfikacja_Podrogramu | Deklaracja_Wej
ścia }
[
private
{ Specyfikacja_Podrogramu | Deklaracja_Wej
ścia | Deklaracja_danych } ]
end
[Nazwa_typu_chronionego]
Deklaracja_Wej
ścia :=
entry
Identyfikator_Wej
ścia[(Podtyp_Indeksu)] (Lista_Parametrów);
Specyfikacja typu chronionego
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
34
ADA-wspolbiezn-26
Tre
ść_obiektu_chronionego :=
protected
body
Nazwa_typu_chronionego
is
{ Specyfikacja_Podrogramu | Tre
ść_Podprogramu | Treść_Wejścia }
end
[Nazwa_typu_chronionego]
Tre
ść_Wejścia :=
entry
Identyfikator_Wej
ścia[(Deklaracja_Indeksu)] (Lista_Parametrów)]
when
Wyra
żenie_logiczne_dozoru
is
Sekwencja_instrukcji_obs
ługi_wejścia
end
Identyfikator_Wej
ścia;
Deklaracja_Indeksu :=
for
Identyfikator_indeksu
in
Podtyp_indeksu
Tre
ść typu chronionego
protected
Modul1
is
-- specyfikacja obiektu chronionego Modul1
entry
We1(...); -- wej
ście W1 z listą parametrów formalnych
procedure
Pr1(...); -- procedura P1 z list
ą parametrów formalnych
function
Fun1(...); -- funkcja Fun1 z list
ą parametrów formalnych
...
private
zmienna1: Typ1; -- zmienna dzielona typu Typ1
zmienna2: Typ2; -- zmienna dzielona typu Typ2
...
protected
body
Modul1
is
-- tre
ść obiektu chronionego Mod
entry
We1
when
warunek
is
– tre
ść wejścia We1 z barierą
begin
....
end
We1;
end
Mod1;
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
35
ADA-wspolbiezn-26
Synchronizacja dost
ępu do obiektu chronionego:
•
Dopuszczalne jest wspó
łbieżne wykonywanie funkcji obiektu
chronionego. Funkcja umo
żliwia tylko odczyt danych dzielonych.
Wykonanie funkcji odbywa si
ę na zasadzie wzajemnego wykluczania
wzgl
ędem procedur i wejść.
•
Procedury obiektu chronionego wykonywane s
ą na zasadzie
wzajemnego wykluczania wzgl
ędem funkcji i wejść.
•
Wej
ścia obiektu chronionego wykonywane są na zasadzie
wzajemnego wykluczania wzgl
ędem funkcji i wejść. Wejścia
dodatkowo chronione s
ą przez wyrażenie logiczne (bariera).
Wykonane b
ędą gdy warunek przyjmie wartość
true
. W przeciwnym
przypadku zadanie wywo
łujące będzie zablokowane do czasu
spe
łnienia warunku.
Warunek bariery sprawdzany jest gdy:
•
Zadanie bie
żące wywołuje wejście dozorowane.
•
Inne zadanie wykonuje procedur
ę lub wywołuje wejście danego
obiektu chronionego. Obliczenie warunku bariery nast
ępuje gdy
ko
ńczy się procedura lub zadanie kończy wywołanie wejścia.
Kolejki zada
ń oczekujących na barierach są kolejkami typu FIFO.
Wniosek:
Obiekt chroniony implementuje monitor.
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
36
ADA-wspolbiezn-26
Obiekt chroniony
zadania oczekujące
na wejście do
obiektu
chronionego
Kolejka 1
Zadania
wstrzymane na
barierach
Wejścia
entry 1
entry 2
Kolejka 2
Zmienne
Procedury
Pk
P2
P1
Funkcje
Pk
P2
P1
bariera1
bariera2
Rysunek 3-1 Ilustracja obiektu chronionego
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
37
ADA-wspolbiezn-26
-- Problem producenta konsumenta - obiekt chroniony
with ada.text_io;
use ada.text_io;
procedure prodkons3 is
maxi: constant Integer := 8;
type buf_t is array(1..maxi) of Integer;
protected bufcykl is
entry wstaw(element : in Integer);
entry wez(element : out Integer);
private
idx : Integer := 0;
buf : buf_t;
end bufcykl;
protected body bufcykl is
entry wstaw(element: in Integer) when (idx+1)<maxi+1 is
begin
idx := idx + 1;
buf(idx) := element;
end wstaw;
entry wez(element : out Integer) when (idx-1)>0 is
begin
element := buf(idx);
idx := idx - 1;
end wez;
end;
task producent is
end;
task body producent is
i : Integer := 0;
begin
loop
i := i + 1;
bufcykl.wstaw(i);
put_line("Prod-wstaw" & Integer'Image(i));
delay 0.7;
end loop;
end;
task konsument is
end;
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
38
ADA-wspolbiezn-26
task body konsument is
i : Integer := 0;
begin
loop
bufcykl.wez(i);
put_line("Kons-wez" & Integer'Image(i));
delay 1.0;
end loop;
end;
begin
put_line("Start - prodkons3");
end prodkons3;
Przyk
ład rozwiązania problemu producenta – konsumenta z obiektem
chronionym
Gdy zadanie musi by
ć obsługiwane w dwóch częściach stosuje się
instrukcj
ę
requeue
.
Instrukcja_requeue :=
requeue
Nazwa_wej
ścia [
with abort
]
Instrucja powoduje ponowne umieszczenie zadania w kolejce do
wyspecyfikowanego wej
ścia. Instrukcja powinna być umieszczona jako
ostatnia w bloku obs
ługi wejścia.
Gdy zadanie przebywa wewn
ątrz obiektu chronionego to dostęp innych
zada
ń do tego obiektu na ten czas może być zablokowany. W związku z
tym zadanie powinno przebywa
ć w obiekcie chronionym jak najkrócej. W
zwi
ązku z tym wykonywanie pewnych instrukcji w obiekcie chronionym
jest zabronione.
Instrukcje zabronione w obiekcie chronionym:
select
accept
wywo
łanie wejścia
delay, delay until
tworzenie lub aktywacja zadania
wywo
łanie podprogramu wewnątrz którego znajdują się operacje
potencjalnie blokuj
ące.
U
życie powyższych operacji w obiekcie chronionym powoduje
zg
łoszenie wyjątku.
PDF created with pdfFactory trial version
Wspó
łbieżność w języku Ada
39
ADA-wspolbiezn-26
3.3 Stany zadania w języku Ada
non-existing
created
terminated
finalising
completed
activating
running
wait for protected
entry call
wait on
entry call
wait on
accept
wait on
select
wait on
rendezvous
end
delayed
Rysunek 0-1 Wa
żniejsze stany zadania w języku Ada
4. Źródła
[1] Z. Huzar, Z. Fry
źlewicz, I. Dubielewicz, ADA 95, wyd. Helion
1998.
[2] Gilles Motet, Tomasz Szmuc, Programowanie systemów
czasu rzeczywistego z zastosowaniem j
ęzyka ADA, AGH
uczelniane wydawnictwo naukowo dydaktyczne, Kraków 2002.
[3] Pyle I. C. Ada, Warszawa WNT 1986.
[4] Richard Riehle, Ada Distilled, An Introduction to Ada
Programming for Experienced Computer Programmers
http://www.adaic.org/docs/distilled/adadistilled.pdf
PDF created with pdfFactory trial version