- •23. Задачи (язык Ада) Описание тела задачи
- •Инициирование задачи, пример
- •Синхронизация, механизм рандеву
- •Взаимное исключение
- •Пример. Реализация механизма семафоров
- •Пример. Реализация механизма сигналов
- •Описание задачи (опционально)
- •Описание задачи, пример (опционально)
- •Пример «Почтовый ящик» (опционально)
- •Пример «Почтовый ящик» (опционально)
- •Пример «Почтовый ящик» (опционально)
- •24. Отбор среди входов
- •Пример. Задача «Поставщик- Потребитель»
- •begin Задача «Поставщик-Потребитель»
- •Оператор отбора среди входов (опционально)
- •Отбор среди входов (опционально)
- •25. Задача «Обедающие философы»
- •Задача «Обедающие философы»
- •Задача «Обедающие философы»
- •Задача «Обедающие философы»
Пример «Почтовый ящик» (опционально)
Буфер рассчитан только одно сообщение и увеличивать его нет смысла так как очень жесткий способ синхронизации, Принять и Отправить выполняются по очереди
8. Задачи в АДА, механизм рандеву |
|
11 |
|
Сидельников В.В. vvs_home@list.ru |
2011 v.01 |
||
|
24. Отбор среди входов
selectwhen (A) => accept X do
. . .
or
end;
when (B) => accept Y do
. . .
end; end select;
8. Задачи в АДА, механизм рандеву |
|
12 |
|
Сидельников В.В. vvs_home@list.ru |
2011 v.01 |
||
|
Пример. Задача «Поставщик- Потребитель»
|
. |
Буфер |
|
Поставщик |
... |
Потребитель |
ТекущийЧтение ТекущийЗапись task body ПоставщикПотребитель;
Размер: constant INTEGER = 20;
Буфер: array(0..Размер) of СООБЩЕНИЕ;
ТекущийЗапись, ТекущийЧтение: INTEGER = 0; Количество: INTEGER = 0;
8. Задачи в АДА, механизм рандеву |
|
13 |
|
Сидельников В.В. vvs_home@list.ru |
2011 v.01 |
||
|
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 ПоставщикПотребитель;
8. Задачи в АДА, механизм рандеву |
|
14 |
|
Сидельников В.В. vvs_home@list.ru |
2011 v.01 |
||
|
Оператор отбора среди входов (опционально)
select
[when <условие>=>] <отбираемая альтернатива>
[последовательность операторов]
{or
[when <условие>=>] <отбираемая альтернатива>
[последовательность операторов]}
[else
последовательность операторов] end select;
<отбираемая альтернатива>:
•accept()
•delay(<выражение, указывающее величину задержки>
8. Задачи в АДА, механизм рандеву |
|
15 |
|
Сидельников В.В. vvs_home@list.ru |
2011 v.01 |
||
|
Отбор среди входов (опционально)
1.Открытый вход – вход, у которого условие входа в данный момент является истинным
2.Если нет ни открытых операторов задержки, ни фразы else, задача будет неопределенно долго ждать вызова входа, связанного с открытым оператором входа accept и обработает первый поступивший вызов
3.Если имеется открытый оператор задержки, задача будет ожидать вызова входа для открытого оператора входа в течение заданного временного интервала, а затем выполнит соответствующую альтернативу.
4.Если нет ни открытых альтернатив, ни фразы else, возникает исключительная ситуация SELECT_ERROR
5.Если нет открытого оператора задержки, но есть фраза else, то задача немедленно приступит к выполнению части else.
8. Задачи в АДА, механизм рандеву |
|
16 |
|
Сидельников В.В. vvs_home@list.ru |
2011 v.01 |
||
|
25. Задача «Обедающие философы»
program ОбедающиеФилософы is
subtype ID is range 1..5;
Вилки: array(ID) of Вилка; Философы: array(ID) of Философ;
task body Вилка;
begin loop
select
accept ВзятьВилку; -- см.2, слайд 16 accept ПоложитьВилку;
end select; end loop;
end Вилка;
8. Задачи в АДА, механизм рандеву |
|
17 |
|
Сидельников В.В. vvs_home@list.ru |
2011 v.01 |
||
|
Задача «Обедающие философы»
task body Философ;
I: ID; begin
accept ПолучитьНомер(J in ID) do; I:= J;
end ПолучитьНомер; ЛеваяВилка:= I;
if(I=5)then ПраваяВилка:=1 else ПраваяВилка:= I+1;
loop
<здесь философ думает>
Вилки(ЛеваяВилка).ВзятьВилку; (*) Вилки(ПраваяВилка).ВзятьВилку;
<здесь философ ест>
Вилки(ЛеваяВилка).ПоложитьВилку; Вилки(ПраваяВилка).ПоложитьВилку;
end loop; end Философ;
8. Задачи в АДА, механизм рандеву |
|
18 |
|
Сидельников В.В. vvs_home@list.ru |
2011 v.01 |
||
|
Задача «Обедающие философы»
-- Инициирование задач begin
for K in ID loop
Философы(К).ПолучитьНомер(К); end loop;
end ОбедающиеФилософы;
Если все пять философов одновременно выполнят действие (*), то возникает тупиковая ситуация
8. Задачи в АДА, механизм рандеву |
|
19 |
|
Сидельников В.В. vvs_home@list.ru |
2011 v.01 |
||
|
Задача «Обедающие философы»
task body Хозяин;
I: INTEGER:= 0;
begin loop
select when(I<4)=>
accept Войти; I:= I + 1;
or
accept Выйти; -- см.2, слайд 16
I:= I - 1; end loop;
end Хозяин;
(Задание: Прописать использование задачи «Хозяин» в программе «ОбедающиеФилософы»)
8. Задачи в АДА, механизм рандеву |
|
20 |
|
Сидельников В.В. vvs_home@list.ru |
2011 v.01 |
||
|