Spec-Zone.ru › Ada 2022
Руководство по Ada (Ada 2022)

D.2.6 Распределение по принципу наименьшего срока выполнения

Срок выполнения задачи указывает на степень срочности задачи; он представляет точку на идеальной временной шкале. Срок выполнения может влиять на то, как ресурсы распределяются задаче.
Этот подраздел представляет пакет Dispatching.EDF, предназначенный для представления срока выполнения задачи и политики распределения, определяющей распределение по принципу наименьшего срока выполнения (EDF). Аспект Relative_Deadline используется для назначения начального срока выполнения задаче. Пragma Generate_Deadlines используется для задания конфигурации, в которой срок выполнения задачи пересчитывается всякий раз, когда задача становится готовой.
Абзацы с 3 по 6 перенесены в Приложение J, «Устаревшие функции».

Статическая семантика

policy_идентификатор EDF_Within_Priorities — это политика распределения задач.
Существует следующий пакет библиотеки, определённый языком:
with Ada.Real_Time;
with Ada.Task_Identification;
package Ada.Dispatching.EDF
with Nonblocking, Global => in out synchronized is
subtype Deadline is Ada.Real_Time.Time;
subtype Relative_Deadline is Ada.Real_Time.Time_Span;
Default_Deadline : constant Deadline :=
Ada.Real_Time.Time_Last;
Default_Relative_Deadline : constant Relative_Deadline :=
Ada.Real_Time.Time_Span_Last;
procedure Set_Deadline
(D : in Deadline;
T : in Ada.Task_Identification.Task_Id :=
Ada.Task_Identification.Current_Task);
function Get_Deadline
(T : Ada.Task_Identification.Task_Id :=
Ada.Task_Identification.Current_Task) return Deadline;
procedure Set_Relative_Deadline
(D : in Relative_Deadline;
T : in Ada.Task_Identification.Task_Id :=
Ada.Task_Identification.Current_Task);
function Get_Relative_Deadline
(T : Ada.Task_Identification.Task_Id :=
Ada.Task_Identification.Current_Task)
return Relative_Deadline;
procedure Delay_Until_And_Set_Deadline
(Delay_Until_Time : in Ada.Real_Time.Time;
Deadline_Offset : in Ada.Real_Time.Time_Span)
with Nonblocking => False;
function Get_Last_Release_Time
(T : Ada.Task_Identification.Task_Id :=
Ada.Task_Identification.Current_Task)
return Ada.Real_Time.Time;
end Ada.Dispatching.EDF;
Для подпрограммы, типа задачи (включая анонимный тип single_task_declaration) или защищенного типа (включая анонимный тип single_protected_declaration) можно указать следующий аспект представления, определённый языком:
Relative_Deadline

Аспект Relative_Deadline — это выражение, тип которого должен быть Real_Time.Time_Span.
Форма pragma Generate_Deadlines следующая:
pragma Generate_Deadlines;
Generate_Deadlines — это конфигурационное pragma.

Правила легальности

Аспект Relative_Deadline не должен быть указан для типа задачи или защищенного интерфейса. Если аспект Relative_Deadline указан для подпрограммы, то определение_аспекта должно быть статическим выражением.

Правила после компиляции

Если для раздела указана политика EDF_Within_Priorities, то для раздела также должна быть указана политика Ceiling_Locking (см. D.3).
Если политика EDF_Within_Priorities присутствует в pragma Priority_Specific_Dispatching (см. D.2.2) в разделе, то для раздела также должна быть указана политика Ceiling_Locking (см. D.3).

Динамическая семантика

