Spec-Zone.ru › Ada 2005
Справочник по Ada 2005

D.3 Блокировка по приоритету потолка

Этот пункт описывает взаимодействие между планированием задач по приоритету и потолками защищенных объектов. Это взаимодействие основано на понятии приоритета потолка защищенного объекта.

Синтаксис

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

Правила законности

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

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

Директива Locking_Policy является конфигурационной директивой.

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

Политика блокировки определяет детали блокировки защищенных объектов. Все защищенные объекты имеют приоритет. Политика блокировки определяет значение приоритета защищенного объекта и взаимоотношения между этими приоритетами и приоритетами задач. Кроме того, политика определяет состояние задачи при выполнении защищенного действия и как на неё влияет блокировка. Политика блокировки задается директивой Locking_Policy. Для политик блокировки, определенных реализацией, значение приоритета защищенного объекта определяется реализацией. Если никакая директива Locking_Policy не применяется к каким-либо модулям программы, составляющим раздел, политика блокировки для этого раздела, а также значение приоритета защищенного объекта определяются реализацией.
Выражение директивы Priority или Interrupt_Priority (см. D.1) вычисляется при создании соответствующего защищенного объекта и преобразуется в подтип System.Any_Priority или System.Interrupt_Priority соответственно. Значение выражения является начальным приоритетом соответствующего защищенного объекта. Если никакая директива Priority или Interrupt_Priority не применяется к защищенному объекту, начальный приоритет определяется политикой блокировки.
Существует одна предопределенная политика блокировки, Ceiling_Locking; эта политика определяется следующим образом:
  • Каждый защищенный объект имеет приоритет потолка, который определяется либо директивой Priority или Interrupt_Priority, как определено в D.1, либо присвоением атрибуту Priority, как описано в D.5.2. Приоритет потолка защищенного объекта (или коротко потолок) является верхней границей активного приоритета задачи, когда она вызывает защищенные операции этого защищенного объекта.
  • Начальный приоритет потолка защищенного объекта равен начальному приоритету этого объекта.
  • Если директива Interrupt_Handler или Attach_Handler (см. C.3.1) появляется в определении_защищенного_объекта без директивы Interrupt_Priority, начальный приоритет защищенных объектов данного типа определяется реализацией, но лежит в пределах подтипа System.Interrupt_Priority.
  • Если никакая директива pragma Priority, Interrupt_Priority, Interrupt_Handler или Attach_Handler не указана в определении_защищенного_объекта, то начальный приоритет соответствующего защищенного объекта равен System.Priority'Last.
  • В то время как задача выполняет защищенное действие, она наследует приоритет потолка соответствующего защищенного объекта.
  • Когда задача вызывает защищенную операцию, проверяется, что её активный приоритет не выше потолка соответствующего защищенного объекта; Program_Error поднимается, если эта проверка не выполняется.

Ограниченные (временно́й ошибки)

После любого изменения приоритета, это ограниченная ошибка для активного приоритета любой задачи с вызовом, ожидающим выполнения, в записи защищенного объекта, чтобы быть выше приоритета потолка защищенного объекта. В этом случае выполняется одно из следующего:
  • в любое время до выполнения тела записи Program_Error поднимается в вызывающей задаче;
  • когда запись открыта, тело записи выполняется с приоритетом потолка защищенного объекта;
  • когда запись открыта, тело записи выполняется с приоритетом потолка защищенного объекта, а затем Program_Error поднимается в вызывающей задаче; или
  • когда запись открыта, тело записи выполняется с приоритетом потолка защищенного объекта, который действовал, когда вызов записи был поставлен в очередь.

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

Реализация разрешается округлять все потолки в определённом поддиапазоне System.Priority или System.Interrupt_Priority до верха этого поддиапазона равномерно.
Реализации разрешается определять другие политики блокировки, но не обязаны поддерживать более одной политики блокировки на раздел.
Поскольку реализациям разрешается устанавливать ограничения на код, который выполняется с активным приоритетом прерывания (см. C.3.1 и D.2.1), реализация может реализовать языковую функцию в терминах защищенного объекта с реализацией определенного потолка, но потолок должен быть не меньше Priority'Last.

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

Реализация должна использовать имена, оканчивающиеся на «_Locking» для политик блокировки, определенных реализацией.
ПРИМЕЧАНИЯ
20 Во время выполнения задачи в защищенном действии, она может быть прервана только задачами, активные приоритеты которых выше, чем приоритет потолка защищенного объекта.
21 Если защищенный объект имеет приоритет потолка в диапазоне Interrupt_Priority, определённые прерывания блокируются во время выполнения защищенных действий этого объекта. В крайнем случае, если потолок равен Interrupt_Priority'Last, все блокируемые прерывания блокируются в течение этого времени.
22 Приоритет потолка защищенного объекта должен быть в диапазоне Interrupt_Priority, если одна из его процедур должна использоваться как обработчик прерывания (см. C.3).
23 При указании потолка защищенного объекта, следует выбрать значение, которое по крайней мере равно наивысшему активному приоритету, при котором задачи могут выполняться при вызове защищенных операций этого объекта. При определении этого значения следует учитывать следующие факторы, которые могут повлиять на активный приоритет: влияние Set_Priority, вложенные защищенные операции, вызовы записи, активация задач и другие факторы, определенные реализацией.
24 Присоединение защищённой процедуры, чей потолок ниже приоритета аппаратного прерывания, к прерыванию приводит к ошибочному выполнению программы (см. C.3.1).
25 В реализации на одном процессоре правила приоритета потолка гарантируют, что нет возможности возникновения тупика, включающего только защищённые подпрограммы (за исключением случая, когда защищённая операция вызывает другую защищённую операцию на том же защищённом объекте).


Spec-Zone.ru

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