MOVE_PAGES - Linux手册页
Linux程序员手册 第2部分
更新日期: 2020-06-09
名称
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()将进程pid的指定页面移动到节点指定的内存节点。移动的结果反映在状态中。这些标志指示对要移动的页面的约束。
pid是要在其中移动页面的进程的ID。如果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是指向应移动页面的指针的数组。这些是应该与页面边界对齐的指针。地址由pid指定的进程指定。
节点是一个整数数组,为每个页面指定所需的位置。数组中的每个元素都是一个节点号。节点也可以为NULL,在这种情况下,move_pages()不会移动任何页面,而是将返回状态数组中当前每个页面所在的节点。为了确定需要移动的页面,可能需要获取每个页面的状态。
status是一个整数数组,返回每个页面的状态。仅当move_pages()没有返回错误时,该数组才包含有效值。将数组预初始化为不能代表实际numa节点或状态数组有效错误的值可以帮助识别已迁移的页面。
标志指定要移动的页面类型。 MPOL_MF_MOVE意味着仅移动该进程专用的页面。 MPOL_MF_MOVE_ALL表示还可以移动多个进程之间共享的页面。该进程必须具有特权(CAP_SYS_NICE)才能使用MPOL_MF_MOVE_ALL。
Page states in the status array
可以在状态数组的每个元素中返回以下值。
- 0..MAX_NUMNODES
- 标识页面所在的节点。
- -EACCES
- 该页面由多个进程映射,并且仅在指定了MPOL_MF_MOVE_ALL的情况下才能移动。
- -EBUSY
- 该页面当前正忙,无法移动。稍后再试。如果页面正在进行I / O或另一个内核子系统持有对该页面的引用,则会发生这种情况。
- -EFAULT
- 这是零页,或者该进程未映射内存区域。
- -EIO
- 无法写回页面。由于该页面是脏的并且文件系统没有提供允许移动脏页面的迁移功能,因此必须写回该页面才能移动它。
- -EINVAL
- 脏页无法移动。文件系统不提供迁移功能,也无法回写页面。
- -ENOENT
- 该页面不存在。
- -ENOMEM
- 无法在目标节点上分配内存。
返回值
成功时,move_pages()返回零。错误时,它返回-1,并将errno设置为错误。如果返回正值,则为未迁移的页数。
错误说明
- Positive value
- 非迁移页面的数量,如果它们是非致命原因的结果(自Linux 4.17开始)。 E2BIG移动的页面太多。从Linux 2.6.29开始,内核不再生成此错误。
- EACCES
- 当前cpuset不允许目标节点之一。
- EFAULT
- 无法访问参数数组。
- EINVAL
- 指定了MPOL_MF_MOVE和MPOL_MF_MOVE_ALL以外的其他标志,或者尝试迁移内核线程的页面。
- ENODEV
- 目标节点之一不在线。
- EPERM
- 调用者在没有足够特权(CAP_SYS_NICE)的情况下指定了MPOL_MF_MOVE_ALL。或者,调用者尝试移动属于另一个用户的进程的页面,但是没有这样做的权限(CAP_SYS_NICE)。
- ESRCH
- 进程不存在。
版本
move_pages()首次出现在Linux 2.6.18版中。
遵循规范
此系统调用是特定于Linux的。
备注
有关库支持的信息,请参见numa(7)。
将get_mempolicy(2)与MPOL_F_MEMS_ALLOWED标志一起使用,以获取当前cpuset所允许的节点集。请注意,此信息随时可以通过手动或自动重新配置cpuset进行更改。
使用此功能可能导致页面的位置(节点)违反为指定地址(请参阅mbind(2))和/或指定进程(请参阅set_mempolicy(2))建立的内存策略。也就是说,内存策略不限制move_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手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。