Миро Самек, Роберт Вард "Построение наипростейшего диспетчера задач" (перевод)


Синхронный и асинхронный перехват управления

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

  • Низкоприоритетная задача помещает в очередь данные о событии для процесса с большим приоритетом:

    SST должен немедленно прекратить выполнение незкоприоритетной задачи и запустить высокоприоритетную, Такой вид перехвата управления называется "синхронным", так как прямо связан с моментом помещения данных о событии в очередь.

  • Сообщение о событии для более приоритетного, нежели активный, процесса помещается в очередь прерыванием:

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


Рисунок 2. Синхронное вытеснение более приоритетной задачей
Рисунок 2. Синхронное
          вытеснение

Рисунок 2 иллюстрирует синхронный сценарий перехвата управления, вызванный передачей события от низкоприоритетного процесса к высокоприоритетному. В начальный момент времени система выполняет низкоприоритетную задачу (1). В какой-то момент в ходе нормального исполнения низкоприоритетный процесс отправляет событие для задачи с более высоким приоритетом, переводя её в состояние готовности к исполнению. Отправка сообщения активирует диспетчер SST (2). Тот, обнаружив готовую к исполнению задачу более высокого приоритета, запускает её (3) (данное действие выглядит как простой вызов Си-функции). Отметим, что, так как приоритетная задача выполняется в потоке диспетчера, этот последний не может завершить своё выполнение до завершения дочернего процесса. Приоритетная задача выполняется (4), но в какой-то момент также передаёт событие для внешнего абонента. Если приоритет получателя ниже, чем у отправителя, то активированный (опять же простым вызовом Си-функции) диспетчер (5), не обнаружив задач с более высоким приоритемом в состоянии готовности, немедленно завершает работу. После возврата управления от второго вызова диспетчера прерванный процесс продолжает работу до завершения (6) и возвращает управление диспетчеру SST (7) [* первый вызов]. Тот проверяет наличие готовых приоритетных задач (8) и, не найдя таковых, возвращает управление низкоприоритетной задаче, которая возобновляет свою работу (9).

Синхронное вытеснение не ограничивается, конечно, одним уровнем. Если приоритетный процесс отправит в момент (5) (рисунок 2) сообщение ещё более приоритетной задаче, будет задействован механизм синхронной передачи управления и процедура рекурсивно повторится на более высоком уровне.


Рисунок 3. Асинхронное вытеснение прерыванием и более приоритетной задачей
Рисунок 3. Асинхронное
          вытеснение

На рисунке 3 показана последовательность событий при асинхронном перехвате управления, вызванном прерыванием. В начальный момент выполняется низкоприоритетная задача (1), а прерывания разрешены. Асинхронное событие прерывает процессор (2). Тот немедленно прекращает выполнение текущей работы и переходит к исполнению обработчика прерывания, который обращается к спещифичному для SST прологу (3), код которого сохраняет в стеке сведения о приоритете прерванного процесса и поднимает текущий приоритет до уровня прерывания. Обработчик выполняет необходимые действия (4), включающие отправку сообщения (5) высокоприоритетному процессу. Отправка сообщения активирует диспетчер, но тот, не обнаружив задачи с более высоким приоритетом, чем у прерывания, немедленно возвращает управление обработчику. ISR продолжает обработку (6) и, наконец, выполняет SST-эпилог (7). Код эпилога посылает инструкцию завершения прерывания (end-of-interrupt - EOI) в контроллер прерываний, восстанавливает приоритет прерванного задания и вызывает диспетчер SST (8). Диспетчер обнаруживает, что процесс с большим приоритетом находится в состоянии готовности, разрешает прерывания и запускает его на исполнение (9). Отметим, что выхода из кода диспетчера не происходит. В отсутствие других прерываний приоритетная задача выполняется до завершения (10). Завершение приводит к возврату управления диспетчеру (11), который проверяет наличие приоритетных заданий в состоянии готовности (12), не находит таковых и завершает выполнение. Управление возвращается от прерывания к низкоприоритетной задаче (13), всё это время находившейся в состоянии ожидания. Отметим, что процесс выхода из прерывания (13) жёстко соотносится с процедурой входа в него (2). Завершается последовательность действий продолжением работы низкоприоритетной задачи (14).

Принципиальной конструктивной особенностью SST является завершение обработки прерывания в коде специального эпилога (8), притом даже, что контекст прерывания по-прежнему остаётся в стеке и всё ещё не выполнена инструкция IRET (данная аббревиатура используется здесь в качестве собирательного названия для набора действий в рамках конкретной вычислительной архитектуры, приводящих аппаратуру подсистемы прерываний в исходное состояние). Прерывание завершается, потому что директива EOI заставляет контроллер разблокировать прерывания в момент исполнения кода диспетчера SST. До EOI контроллер реагирует только на события, приоритет которых выше приоритера обрабатываемого прирывания. После инструкции EOI и последующего вызова диспетчера разблокируются прерывания всех уровней, как этого ожидает код уровня приложения.

Таким образом, асинхронное вытеснение не ограничивается одним уровнем. Приоритетный код, работающий в условиях разблокированных прерываний и показанный на диаграмме 3 в виде сегмента (10), может быть субъектом асинхронного вытеснения прерыванием, включая прерывание того же уровня, что и возникшее в момент (2). Если новое прерывание отправит событие более высокоприоритетному, чем код (10), процессу, то и он, в свою очередь, может быть асинхронно прерван. Последовательность рекурсивно повторится на новом уровне.

ПредпросмотрAttachmentSize
super_simple_tasker.zip293.38 КБ
sst_code.zip43.69 КБ