Provided by: manpages-ru-dev_4.21.0-2_all bug

ИМЯ

       ioprio_get,   ioprio_set   -   получает/устанавливает   класс   и  приоритет  планирования
       ввода-вывода

LIBRARY

       Standard C library (libc, -lc)

СИНТАКСИС

       #include <linux/ioprio.h>    /* определения констант IOPRIO_* */
       #include <sys/syscall.h>     /* определения констант SYS_* */
       #include <unistd.h>

       int syscall(SYS_ioprio_get, int which, int who);
       int syscall(SYS_ioprio_set, int which, int who, int ioprio);

       Note: glibc provides no  wrappers  for  these  system  calls,  necessitating  the  use  of
       syscall(2).

ОПИСАНИЕ

       Системные  вызовы  ioprio_get()  и ioprio_set() получают и устанавливают класс и приоритет
       планирования ввода-вывода одной или более нитей.

       В аргументах which и who указывается нить(и), над которой выполняются системные вызовы.  В
       аргументе  which  указывается  как  будет  рассматриваться  who;  он  может  иметь одно из
       следующих значений:

       IOPRIO_WHO_PROCESS
              Значением who является идентификатор процесса или нити, определяющий  один  процесс
              или нить. Если who равно 0, то операции выполняются над вызвавшей нитью.

       IOPRIO_WHO_PGRP
              Значением  who  является  идентификатор  группы,  определяющий  всех  членов группы
              процесса. Если who равно 0, то операции выполняются над группой  процессов,  членом
              которой является вызвавший.

       IOPRIO_WHO_USER
              Значением  who  является  идентификатор  пользователя,  определяющий  все процессы,
              которые имеют этот реальный идентификатор.

       Если при вызове ioprio_get() в which указано IOPRIO_WHO_PGRP или  IOPRIO_WHO_USER,  и  под
       шаблон  who  подходит  более одного процесса, то возвращаемый приоритет будет равен самому
       высокому значению среди процессов  этой  группы.  Считается,  что  один  приоритет  больше
       другого,  если  он  принадлежит  более высокому классу процессов (IOPRIO_CLASS_RT является
       самым высоким классом  приоритетов;  IOPRIO_CLASS_IDLE  —  самым  низким),  или  если  оба
       процесса  принадлежат  одному  классу,  то  тогда  самым высоким будет приоритет с большим
       уровнем (меньший номер приоритета, означает более высокий уровень).

       Аргумент ioprio, задаваемый в ioprio_set(), является битовой маской, в которой указываются
       класс  планирования  и  приоритет,  назначаемый  заданному  процессу(ам). Для компоновки и
       разделения значений ioprio используются следующие макросы:

       IOPRIO_PRIO_VALUE(class, data)
              Объединяет заданный класс планирования class и приоритет (data) в значение  ioprio,
              которое возвращается как результат макроса.

       IOPRIO_PRIO_CLASS(mask)
              Из  указанной маски mask (значение ioprio) возвращает значение класса ввода-вывода,
              то есть одно из значений: IOPRIO_CLASS_RT, IOPRIO_CLASS_BE или IOPRIO_CLASS_IDLE.

       IOPRIO_PRIO_DATA(mask)
              Из указанной маски mask (значение ioprio) возвращает значение приоритета (data).

       Подробней о классах планирования и приоритетах, а также о значении 0 в ioprio  смотрите  в
       разделе ЗАМЕЧАНИЯ.

       Приоритеты  ввода-вывода  поддерживаются  при  операциях  чтения  и  синхронной (O_DIRECT,
       O_SYNC) записи. Приоритеты ввода-вывода не поддерживаются при асинхронной записи, так  как
       они  вызываются  вне контекста программы засоряющей память, и поэтому приоритеты программы
       не применяются.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

       При успешном выполнении ioprio_get() возвращается значение ioprio процесса с самым высоким
       приоритетом  ввода-вывода  из всех процессов, подходящих под критерий, указанный в which и
       who. При ошибке возвращается -1, а в errno содержится код ошибки.

       При успешном выполнении ioprio_set() возвращается 0. При ошибке возвращается -1, а в errno
       содержится код ошибки.

ОШИБКИ

       EINVAL Неправильное  значение  which  или  ioprio.  Обратитесь  к разделу ЗАМЕЧАНИЯ, в нём
              приведены доступные классы планировщика и уровни приоритета ioprio.

       EPERM  У  вызывающего  процесса  нет  прав,  необходимых  для  назначения  данного  ioprio
              указанному   процессу(ам).   Более   подробную   информацию  о  необходимых  правах
              ioprio_set() можно найти в разделе ЗАМЕЧАНИЯ.

       ESRCH  Не найдено процессов, которые бы соответствовали заданным в which и who критериям.

ВЕРСИИ

       Данные системные вызовы появились в Linux начиная с ядра версии 2.6.13.

СТАНДАРТЫ

       Данные системные вызовы есть только в Linux.

