Расчет значения кванта времени, наоборот, более прост, так как значение динамического приоритета уже базируется на значении параметра task_timeslice()
возвращает новое значение кванта времени для данного задания. Расчет просто сводится к масштабированию значения приоритета в диапазон значений квантов времени. Чем больше значение приоритета задачи, тем большей продолжительности квант времени получит задание в текущем цикле выполнения. Максимальное значение кванта времени равно MAX_TIMESLICE
, которое по умолчанию равно 200 мс. Даже задания с самым низким приоритетом получают квант времени продолжительностью MIN_TIMESLICE
, что соответствует 10 мс. Задачи с приоритетом, используемым по умолчанию (значение параметра
Таблица 4.1. Продолжительности квантов времени планировщика
Тип задания | Значение параметра | Продолжительность кванта времени |
---|---|---|
Вновь созданное | То же, что и у родительского процесса | Половина от родительского процесса |
Минимальный приоритет | +19 | 5 мс (MIN_TIMESLICE) |
Приоритет по умолчанию | 0 | 100 мс (DEF_TIMESLICE) |
Максимальный приоритет | -20 | 800 мс (MAX_TIMESLICE) |
Для интерактивных задач планировщик оказывает дополнительную услугу: если задание достаточно интерактивно, то при исчерпании своего кванта времени оно будет помещено не в истекший массив приоритетов, а обратно в активный массив приоритетов. Следует вспомнить, что пересчет значений квантов времени производится путем перестановки активного и истекшего массивов приоритетов: активный массив становится истекшим, а истекший — активным. Такая процедура обеспечивает пересчет значений квантов времени, который масштабируется по времени как scheduler_tick()
, которая вызывается обработчиком прерываний таймера (обсуждается в главе 10, "Таймеры и управление временем"), как показано ниже.
struct task_struct *task = current;
struct runqueue *rq = this_rq();
if (!--task->time_slice) {
if (!TASK_INTERACTIVE(task) || EXPIRED_STARVING(rq))
enqueue_task(task, rq->expired);
else
enqueue_task(task, rq->active);
}