7.3.1 Планирование процессов

Предыдущая  Содержание  Следующая V*D*V

В предыдущем разделе мы обсуждали детали планировщика Linux. Теперь мы понимаем, как планировщиком управляются задачи реального времени. В этом разделе мы обсудим планировщик по отношению к ядру 2.6. Для определения задачи реального времени в Linux есть три основных параметра:

 

Класс планирования

Приоритет процесса

Интервал времени

 

Они объясняются ниже.

 

Класс планирования

 

Планировщик Linux предлагает три класса планирования, два для приложений реального времени и один для приложений не реального времени. Этими тремя классами являются:

 

SCHED_FIFO: политика планирования реального времени первый вошёл, первый вышел (First-In First-Out). Алгоритм планирования не использует никаких интервалов времени. Процесс SCHED_FIFO выполняется до завершения, если он не заблокирован запросом ввода/вывода, вытеснен высокоприоритетным процессом, или он добровольно отказывается от процессора. Следует обратить внимание на следующие моменты:
– Процесс SCHED_FIFO, который был вытеснен другим процессом более высокого приоритета, остаётся во главе списка с его приоритетом и возобновит выполнение, как только все процессы с более высоким приоритетом будут вновь заблокированы.
– Когда процесс SCHED_FIFO готов к работе (например, после пробуждения от операции блокировки), он будет вставлен в конец списка с его приоритетом.
– Вызов sched_setscheduler или sched_setparam поставит процесс SCHED_FIFO в начало списка. Как следствие, это может вытеснить работающий в данный момент процесс, если его приоритет такой же, как и у работающего процесса.

SCHED_RR: циклическая (Round-Robin) политика планирования реального времени. Она похожа на SCHED_FIFO с той лишь разницей, что процессу SCHED_RR разрешено работать как максимум время кванта. Если процесс SCHED_RR исчерпывает свой квант времени, он помещается в конец списка с его приоритетом. Процесс SCHED_RR, который был вытеснен процессом с более высоким приоритетом, завершит оставшуюся часть своего кванта времени после возобновления выполнения.

SCHED_OTHER: стандартный планировщик Linux с разделением времени для процессов, работающих не в реальном времени.

 

Для установки и получения политики планирования процесса используются функции sched_setscheduler и sched_getscheduler, соответственно.

 

Приоритет

 

Диапазоны приоритетов для различных политик планирования показаны в Таблице 7.1. Функции sched_get_priority_max и sched_get_priority_min возвращают максимальный и минимальный приоритет, разрешённый для политики планирования, соответственно. Чем выше число, тем выше приоритет. Таким образом, процесс SCHED_FIFO или SCHED_RR всегда имеет более высокий приоритет, чем процесс SCHED_OTHER. Для процессов SCHED_FIFO и SCHED_RR функции sched_setparam и sched_getparam используются для установки и получения приоритета, соответственно. Для изменения приоритета процессов SCHED_OTHER используется системный вызов nice (или команды).

 

Таблица 7.1 Диапазон приоритетов в пространстве пользователя

 

Класс планирования

Диапазон приоритетов

SCHED_OTHER

0

SCHED_FIFO

1 - 99

SCHED_RR

1 - 99

 

Ядро позволяет значению nice быть установленным как для процесса SCHED_RR или SCHED_FIFO, но это не будет иметь никакого влияния на планирование, пока задача выполняется с классом SCHED_OTHER.

 

Точка зрения ядра на приоритеты процессов отличается от точки зрения процессов. Соответствие между приоритетами пользовательского пространства и пространства ядра для задач реального времени в ядре версии 2.6.3 показывает Рисунок 7.3.

 

Рисунок 7.3 Связь приоритетов задач реального времени.

Рисунок 7.3 Связь приоритетов задач реального времени.

 

Для ядра низкое значение означает высокий приоритет. Приоритеты реального времени в ядро находятся в диапазоне от 0 до 98. Ядро связывает пользовательские приоритеты SCHED_FIFO и SCHED_RR с приоритетами ядра с помощью следующих макросов:

 

#define MAX_USER_RT_PRIO 100

