Справочник по Ada 2005
D.2.5 Распределение по принципу круговой очереди
Данный пункт определяет политику распределения задач Round_Robin_Within_Priorities и пакет Round_Robin.
Статическая семантика
policy_идентификатор Round_Robin_Within_Priorities является политикой распределения задач.
Существует следующий определенный языком библиотечный пакет:
with System;
with Ada.Real_Time;
package Ada.Dispatching.Round_Robin is
Default_Quantum : constant Ada.Real_Time.Time_Span :=
определяется реализацией;
procedure Set_Quantum (Pri : in System.Priority;
Quantum : in Ada.Real_Time.Time_Span);
procedure Set_Quantum (Low, High : in System.Priority;
Quantum : in Ada.Real_Time.Time_Span);
function Actual_Quantum (Pri : System.Priority) return Ada.Real_Time.Time_Span;
function Is_Round_Robin (Pri : System.Priority) return Boolean;
end Ada.Dispatching.Round_Robin;
with Ada.Real_Time;
package Ada.Dispatching.Round_Robin is
Default_Quantum : constant Ada.Real_Time.Time_Span :=
определяется реализацией;
procedure Set_Quantum (Pri : in System.Priority;
Quantum : in Ada.Real_Time.Time_Span);
procedure Set_Quantum (Low, High : in System.Priority;
Quantum : in Ada.Real_Time.Time_Span);
function Actual_Quantum (Pri : System.Priority) return Ada.Real_Time.Time_Span;
function Is_Round_Robin (Pri : System.Priority) return Boolean;
end Ada.Dispatching.Round_Robin;
При использовании политики распределения задач Round_Robin_Within_Priorities для раздела, каждая задача с приоритетом в диапазоне System.Interrupt_Priority распределяется в соответствии с политикой FIFO_Within_Priorities.
Динамическая семантика
Процедуры Set_Quantum устанавливают требуемое значение Quantum для одного уровня приоритета Pri или диапазона уровней приоритета Low .. High. Если для уровня приоритета Round Robin квант не установлен, используется Default_Quantum.
Функция Actual_Quantum возвращает фактический квант, используемый реализацией для уровня приоритета Pri.
Функция Is_Round_Robin возвращает True, если приоритет Pri покрывается политикой распределения задач Round_Robin_Within_Priorities; в противном случае возвращает False.
Вызов Actual_Quantum или Set_Quantum вызывает исключение Dispatching.Dispatching_Policy_Error, если для заданного приоритета или любого из приоритетов в заданном диапазоне применяется предопределенная политика, отличная от Round_Robin_Within_Priorities.
Для Round_Robin_Within_Priorities правила распределения для FIFO_Within_Priorities применяются с добавлением следующих правил:
- Когда задача добавляется или перемещается в конец очереди готовности для своего базового приоритета, у нее есть бюджет времени выполнения, равный кванту для этого уровня приоритета. Это также произойдет, когда заблокированная задача снова станет исполняемой.
- Когда задача прерывается (задачей с более высоким приоритетом) и добавляется в начало очереди готовности для своего уровня приоритета, она сохраняет свой оставшийся бюджет.
- Пока задача выполняется, ее бюджет уменьшается на количество времени выполнения, которое она использует. Точность этого учета такая же, как и для таймеров времени выполнения (см. D.14).
- Когда задача исчерпала свой бюджет и не имеет унаследованного приоритета (и не выполняется в рамках защищенной операции), она перемещается в конец очереди готовности для своего уровня приоритета. Это является точкой распределения задач.
Требования к реализации
Реализация должна позволять, для одного раздела, указать как политику распределения задач Round_Robin_Within_Priorities, так и политику блокировки (см. D.3) Ceiling_Locking.
Требования к документации
Реализация должна документировать поддерживаемые значения квантов.
Реализация должна документировать точность, с которой она определяет исчерпание бюджета задачи.
ПРИМЕЧАНИЯ
16 Из-за ограничений реализации значение квантов, возвращаемое Actual_Quantum, может не совпадать с заданным Set_Quantum.
17 Задача, которая непрерывно выполняется с унаследованным приоритетом, не будет подлежать распределению по круговой очереди.