ADA wspolbiezn 24

background image

Wspó

łbieżność w języku Ada

1

ADA-wspolbiezn-24

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

zewnatrz (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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

2

ADA-wspolbiezn-24


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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

3

ADA-wspolbiezn-24

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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

4

ADA-wspolbiezn-24

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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

5

ADA-wspolbiezn-24

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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

6

ADA-wspolbiezn-24

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

uruchomeniu decyduje procedura szereguj

ąca.

PDF created with pdfFactory trial version

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

7

ADA-wspolbiezn-24


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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

8

ADA-wspolbiezn-24

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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

9

ADA-wspolbiezn-24

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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

10

ADA-wspolbiezn-24

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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

11

ADA-wspolbiezn-24

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


ż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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

12

ADA-wspolbiezn-24


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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

13

ADA-wspolbiezn-24

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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

14

ADA-wspolbiezn-24

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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

15

ADA-wspolbiezn-24

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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

16

ADA-wspolbiezn-24

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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

17

ADA-wspolbiezn-24

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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

18

ADA-wspolbiezn-24


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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

19

ADA-wspolbiezn-24

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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

20

ADA-wspolbiezn-24

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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

21

ADA-wspolbiezn-24



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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

22

ADA-wspolbiezn-24

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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

23

ADA-wspolbiezn-24

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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

24

ADA-wspolbiezn-24

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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

25

ADA-wspolbiezn-24

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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

26

ADA-wspolbiezn-24

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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

27

ADA-wspolbiezn-24

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

łąź terminale 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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

28

ADA-wspolbiezn-24

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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

29

ADA-wspolbiezn-24

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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

30

ADA-wspolbiezn-24

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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

31

ADA-wspolbiezn-24

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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

32

ADA-wspolbiezn-24

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

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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

33

ADA-wspolbiezn-24

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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

34

ADA-wspolbiezn-24

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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

35

ADA-wspolbiezn-24

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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

36

ADA-wspolbiezn-24

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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

37

ADA-wspolbiezn-24


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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

38

ADA-wspolbiezn-24

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

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada

39

ADA-wspolbiezn-24

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

www.pdffactory.com


Wyszukiwarka

Podobne podstrony:
ADA wspolbiezn 26
24 piątek
24(45)RUP
ostre białaczki 24 11 2008 (kurs)
ZPSBN T 24 ON poprawiony
24 NIEDZIELA ZWYKŁA A
Wykład 24
4 wykład0 24 10 2007
Atrybucje 23 24
od 24 do 32
24 G23 H19 QUALITY ASSURANCE OF BLOOD COMPONENTS popr
4 JM02 JS05 24 29 złamania
24 gold & 20's
mspo 24 2

więcej podobnych podstron