migrate_pages -
переносит
все
страницы
процесса
на другой
набор
узлов
NUMA (Non-Uniform Memory Access) policy library (
libnuma,
-lnuma)
#include <numaif.h>
long migrate_pages(int pid, unsigned long maxnode,
const unsigned long *old_nodes,
const unsigned long *new_nodes);
Вызов
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.
The
migrate_pages() system call first appeared in 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
или
подобным
названием.
get_mempolicy(2),
mbind(2),
set_mempolicy(2),
numa(3),
numa_maps(5),
cpuset(7),
numa(7),
migratepages(8),
numastat(8)
Файл
Documentation/vm/page_migration.rst
в дереве
исходного
кода ядра Linux
Русский
перевод
этой
страницы
руководства
был сделан
aereiae <
[email protected]>, Alexey <
[email protected]>, Azamat
Hackimov <
[email protected]>, Dmitriy S. Seregin
<
[email protected]>, Dmitry Bolkhovskikh <
[email protected]>,
ITriskTI <
[email protected]>, Max Is <
[email protected]>, Yuri
Kozlov <
[email protected]>, Иван
Павлов <
[email protected]>
и Малянов
Евгений
Викторович
<
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]