7.3.1 Планирование процессов |
Предыдущая Содержание Следующая |
В предыдущем разделе мы обсуждали детали планировщика Linux. Теперь мы понимаем, как планировщиком управляются задачи реального времени. В этом разделе мы обсудим планировщик по отношению к ядру 2.6. Для определения задачи реального времени в Linux есть три основных параметра:
▪Класс планирования ▪Приоритет процесса ▪Интервал времени
Они объясняются ниже.
Класс планирования
Планировщик Linux предлагает три класса планирования, два для приложений реального времени и один для приложений не реального времени. Этими тремя классами являются:
▪SCHED_FIFO: политика планирования реального времени первый вошёл, первый вышел (First-In First-Out). Алгоритм планирования не использует никаких интервалов времени. Процесс 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 Диапазон приоритетов в пространстве пользователя
Точка зрения ядра на приоритеты процессов отличается от точки зрения процессов. Соответствие между приоритетами пользовательского пространства и пространства ядра для задач реального времени в ядре версии 2.6.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
Использование этих функций иллюстрирует Распечатка 7.1. Данный пример создаёт процесс SCHED_FIFO с приоритетом, который имеет среднее значение между минимальным и максимальным приоритетом для класса планирования SCHED_FIFO. Он также динамически изменяет приоритет процесса SCHED_FIFO. Как значение nice может быть использовано для управления выделением интервала времени для класса SCHED_RR показывает Распечатка 7.2.
| |||||||||||||||||||||||||||||
Предыдущая Содержание Следующая |