Справочник Ada 95
D.1 Приоритеты задач
Этот пункт описывает модель приоритетов для систем реального времени. Кроме того, определены методы задания приоритетов.
Синтаксис
Форма директивы pragma Priority такова:
pragma Priority(выражение);
Форма директивы pragma Interrupt_Priority такова:
pragma Interrupt_Priority[(выражение)];
Правила разрешения имен
Ожидаемый тип для выражения в директивах Priority или Interrupt_Priority — Integer.
Правила допустимости
Директива Priority разрешена только непосредственно внутри определения task_definition, определения protected_definition или в части declarative_part тела subprogram_body. Директива Interrupt_Priority разрешена только непосредственно внутри определения task_definition или определения protected_definition. В заданном конструкте может присутствовать не более одной такой директивы.
Для директивы Priority, которая появляется в части declarative_part тела subprogram_body, выражение должно быть статическим и его значение должно находиться в диапазоне System.Priority.
Статическая семантика
В пакете System существуют следующие объявления:
subtype Any_Priority is Integer range определено_в_реализации;
subtype Priority is Any_Priority
range Any_Priority'First .. определено_в_реализации;
subtype Interrupt_Priority is Any_Priority
range Priority'Last+1 .. Any_Priority'Last;
subtype Priority is Any_Priority
range Any_Priority'First .. определено_в_реализации;
subtype Interrupt_Priority is Any_Priority
range Priority'Last+1 .. Any_Priority'Last;
Default_Priority : constant Priority := (Priority'First + Priority'Last)/2;
Полный диапазон значений приоритетов, поддерживаемых реализацией, задан подтипом Any_Priority. Поддиапазон значений приоритетов, достаточный для блокировки одного или нескольких прерываний, задан подтипом Interrupt_Priority. Поддиапазон значений приоритетов ниже System.Interrupt_Priority'First задан подтипом System.Priority.
Приоритет, заданный директивами Priority или Interrupt_Priority, — это значение выражения в директиве, если оно указано. Если в директиве Interrupt_Priority выражение отсутствует, значение приоритета — Interrupt_Priority'Last.
Динамическая семантика
Директива Priority не имеет эффекта, если она встречается в declarative_part тела subprogram_body подпрограммы, отличной от главной.
Приоритет задачи — целое число, указывающее степень срочности и являющееся основой для разрешения конфликтов задач за ресурсы. Если не указано иное, при конкуренции задач за процессоры или другие ресурсы, определяемые реализацией, ресурсы выделяются задаче с наибольшим значением приоритета. Базовый приоритет задачи — приоритет, с которым она была создана, или тот, который был позже задан с помощью Dynamic_Priorities.Set_Priority (см. D.5). В любое время задача также имеет активный приоритет, который обычно отражает базовый приоритет, а также приоритет, унаследованный из других источников. Наследование приоритетов — процесс, в котором приоритет задачи или другого объекта (например, защищенного объекта; см. D.3) используется при оценке активного приоритета другой задачи.
Влияние указания такой директивы в protected_definition обсуждается в D.3.
Выражение в директивах Priority или Interrupt_Priority, которые появляются в task_definition, вычисляется для каждого объекта задачи (см. 9.1). Для директивы Priority значение выражения преобразуется в подтип Priority; для директивы Interrupt_Priority — в подтип Any_Priority. Затем значение приоритета связывается с объектом задачи, чье определение task_definition содержит директиву.
Аналогично, значение приоритета связывается с задачей среды, если директива появляется в declarative_part главной подпрограммы.
Начальное значение базового приоритета задачи задаётся по умолчанию или с помощью директивы Priority или Interrupt_Priority. После создания задачи её базовый приоритет может быть изменён только путём вызова Dynamic_Priorities.Set_Priority (см. D.5). Начальный базовый приоритет задачи в отсутствие директивы — базовый приоритет задачи, которая её создала, в момент создания (см. 9.1). Если директива Priority не относится к главной подпрограмме, начальный базовый приоритет задачи среды — System.Default_Priority. Активный приоритет задачи используется, когда задача конкурирует за процессоры. Аналогично, активный приоритет задачи используется для определения позиции задачи в очереди, когда указано Priority_Queuing (см. D.4).
В любой момент времени активный приоритет задачи — максимальное из всех приоритетов, которые задача наследует в этот момент. Для задачи, которая не заблокирована (см. D.11), её базовый приоритет всегда является источником наследования приоритета. Другие источники наследования приоритетов задаются в следующих условиях:
- Во время активации задача, которая активируется, наследует активный приоритет, который у её активизатора (см. 9.2) был в момент инициирования активации.
- Во время ожидания, задача, принимающая вызов входа, наследует приоритет вызова входа (см. 9.5.3 и D.4).
- Во время защищённого действия над защищённым объектом, задача наследует приоритет потолка защищённого объекта (см. 9.5 и D.3).
Во всех этих случаях наследование приоритета прекращается, как только условие, вызывающее наследование, больше не выполняется.
Требования к реализации
Диапазон System.Interrupt_Priority должен содержать хотя бы одно значение.
Диапазон System.Priority должен содержать как минимум 30 значений.
ПРИМЕЧАНИЯ
4 Выражение приоритета может включать ссылки на дискриминанты окружающего типа.
5 Из правил активного приоритета следует, что в момент, когда задача перестаёт наследовать приоритет от другого источника, её активный приоритет переоценивается. Это дополнительно к другим случаям переоценки, описанным в этом приложении.
6 Реализация может предоставить нестандартный режим, в котором задачи наследуют приоритеты в условиях, отличных от указанных выше.