MIGRATE_PAGES - Linux手册页
Linux程序员手册 第2部分
更新日期: 2019-03-06
名称
migrate_pages-将流程中的所有页面移至另一组节点
语法
#include <numaif.h> long migrate_pages(int pid, unsigned long maxnode, const unsigned long *old_nodes, const unsigned long *new_nodes);
与-lnuma链接。
说明
migrate_pages()尝试将存储节点old_nodes中的进程pid的所有页面移动到new_nodes中的存储节点。不在old_nodes中任何节点中的页面将不会迁移。在迁移到new_nodes期间,内核尽可能地在old_nodes内部维护相对拓扑关系。
old_nodes和new_nodes参数是指向节点编号的位掩码的指针,每个掩码中最多可以有maxnode位。这些掩码被维护为无符号长整数的数组(在最后一个长整数中,将忽略maxnode指定的位以外的位)。 maxnode参数是位掩码中的最大节点数加一(这与mbind(2)中的相同,但与select(2)不同)。
pid参数是要移动其页面的进程的ID。要在另一个进程中移动页面,必须给调用方以特权(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。或者,由new_nodes指定的所有节点ID都不是联机的,并且该进程的当前cpuset上下文允许使用,或者没有指定的节点包含内存。
- 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标志一起使用,以获取调用进程的cpuset允许的节点集。请注意,此信息可随时通过手动或自动重新配置cpuset进行更改。
使用migration_pages()可能导致页面的位置(节点)违反为指定地址(请参阅mbind(2))和/或指定进程(请参阅set_mempolicy(2))建立的内存策略。也就是说,内存策略不限制migration_pages()使用的目标节点。
标头不包含在glibc中,但需要安装libnuma-devel或类似的软件包。
另外参见
get_mempolicy(2),mbind(2),set_mempolicy(2),numa(3),numa_maps(5),cpuset(7),numa(7),migratepages(8),numastat(8)
Linux内核源代码树中的Documentation / vm / page_migration.rst
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。