sched_setattr(2)

НАИМЕНОВАНИЕ
sched_setattr, sched_getattr - назначает и возвращает алгоритм планирования и атрибуты

БИБЛИОТЕКА
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);

Примечание: glibc не предоставляет обёрточных функций для этих системных вызовов, что делает необходимым использование syscall(2).

ОПИСАНИЕ

  sched_setattr()
Системный вызов sched_setattr() задаёт алгоритм планирования и соответствующие атрибуты для нити с идентификатором pid. Если pid равно нулю, то будет изменён алгоритм и атрибуты планирования вызывающей нити.

В настоящее время в Linux поддерживаются следующие «обычные» (т. е. не реального времени) алгоритмы планирования, которые можно указать в policy:

SCHED_OTHER
    алгоритм циклического обслуживания с разделением времени;

SCHED_BATCH
    «пакетный» стиль выполнения процессов;

SCHED_IDLE
    для выполнения фоновых заданий с очень низким приоритетом.

Также поддерживаются различные алгоритмы «реального времени», для специальных, критичных ко времени приложений, которым требуется точное управление методом выбора приложением исполняемых нитей. Правила управления, когда процесс может использовать эти алгоритмы, смотрите в sched(7). Алгоритмы реального времени, которые могут быть указаны в policy:

SCHED_FIFO
    алгоритм «первым вошёл — первым вышел»;

SCHED_RR
    алгоритм циклического обслуживания.

В Linux также предоставляются следующий алгоритм планирования:

SCHED_DEADLINE
    алгоритм планирования с предельным сроком; смотрите sched(7).

Аргумент attr является указателем на структуру, в которой определяется новый алгоритм планирования и атрибуты, для заданной нити. Данная структура имеет следующий вид:

    struct sched_attr {
        u32 size;              /* Size of this structure */
        u32 sched_policy;      /* Policy (SCHED_*) */
        u64 sched_flags;       /* Flags */
        s32 sched_nice;        /* Nice value (SCHED_OTHER,
                                  SCHED_BATCH) */
        u32 sched_priority;    /* Static priority (SCHED_FIFO,
                                  SCHED_RR) */
        /* For SCHED_DEADLINE */
        u64 sched_runtime;
        u64 sched_deadline;
        u64 sched_period;

        /* Utilization hints */
        u32 sched_util_min;
        u32 sched_util_max;
    };

Поля структуры 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_FLAG_UTIL_CLAMP_MIN
    SCHED_FLAG_UTIL_CLAMP_MAX (оба начиная с Linux 5.3)
        These flags indicate that the sched_util_min or sched_util_max fields, respectively, are present, representing the expected minimum and maximum utilization of the thread.

        The utilization attributes provide the scheduler with boundaries within which it should schedule the thread, potentially informing its decisions regarding task placement and frequency selection.

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_util_min
sched_util_max (оба начиная с Linux 5.3)
    These fields specify the expected minimum and maximum utilization, respectively. They are ignored unless their corresponding SCHED_FLAG_UTIL_CLAMP_MIN or SCHED_FLAG_UTIL_CLAMP_MAX is set in sched_flags.

    Utilization is a value in the range [0, 1024], representing the percentage of CPU time used by a task when running at the maximum frequency on the highest capacity CPU of the system. This is a fixed point representation, where 1024 corresponds to 100%, and 0 corresponds to 0%. For example, a 20% utilization task is a task running for 2ms every 10ms at maximum frequency and is represented by a utilization value of 0.2 * 1024 = 205.

    A task with a minimum utilization value larger than 0 is more likely scheduled on a CPU with a capacity big enough to fit the specified value. A task with a maximum utilization value smaller than 1024 is more likely scheduled on a CPU with no more capacity than the specified value.

    A task utilization boundary can be reset by setting its field to UINT32_MAX (since Linux 5.11).

Аргумент flags предназначен для расширения интерфейса в будущем; в текущей реализации его значение должно быть равно 0.

  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 не найдена.

Также sched_getattr() может завершиться с ошибкой по следующим причинам:

E2BIG
    Буфер, задаваемый size и attr, слишком мал.

EINVAL
    Некорректное значение size; то есть, оно меньше чем первая версия структуры sched_attr (48 байт) или больше размера системной страницы.

Также sched_setattr() может завершиться с ошибкой по следующим причинам:

E2BIG
    Буфер, заданный size и attr, больше структуры ядра и один или более превышающих байт не равны нулю.

EBUSY
    Ошибка контроля допуска SCHED_DEADLINE, смотрите sched(7).

EINVAL
    attr.sched_policy is not one of the recognized policies.

EINVAL
    attr.sched_flags contains a flag other than SCHED_FLAG_RESET_ON_FORK.

EINVAL
    attr.sched_priority недействителен.

EINVAL
    attr.sched_policy is SCHED_DEADLINE, and the deadline scheduling parameters in attr are invalid.

EINVAL
    attr.sched_flags contains SCHED_FLAG_UTIL_CLAMP_MIN or SCHED_FLAG_UTIL_CLAMP_MAX, and attr.sched_util_min or attr.sched_util_max are out of bounds.

EOPNOTSUPP
    SCHED_FLAG_UTIL_CLAMP was provided, but the kernel was not built with CONFIG_UCLAMP_TASK support.

EPERM
    Вызывающий не имеет соответствующих прав.

EPERM
    В процессорной маске увязывания нити, заданной в pid, отсутствуют все ЦП системы (смотрите sched_setaffinity(2)).

СТАНДАРТЫ
Linux.

ИСТОРИЯ
Linux 3.14.

ПРИМЕЧАНИЯ
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 <fatzer2@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Hotellook, Nikita <zxcvbnm3230@mail.ru>, Spiros Georgaras <sng@hellug.gr>, Vladislav <ivladislavefimov@gmail.com>, Yuri Kozlov <yuray@komyakino.ru>, Иван Павлов <pavia00@gmail.com> и Kirill Rekhov <krekhov.dev@gmail.com>

Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков (<debian-l10n-russian@lists.debian.org>).