Spec-Zone.ru › Ada 2012
Справочное руководство Ada 2012

D.2.4 Непрерывная обработка задач

В этом подразделе определяется политика обработки задач без прерывания.

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

Политикаидентификатор Non_Preemptive_FIFO_Within_Priorities — это политика обработки задач.
Существует следующий определяемый языком пакет библиотеки:
package Ada.Dispatching.Non_Preemptive is
pragma Preelaborate(Non_Preemptive);
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 не должен быть указан в качестве политикиидентификатор pragma Priority_Specific_Dispatching (см. D.2.2).

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

Когда используется Non_Preemptive_FIFO_Within_Priorities, изменения в очередях готовности происходят только следующим образом:
  • Когда заблокированная задача становится готовой, она добавляется в конец очереди готовности для своего активного приоритета.
  • Когда меняется активный приоритет готовой задачи, которая не выполняется, или вступает в силу установка её базового приоритета, задача удаляется из очереди готовности для её старого активного приоритета и добавляется в конец очереди готовности для её нового активного приоритета.
  • Когда вступает в силу установка базового приоритета выполняющейся задачи, задача добавляется в конец очереди готовности для её активного приоритета.
  • Когда задача выполняет delay_statement, который не приводит к блокированию, она добавляется в конец очереди готовности для своего активного приоритета.
Для этой политики, блокирование или завершение задачи, delay_statement, вызов 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, который происходит внутри защищённого действия, использует приоритет потолка защищённого объекта (а не активный приоритет задачи) при определении, прервать задачу или нет.


Spec-Zone.ru

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