Глава 9. ЗАДАЧИ

Содержание

9.1. СПЕЦИФИКАЦИИ ЗАДАЧ И ТЕЛА ЗАДАЧ
9.2. ЗАДАННЫЕ ТИПЫ И ЗАДАЧНЫЕ ОБЪЕКТЫ
9.3. ВЫПОЛНЕНИЕ И АКТИВИЗАЦИЯ ЗАДАЧИ
9.4. ЗАВИСИМОСТЬ ЗАДАЧ. ЗАВЕРШЕНИЕ ЗАДАЧ
9.5. ВХОДЫ, ВЫЗОВЫ ВХОДОВ И ОПЕРАТОРЫ ПРИНЯТИЯ
9.6. ОПЕРАТОРЫ ЗАДЕРЖКИ, ДЛИТЕЛЬНОСТЬ И ВРЕМЯ
9.7. ОПЕРАТОРЫ ОТБОРА
9.7.2. УСЛОВНЫЕ ВЫЗОВЫ ВХОДОВ
9.8. ПРИОРИТЕТЫ
9.9. АТРИБУТЫ ЗАДАЧ И ВХОДОВ
9.10. ОПЕРАТОРЫ ПРЕКРАЩЕНИЯ
9.11. РАЗДЕЛЯЕМЫЕ ПЕРЕМЕННЫЕ
9.12. ПРИМЕР ИСПОЛЬЗОВАНИЯ ЗАДАЧИ

Выполнение программы без задач определено в терминах последовательного выполнения ее действий в соответствии с правилами, сформулированными в других главах данного руководства. Можно предположить, что эти действия выполняет один логический процессор.

Под параллельным выполнением задач понимают следующее. Предполагается, что каждую задачу выполняет отдельный логический процессор. Различные задачи (на различных логических процессорах) выполняются независимо, за исключением точек их синхронизации.

Некоторые задачи могут иметь входы. Вход задачи может быть вызван другими задачами. Задача принимает вызов одного из своих входов выполнением оператора принятия этого входа. Синхронизация достигается посредством рандеву между задачей, вызывающей вход, и задачей, принимающей вызов. Некоторые входы имеют параметры; вызовы и операторы принятия таких входов, имеющих параметры, являются основным средством обмена значениями между задачами.

Свойства каждой задачи определяются соответствующим задачным модулем, который состоит из спецификации задачи и тела задачи. Задачные модули представляют собой одну из четырех форм программных модулей, из которых может состоять программа. Другие три формы — это подпрограммы, пакеты и настраиваемые модули. В данной главе описываются свойства задачных модулей, задач и входов и операторы, влияющие на взаимодействие задач (т. е. операторы вызова входов, принятия, задержки, отбора и прекращения).

Примечание. Параллельные задачи (параллельные логические процессоры) могут быть реализованы на многомашинных комплексах, многопроцессорных ЭВМ или чередующимся выполнением на одном физическом процессоре. С другой стороны, если реализация способна определить, что тот же результат получается при параллельном выполнении частей одной задачи на различных физических процессорах, то можно принять и такой способ выполнения;в этом случае несколько физических процессоров реализуют один логический процессор.

Ссылки: вход 9.5, настраиваемый модуль 12, оператор вызова входа 9.5, оператор задержки 9.6, оператор прекращения 9.10, оператор принятия 9.5, оператор отбора 9.7, пакет 7, подпрограмма б, программный модуль 6, рандеву 9.5, спецификация задачи 9.1, тело задачи 9.1.

9.1. СПЕЦИФИКАЦИИ ЗАДАЧ И ТЕЛА ЗАДАЧ

Задачный модуль состоит из спецификации задачи и тела задачи. Спецификация задачи, которая начинается зарезервированными словами task type, описывает задачный тип. Значение объекта задачного типа указывает задачу. Если задача имеет входы, то они описываются в спецификации задачи; эти входы также называются входами объекта. Выполнение задачи определяется соответствующим телом задачи.

