ИМЯ
sched_setscheduler, sched_getscheduler - устанавливает или получает алгоритм планирования (и его параметры)LIBRARY
Standard C library ( libc, -lc)СИНТАКСИС
#include <sched.h>
int sched_setscheduler(pid_t pid, int policy, const struct sched_param *param); int sched_getscheduler(pid_t pid);
ОПИСАНИЕ
Вызов sched_setscheduler() задаёт алгоритм и параметры планирования выполнения нити с идентификатором pid. Если pid равен нулю, то будет изменён алгоритм и параметры планирования вызывающей нити. Параметры планирования указываются в аргументе param, который является указателем на следующую структуру:struct sched_param { ... int sched_priority; ... };
В текущей реализации структура содержит только одно поле — sched_priority. Интерпретация param зависит от выбранного алгоритма. В настоящее время в Linux поддерживаются следующие «обычные» (т. е. не реального времени) алгоритмы планирования, которые можно указать в policy:
- SCHED_OTHER
- алгоритм циклического обслуживания с разделением времени;
- SCHED_BATCH
- «пакетный» стиль выполнения процессов;
- SCHED_IDLE
- для выполнения фоновых заданий с очень низким приоритетом.
- SCHED_FIFO
- алгоритм «первым вошёл — первым вышел»;
- SCHED_RR
- алгоритм циклического обслуживания.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
On success, sched_setscheduler() returns zero. On success, sched_getscheduler() returns the policy for the thread (a nonnegative integer). On error, both calls return -1, and errno is set to indicate the error.ОШИБКИ
- EINVAL
- Некорректные аргументы: значение pid отрицательно или param равно NULL.
- EINVAL
- (sched_setscheduler()) Значение policy не равно одному из известных значений алгоритмов.
- EINVAL
- (sched_setscheduler()) Значение param не имеет смысла для заданного policy.
- EPERM
- Вызывающая нить не имеет достаточно привилегий.
- ESRCH
- Нить с идентификатором pid не найдена.
СТАНДАРТЫ
POSIX.1-2001, POSIX.1-2008 (но смотрите ДЕФЕКТЫ далее). Алгоритмы SCHED_BATCH и SCHED_IDLE есть только в Linux.ЗАМЕЧАНИЯ
Подробное описание семантики всех алгоритмов планирования («обычных» и «реального времени») можно найти в справочной странице sched(7). В этой странице также описывается дополнительный алгоритм, SCHED_DEADLINE, который доступен только через вызов sched_setattr(2). В системах POSIX, в которых доступны sched_setscheduler() и sched_getscheduler(), в <unistd.h> определён макрос _POSIX_PRIORITY_SCHEDULING. В POSIX.1 не описаны права, которые требуются привилегированной нити для вызова sched_setscheduler(), и в разных системах используются разные права. Например, в справочной странице Solaris 7 сказано, что реальный и эффективный пользовательский идентификатор вызывающего должен совпадать с реальным пользовательским идентификатором или сохранённым set-user-ID изменяемой нити. Алгоритм планирования и параметры, фактически, являются атрибутами нить в Linux. Значение, возвращаемое из вызова gettid(2), можно передавать в аргументе pid. При указании в pid значения 0 операции будут выполняться на атрибутах вызывающей нити, а при передаче значения, полученном из вызова getpid(2), операции будут выполнятся на атрибутах главной нити группы нитей (если вы используете интерфейс нитей POSIX, то используйте pthread_setschedparam(3), pthread_getschedparam(3) и pthread_setschedprio(3) вместо системных вызовов sched_*(2)).ДЕФЕКТЫ
В POSIX.1 указано, что при успешном выполнении sched_setscheduler() должно возвращаться предыдущее значение алгоритма планирования. В Linux вызов sched_setscheduler() не выполняет это требование, так как при успешном выполнении всегда возвращает 0.СМ. ТАКЖЕ
chrt(1), nice(2), sched_get_priority_max(2), sched_get_priority_min(2), sched_getaffinity(2), sched_getattr(2), sched_getparam(2), sched_rr_get_interval(2), sched_setaffinity(2), sched_setattr(2), sched_setparam(2), sched_yield(2), setpriority(2), capabilities(7), cpuset(7), sched(7)ПЕРЕВОД
Русский перевод этой страницы руководства был сделан Alexander Golubev <[email protected]>, Azamat Hackimov <[email protected]>, Hotellook, Nikita <[email protected]>, Spiros Georgaras <[email protected]>, Vladislav <[email protected]>, Yuri Kozlov <[email protected]> и Иван Павлов <[email protected]> Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на [email protected]30 октября 2022 г. | Linux man-pages 6.03 |