Главная » 2017 » Ноябрь » 21 » man 2 move_pages
00:56
man 2 move_pages

SEO sprint - Всё для максимальной раскрутки!





ИМЯ


move_pages - перемещает отдельные страницы процесса на другой узел



ОБЗОР


#include <numaif.h>

long move_pages(int pid, unsigned long count, void **pages,
const int *nodes, int *status, int flags);

Компонуется при указании параметра -lnuma.



ОПИСАНИЕ


Вызов move_pages() перемещает указанные в pages страницы процесса с pid в память
узлов, заданных в nodes. Результат перемещения отражается в status. В flags
задаются ограничения на перемещаемые страницы.

Значение pid представляет собой идентификатор процесса, в котором перемещаются
страницы. Если pid равен 0, то move_pages() перемещается страницы вызывающего
процесса.

Для перемещения страниц в другом процессе требуются следующие права:

* В ядрах до Linux 4.12 включительно: вызывающий должен иметь права
(CAP_SYS_NICE) или реальный или эффективный пользовательский ID вызывающего
процесса должен совпадать с реальным или сохранённым пользовательским ID
целевого процесса.

* Старые правила позволяли вызывающему обнаруживать различные виртуальные адреса,
выбранные ядром, что лишает смысла случайность расположения раскладки адресного
пространства процесса, принадлежащему тому же UID что и вызывающий; правила
были изменены в Linux 4.13. Начиная с Linux 4.13, права регулируются проверкой
режима доступа ptrace PTRACE_MODE_READ_REALCREDS целевого процесса; смотрите
ptrace(2).

В аргументе count задаётся количество перемещаемых страниц. Он определяет размер
трёх массивов: pages, nodes и status.

Аргумент pages представляет собой массив указателей на страницы, которые должны
быть перемещены. Данные указатели должны быть выровнены на границу страницы.
Адреса указываются в том же виде, в каком доступны процессу с заданным pid.

Аргумент nodes представляет собой массив целых, которыми задаются желаемые
местоположения каждой страницы. Каждый элемент массива представляет собой номер
узла. Также, значением nodes может быть NULL; в этом случае move_pages() не
перемещает страницы, а записывает в массив status номер узла, на котором
расположена каждая страница в данный момент. Получение состояния каждой страницы
может потребоваться для определения страниц, которые нужно переместить.

Аргумент status представляет собой массив целых, которым определяется состояние
каждой страницы. Массив содержит правильные значения только, если вызов
move_pages() не завершился с ошибкой.

В аргументе flags указываются типы перемещаемых страниц. Флаг MPOL_MF_MOVE
означает, что будут перемещены только страницы, которые монопольно используются
процессом. Флаг MPOL_MF_MOVE_ALL означает, что также будут перемещены страницы,
которые используются совместно с другими процессами. Для использования флага
MPOL_MF_MOVE_ALL процесс должен быть привилегированным (CAP_SYS_NICE).
только, если указан флаг MPOL_MF_MOVE_ALL.

-EBUSY Страница в данный момент занята и не может быть перемещена. Попробуйте
позднее. Такое случается, если со страницей выполняется операция
ввода-вывода или другая подсистема ядра удерживается ссылку на эту
страницу.

-EFAULT
Это нулевая страница или область памяти не отображена процессом.

-EIO Не удалось выполнить обратную запись на страницу. Для перемещения требуется
выполнить обратную запись, так как данные страницы неактуальны (dirty), но
файловая система не предоставляет функцию переноса (migration), которая
позволила бы переместить неактуальные страницы.

-EINVAL
Нельзя переместить неактуальные страницы. Файловая система не предоставляет
функцию переноса (migration), поэтому нет возможности выполнить обратную
запись на страницы.

-ENOENT
Страница отсутствует.

-ENOMEM
Не удалось выделить память на узле назначения.



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


При нормальном завершении работы move_pages() возвращает ноль. В случае ошибки
возвращается -1, а errno устанавливается в соответствующее значение.



ОШИБКИ


E2BIG Слишком много перемещаемых страниц.

EACCES Один из узлов назначения не разрешён для текущего набора ЦП.

EFAULT Недоступен массив параметров.

EINVAL Указаны флаги, отличные от MPOL_MF_MOVE и MPOL_MF_MOVE_ALL, или предпринята
попытка переместить (migrate) страницы нити ядра.

ENODEV Один из узлов назначения недоступен (not online).

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

EPERM Вызывающий указал флаг MPOL_MF_MOVE_ALL, но у него не хватает привилегий
(CAP_SYS_NICE). Или вызывающий попытался переместить страницы процесса,
принадлежащие другому пользователю, но не имеет привилегий для этого
(CAP_SYS_NICE).

ESRCH Процесс не существует.



ВЕРСИИ


Вызов move_pages() впервые появился в Linux в ядре версии 2.6.18.



СООТВЕТСТВИЕ СТАНДАРТАМ


Использование этого вызова может привести к тому, что расположение страниц (на
узле) нарушит политику памяти, установленную для заданных адресов (см. mbind(2))
и/или заданного процесса (см. set_mempolicy(2)). То есть политика памяти не
ограничивает узлы назначения, используемые move_pages().

Заголовочный файл <numaif.h> не включён в glibc, его можно найти в пакете с именем
libnuma-devel или подобным названием.



СМОТРИТЕ ТАКЖЕ


get_mempolicy(2), mbind(2), set_mempolicy(2), numa(3), numa_maps(5), cpuset(7),
numa(7), migratepages(8), numastat(8)



Категория: (2) Системные вызовы ядра (функции языка Си) | Просмотров: 369 | Добавил: Администратор | Рейтинг: 0.0/0
Всего комментариев: 0
avatar