Spec-Zone.ru › Ada 2022
Справочник по 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
procedure Set_Priority(Priority : in System.Any_Priority;
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;
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 для каждой задачи по отдельности. Это можно сделать надёжно в рамках защищённой операции, которая имеет достаточно высокий приоритет ограничения, чтобы гарантировать, что операция завершится без прерывания ни одной из затронутых задач.


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API