Справочник Ada 2012
D.5.1 Динамические приоритеты задач
Этот подраздел описывает, как базовый приоритет задачи может быть изменён или запрошен во время выполнения.
Статическая семантика
Существует следующее определяемое языком библиотечное пакет:
with System;
with Ada.Task_Identification; -- См. C.7.1
package Ada.Dynamic_Priorities is
pragma Preelaborate(Dynamic_Priorities);
with Ada.Task_Identification; -- См. C.7.1
package Ada.Dynamic_Priorities is
pragma Preelaborate(Dynamic_Priorities);
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 для случая без прерывания, в циклах процессорного такта. Это измеряется для вызова, который изменяет приоритет готовой задачи, которая не выполняется (которая не может быть вызывающей), где новый базовый приоритет затронутой задачи ниже активного приоритета вызывающей задачи, и затронутая задача не находится в очереди входа и не выполняет защищённую операцию.
ПРИМЕЧАНИЯ
26 Установка базового приоритета задачи влияет на планирование задач. Во-первых, это может изменить активный приоритет задачи. Во-вторых, при политике FIFO_Within_Priorities это всегда приводит к перемещению задачи в конец очереди готовности, соответствующей её активному приоритету, даже если новый базовый приоритет не изменился.
27 При политике очереди по приоритетам установка базового приоритета задачи влияет на вызов очереди входа, если задача заблокирована, ожидая вызова. То есть, установка базового приоритета задачи обновляет приоритет вызова очереди входа от этой задачи, удаляет и затем снова вставляет вызов в очередь входа по новому приоритету (см. D.4), если вызов не исходит от вызывающего_выражения асинхронного_выбора.
28 Эффект двух или более вызовов Set_Priority, выполняемых параллельно для одной и той же задачи, определяется как выполнение этих вызовов в некотором последовательном порядке.
29 Правило, когда генерируется Tasking_Error для Set_Priority или Get_Priority, отличается от правила, когда Tasking_Error генерируется при вызове входа (см. 9.5.3). В частности, разрешено запрос приоритета завершённой или аномальной задачи, пока задача ещё не завершена, и разрешено изменение приоритета задачи для любого состояния задачи (включая завершённые задачи).
30 Изменение приоритетов набора задач может выполняться серией вызовов Set_Priority для каждой задачи по отдельности. Для надёжной работы это должно выполняться в защищённой операции, которая имеет достаточно высокий приоритет ограничения, чтобы гарантировать, что операция завершается без прерывания ни одной из затронутых задач.