Linux, как и Unix, обеспечивает
Проектирование хорошего планировщика процессов для ядра является искусством; практические подробности выходят за рамки данной книги. Однако, процесс может влиять на назначения приоритетов ядром посредством своего значения
Значение относительного приоритета является указанием того, насколько «приятным» хочет быть процесс в отношении других процессов. В соответствии с этим большие значения означают во все большей степени терпеливые процессы; т.е. те, которые все более приятны другим, снижая свой приоритет по отношению к ним.
Отрицательное значение относительного приоритета, с другой стороны, означает, что процесс желает быть «менее приятным» по отношению к другим. Такой процесс более эгоистичный, требуя себе большего количества времени процессора[89]. К счастью, в то время как пользователи могут повышать значение относительного приоритета (быть более приятными), лишь root
может снижать значение относительного приоритета (быть менее приятным).
Значение относительного приоритета является лишь одним фактором в уравнении, используемом ядром для вычисления приоритета; это не значение самого приоритета, которое изменяется с течением времени на основе поведения процесса и состояния других процессов системы. Для изменения значения относительного приоритета используется системный вызов nice()
:
#include
int nice(int inc);
Значение относительного приоритета по умолчанию равно 0. Разрешен диапазон значений от -20 до 19. Это требует некоторой привычки. Чем более отрицательное значение, тем выше приоритет процесса: -20 является наивысшим приоритетом (наименьшая приятность), а 19 — наинизшим приоритетом (наибольшая приятность)
Аргумент inc
является приращением, на который надо изменить значение приоритета. Для получения текущего значения, не изменяя его, используйте 'nice(0)
'. Если результат 'текущий_относительный_приоритет + inc
' выйдет за пределы от -20 до 19, система принудительно включит его в этот диапазон.
Возвращаемое значение является новым значением относительного приоритета или -1, если возникла ошибка. Поскольку -1 также является действительным значением относительного приоритета, при вызове nice()
следует сначала явным образом установить errno
в ноль, а затем проверить его насчет имевшихся проблем:
int niceval;
int inc = /* любое значение */;
errno = 0;
if ((niceval = nice(inc)) < 0 && errno != 0) {
fprintf(stderr, "nice(%d) failed: %s\n", inc, strerror(errno));
/* другое восстановление */
}
Этот пример может завершиться неудачей, если в inc
отрицательное значение, а процесс не запущен как root
.
9.1.3.1. POSIX против действительности
Диапазон значений относительного приоритета от -20 до 19, которые использует Linux, имеет исторические корни; он ведет начало по крайней мерее V7. POSIX выражает состояние менее прямым языком, что дает возможность большей гибкости, сохраняя в то же время историческую совместимость. Это также затрудняет чтение и понимание стандарта, вот почему вы и читаете эту книгу. Итак, вот как описывает это POSIX
Во-первых, (2 * NZERO) - 1
'. Константа NZERO
определена в
и должна равняться по крайней мере 20. Это дает диапазон 0–39.
Во-вторых, как мы описывали, сумма текущего значения относительного приоритета и приращение incr
загоняются в этот диапазон.
В заключение, возвращаемое nice()
значение является значением относительного приоритета процесса минус NZERO
. При значении NZERO
20 это дает первоначальный диапазон от -20 до 19, который мы описали вначале.