Как выполняется планировщик VxWorks?

Хотелось бы знать, как вызывается планировщик, чтобы он мог переключать задачи. Как и в случае с упреждающим планированием или циклическим планированием - планировщик должен вмешаться, чтобы выполнить любое переключение задач. Предположим, что задача с низким приоритетом имеет бесконечный цикл — когда планировщик вмешивается и переключается на задачу с более высоким приоритетом?

Вопрос такой: 1. Кто звонит планировщику? [в VxWorks] 2. Если он вызывается через равные промежутки времени — как реализован этот механизм?

Заранее спасибо.

--Эшвин


person Ashwin    schedule 08.06.2010    source источник
comment
Хотя я не знаю VxWorks, в других ОС планировщик обычно вызывается прерыванием по таймеру, поэтому он может переключать задачи, даже если одна задача в данный момент занята.   -  person Rudi    schedule 08.06.2010


Ответы (4)


Простой ответ заключается в том, что vxWorks берет на себя управление через аппаратное прерывание от системного таймера, которое происходит постоянно с фиксированными интервалами во время работы системы.

Вот подробнее:

При запуске vxWorks настраивает ваше оборудование на генерацию таймера прерывания каждые n миллисекунд, где n часто равно 10, но полностью зависит от вашего оборудования. Интервал таймера обычно устанавливается vxWorks в вашем Пакете поддержки Board (BSP) при его запуске.

Каждый раз, когда таймер запускает прерывание, система запускает выполнение обработчика прерывания таймера. Обработчик прерываний по таймеру является частью vxWorks, поэтому теперь контроль принадлежит vxWorks. Первое, что он делает, это сохраняет состояние ЦП (например, регистры) в Блок управления задачей (TCB) текущей задачи.

Затем, в конце концов, vxWorks запускает планировщик, чтобы определить, кто будет следующим. Для запуска задачи vxWorks копирует состояние задачи из своего TCB в регистры машины, и после этого задача получает контроль над процессором.

Информация о бонусе:

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

person indiv    schedule 08.06.2010
comment
Обратите внимание, что это верно только в том случае, если вы включаете циклическое планирование (путем вызова kernelTimeSlice() ), по умолчанию используется упреждающее планирование на основе приоритетов. - person nos; 01.12.2011
comment
@nos: прерывание по таймеру всегда выполняется для отслеживания количества тактов, сторожевых таймеров и тайм-аутов семафоров независимо от политики планирования. Просто случается так, что для вытесняющего планирования на основе приоритета планировщик vxWorks не выбирает новую задачу для запуска, если какая-либо операция таймера не перемещает задачу с более высоким приоритетом в очередь готовности. Но справедливое замечание. Я всегда хотел обновить этот ответ, чтобы он был более точным и включал системные вызовы, о которых я совершенно забыл упомянуть в то время. - person indiv; 01.12.2011
comment
Следует также помнить, что круговой алгоритм ДОПОЛНИТЕЛЬНО основан на приоритете. Вы получаете приоритет на основе независимо. Круговое планирование влияет только на задачи с одинаковым уровнем приоритета. Кроме того, даже только в приоритете задачи могут использовать, например, taskDelay, поэтому системные тики все равно должны продолжаться. - person mjs; 31.10.2013

indiv дает очень хороший ответ, но он точен лишь частично.
Реальная работа системы немного сложнее.

Планировщик может выполняться как в результате синхронных, так и асинхронных операций.

Синхронные относятся к операциям, которые вызываются кодом в текущей выполняемой задаче. Ярким примером этого может быть получение семафора (semTake).
Если семафор недоступен, выполняемая в данный момент задача будет отложена и больше не будет доступна для выполнения. В этот момент планировщик будет вызван и определит следующую задачу, которая должна быть выполнена, и выполнит переключение контекста.

Асинхронные операции по существу относятся к прерываниям. Прерывания таймера очень хорошо описаны indiv. Однако ряд различных элементов может вызвать выполнение прерывания: сетевой трафик, датчик, последовательные данные и т. д.

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

Обратите внимание, что у планировщика нет собственного контекста; это не задача. Это просто код, который выполняется в любом контексте, из которого он вызывается. Либо из контекста прерывания (асинхронно), либо из контекста вызывающей задачи (синхронно).

person Benoit    schedule 15.02.2011
comment
Note that the scheduler does not have its own context; it is not a task. It is simply code that executes in whatever context it is invoked from. Either from the interrupt context (asynchronous) or from the invoking task context (synchronous). Это верно для БОЛЬШИНСТВА ОС, которые, как я полагаю, работают в режиме реального времени или нет. - person HighOnMeat; 28.12.2018

Если у вас нет сильно настроенной целевой сборки, планировщик вызывается прерыванием таймера. Однако детали зависят от платформы.

person myron-semack    schedule 08.06.2010

Планировщик также вызывается, если текущая задача завершается или блокируется.

person blah    schedule 08.06.2010