Справочник Ada 2012
D.2.5 Распределение по круговой очереди
В данном подпункте определяется политика диспетчеризации задач Round_Robin_Within_Priorities и пакет Round_Robin.
Статическая семантика
Политика_идентификатор 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 Задача, которая непрерывно выполняется с унаследованным приоритетом, не будет подвержена диспетчеризации по круговой очереди.