Справочник по Ada (Ada 2022)
D.2.4 Непрерывная диспетчеризация задач
Этот подпункт определяет политику диспетчеризации задач без прерывания.
Статическая семантика
Политика policy_идентификатор Non_Preemptive_FIFO_Within_Priorities является политикой диспетчеризации задач.
Существует следующий пакет библиотеки, определенный языком:
package Ada.Dispatching.Non_Preemptive
with Preelaborate, Nonblocking, Global => in out synchronized is
procedure Yield_To_Higher;
procedure Yield_To_Same_Or_Higher renames Yield;
end Ada.Dispatching.Non_Preemptive;
with Preelaborate, Nonblocking, Global => in out synchronized is
procedure Yield_To_Higher;
procedure Yield_To_Same_Or_Higher renames Yield;
end Ada.Dispatching.Non_Preemptive;
Вызов Yield_To_Higher является точкой диспетчеризации задач для данной политики. Если задача в начале очереди задач с наивысшим приоритетом имеет более высокий активный приоритет, чем вызывающая задача, то вызывающая задача прерывается.
Правила правомерности
Non_Preemptive_FIFO_Within_Priorities не должен быть указан в качестве policy_идентификатора для pragma Priority_Specific_Dispatching (см. D.2.2).
Динамическая семантика
Когда в действии Non_Preemptive_FIFO_Within_Priorities, изменения в очередях задач происходят только следующим образом:
- Когда заблокированная задача становится готовой, она добавляется в конец очереди задач для ее активного приоритета.
- Когда изменяется активный приоритет готовой задачи, которая не выполняется, или вступает в силу установка ее базового приоритета, задача удаляется из очереди задач для ее старого активного приоритета и добавляется в конец очереди задач для ее нового активного приоритета.
- Когда вступает в силу установка базового приоритета выполняющейся задачи, задача добавляется в конец очереди задач для ее активного приоритета.
- Когда задача выполняет заявление_ожидания, которое не приводит к блокированию, она добавляется в конец очереди задач для ее активного приоритета.
Для этой политики блокирование или завершение задачи, заявление_ожидания, вызов Yield_To_Higher и вызов Yield_To_Same_Or_Higher или Yield являются единственными точками диспетчеризации задач (см. D.2.1).
Требования к реализации
Реализация должна позволять, для одного раздела, задать политику диспетчеризации задач как Non_Preemptive_FIFO_Within_Priorities, а также политику блокировки (см. D.3) как Ceiling_Locking.
Разрешения на реализацию
Поскольку реализации разрешается округлять все приоритеты потолка в поддиапазоне System.Priority до System.Priority'Last (см. D.3), реализация может позволить задаче раздела, использующей политику Non_Premptive_FIFO_Within_Priorities, выполняться в защищенном объекте без повышения ее активного приоритета, при условии, что связанный защищенный блок не содержит подпрограмм с аспектами Interrupt_Handler или Attach_Handler, указанными, а также блок не имеет аспекта Interrupt_Priority. При политике блокировки (см. D.3) Ceiling_Locking, реализация, использующая это разрешение, должна гарантировать, что вызов Yield_to_Higher, который происходит внутри защищенного действия, использует приоритет потолка защищенного объекта (а не активный приоритет задачи) при определении того, прерывать задачу или нет.