ioprio_set(2) | System Calls Manual | ioprio_set(2) |
ioprio_get, ioprio_set - получает/устанавливает класс и приоритет планирования ввода-вывода
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_get() в which указано IOPRIO_WHO_PGRP или IOPRIO_WHO_USER, и под шаблон who подходит более одного процесса, то возвращаемый приоритет будет равен самому высокому значению среди процессов этой группы. Считается, что один приоритет больше другого, если он принадлежит более высокому классу процессов (IOPRIO_CLASS_RT является самым высоким классом приоритетов; IOPRIO_CLASS_IDLE — самым низким), или если оба процесса принадлежат одному классу, то тогда самым высоким будет приоритет с большим уровнем (меньший номер приоритета, означает более высокий уровень).
Аргумент ioprio, задаваемый в ioprio_set(), является битовой маской, в которой указываются класс планирования и приоритет, назначаемый заданному процессу(ам). Для компоновки и разделения значений ioprio используются следующие макросы:
Подробней о классах планирования и приоритетах, а также о значении 0 в ioprio смотрите в разделе ЗАМЕЧАНИЯ.
Приоритеты ввода-вывода поддерживаются при операциях чтения и синхронной (O_DIRECT, O_SYNC) записи. Приоритеты ввода-вывода не поддерживаются при асинхронной записи, так как они вызываются вне контекста программы засоряющей память, и поэтому приоритеты программы не применяются.
При успешном выполнении ioprio_get() возвращается значение ioprio процесса с самым высоким приоритетом ввода-вывода из всех процессов, подходящих под критерий, указанный в which и who. При ошибке возвращается -1, а в errno содержится код ошибки.
При успешном выполнении ioprio_set() возвращается 0. При ошибке возвращается -1, а в errno содержится код ошибки.
Данные системные вызовы появились в 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
Начиная с версии 3 (т. н. CFQ Time Sliced) в CFQ реализованы уровни уступчивости ввода-вывода, подобно используемым в планировщике ЦП. Эти уровни уступчивости сгруппированы в три класса планирования, в каждом содержится один и более уровней приоритета:
Более подробную информацию о планировщике ввода-вывода CFQ и пример программы можно найти в файле исходного кода ядра Documentation/block/ioprio.txt.
Право на изменение приоритета процесса зависит от двух условий:
Вызов 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 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.
5 февраля 2023 г. | Linux man-pages 6.03 |