ИМЯ
sched_setattr, sched_getattr - назначает и возвращает алгоритм планирования и атрибутыLIBRARY
Standard C library ( libc, -lc)СИНТАКСИС
#include <sched.h> /* определения констант SCHED_* */ #include <sys/syscall.h> /* определения констант SYS_* */ #include <unistd.h>
int syscall(SYS_sched_setattr, pid_t pid, struct sched_attr *attr, unsigned int flags); int syscall(SYS_sched_getattr, pid_t pid, struct sched_attr *attr, unsigned int size, unsigned int flags);Note: glibc provides no wrappers for these system calls, necessitating the use of syscall(2).
ОПИСАНИЕ
sched_setattr()
Системный вызов sched_setattr() задаёт алгоритм планирования и соответствующие атрибуты для нити с идентификатором pid. Если pid равно нулю, то будет изменён алгоритм и атрибуты планирования вызывающей нити. В настоящее время в Linux поддерживаются следующие «обычные» (т. е. не реального времени) алгоритмы планирования, которые можно указать в policy:- SCHED_OTHER
- алгоритм циклического обслуживания с разделением времени;
- SCHED_BATCH
- «пакетный» стиль выполнения процессов;
- SCHED_IDLE
- для выполнения фоновых заданий с очень низким приоритетом.
- SCHED_FIFO
- алгоритм «первым вошёл — первым вышел»;
- SCHED_RR
- алгоритм циклического обслуживания.
- SCHED_DEADLINE
- алгоритм планирования с предельным сроком; смотрите sched(7).
struct sched_attr { u32 size; /* размер этой структуры */ u32 sched_policy; /* алгоритм (SCHED_*) */ u64 sched_flags; /* флаги */ s32 sched_nice; /* значение уступчивости (SCHED_OTHER, SCHED_BATCH) */ u32 sched_priority; /* статический приоритет (SCHED_FIFO, SCHED_RR) */ /* остальные поля нужны для SCHED_DEADLINE */ u64 sched_runtime; u64 sched_deadline; u64 sched_period; };
Поля структуры sched_attr:
- size
- В этом поле должен быть указан размер структуры в байтах с помощью sizeof(struct sched_attr). Если предоставляемая структура меньше чем структура ядра, то предполагается, что дополнительные поля равны «0». Если представляемая структура больше ядерной, то ядро проверяет, что все дополнительные поля равны 0; если нет, то sched_setattr() завершается с ошибкой E2BIG и заменяет значение size размером структуры ядра.
- Возможность иметь разный размер структуры sched_attr пользовательского пространства и структуры ядра позволит расширять интерфейс с будущем. Некорректные приложения, передающие больший размер структуры, ничего не сломают в будущем, если увеличится размер ядерной структуры sched_attr. В будущем, это также может позволить приложениям, которые знают о большей структуре sched_attr пользовательского пространства, определять, что они работают на старом ядре, которое не поддерживает структуру большего размера.
- sched_policy
- В этом поле задаётся алгоритм планирования в виде значений SCHED_*, перечисленных выше.
- sched_flags
- Это поле содержит побитовое ИЛИ нуля и более следующих флагов, для управления поведением планирования:
- SCHED_FLAG_RESET_ON_FORK
- Потомки, созданные fork(2), не наследуют привилегированные алгоритмы планирования. Подробней смотрите в sched(7).
- SCHED_FLAG_RECLAIM (начиная с Linux 4.13)
- Этот флаг позволяет нити SCHED_DEADLINE отхватить полосу пропускания, которая не используется другими нитями реального времени.
- SCHED_FLAG_DL_OVERRUN (начиная с Linux 4.16)
- Этот флаг позволяет приложению получать информацию о времени переработки (run-time overrun) в нитях SCHED_DEADLINE. Такие переработки могут быть вызваны (например) неточным учётом времени выполнения или некорректным назначением параметра. Уведомление поступает в виде сигнала SIGXCPU, который генерируется при каждой переработке.
- Сигнал SIGXCPU направляется процессу (смотрите signal(7)), а не нити. Вероятно, это дефект. С одной стороны, sched_setattr() используется для задания атрибутов определённой нити. С другой стороны, если сигнал, направленный процессу, доставляется нити внутри процесса, у которой не было переработки, то приложение не может узнать какая нить переработала.
- sched_nice
- В этом поле задаётся значение уступчивости, которое будет назначено при указании в sched_policy значения SCHED_OTHER или SCHED_BATCH. Значение уступчивости представляет собой число в диапазоне от -20 (высший приоритет) до +19 (низший приоритет); смотрите sched(7).
- sched_priority
- В этом поле указывается статический приоритет, который будет установлен при указании в sched_policy значения SCHED_FIFO или SCHED_RR. Допустимый диапазон приоритетов для этих алгоритмов можно определить с помощью sched_get_priority_min(2) и sched_get_priority_max(2). Для других алгоритмов значение этого поля должно быть равно 0.
- sched_runtime
- В этом поле задаётся параметр «Runtime» для планирования с предельным сроком. Значение выражается в наносекундах. Это и два следующих поля используются только при алгоритме SCHED_DEADLINE; подробности смотрите в sched(7).
- sched_deadline
- В этом поле задаётся параметр «Deadline» для планирования с предельным сроком. Значение выражается в наносекундах.
- sched_period
- В этом поле задаётся параметр «Period» для планирования с предельным сроком. Значение выражается в наносекундах.
sched_getattr()
Системный вызов sched_getattr() возвращает алгоритм планирования и соответствующие атрибуты для нити с идентификатором pid. Если pid равно нулю, то будет возвращён алгоритм и атрибуты планирования вызывающей нити. В аргументе size должен быть задан размер структуры sched_attr, каким он известен в пользовательском пространстве. Значение должно быть не менее размера изначально показанной структуры sched_attr или вызов завершится с ошибкой EINVAL. Возвращаемые атрибуты планирования помещаются в поля структуры sched_attr, на которую указывает attr. Ядро присваивает attr.size размер своей структуры sched_attr. If the caller-provided attr buffer is larger than the kernel's sched_attr structure, the additional bytes in the user-space structure are not touched. If the caller-provided structure is smaller than the kernel sched_attr structure, the kernel will silently not return any values which would be stored outside the provided space. As with sched_setattr(), these semantics allow for future extensibility of the interface. Аргумент flags предназначен для расширения интерфейса в будущем; в текущей реализации его значение должно быть равно 0.ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
On success, sched_setattr() and sched_getattr() return 0. On error, -1 is returned, and errno is set to indicate the error.ОШИБКИ
Вызовы sched_getattr() и sched_setattr() могут завершиться с ошибкой по следующим причинам:- EINVAL
- Значение attr равно NULL; или значение pid отрицательно; или значение flags не равно 0.
- ESRCH
- Нить с идентификатором pid не найдена.
- E2BIG
- Буфер, задаваемый size и attr, слишком мал.
- EINVAL
- Некорректное значение size; то есть, оно меньше чем первая версия структуры sched_attr (48 байт) или больше размера системной страницы.
- E2BIG
- Буфер, заданный size и attr, больше структуры ядра и один или более превышающих байт не равны нулю.
- EBUSY
- Ошибка контроля допуска SCHED_DEADLINE, смотрите sched(7).
- EINVAL
- Значение attr.sched_policy не является одним из возможных алгоритмов; в attr.sched_flags содержится флаг отличный от SCHED_FLAG_RESET_ON_FORK; некорректное значение attr.sched_priority; значение attr.sched_policy равно SCHED_DEADLINE и есть некорректные параметры алгоритм планирования с предельным сроком в attr.
- EPERM
- Вызывающий не имеет соответствующих прав.
- EPERM
- В процессорной маске увязывания нити, заданной в pid, отсутствуют все ЦП системы (смотрите sched_setaffinity(2)).
ВЕРСИИ
Данные системные вызовы впервые появились в Linux 3.14.СТАНДАРТЫ
Данные системные вызовы являются нестандартными расширениями Linux.ЗАМЕЧАНИЯ
glibc does not provide wrappers for these system calls; call them using syscall(2). Вызов sched_setattr() предоставляет весь набор возможностей sched_setscheduler(2), sched_setparam(2), nice(2) и (всё кроме способности задавать приоритет всем процессам, принадлежащим указанному пользователю или всем процессам указанной группы) setpriority(2). Аналогично, sched_getattr() предоставляет весь набор возможностей sched_getscheduler(2), sched_getparam(2) и (частично) getpriority(2).ДЕФЕКТЫ
В версиях Linux до 3.15, sched_setattr() завершается с ошибкой EFAULT, а не E2BIG в случаях, которые описаны в разделе ОШИБКИ. Up to Linux 5.3, sched_getattr() failed with the error EFBIG if the in-kernel sched_attr structure was larger than the size passed by user space.СМ. ТАКЖЕ
chrt(1), nice(2), sched_get_priority_max(2), sched_get_priority_min(2), sched_getaffinity(2), sched_getparam(2), sched_getscheduler(2), sched_rr_get_interval(2), sched_setaffinity(2), sched_setparam(2), sched_setscheduler(2), sched_yield(2), setpriority(2), pthread_getschedparam(3), pthread_setschedparam(3), pthread_setschedprio(3), 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]5 февраля 2023 г. | Linux man-pages 6.03 |