Справочник по Ada 2012
D.1 Приоритеты задач
В этом подпункте задается модель приоритетов для систем реального времени. Кроме того, определяются методы задания приоритетов.
Абзацы с 2 по 6 перемещены в Приложение J, «Устаревшие функции».
Статическая семантика
Для типа задачи (включая анонимный тип объявления single_task_declaration), защищенного типа (включая анонимный тип объявления single_protected_declaration) или подпрограммы могут быть указаны следующие аспекты представления, определенные языком:
Приоритет
Аспект Priority — это выражение, которое должно иметь тип Integer.
Приоритет_прерывания
Аспект Interrupt_Priority — это выражение, которое должно иметь тип Integer.
Правила легальности
Этот абзац был удален.
Если для подпрограммы задан аспект Priority, то выражение должно быть статическим, а его значение должно находиться в диапазоне System.Priority.
Для данного объекта может быть указан только один из аспектов Priority и Interrupt_Priority.
Для типа синхронизированного интерфейса не должен быть задан ни один из аспектов Priority или Interrupt_Priority.
Статическая семантика
В пакете System существуют следующие объявления:
подтип Any_Priority является Integer в диапазоне определяемом реализацией;
подтип Priority является Any_Priority
в диапазоне Any_Priority'First .. определяемом реализацией;
подтип Interrupt_Priority является Any_Priority
в диапазоне Priority'Last+1 .. Any_Priority'Last;
подтип Priority является Any_Priority
в диапазоне Any_Priority'First .. определяемом реализацией;
подтип Interrupt_Priority является Any_Priority
в диапазоне Priority'Last+1 .. Any_Priority'Last;
Default_Priority : константа Priority := (Priority'First + Priority'Last)/2;
Полный диапазон значений приоритетов, поддерживаемых реализацией, задается подтипом Any_Priority. Диапазон значений приоритетов, достаточный для блокировки одного или нескольких прерываний, задаётся подтипом Interrupt_Priority. Диапазон значений приоритетов ниже System.Interrupt_Priority'First задаётся подтипом System.Priority.
Этот абзац был удалён.
Динамическая семантика
Аспект Priority не оказывает никакого влияния, если он задан для подпрограммы, отличной от главной подпрограммы; значение Priority не ассоциируется ни с какой задачей.
Приоритет задачи — это целочисленное значение, которое указывает на степень срочности и служит основой для разрешения конфликтов задач при запросе ресурсов. Если не указано иное, при конкуренции задач за процессоры или другие ресурсы, определённые реализацией, ресурсы распределяются задаче с наивысшим значением приоритета. Базовый приоритет задачи — это приоритет, с которым она была создана или который был позже задан с помощью Dynamic_Priorities.Set_Priority (см. D.5). В любое время задача также имеет активный приоритет, который, как правило, отражает её базовый приоритет, а также любой приоритет, унаследованный от других источников. Наследование приоритетов — это процесс, в котором приоритет задачи или другого объекта (например, защищённого объекта; см. D.3) используется при оценке активного приоритета другой задачи.
Влияние задания аспектов Priority или Interrupt_Priority для защищённого типа или объявления single_protected_declaration обсуждается в D.3.
Выражение, заданное для аспекта Priority или Interrupt_Priority типа задачи, вычисляется каждый раз при создании объекта типа задачи (см. 9.1). Для аспекта Priority значение выражения преобразуется к подтипу Priority; для аспекта Interrupt_Priority это значение преобразуется к подтипу Any_Priority. Затем значение приоритета связывается с объектом задачи.
Аналогично, значение приоритета связывается с задачей окружения, если аспект задан для главной подпрограммы.
Начальное значение базового приоритета задачи задаётся по умолчанию или с помощью аспекта Priority или Interrupt_Priority. После создания задачи её базовый приоритет может быть изменён только вызовом Dynamic_Priorities.Set_Priority (см. D.5). Начальный базовый приоритет задачи в отсутствие аспекта — это базовый приоритет задачи, создавшей её, на момент создания (см. 9.1). Если аспект Priority не задан для главной подпрограммы, начальный базовый приоритет задачи окружения — System.Default_Priority. Активный приоритет задачи используется при конкуренции задач за процессоры. Аналогично, активный приоритет задачи используется для определения позиции задачи в очереди, когда задан Priority_Queuing (см. D.4).
В любой момент времени активный приоритет задачи — это максимальное значение всех приоритетов, которые задача унаследовала в этот момент. Для задачи, которая не удерживается (см. D.11), её базовый приоритет является источником наследования приоритета, если не указано иное для конкретной политики диспетчеризации задач. Другие источники наследования приоритета указаны в следующих условиях:
- При активации активируемая задача наследует активный приоритет, который имел её активатор (см. 9.2) на момент инициации активации.
- Во время защищенного действия над защищенным объектом задача наследует приоритет потолка защищённого объекта (см. 9.5 и D.3).
Во всех этих случаях наследование приоритета прекращается, как только условие, вызвавшее наследование, больше не существует.
Требования к реализации
Диапазон System.Interrupt_Priority должен включать по крайней мере одно значение.
Диапазон System.Priority должен включать по крайней мере 30 значений.
ПРИМЕЧАНИЯ
4 Выражение приоритета может включать ссылки на дискриминанты окружающего типа.
5 Из правил активного приоритета следует, что в момент, когда задача прекращает наследование приоритета от другого источника, её активный приоритет переоценивается. Это дополнительно к другим случаям, описанным в этом приложении, для такой переоценки.
6 Реализация может предоставить нестандартный режим, в котором задачи наследуют приоритеты при условиях, отличных от указанных выше.