Аспект Relative_Deadline не оказывает влияния, если он указан для подпрограммы, отличной от основной.
Если pragma Generate_Deadlines активно, срок выполнения задачи пересчитывается каждый раз, когда она становится готовой. Новый срок выполнения — это значение Real_Time.Clock в момент добавления задачи в очередь готовых задач плюс значение, возвращаемое Get_Relative_Deadline.
Начальный абсолютный срок выполнения задачи со специфицированным Relative_Deadline — это результат добавления значения, возвращаемого вызовом Real_Time.Clock, к значению выражения, указанного в аспекте Relative_Deadline, где всё это вычисление, включая вызов Real_Time.Clock, выполняется между созданием задачи и началом её активации. Если аспект Relative_Deadline не указан, то начальный абсолютный срок выполнения задачи — это значение Default_Deadline (Ada.Real_Time.Time_Last). Задача среды также получает начальный срок выполнения по этому правилу, используя значение аспекта Relative_Deadline основной подпрограммы (если таковой имеется).
Влияние указания аспекта Relative_Deadline для защищенного типа или single_protected_declaration обсуждается в D.3.
Задача имеет как активный, так и базовый абсолютный срок выполнения. Они совпадают, за исключением случаев, когда задача наследует относительный срок выполнения во время активации или rendez-vous (см. ниже), или внутри защищенного действия (см. D.3). Процедура Set_Deadline изменяет (базовый) абсолютный срок выполнения задачи на D. Функция Get_Deadline возвращает (базовый) абсолютный срок выполнения задачи.
Процедура Set_Relative_Deadline изменяет относительный срок выполнения задачи на D. Функция Get_Relative_Deadline возвращает относительный срок выполнения задачи.
Функция Get_Last_Release_Time возвращает время, предоставленное Real_Time.Clock, когда задача была последней сделана готовой (то есть, была добавлена в очередь готовых задач).
Процедура Delay_Until_And_Set_Deadline приостанавливает выполнение вызывающей задачи до времени Delay_Until_Time. Когда задача становится готовой снова, у неё будет срок выполнения Delay_Until_Time + Deadline_Offset.
В системе с одним процессором установка срока выполнения задачи на новое значение происходит немедленно в первой точке, которая находится вне выполнения защищённого действия. Если задача находится в очереди готовых задач, она удаляется и повторно добавляется в очередь готовых задач, определяемую правилами, определёнными ниже.
Когда для приоритета указан EDF_Within_Priorities, очередь готовых задач для этого приоритета упорядочивается по сроку выполнения. Задача в начале очереди — это задача с самым ранним сроком выполнения.
Точка распределения задач возникает для текущей выполняющейся задачи T, к которой применяется политика EDF_Within_Priorities:
  • когда происходит изменение базового (абсолютного) срока выполнения T;
  • Этот абзац был удалён.
  • существует непустая очередь готовых задач для этого процессора с более высоким приоритетом, чем активный приоритет выполняющейся задачи;
  • есть готовая задача с таким же приоритетом, как у T, но с более ранним абсолютным сроком выполнения.
В этих случаях текущая выполняющаяся задача считается прерванной и возвращается в очередь готовых задач для её активного приоритета в позиции, определяемой её активным (абсолютным) сроком выполнения.
Абзацы с 23 по 27 были удалены.
Когда вступает в силу установка базового приоритета готовой задачи, и новый приоритет задан как EDF_Within_Priorities, задача добавляется в очередь готовых задач в позиции, определяемой её активным сроком выполнения.
Для всех операций, определённых в Dispatching.EDF, Tasking_Error поднимается, если задача, идентифицированная T, завершила свою работу. Program_Error поднимается, если значение T равно Null_Task_Id.
Если две задачи с приоритетом, обозначенным как EDF_Within_Priorities, выполняют rendezvous, то срок выполнения для выполнения оператора accept — это более ранний из сроков выполнения двух задач.
Во время активации активируемая задача наследует срок выполнения, который был у её активатора (см. 9.2) в момент начала активации.
Абзац 30 был удалён.

Ошибочное выполнение

Если значение Task_Id передаётся в качестве параметра любой из подпрограмм этого пакета, и соответствующий объект задачи больше не существует, выполнение программы является ошибочным.

Требования к документации

В многопроцессорной системе реализация должна документировать любые условия, которые приводят к задержке завершения установки срока выполнения задачи позже, чем указано для однопроцессорной системы.
ПРИМЕЧАНИЕ Если для двух разных приоритетов указана политика EDF_Within_Priorities, то задачи с более высоким приоритетом всегда выполняются перед задачами с более низким приоритетом, независимо от сроков выполнения.
Этот абзац был удалён.


Spec-Zone.ru

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