
Srv_11_15_02_Рандеву в _Ада.ppt
- Количество слайдов: 20
Задачи (язык Ада) Описание тела задачи task body is <имя_задачи> <описание_данных> begin <описание_действий> end <имя_задачи>; 11. Задачи в АДА, механизм рандеву 2015 v. 00 1
Инициирование задачи, пример program Турист task body Встреча is; begin . . . end Встреча; task body Багаж is; begin . . . end Багаж; begin initiate(Встреча); initiate(Багаж); end Турист; 11. Задачи в АДА, механизм рандеву Турист Встреча Багаж Неявная инициализация: begin nill; end Турист; 2015 v. 00 2
Механизм рандеву, синхронизация, Вход: Вызов входа: task body A 2 is task body A 1 is begin . . . accept R do (2) <обработка входа> end; (3) . . . end A; begin . . . A 2. R; (1) . . . end A; 1 1 A 1 ждет I 2 A 1 t II 3 t t ждет 2 3 t A 2 ждет 11. Задачи в АДА, механизм рандеву 2015 v. 00 3
Взаимное исключение task body A 1 is begin . . . B. R; . . . end A; task body An is begin . . . B. R; . . . end A; 11. Задачи в АДА, механизм рандеву task body B is begin loop accept R do . . . end; end loop; end A; Очередь. Доступа. Ко. Входу_R 2015 v. 00 4
Пример 1 – механизм семафоров task body Процесс_1; begin . . . Семафор. P; Критическая. Секция_1; Семафор. V; . . . end; task body Процесс_2; begin. . . Семафор. P; Критическая. Секция_2; Семафор. V; . . . end; 11. Задачи в АДА, механизм рандеву task body Семафор; begin loop accept P do end; accept V do end; end loop; end Семафор; 2015 v. 00 5
Пример 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 Сигнал; 11. Задачи в АДА, механизм рандеву 2015 v. 00 6
Описание задачи Спецификация задачи: task <имя_задачи> is entry <имя_входа> [(формальные_параметры)] end <имя_задачи>; Тело задачи: task body is <имя_задачи> <описание_данных> begin <описание_действий> accept <имя входа> [(<формальные параметры>)] do <описание_действий_входа> end; <описание_действий> end <имя_задачи>; 11. Задачи в АДА, механизм рандеву 2015 v. 00 7
Описание задачи, пример program Преобразование_символа; task Читать; task Преобразовать entry R(P: in CHARACTER); task body Преобразовать; Y: CHARACTER; end Преобразовать; begin loop task body Читать; accept R(P: in CHARACTER) do Сh: CHARACTER; Y: = P; X: FILE; end; begin Put(UPPER(Y)); Open (X); end loop; while not EOF(X) loop end; Get(Ch); Преобразовать. R(Ch); begin end loop; nill; Close(X) end Читать; 11. Задачи в АДА, механизм рандеву 2015 v. 00 8
Пример 3 - «Почтовый ящик» task body Почтовый. Ящик; Буфер: СООБЩЕНИЕ; begin loop accept Отправить(Передача: in СООБЩЕНИЕ) do Буфер: = Передача; end; accept Принять(Прием: out СООБЩЕНИЕ) do Прием: = Буфер; end; end loop; end Почтовый_Ящик; Отправитель Почтовый. Ящик 11. Задачи в АДА, механизм рандеву 2015 v. 00 Получатель 9
Пример «Почтовый ящик» task body Отправитель; begin loop. . . Почтовый. Ящик. Отправить(Послание); . . . end loop; end Отправитель; task body Получатель; begin loop. . . Почтовый. Ящик. Принять(Послание); . . . end loop; end Получатель; 11. Задачи в АДА, механизм рандеву 2015 v. 00 10
Пример «Почтовый ящик» Буфер рассчитан только одно сообщение и увеличивать его нет смысла так как очень жесткий способ синхронизации, Принять и Отправить выполняются по очереди 11. Задачи в АДА, механизм рандеву 2015 v. 00 11
Отбор среди входов select when (A) => accept X do. . . end; or when (B) => accept Y do. . . end; end select; 11. Задачи в АДА, механизм рандеву 2015 v. 00 12
Пример. Задача «Поставщик. Потребитель» Поставщик . Буфер Текущий. Чтение . . . Потребитель Текущий. Запись task body Поставщик. Потребитель; Размер: constant INTEGER = 20; Буфер: array(0. . Размер) of СООБЩЕНИЕ; Текущий. Запись, Текущий. Чтение: INTEGER = 0; Количество: INTEGER = 0; 11. Задачи в АДА, механизм рандеву 2015 v. 00 13
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 Поставщик. Потребитель; 11. Задачи в АДА, механизм рандеву 2015 v. 00 14
Оператор отбора среди входов select [when <условие>=>] <отбираемая альтернатива> [последовательность операторов] {or [when <условие>=>] <отбираемая альтернатива> [последовательность операторов]} [else последовательность операторов] end select; <отбираемая альтернатива>: • accept() • delay(<выражение, указывающее величину задержки> 11. Задачи в АДА, механизм рандеву 2015 v. 00 15
Отбор среди входов (опционально) 1. Открытый вход – вход, у которого условие входа в данный момент является истинным 2. Если нет ни открытых операторов задержки, ни фразы else, задача будет неопределенно долго ждать вызова входа, связанного с открытым оператором входа accept и обработает первый поступивший вызов 3. Если имеется открытый оператор задержки, задача будет ожидать вызова входа для открытого оператора входа в течение заданного временного интервала, а затем выполнит соответствующую альтернативу. 4. Если нет ни открытых альтернатив, ни фразы else, возникает исключительная ситуация SELECT_ERROR 5. Если нет открытого оператора задержки, но есть фраза else, то задача немедленно приступит к выполнению части else. 11. Задачи в АДА, механизм рандеву 2015 v. 00 16
Задача «Обедающие философы» 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 Вилка; 11. Задачи в АДА, механизм рандеву 2015 v. 00 17
Задача «Обедающие философы» 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 Философ; 11. Задачи в АДА, механизм рандеву 2015 v. 00 18
Задача «Обедающие философы» -- Инициирование задач begin for K in ID loop Философы(К). Получить. Номер(К); end loop; end Обедающие. Философы; Если все пять философов одновременно выполнят действие (*), то возникает тупиковая ситуация 11. Задачи в АДА, механизм рандеву 2015 v. 00 19
Задача «Обедающие философы» task body Хозяин; I: INTEGER: = 0; begin loop select when(I<4)=> accept Войти; I: = I + 1; or accept Выйти; I: = I - 1; end loop; end Хозяин; (Задание: Прописать использование задачи «Хозяин» в программе «Обедающие. Философы» ) 11. Задачи в АДА, механизм рандеву 2015 v. 00 20
Srv_11_15_02_Рандеву в _Ада.ppt