The website "dmilvdv.narod.ru." is not registered with uCoz.
If you are absolutely sure your website must be here,
please contact our Support Team.
If you were searching for something on the Internet and ended up here, try again:

About uCoz web-service

Community

Legal information

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

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 и может измениться в будущем.

 

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