Linux
2017-09-15
Aliases: sched_getscheduler(2), sched_getscheduler(2), sched_getscheduler(2), sched_getscheduler(2), sched_getscheduler(2), sched_getscheduler(2), sched_getscheduler(2), sched_getscheduler(2), sched_getscheduler(2), sched_getscheduler(2)
man-pages-ru
Russian man pages from the Linux Documentation Project
manpages-dev
Manual pages about using GNU/Linux for development
man-pages
Linux kernel and C library user-space interface documentation
ИМЯ
sched_setscheduler, sched_getscheduler - устанавливает или получает алгоритм планирования (и его параметры)
ОБЗОР
#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->sched_priority должно быть равно 0.
Для каждого перечисленного выше алгоритма в param->sched_priority задаётся приоритет планирования для нити. Это число в диапазоне, возвращаемом вызовами sched_get_priority_min(2) и sched_get_priority_max(2) с указанным policy. В Linux эти системные вызовы возвращают 1 и 99, соответственно.
Параметры планирования указываются в аргументе param, который является указателем на следующую структуру:
struct sched_param {
...
int sched_priority;
... };
...
int sched_priority;
... };
В текущей реализации структура содержит только одно поле — sched_priority. Интерпретация param зависит от выбранного алгоритма.
В настоящее время в Linux поддерживаются следующие «обычные» (т. е. не реального времени) алгоритмы планирования, которые можно указать в policy:
SCHED_OTHER | алгоритм циклического обслуживания с разделением времени; |
SCHED_BATCH | «пакетный» стиль выполнения процессов; |
SCHED_IDLE | для выполнения фоновых заданий с очень низким приоритетом. |
Также поддерживаются различные алгоритмы «реального времени», для специальных, критичных ко времени приложений, которым требуется точное управление методом выбора приложением исполняемых нитей. Правила управления, когда процесс может использовать эти алгоритмы, смотрите в sched(7). Алгоритмы реального времени, которые могут быть указаны в policy:
SCHED_FIFO | алгоритм «первым вошёл — первым вышел»; |
SCHED_RR | алгоритм циклического обслуживания. |
Начиная с Linux 2.6.32, флаг SCHED_RESET_ON_FORK может быть добавлен (OR) в policy при вызове sched_setscheduler(). В результате включения этого флага потомок, созданный fork(2), не наследует алгоритмы привилегированные алгоритмы планирования. Подробней смотрите в sched(7).
Вызов sched_getscheduler() возвращает текущий алгоритм планирования нити с идентификатором pid. Если значение pid равно нулю, то будет выдан алгоритм вызывающей нити.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении sched_setscheduler() возвращается ноль. При успешном выполнении sched_getscheduler() возвращается алгоритм нити (неотрицательное целое). При ошибках оба вызова возвращают -1, а переменной errno присваивается соответствующее значение.
ОШИБКИ
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)
REFERENCED BY
getrlimit(2), gettid(2), mlock(2), nanosleep(2), prctl(2), sched_get_priority_max(2), sched_setaffinity(2), sched_setattr(2), sched_setparam(2), posix_spawn(3), proc(5), cpuset(7), credentials(7), sched(7), chrt(1), taskset(1), sched_rr_get_interval(2), sched_yield(2), vlimit(3), pthread_setschedparam(3), rtctl(1)