Справочник по Ada (Ada 2022)
D.5.1 Динамические приоритеты задач
Данный подпункт описывает, как базовый приоритет задачи может быть изменён или запрошен во время выполнения.
Статическая семантика
Существует следующее языко-определённый библиотечный пакет:
with System;
with Ada.Task_Identification; -- См. C.7.1
package Ada.Dynamic_Priorities
with Preelaborate, Nonblocking, Global => in out synchronized is
with Ada.Task_Identification; -- См. C.7.1
package Ada.Dynamic_Priorities
with Preelaborate, Nonblocking, Global => in out synchronized is
procedure Set_Priority(Priority : in System.Any_Priority;
T : in Ada.Task_Identification.Task_Id :=
Ada.Task_Identification.Current_Task);
T : in Ada.Task_Identification.Task_Id :=
Ada.Task_Identification.Current_Task);
function Get_Priority (T : Ada.Task_Identification.Task_Id :=
Ada.Task_Identification.Current_Task)
return System.Any_Priority;
Ada.Task_Identification.Current_Task)
return System.Any_Priority;
end Ada.Dynamic_Priorities;
Динамическая семантика
Процедура Set_Priority устанавливает базовый приоритет указанной задачи на заданное значение Priority. Set_Priority не оказывает никакого влияния, если задача завершена.
Функция Get_Priority возвращает текущий базовый приоритет задачи T. Если задача завершена, возникает исключение Tasking_Error.
Program_Error возникает в Set_Priority и Get_Priority, если T равно Null_Task_Id.
В системе с одним процессором установка базового приоритета задачи T на новое значение происходит немедленно в первой точке, когда T находится вне выполнения защищённого действия.
Пункт 11 был удалён.
Ошибка выполнения
Если любая подпрограмма в этом пакете вызывается с параметром T, который указывает на объект задачи, который больше не существует, выполнение программы является ошибочным.
Требования к документации
В многопроцессорной системе реализация должна документировать любые условия, которые заставляют завершение установки приоритета задачи быть отложенным позже, чем это указано для однопроцессорной системы.
Метрики
Реализация должна документировать следующие метрики:
- Время выполнения вызова Set_Priority, в случае отсутствия прерывания, в тактах процессора. Это измеряется для вызова, который изменяет приоритет готовой задачи, которая не выполняется (которая не может быть вызывающей), где новый базовый приоритет затронутой задачи ниже активного приоритета вызывающей задачи, и затронутая задача не находится в очереди на входе и не выполняет защищённую операцию.
ПРИМЕЧАНИЕ 1 Установка базового приоритета задачи влияет на диспетчеризацию задач. Во-первых, это может изменить активный приоритет задачи. Во-вторых, в соответствии с политикой FIFO_Within_Priorities это всегда приводит к перемещению задачи в конец очереди готовности, соответствующей её активному приоритету, даже если новый базовый приоритет не изменился.
ПРИМЕЧАНИЕ 2 В соответствии с политикой очереди приоритетов установка базового приоритета задачи оказывает влияние на вызов очереди входа, если задача заблокирована в ожидании вызова. То есть, установка базового приоритета задачи обновляет приоритет вызова очереди входа от этой задачи, удаляет вызов и затем вставляет его обратно в очередь входа по новому приоритету (см. D.4), если вызов не произошёл от triggering_statement asynchronous_select.
ПРИМЕЧАНИЕ 3 Эффект двух или более вызовов Set_Priority, выполняемых параллельно для одной и той же задачи, определяется как выполнение этих вызовов в некотором последовательном порядке.
ПРИМЕЧАНИЕ 4 Правило, когда возникает Tasking_Error для Set_Priority или Get_Priority, отличается от правила, когда Tasking_Error возникает при вызове входа (см. 9.5.3). В частности, приоритет завершённой или аномальной задачи может быть запрошен, пока задача ещё не завершена, и приоритет задачи может быть установлен в любом состоянии задачи (включая завершённые задачи).
ПРИМЕЧАНИЕ 5 Изменение приоритетов набора задач может выполняться последовательностью вызовов Set_Priority для каждой задачи по отдельности. Это можно сделать надёжно в рамках защищённой операции, которая имеет достаточно высокий приоритет ограничения, чтобы гарантировать, что операция завершится без прерывания ни одной из затронутых задач.