Спецификация задачи без зарезервированного слова type определяет одну задачу. Описание такой задачи эквивалентно описанию анонимного задачного типа одновременно с описанием объекта этого задачного типа, а идентификатор задачного модуля именует объект. В остальной части данной главы пояснения даются в терминах описаний задачного типа; соответствующие пояснения для одной задачи следуют из упомянутого отношения эквивалентности.

описание-задачи ::== спецификация-задачи;спецификация - задачи :: =   task [type] идентификатор [is      {описание - входа}      {спецификатор - представления}    end [простое-имя-задачи]]тело-задачи ::=   task body простое-имя-задачи is      [раздел - описаний]    begin      последовательность - операторов   [exception      обработчик - исключения      {обработчик-исключения}]   end [простое-имя-задачи];

Простое имя в начале тела задачи должно совпадать с идентификатором задачного моду-ля. Аналогично если в конце спецификации или тела задачи появляется простое имя, то оно должно совпадать с идентификатором задачного модуля. Внутри тела задачи имя соответствующего задачного модуля может быть также использовано для ссылки на объект-задачу (указывать на задачу), тело которой выполняется в данный момент; кроме того, не допускается использование этого имени в качестве обозначения типа внутри собственного задачного модуля.[7]

При предвыполнении спецификации задачи описания входов и спецификаторы представления (если они есть) предвыполняются в том порядке, в котором они даны. Спецификаторы представления применяются только к входам, описанным в спецификации задачи (см. 13.5).

Предвыполнение тела задачи не имеет никакого другого результата, кроме установления, что тело с этих пор может быть использовано для выполнения задач, указанных объектами соответствующего задачного типа.

Выполнение тела задачи вызывается активизацией задачного объекта соответствующего типа (см. 9.3). Возможные в конце тела задачи обработчики исключений обрабатывают исключения, возбуждаемые в ходе выполнения последовательности операторов тела задачи (см. 11.4).

Примеры спецификации задачных типов:

task type RESOURCE is   entry SEIZE;   entry RELEASE;end RESOURCE;task type KEYBOARD_DRIVER is   entry READ (C : out CHARACTER);   entry WRITE (C : In   CHARACTER);endKEYBOARD_DRIVER;

Примеры спецификации одной задачи:

task PRODUCER_CONSUMER is   entry READ (V : out ITEM);   entry WRITE (E : in  ITEM);end;task CONTROLLER is   entry REQUEST(LEVEL)(D : ITEM); -— семейство ВХОДОВ end CONTROLLER;task USER;  -— не имеет входов

Пример спецификации задачи и соответствующего тела:

task PROTECTED_ARRAY is   -— INDEX and ITEM — это глобальные типы   entry READ (N : in INDEX; V : out ITEM);   entry WRITE (N : In INDEX; E : in  ITEM);end;task body PROTECTED_ARRAY is   TABLE : array(INDEX) of ITEM := (INDEX => NULL_ITEM);begin   loop       select         accept READ (N : in INDEX; V : out ITEM) do             V := TABLE(N);         end READ;      or         accept WRITE (N : in INDEX; E : in   ITEM) do             TABLE(N) := E;         end WRITE;      end select;   end loop;end PROTECTED_ARRAY;

Примечание. Спецификация задачи задает интерфейс задачам данного типа с другими задачами тех же или различных типов, а также с главной программой.

Ссылки: вход 9.5, главная программа 10.1, зарезервированное слово 2.9, идентификатор 2.3, обработчик исключения 11.2, объект 3.2, описание 3.1, описание входа 9.5, описание объекта 3.2.1, описание типа 3.3.1, последовательность операторов 5.1, предвыполнение 3.9, простое имя 4.1, раздел описаний 3.9, спецификатор представления 13.1, тип 3.3.



[7] 1) Кроме того, оно не может быть использовано в качестве производного от него типа или подтипа. - Прим. ред.