kernel priority = MAX_USER_RT_PRIO -1 – (user priority);

 

Таким образом, пользовательский приоритет 1 связывается с приоритетом ядра 98, приоритет 2 с 97, и так далее.

 

Интервал времени

 

Как обсуждалось ранее, интервал времени действителен только для процессов SCHED_RR. Процессы SCHED_FIFO можно рассматривать как имеющие бесконечный интервал времени. Так что это обсуждение касается только процессов SCHED_RR.

Linux устанавливает минимальный интервал времени для процесса как 10 мс, интервал времени по умолчанию как 100 мс, а максимальный интервал времени как 200 мс. Интервалы времени заполняются вновь после их окончания. В версии 2.6.3 интервал времени процесса рассчитывается так:

 

#define MIN_TIMESLICE (10)

#define MAX_TIMESLICE (200)

#define MAX_PRIO (139)   // MAX внутренний приоритет ядра

#define MAX_USER_PRIO 39 // MAX nice при переводе к положительной шкале

 

/* ‘p’ это структура задач процесса */

#define BASE_TIMESLICE(p) \

   (MIN_TIMESLICE + ((MAX_TIMESLICE - MIN_TIMESLICE) *

   (MAX_PRIO-1 - (p)->static_prio) / (MAX_USER_PRIO-1)))

 

static_prio содержит значение nice для процесса. Ядро преобразует диапазон nice c -20 до +19 во внутренний диапазон nice  в ядре от 100 до 139. nice процесса конвертируется в такой масштаб и сохраняется в static_prio. Таким образом, значение nice -20 соответствует static_prio 100, а +19 для nice, static_prio 139. Наконец, интервал времени процесса возвращает функция task_timeslice.

 

static inline unsigned int task_timeslice(task_t *p) {

  return BASE_TIMESLICE(p);

}

 

Обратите внимание, что static_prio является единственной переменной в расчёте интервала времени. Таким образом, можно сделать некоторые важные выводы:

 

Все процессы SCHED_RR выполняются по умолчанию с интервалом времени в 100 мс, поскольку они обычно имеют значение nice, равное 0.

При значении nice -20 процесс SCHED_RR получит интервал времени 200 мс, а при nice +19 процесс SCHED_RR получит  интервал времени 10 мс. Таким образом, значение nice может быть использовано для управления выделением интервала времени для процессов SCHED_RR.

Чем меньше значение nice (то есть, приоритет более высокий), тем больше интервал времени.

 

Функции планирования

 

Функции планирования, предоставляемые для поддержки приложений реального времени в Linux, перечислены в Таблице 7.2.

 

Таблица 7.2 Функции планирования POSIX.1b

 

Метод

Описание

sched_getscheduler

Получение класса планирования процесса.

sched_setscheduler

Установка класса планирования процесса.

sched_getparam

Получение приоритета процесса.

sched_setparam

Установка приоритета планирования.

sched_get_priority_max

Получение максимального разрешённого значения приоритета для класса планирования.

sched_get_priority_min

Получение минимального разрешённого значения приоритета для класса планирования.

sched_rr_get_interval

Получение текущего временного интервала для процесса SCHED_RR.

sched_yield

Передача выполнения другому процессу.

 

Функции sched_setscheduler и sched_setparam следует вызывать с привилегиями суперпользователя.

 

Использование этих функций иллюстрирует Распечатка 7.1. Данный пример создаёт процесс SCHED_FIFO с приоритетом, который имеет среднее значение между минимальным и максимальным приоритетом для класса планирования SCHED_FIFO. Он также динамически изменяет приоритет процесса SCHED_FIFO. Как значение nice может быть использовано для управления выделением интервала времени для класса SCHED_RR показывает Распечатка 7.2.

 

Влияние nice на выделении интервала времени SCHED_RR не предусмотрено POSIX. Это делает возможным реализация планировщика в Linux. Вы не должны использовать эту функцию в переносимых программах. Такое влияние nice на SCHED_RR происходит от ядра версии 2.6.3 и может измениться в будущем.

 

Предыдущая  Содержание  Следующая