Provided by: manpages-ru-dev_4.19.0-7_all bug

ИМЯ

       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(7). Алгоритмы реального времени, которые могут быть указаны в policy:

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

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

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

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

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

           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»  для  планирования  с  предельным  сроком.
              Значение выражается в наносекундах.

       Аргумент  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   не   является   одним  из  возможных  алгоритмов;  в
              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
       <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>

       Этот  перевод  является  бесплатной  документацией;  прочитайте  Стандартную  общественную
       лицензию GNU версии 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

       Если  вы  обнаружите  ошибки  в  переводе этой страницы руководства, пожалуйста, отправьте
       электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.