migrate_pages - переносит все страницы процесса на другой набор узлов
migrate_pages(2)
переносит все страницы процесса на другой набор узлов
ОБЗОР
#include <numaif.h>
long migrate_pages(int pid, unsigned long maxnode,
const unsigned long *old_nodes,
const unsigned long *new_nodes);
Компонуется при указании параметра -lnuma.
ОПИСАНИЕ
Вызов
migrate_pages() пытается перенести все страницы процесса с
идентификатором
pid, находящиеся в памяти узлов
old_nodes, в память
узлов
new_nodes. Страницы, не расположенные в узлах
old_nodes, не
переносятся. При переносе на
new_nodes ядро в максимально возможной
степени поддерживает относительную топологию связи внутри
old_nodes.
Аргументы old_nodes и new_nodes представляют собой указатели на маски
битов номеров узлов, до maxnode в каждой маске. Эти маски обрабатываются
как массивы беззнаковых целых long (в последнем целом long биты,
лежащие за пределом maxnode, игнорируются). Аргумент maxnode
представляет собой максимальный номер узла в битовой маске плюс 1 (также как
в mbind(2), но отличается от select(2)).
В аргументе pid задаётся идентификатор процесса, чьи страницы будут
перемещаться. Чтобы перемещать страницы не своего процесса, вызывающий
должен быть привилегированным (CAP_SYS_NICE) или реальный или эффективный
ID пользователя вызывающего процесса должен совпадать с реальным или
сохранённым ID пользователя процесса назначения. Если pid равен 0, то
migrate_pages() перемещает страницы вызвавшего процесса.
Совместно используемые с другими процессами страницы будут перемещаться
только, если первоначальный процесс имеет мандат CAP_SYS_NICE.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При нормальном завершении работы
migrate_pages() возвращает количество
неперемещённых страниц (то есть, ноль означает, что все страницы успешно
перемещены). В случае ошибки возвращается -1, а
errno устанавливается в
соответствующее значение.
ОШИБКИ
EFAULT
Часть или весь диапазон памяти, заданный в old_nodes/new_nodes и
maxnode, указывает за пределы доступного адресного пространства.
EINVAL
Значение maxnode превышает введённое ядром ограничение. В old_nodes
или new_nodes задан один или более ID узлов, превышающих поддерживаемый
максимальный ID узла. Или ни один из ID узлов, указанных в new_nodes,
включен и доступен из контекста текущего набора процессоров процесса, или ни
один из узлов не содержит память.
EPERM
Недостаточно прав (CAP_SYS_NICE) для перемещения страниц процесса,
заданного pid, или недостаточно прав (CAP_SYS_NICE) для доступа к
указанным узлам назначения.
ESRCH
Не найден процесс с указанным pid.
ВЕРСИИ
Вызов
migrate_pages() впервые появился в Linux в ядре версии 2.6.16.
СООТВЕТСТВИЕ СТАНДАРТАМ
Данный вызов есть только в Linux.
ЗАМЕЧАНИЯ
Информация о библиотеке доступна в
numa(7).
Используйте get_mempolicy(2) с флагом MPOL_F_MEMS_ALLOWED для
получения набора узлов, которые доступны в наборе ЦП вызывающему
процессу. Заметим, что эта информация может измениться в любое время вручную
или при автоматической перенастройке набора ЦП.
Использование migrate_pages() может привести к тому, что расположение
страниц (на узле) нарушит политику памяти, установленную для заданных
адресов (см. mbind(2)) и/или заданного процесса
(см. set_mempolicy(2)). То есть политика памяти не ограничивает узлы
назначения, используемые migrate_pages().
Заголовочный файл <numaif.h> не включён в glibc, его можно найти
в пакете с именем libnuma-devel или подобным названием.