Spec-Zone.ru › Ada 2012
Справочник Ada 2012

D.14.2 Бюджеты времени выполнения группы задач

В этом подпункте описан пакет, определённый языком, для назначения бюджетов времени выполнения группам задач.

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

Существует следующий пакет библиотеки, определённый языком:
with System;
with System.Multiprocessors;
package Ada.Execution_Time.Group_Budgets is
type Group_Budget(CPU : System.Multiprocessors.CPU :=
System.Multiprocessors.CPU'First)
is tagged limited private;
type Group_Budget_Handler is access
protected procedure (GB : in out Group_Budget);
type Task_Array is array (Positive range <>) of
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;
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 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);
Group_Budget_Error : exception;
private
-- не определено языком
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. Ноль не влияет на бюджет. Вызов процедуры 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 должна производиться атомарно относительно выполнения обработчика.
ПРИМЕЧАНИЯ
46 Сброс или установка обработчика бюджета группы не изменяет текущее значение бюджета. Исчерпание или загрузка бюджета не изменяет, установлен или сброшен обработчик бюджета группы.
47 Обработчик Group_Budget_Handler может быть связан с несколькими объектами Group_Budget.


Spec-Zone.ru

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