Справочник по Ada 2005
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 находится вне выполнения защищённого действия.
Ограниченные (времени выполнения) ошибки
Этот абзац был удалён.
Ошибочное выполнение
Если любая подпрограмма в этом пакете вызывается с параметром T, который указывает на объект задачи, который больше не существует, выполнение программы является ошибочным.
Требования к документации
В многопроцессорной системе реализация должна документировать любые условия, которые приводят к задержке завершения установки приоритета задачи позже, чем указано для однопроцессорной системы.
Метрики
Реализация должна документировать следующую метрику:
- Время выполнения вызова Set_Priority, для случая без прерывания, в тактах процессора. Это измеряется для вызова, который изменяет приоритет готовой задачи, которая не выполняется (которая не может быть вызывающей), где новый базовый приоритет затронутой задачи ниже активного приоритета вызывающей задачи, и затронутая задача не находится в очереди ожидания и не выполняет защищённую операцию.
ПРИМЕЧАНИЯ
26 Установка базового приоритета задачи влияет на диспетчеризацию задач. Во-первых, это может изменить активный приоритет задачи. Во-вторых, в соответствии с политикой FIFO_Within_Priorities это всегда приводит к перемещению задачи в конец очереди готовности, соответствующей её активному приоритету, даже если новый базовый приоритет не изменился.
27 В соответствии с политикой очереди по приоритетам, установка базового приоритета задачи влияет на вызов очереди входа, если задача заблокирована в ожидании вызова. То есть, установка базового приоритета задачи приводит к обновлению приоритета вызова очереди входа от этой задачи и удалению вызова, а затем его повторной вставке в очередь входа с новым приоритетом (см. D.4), за исключением вызова, исходящего от triggering_statement asynchronous_select.
28 Эффект двух или более вызовов Set_Priority, выполняемых параллельно на одной задаче, определяется как выполнение этих вызовов в некотором последовательном порядке.
29 Правило того, когда генерируется Tasking_Error для Set_Priority или Get_Priority, отличается от правила генерации Tasking_Error при вызове входа (см. 9.5.3). В частности, разрешается настройка или запрос приоритета завершённой или аномальной задачи, до тех пор пока задача ещё не завершена.
30 Изменение приоритетов набора задач может выполняться серией вызовов Set_Priority для каждой задачи отдельно. Для надёжной работы это должно выполняться в рамках защищённой операции, которая имеет достаточно высокий приоритет, чтобы гарантировать завершение операции без прерывания любой из затронутых задач.