Руководство по Ada (Ada 2022)
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 существуют следующие объявления:
subtype Любой_Приоритет is Integer range определяется реализацией;
subtype Приоритет is Любой_Приоритет
range Любой_Приоритет'First .. определяется реализацией;
subtype Приоритет_прерывания is Любой_Приоритет
range Приоритет'Last+1 .. Любой_Приоритет'Last;
subtype Приоритет is Любой_Приоритет
range Любой_Приоритет'First .. определяется реализацией;
subtype Приоритет_прерывания is Любой_Приоритет
range Приоритет'Last+1 .. Любой_Приоритет'Last;
По умолчанию_Приоритет : constant Приоритет := (Приоритет'First + Приоритет'Last)/2;
Полный диапазон значений приоритета, поддерживаемый реализацией, задаётся подтипом Любой_Приоритет. Диапазон значений приоритета, достаточный для блокирования одного или нескольких прерываний, задаётся подтипом Приоритет_прерывания. Диапазон значений приоритета ниже 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 это значение преобразуется в подтип Любой_Приоритет. Затем значение приоритета ассоциируется с объектом задачи.
Аналогично, значение приоритета ассоциируется с задачей среды, если аспект задан для главной подпрограммы.
Начальное значение базового приоритета задачи задаётся по умолчанию или с помощью аспекта Priority или Interrupt_Priority. После создания задачи её базовый приоритет может быть изменён только вызовом Dynamic_Priorities.Set_Priority (см. D.5). Начальный базовый приоритет задачи в отсутствие аспекта — это базовый приоритет создавшей её задачи на момент создания (см. 9.1). Если аспект Priority не задан для главной подпрограммы, то начальный базовый приоритет задачи среды — System.По умолчанию_Приоритет. Активный приоритет задачи используется, когда она конкурирует за процессоры. Аналогично, активный приоритет задачи используется для определения позиции задачи в очереди, когда задан Priority_Queuing (см. D.4).
В любое время активный приоритет задачи — это максимальное из всех приоритетов, которые она наследует в данный момент. Для задачи, которая не удерживается (см. D.11), её базовый приоритет является источником наследования приоритетов, если не указано иное для конкретной политики диспетчеризации задач. Другие источники наследования приоритетов указаны в следующих условиях:
- При активации задача, которая активируется, наследует активный приоритет, который имел её активатор (см. 9.2) в момент инициации активации.
- При rendez-vous задача, принимающая вызов входа, наследует приоритет вызова входа (см. 9.5.3 и D.4).
- При запуске защищенного действия над защищенным объектом, когда вступает в силу политика FIFO_Spinning, задача наследует потолочный приоритет защищенного объекта (см. 9.5, D.3 и D.4.1).
- В то время как задача выполняет защищенное действие над защищенным объектом, задача наследует потолочный приоритет защищенного объекта (см. 9.5 и D.3).
Во всех этих случаях наследование приоритета прекращается, как только условие, вызывающее наследование, перестаёт существовать.
Требования к реализации
Диапазон System.Interrupt_Priority должен включать как минимум одно значение.
Диапазон System.Priority должен включать как минимум 30 значений.
ПРИМЕЧАНИЕ 1 Выражение приоритета может включать ссылки на дискриминанты окружающего типа.
ПРИМЕЧАНИЕ 2 Из правил активного приоритета следует, что в момент, когда задача прекращает наследование приоритета от другого источника, её активный приоритет переоценивается. Это помимо других случаев, описанных в этом приложении, для такой переоценки.
ПРИМЕЧАНИЕ 3 Реализация может предоставить нестандартный режим, в котором задачи наследуют приоритеты при условиях, отличных от указанных выше.