Spec-Zone.ru › Ada 2022
Руководство по Ada (Ada 2022)

D.4 Политики очереди входа

Этот подпункт описывает механизм, позволяющий пользователю выбрать политику очереди входа. Он также определяет три такие политики. Другие политики определяются реализацией.

Синтаксис

Форма pragma Queuing_Policy выглядит следующим образом:
pragma Queuing_Policy(policy_идентификатор);

Правила допустимости

policy_идентификатор должен быть либо FIFO_Queuing, Ordered_FIFO_Queuing, Priority_Queuing, либо определённым реализацией идентификатором.

Правила после компиляции

Pragma Queuing_Policy является конфигурационным pragma.

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

Политика очереди определяет порядок, в котором задачи помещаются в очередь для обслуживания входа, и порядок, в котором рассматриваются различные очереди входов для обслуживания. Политика очереди задаётся с помощью pragma Queuing_Policy.
Три политики очереди, FIFO_Queuing, Ordered_FIFO_Queuing и Priority_Queuing, определены языком. Если для каких-либо единиц программы, составляющих партицию, не применяется pragma Queuing_Policy, политика очереди для этой партиции является FIFO_Queuing. Правила для политики FIFO_Queuing указаны в 9.5.3 и 9.7.1.
Политика Ordered_FIFO_Queuing определяется следующим образом:
  • Вызовы выбираются в очереди заданного входа в порядке поступления.
  • Когда более одного условия entry_barrier защищённого объекта становятся True, и более одной из соответствующих очередей непусты, выбирается вызов, который поступил первым.
  • Если время истечения двух или более открытых delay_alternativeов одинаковое, и нет других открытых accept_alternativeов, выполняется sequence_of_statements delay_alternative, которая первая в текстовом порядке в selective_accept.
  • Когда более одной альтернативы selective_accept открыты и имеют очереди вызовов, выбирается альтернатива, чья очередь содержит вызов, который поступил первым.
Политика Priority_Queuing определяется следующим образом:
  • Вызовы входа (включая элемент семейства входов) помещаются в очередь в порядке, соответствующем приоритетам вызовов. Приоритет вызова входа инициализируется активным приоритетом вызывающей задачи в момент совершения вызова, но может измениться позже. В рамках одного приоритета порядок соответствует времени вызова (или повторной постановки в очередь, или установке приоритета) (то есть порядок FIFO).
  • После первоначального помещения вызова в очередь изменения активного приоритета задачи не влияют на приоритет вызова, если базовый приоритет задачи не установлен, пока задача заблокирована на вызове входа.
  • При установке базового приоритета задачи (см. D.5), если задача заблокирована на вызове входа, и вызов находится в очереди, приоритет вызова обновляется до нового активного приоритета вызывающей задачи. Это приводит к удалению вызова из очереди и его повторной вставке в очередь с новым активным приоритетом.
  • Когда более одного условия entry_barrier защищённого объекта становятся True, и более одной из соответствующих очередей непусты, выбирается вызов с наивысшим приоритетом. Если несколько таких вызовов имеют одинаковый приоритет, выбирается вызов в очереди входа, объявление которого стоит первым в текстовом порядке в protected_definition. Для членов одного семейства входов выбирается тот с меньшим индексом семейства.
  • Если время истечения двух или более открытых delay_alternativeов одинаковое, и нет других открытых accept_alternativeов, выполняется sequence_of_statements delay_alternative, которая первая в текстовом порядке в selective_accept.
  • Когда более одной альтернативы selective_accept открыты и имеют очереди вызовов, выбирается альтернатива, чья очередь содержит вызов с наивысшим приоритетом в начале. Если два или более открытых альтернативы имеют вызовы с одинаковым приоритетом, выбирается вызов входа в accept_alternative, который первый в текстовом порядке в selective_accept.

Разрешения на реализацию

Реализации разрешается определять другие политики очереди, но не требуется поддерживать задание более одной политики очереди на одну партицию.
Реализации разрешается отложить переупорядочение очередей входов после изменения базового приоритета задачи, заблокированной на вызове входа, если непрактично сразу переупорядочить очередь.

Рекомендации по реализации

Реализация должна использовать имена, заканчивающиеся на «_Queuing», для определяемых реализацией политик очереди.

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

Для типа задачи (включая анонимный тип single_task_declaration), защищенного типа (включая анонимный тип single_protected_declaration) или entry_declaration, может быть указан следующий аспект представления языка:
Max_Entry_Queue_Length

Тип аспекта Max_Entry_Queue_Length — Integer.
Если аспект задан напрямую, то aspect_definition должно быть статической константой не меньше -1. Если не указано, аспект имеет значение -1 (что обозначает отсутствие дополнительных ограничений на длину очереди).

Правила допустимости

Если аспект Max_Entry_Queue_Length для типа имеет неотрицательное значение, то аспект Max_Entry_Queue_Length для каждого отдельного входа этого типа не должен превышать значение аспекта для типа. Аспект Max_Entry_Queue_Length типа является неизменяемым (см. 13.1.1).

Правила после компиляции

Если ограничение Max_Entry_Queue_Length применяется к партиции, то любое значение, заданное для аспекта Max_Entry_Queue_Length, указанного для объявления типа или входа в партиции, не должно превышать значение ограничения.

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

Если для типа указано несоответствующее значение Max_Entry_Queue_Length, и вызов входа или повторное помещение в очередь приведут к тому, что очередь для любого входа типа станет длиннее указанного значения, то Program_Error возникает в точке вызова или повторного помещения в очередь.
Если для входа указано несоответствующее значение Max_Entry_Queue_Length, и вызов входа или повторное помещение в очередь приведут к тому, что очередь для входа станет длиннее указанного значения, то Program_Error возникает в точке вызова или повторного помещения в очередь.


Spec-Zone.ru

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