Справочник по Ada (Ada 2022)
D.14.2 Бюджеты времени выполнения группы задач
Этот подраздел описывает пакет, определённый языком, для назначения бюджетов времени выполнения группам задач.
Статическая семантика
Существует следующий пакет библиотеки, определённый языком:
with System;
with System.Multiprocessors;
package Ada.Execution_Time.Group_Budgets
with Nonblocking, Global => in out synchronized is
with System.Multiprocessors;
package Ada.Execution_Time.Group_Budgets
with Nonblocking, Global => in out synchronized is
type Group_Budget(CPU : System.Multiprocessors.CPU :=
System.Multiprocessors.CPU'First)
is tagged limited private;
System.Multiprocessors.CPU'First)
is tagged limited private;
type Group_Budget_Handler is access
protected procedure (GB : in out Group_Budget)
with Nonblocking => False;
protected procedure (GB : in out Group_Budget)
with Nonblocking => False;
type Task_Array is array (Positive range <>) of
Ada.Task_Identification.Task_Id;
Ada.Task_Identification.Task_Id;
Min_Handler_Ceiling : constant System.Any_Priority :=
определяется реализацией;
определяется реализацией;
procedure Add_Task (GB : in out Group_Budget;
T : in Ada.Task_Identification.Task_Id);
procedure Remove_Task (GB: in out Group_Budget;
T : in Ada.Task_Identification.Task_Id);
function Is_Member (GB : Group_Budget;
T : Ada.Task_Identification.Task_Id) return Boolean;
function Is_A_Group_Member
(T : Ada.Task_Identification.Task_Id) return Boolean;
function Members (GB : Group_Budget) return Task_Array;
T : in Ada.Task_Identification.Task_Id);
procedure Remove_Task (GB: in out Group_Budget;
T : in Ada.Task_Identification.Task_Id);
function Is_Member (GB : Group_Budget;
T : Ada.Task_Identification.Task_Id) return Boolean;
function Is_A_Group_Member
(T : Ada.Task_Identification.Task_Id) return Boolean;
function Members (GB : Group_Budget) return Task_Array;
procedure Replenish (GB : in out Group_Budget; To : in Time_Span);
procedure Add (GB : in out Group_Budget; Interval : in Time_Span);
function Budget_Has_Expired (GB : Group_Budget) return Boolean;
function Budget_Remaining (GB : Group_Budget) return Time_Span;
procedure Add (GB : in out Group_Budget; Interval : in Time_Span);
function Budget_Has_Expired (GB : Group_Budget) return Boolean;
function Budget_Remaining (GB : Group_Budget) return Time_Span;
procedure Set_Handler (GB : in out Group_Budget;
Handler : in Group_Budget_Handler);
function Current_Handler (GB : Group_Budget)
return Group_Budget_Handler;
procedure Cancel_Handler (GB : in out Group_Budget;
Cancelled : out Boolean);
Handler : in Group_Budget_Handler);
function Current_Handler (GB : Group_Budget)
return Group_Budget_Handler;
procedure Cancel_Handler (GB : in out Group_Budget;
Cancelled : out Boolean);
Group_Budget_Error : exception;
private
-- не указано языком
end Ada.Execution_Time.Group_Budgets;
-- не указано языком
end Ada.Execution_Time.Group_Budgets;
Тип Group_Budget представляет собой бюджет времени выполнения, который должен использоваться группой задач. Тип Group_Budget требует завершения (см. 7.6). Задача может принадлежать не более чем одной группе. В группу могут быть добавлены задачи любой приоритетности.
Объект типа Group_Budget имеет связанное неотрицательное значение типа Time_Span, известное как его бюджет, которое изначально равно Time_Span_Zero. Тип Group_Budget_Handler идентифицирует защищённую процедуру, которая должна быть выполнена реализацией, когда бюджет исчерпан, то есть достигает нуля. Такая защищённая процедура называется обработчиком.
Объект типа Group_Budget также включает обработчик, который является значением типа Group_Budget_Handler. Обработчик объекта считается установленным, если он не равен null, и сброшенным в противном случае. Обработчик всех объектов Group_Budget изначально сброшен.
Динамическая семантика
Процедура Add_Task добавляет задачу, идентифицированную T, в группу GB; если эта задача уже является членом другой группы, возникает Group_Budget_Error.
Процедура Remove_Task удаляет задачу, идентифицированную T, из группы GB; если эта задача не является членом группы GB, возникает Group_Budget_Error. После успешного выполнения этой процедуры задача больше не является членом какой-либо группы.
Функция Is_Member возвращает True, если задача, идентифицированная T, является членом группы GB; в противном случае она возвращает False.
Функция Is_A_Group_Member возвращает True, если задача, идентифицированная T, является членом какой-либо группы; в противном случае она возвращает False.
Функция Members возвращает массив значений типа Task_Identification.Task_Id, идентифицирующих членов группы GB. Порядок компонентов массива не определён.
Процедура Replenish загружает бюджет группы GB значением To в качестве Time_Span. Исключение Group_Budget_Error возникает, если значение Time_Span To не положительно. Любое выполнение на процессоре любого члена группы задач приводит к уменьшению бюджета, если он не исчерпан. Когда бюджет исчерпан (достигает Time_Span_Zero), связанный обработчик выполняется, если обработчик группы бюджета GB установлен. Тем не менее, задачи продолжают выполняться.
Процедура Add изменяет бюджет группы GB. Положительное значение Interval увеличивает бюджет. Отрицательное значение Interval уменьшает бюджет, но никогда не ниже Time_Span_Zero. Нулевое значение Interval не оказывает никакого влияния. Вызов процедуры Add, в результате которого значение бюджета становится равным Time_Span_Zero, приводит к выполнению связанного обработчика, если обработчик группы бюджета GB установлен.
Функция Budget_Has_Expired возвращает True, если бюджет группы GB исчерпан (равен Time_Span_Zero); в противном случае она возвращает False.
Функция Budget_Remaining возвращает оставшийся бюджет для группы GB. Если бюджет исчерпан, она возвращает Time_Span_Zero. Это минимальное значение для бюджета.
Процедура Set_Handler связывает обработчик Handler с Group_Budget GB: если Handler равен null, обработчик Group_Budget сбрасывается; в противном случае он устанавливается.
Вызов Set_Handler для Group_Budget, у которой уже установлен обработчик, заменяет обработчик; если Handler не равен null, обработчик для Group_Budget остаётся установленным.
Функция Current_Handler возвращает обработчик, связанный с бюджетом группы GB, если обработчик для этой группы бюджета установлен; в противном случае она возвращает null.
Процедура Cancel_Handler сбрасывает обработчик для бюджета группы, если он установлен. Cancelled получает значение True, если обработчик группы бюджета был установлен до его сброса; в противном случае ему присваивается False.
Константа Min_Handler_Ceiling является минимальным приоритетом потолка, необходимым для защищённого объекта с обработчиком, чтобы гарантировать, что нарушение потолка не произойдёт при вызове этого обработчика.
Точность учёта времени выполнения задачи для Group_Budget такая же, как определена для таймеров времени выполнения из родительского пакета.
В рамках завершения объекта типа Group_Budget все задачи-члены удаляются из группы, идентифицируемой этим объектом.
Если задача является членом Group_Budget при завершении, то в рамках завершения задачи она удаляется из группы.
Для всех операций, определённых в этом пакете, Tasking_Error возникает, если задача, идентифицированная T, завершена, а Program_Error возникает, если значение T равно Task_Identification.Null_Task_Id.
Исключение, переданное от обработчика, вызванного при исчерпании бюджета группы задач, не имеет эффекта.
Ошибка выполнения
При вызове любой из подпрограмм, определённых в этом пакете, если задача, идентифицированная T, больше не существует, выполнение программы является ошибочным.
Требования к реализации
Для данного объекта Group_Budget реализация должна выполнять объявленные в этом пакете операции атомарно по отношению к любой из этих операций над тем же объектом Group_Budget. Замена обработчика путём вызова Set_Handler должна выполняться атомарно по отношению к выполнению обработчика.
ПРИМЕЧАНИЕ 1 Сброс или установка обработчика бюджета группы не изменяют текущее значение бюджета. Исчерпание или загрузка бюджета не изменяют, установлен ли обработчик бюджета группы или нет.
ПРИМЕЧАНИЕ 2 Обработчик Group_Budget_Handler может быть связан с несколькими объектами Group_Budget.