ЗАМЕЧАНИЯ

       Два или более процесса или нити могут использовать общий контекст ввода-вывода. Это  может
       происходить  в  случае,  если  вызывается  clone(2) с флагом CLONE_IO. Однако по умолчанию
       разные нити процесса не будут использовать общий контекст ввода-вывода. Это означает,  что
       если  вы  хотите  изменить  приоритет  ввода-вывода  всех  нитей  процесса,  то  вам может
       потребоваться вызвать ioprio_set() для каждой нити. Идентификатор нити, требуемый для этой
       операции, можно получить с помощью gettid(2) или clone(2).

       Данные  системные  вызовы  действительно  работают  только,  если используется планировщик
       ввода-вывода, поддерживающий приоритеты ввода-вывода.  В  ядре  2.6.17  такой  планировщик
       только один: Completely Fair Queuing (CFQ).

       If  no  I/O  scheduler  has  been  set for a thread, then by default the I/O priority will
       follow the CPU nice value (setpriority(2)).  Before Linux 2.6.24, once an I/O priority had
       been  set using ioprio_set(), there was no way to reset the I/O scheduling behavior to the
       default.  Since Linux 2.6.24, specifying ioprio as 0 can be used to reset to  the  default
       I/O scheduling behavior.

   Выбор планировщика ввода-вывода
       Планировщики  ввода-вывода  устанавливаются  в  каждом  устройстве  через специальный файл
       /sys/block/<устройство>/queue/scheduler.

       Используемый в данный момент планировщик  ввода-вывода  можно  посмотреть  через  файловую
       систему /sys. Например, следующая команда покажет список всех планировщиков, загруженных в
       ядро:

           $ cat /sys/block/sda/queue/scheduler
           noop anticipatory deadline [cfq]

       Планировщик,  работающий  на  устройстве  (в  примере  sda),  указан   в  скобках.  Замена
       планировщика выполняется с помощью записи имени нового планировщика в этот файл. Например,
       следующая команда установит планировщик cfq для устройства sda:

           $ su
           Password:
           # echo cfq > /sys/block/sda/queue/scheduler

   Планировщик ввода-вывода с полностью справедливой очерёдностью (CFQ)
       Начиная с версии 3  (т.  н.  CFQ  Time  Sliced)  в  CFQ  реализованы  уровни  уступчивости
       ввода-вывода,   подобно   используемым   в   планировщике   ЦП.  Эти  уровни  уступчивости
       сгруппированы в три  класса  планирования,  в  каждом  содержится  один  и  более  уровней
       приоритета:

       IOPRIO_CLASS_RT (1)
              Класс  ввода-вывода  реального  времени. Данному классу планирования назначен самый
              высокий  приоритет  по  сравнению  с  другими:  процессам  с  этим  классом  всегда
              предоставляется  первоочередной  доступ  к  диску.  Поэтому  данный  класс  следует
              использовать с осторожностью: одним процессом ввода-вывода реального времени  можно
              затормозить  все остальные. В классе реального времени есть 8 уровней данных класса
              (приоритетов), которые уточняют сколько времени нужно процессу для работы с  диском
              для  каждого  сервиса.  Самый  высокий  уровень  приоритета реального времени имеет
              значение 0; самый низкий —  7.  В  будущем  это  может  измениться  и  можно  будет
              непосредственно задавать желаемую скорость обмена данными с диском.

       IOPRIO_CLASS_BE (2)
              Класс   лучшего   из  возможного  (best-effort)  планирования,  устанавливается  по
              умолчанию  для  всех  процессов,  которым  не   назначен   определённый   приоритет
              ввода-вывода.   Данными  класса  (приоритет)  определяется  пропускная  способность
              ввода-вывода процесса. Уровни приоритета данного класса аналогичны  значениям  nice
              для   ЦП  (см.  getpriority(2)).  Уровень  приоритета  определяет  первоочерёдность
              относительно других процессов с классом лучшего из возможного планирования.  Уровни
              приоритета находятся в диапазоне от 0 (самый высший) до 7 (самый низший).

       IOPRIO_CLASS_IDLE (3)
              Класс  свободного (idle) планирования. Процессы, работающие с этим уровнем, получат
              время для ввода-вывода только  когда  нет  обмена  с  диском  процессов  с  другими
              классами.  Свободный класс не имеет данных класса. Обратите внимание, что процесс с
              этим классом приоритета может испытывать нехватку ресурсов, если процессы  с  более
              высокими приоритетами постоянно обращаются к диску.

       Более  подробную информацию о планировщике ввода-вывода CFQ и пример программы можно найти
       в файле исходного кода ядра Documentation/block/ioprio.txt.

   Необходимые права для установки приоритетов ввода-вывода
       Право на изменение приоритета процесса зависит от двух условий:

       Владелец процесса
              Непривилегированный процесс может  установить  приоритет  ввода-вывода  только  для
              процесса,   чей   реальный  идентификатор  совпадает  с  реальным  или  эффективным
              идентификатором  вызывающего  процесса.  Процесс  с  мандатом  CAP_SYS_NICE   может
              изменять приоритет любого процесса.

       Требуемый приоритет
              Attempts  to  set very high priorities (IOPRIO_CLASS_RT)  require the CAP_SYS_ADMIN
              capability.  Up to Linux 2.6.24 also required  CAP_SYS_ADMIN  to  set  a  very  low
              priority (IOPRIO_CLASS_IDLE), but since Linux 2.6.25, this is no longer required.

       Вызов ioprio_set() должен соблюдать оба правила, или он завершится с ошибкой EPERM.

ДЕФЕКТЫ

       glibc  does  not  yet  provide a suitable header file defining the function prototypes and
       macros described on this page.  Suitable definitions can be found in linux/ioprio.h.

СМ. ТАКЖЕ

       ionice(1), getpriority(2), open(2), capabilities(7), cgroups(7)

       Файл Documentation/block/ioprio.txt в дереве исходного кода ядра Linux

ПЕРЕВОД

       Русский   перевод   этой    страницы    руководства    был    сделан    Azamat    Hackimov
       <azamat.hackimov@gmail.com>,    Dmitriy   S.   Seregin   <dseregin@59.ru>,   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⟩.