Справочник по Ada (Ada 2022)
D.2.1 Модель диспетчеризации задач
Модель диспетчеризации задач определяет планирование задач, основанное на концептуальных очередях готовности, упорядоченных по приоритету.
Статическая семантика
Существует следующая определенная языком библиотечная пакет:
package Ada.Dispatching
with Preelaborate, Nonblocking, Global => in out synchronized is
with Preelaborate, Nonblocking, Global => in out synchronized is
procedure Yield
with Nonblocking => False;
with Nonblocking => False;
Dispatching_Policy_Error : exception;
end Ada.Dispatching;
end Ada.Dispatching;
Dispatching служит родителем других определенных языком библиотечных единиц, связанных с диспетчеризацией задач.
Для подпрограммы без экземпляра (включая формальную подпрограмму обобщения), обобщённой подпрограммы или входа, может быть указан следующий определённый языком аспект с помощью определения_аспекта (см. 13.1.1):
Yield
Тип аспекта Yield — Boolean.
Если он задан напрямую, то определение_аспекта должно быть статической константой. Если он не задан (включая наследование), то аспект принимает значение False.
Если для примитивной подпрограммы S типа T задан аспект Yield со значением True, то аспект наследуется соответствующей примитивной подпрограммой каждого потомка T.
Правила легальности
Если аспект Yield задан для подпрограммы диспетчеризации, которая наследует этот аспект, то заданное значение должно быть корректным.
Если аспект Nonblocking (см. 9.5) связанного вызываемого сущности статически True, то аспект Yield не должен быть задан как True. Для вызываемой сущности, которая объявлена внутри тела обобщения, это правило проверяется с предположением, что любые нестатические атрибуты Nonblocking в выражении аспекта Nonblocking сущности статически True.
Помимо мест, где обычно применяются правила легальности (см. 12.3), эти правила также применяются в закрытой части экземпляра обобщённого блока.
Динамическая семантика
Задача может стать задачей выполнения только в том случае, если она готова (см. пункт 9) и требуемые ресурсы выполнения доступны. Процессоры выделяются задачам на основе активного приоритета каждой задачи.
В многопроцессорной системе реализация может определять, сохраняет ли задача, ожидающая доступа к защищённому объекту, свой процессор загруженным.
Диспетчеризация задач — это процесс выбора логической потока управления, связанного с готовой задачей, для выполнения на процессоре. Этот выбор выполняется во время выполнения логического потока управления в определённые моменты, называемые точками диспетчеризации задач. Логический поток управления достигает точки диспетчеризации задач, когда он блокируется или когда завершается связанная с ним задача. Другие точки диспетчеризации задач определяются в этом Приложении для конкретных политик. Ниже мы говорим о задачах, но в контексте параллельной конструкции одна задача может быть представлена несколькими логическими потоками управления, каждый из которых может появляться по отдельности в очереди готовности.
Политики диспетчеризации задач задаются с помощью концептуальных очередей готовности и состояний задач. Очередь готовности — это упорядоченный список готовых задач. Первая позиция в очереди называется головой очереди, а последняя — хвостом очереди. Задача готов, если она находится в очереди готовности или выполняется. Каждый процессор имеет одну очередь готовности для каждого значения приоритета. В любой момент времени каждая очередь готовности процессора содержит ровно множество задач этого приоритета, которые готовы к выполнению на этом процессоре, но не выполняются ни на одном процессоре; то есть те задачи, которые готовы, не выполняются ни на каком процессоре и могут быть выполнены с помощью этого процессора и других доступных ресурсов. Одна задача может находиться в очередях готовности более чем одного процессора.
Каждый процессор также имеет одну задачу выполнения, которая является задачей, которая в данный момент выполняется этим процессором. Всякий раз, когда задача, выполняющаяся на процессоре, достигает точки диспетчеризации задач, она возвращается в одну или несколько очередей готовности; затем на этом процессоре выбирается задача (возможно, та же задача) для выполнения. Выбранная задача — это та, которая находится в голове очереди с наивысшим приоритетом, которая не пуста; эта задача удаляется из всех очередей готовности, к которым она принадлежит.
Вызов Yield и заявление_ожидания являются точками диспетчеризации задач для всех определённых языком политик.
Если аспект Yield имеет значение True, то вызов процедуры Yield включается в тело связанной вызываемой сущности и вызывается непосредственно перед возвратом из тела, если и только если другие точки диспетчеризации задач не встречались во время выполнения тела.
Разрешения реализации
Реализация разрешается определять дополнительные ресурсы как ресурсы выполнения и определять соответствующие политики распределения для них. Такие ресурсы могут иметь определённое реализацией влияние на диспетчеризацию задач.
Реализация может ввести определённые реализацией ограничения на задачи, чей активный приоритет находится в диапазоне Interrupt_Priority.
Если для политики диспетчеризации задач не указано иное, реализация может добавить дополнительные моменты, в которых может происходить диспетчеризация задач, способом, определённым реализацией.
ПРИМЕЧАНИЕ 1 В пункте 9 указано, при каких обстоятельствах задача становится готовой. Состояние готовности зависит от правил активации и завершения задач, заявлений о приостановке и вызовов входа.
ПРИМЕЧАНИЕ 2 Примером возможного ресурса выполнения, определяемого реализацией, является страница физической памяти, которую необходимо загрузить определенной страницей виртуальной памяти, прежде чем задача сможет продолжить выполнение.
ПРИМЕЧАНИЕ 3 Очереди готовности — это чисто концептуальные объекты; нет требования, чтобы такие списки физически существовали в реализации.
ПРИМЕЧАНИЕ 4 Пока задача выполняется, она не находится ни в одной очереди готовности. Всякий раз, когда задача, выполняющаяся на процессоре, добавляется в очередь готовности, для этого процессора выбирается новая задача для выполнения.
ПРИМЕЧАНИЕ 5 В многопроцессорной системе одна задача может находиться в очередях готовности более чем одного процессора. В крайнем случае, если несколько процессоров делят один и тот же набор готовых задач, содержимое их очередей готовности идентично, и поэтому их можно рассматривать как разделяющие одну очередь готовности и реализовывать таким образом. Таким образом, модель диспетчеризации охватывает многопроцессорные системы, где диспетчеризация реализуется с использованием одной очереди готовности, а также те, в которых есть отдельные области диспетчеризации.
ПРИМЕЧАНИЕ 6 Приоритет задачи определяется правилами, указанными в этом подпункте, и в D.1, «Приоритеты задач», D.3, «Замки приоритета потолка» и D.5, «Динамические приоритеты».
ПРИМЕЧАНИЕ 7 Установка базового приоритета задачи в результате вызова Set_Priority не всегда вступает в силу немедленно после вызова Set_Priority. Действие установки базового приоритета задачи откладывается, пока затронутая задача выполняет защищённое действие.