Задачи языка Ада

Содержание

Слайд 2

11. Механизм рандеву 2002 v.0.2 program Турист task body Встреча is;

11. Механизм рандеву 2002 v.0.2

program Турист
task body Встреча is;
begin
. .

.
end Встреча;
task body Багаж is;
begin
. . .
end Багаж;
begin
initiate(Встреча);
initiate(Багаж);
end Турист;

Инициирование задачи

Неявная инициализация:
begin
nill;
end Турист;

Багаж

Турист

Встреча

(!) Активны три задачи

Слайд 3

11. Механизм рандеву 2002 v.0.2 Механизм рандеву task body A1 is

11. Механизм рандеву 2002 v.0.2

Механизм рандеву

task body A1 is
begin

. . .
A2.R; (1)
. . .
end A;


task body A2 is
begin
. . .
accept R do (2)
<обработка входа>
end; (3)
. . .
end A;

Вызов входа:

Вход:

A1

t

t

ждет

A2

I

2

ждет

1

3

II

A1

t

t

A2

ждет

1

3

2

Слайд 4

11. Механизм рандеву 2002 v.0.2 Взаимное исключение task body B is

11. Механизм рандеву 2002 v.0.2

Взаимное исключение


task body B is

begin
loop
accept R do
. . .
end;
end loop;
end A;

task body A1 is
begin
. . .
B.R;
. . .
end A;

task body An is
begin
. . .
B.R;
. . .
end A;

Слайд 5

11. Механизм рандеву 2002 v.0.2 Описание задачи task is entry [(формальные_параметры)]

11. Механизм рандеву 2002 v.0.2

Описание задачи

task <имя_задачи> is
entry <имя_входа> [(формальные_параметры)]
end

<имя_задачи>;
task body is <имя_задачи>
<описание_данных>
begin
<описание_действий>
accept <имя входа> [(<формальные параметры>)] do
<описание_действий_входа>
end;
<описание_действий>
end <имя_задачи>;

Спецификация задачи:

Тело задачи:

Слайд 6

11. Механизм рандеву 2002 v.0.2 program Преобразование_символа; task Читать; task Преобразовать

11. Механизм рандеву 2002 v.0.2

program Преобразование_символа;
task Читать;
task Преобразовать
entry R(P: in

CHARACTER);
end Преобразовать;
task body Читать;
Сh: CHARACTER;
X: FILE;
begin
Open (X);
while not EOF(X) loop
Get(Ch);
Преобразовать.R(Ch);
end loop;
Close(X)
end Читать;

task body Преобразовать;
Y: CHARACTER;
begin
loop
accept R(P: in CHARACTER) do
Y:= P;
end;
Put(UPPER(Y));
end loop;
end;
begin
nill;
end.

Описание задачи, пример

Слайд 7

11. Механизм рандеву 2002 v.0.2 task body Процесс_1; begin . .

11. Механизм рандеву 2002 v.0.2
task body Процесс_1;
begin
. . .
Семафор.P;

КритическаяСекция_1;
Семафор.V;
. . .
end;
task body Процесс_2;
begin
. . .
Семафор.P;
КритическаяСекция_2;
Семафор.V;
. . .
end;

task body Семафор;
begin
loop
accept P do end;
accept V do end;
end loop;
end Сигнал;

Реализация механизма семафоров

Слайд 8

11. Механизм рандеву 2002 v.0.2 task body Процесс_1; begin loop .

11. Механизм рандеву 2002 v.0.2
task body Процесс_1;
begin
loop
. . .
Сигнал.Ждать;
. .

.
end loop;
end;
task body Процесс_N;
begin
loop
. . .
Сигнал.Послать;
. . .
end loop;
end;

task body Сигнал;
begin
loop
accept Послать do end;
if Ждать’COUNT > 0 then
accept Ждать do end;
end if;
end loop;
end Сигнал;

Реализация механизма сигналов

Слайд 9

11. Механизм рандеву 2002 v.0.2 Пример – «Почтовый ящик» task body

11. Механизм рандеву 2002 v.0.2

Пример – «Почтовый ящик»

task body ПочтовыйЯщик;
Буфер:

СООБЩЕНИЕ;
begin
loop
accept Отправить(Передача: in СООБЩЕНИЕ) do
Буфер:= Передача;
end;
accept Принять(Прием: out СООБЩЕНИЕ) do
Прием:= Буфер;
end;
end loop;
end Почтовый_Ящик;

ПочтовыйЯщик

Отправитель

Получатель

Слайд 10

11. Механизм рандеву 2002 v.0.2 Пример – «Почтовый ящик» (2) task

11. Механизм рандеву 2002 v.0.2

Пример – «Почтовый ящик» (2)

task body

Отправитель;
begin
loop
. . .
ПочтовыйЯщик.Отправить(Послание);
. . .
end loop;
end Отправитель;


task body Получатель;
begin
loop
. . .
Почтовый_Ящик.Принять(Послание);
. . .
end loop;
end Получатель;

Слайд 11

11. Механизм рандеву 2002 v.0.2 Пример – «Почтовый ящик» (3) Задача

11. Механизм рандеву 2002 v.0.2

Пример – «Почтовый ящик» (3)

Задача очень

похожа на «Поставщик-Потребитель»
Буфер рассчитан только одно сообщение и увеличивать его нет смысла так как :
Очень жесткий способ синхронизации :
Принять и Отправить выполняются по очереди,
Слайд 12

11. Механизм рандеву 2002 v.0.2 task body ПоставщикПотребитель; Размер: constant INTEGER

11. Механизм рандеву 2002 v.0.2

task body ПоставщикПотребитель;
Размер: constant INTEGER = 20;
Буфер:

array(1..Размер) of СООБЩЕНИЕ;
ТекущийЗапись, ТекущийЧтение: INTEGER = 1;
Количество: INTEGER = 0;

Отбор среди входов, задача «Поставщик-Потребитель»

select
when (A) =>
accept X do
. . .
end;
or
when (B) =>
accept Y do
. . .
end;
end select;

Слайд 13

11. Механизм рандеву 2002 v.0.2 begin loop select when (Количество accept

11. Механизм рандеву 2002 v.0.2

begin
loop
select
when (Количество < Размер)

=>
accept Записать(X: in СООБЩЕНИЕ) do
Буфер(ТекущийЗапись):= X;
end;
Текущий:= (ТекущийЗапись + 1) mod Размер;
Количество:= Количество + 1;
or
when (Количество > 0) =>
accept Прочитать(Y: out СООБЩЕНИЕ) do
Y:= Буфер(ТекущийЧтение);
end;
Текущий:= (ТекущийЧтение + 1) mod Размер;
Количество:= Количество - 1;
end select;
end loop;
end ПоставщикПотребитель;

Задача «Поставщик-Потребитель» (2)

Слайд 14

11. Механизм рандеву 2002 v.0.2 select [when =>] [последовательность операторов] {or

11. Механизм рандеву 2002 v.0.2

select
[when <условие>=>]
<отбираемая альтернатива>
[последовательность операторов]
{or
[when <условие>=>]
<отбираемая альтернатива>
[последовательность

операторов]}
[else
последовательность операторов]
end select;

Оператор Отбора среди входов

Отбираемой альтернативой может быть
ператор входа accept
оператор задержки
delay <выражение, указывающее величину задержки>