遵循规范

此系统调用是特定于Linux的。

另外参见

get_mempolicy(2),getcpu(2),mbind(2),mmap(2),numa(3),cpuset(7),numa(7),numactl(8)

名称

set_mempolicy-为线程及其子级设置默认的NUMA内存策略

语法

#include <numaif.h>

long set_mempolicy(int mode, const unsigned long *nodemask,
                   unsigned long maxnode);

Link with -lnuma.

说明

set_mempolicy()将由策略模式和零个或多个节点组成的调用线程的NUMA内存策略设置为mode,nodemask和maxnode参数指定的值。

NUMA计算机具有不同的内存控制器,这些内存控制器到特定CPU的距离不同。内存策略定义从哪个节点为线程分配内存。

此系统调用定义线程的默认策略。线程策略控制由mbind(2)设置的更具体策略控制的内存范围之外的进程的地址空间中页面的分配。线程默认策略还控制任何页面的分配,这些页面分配给使用带有MAP_PRIVATE标志的mmap(2)调用映射的内存映射文件,并且仅由线程读取和加载(使用mmap()映射的内存映射文件)。 2)不管访问类型如何,都使用MAP_SHARED标志进行调用。仅当为线程分配新页面时,才应用该策略。对于匿名内存,这是线程首次触摸该页面的时间。

模式参数必须指定MPOL_DEFAULTMPOL_BINDMPOL_INTERLEAVE,MPOL_PREFERRED或MPOL_LOCAL中的一种(在下面进行详细说明)。除MPOL_DEFAULT以外的所有模式都要求调用者通过nodemask参数指定该模式适用的一个或多个节点。

模式参数也可以包括可选的模式标志。支持的模式标志是:

MPOL_F_STATIC_NODES(since Linux 2.6.26)
非空节点掩码指定物理节点ID。当进程移至其他cpuset上下文时,或者进程的当前cpuset上下文允许的节点集发生更改时,Linux都不会重新映射节点掩码。
MPOL_F_RELATIVE_NODES(since Linux 2.6.26)
非空节点掩码指定相对于进程当前cpuset所允许的节点ID集合的节点ID。

nodemask指向包含最多maxnode位的节点ID的位掩码。位掩码的大小四舍五入为sizeof(无符号长整数)的下一个倍数,但是内核将仅使用最大maxnode的位。 nodemask的NULL值或maxnode的零值指定了空的节点集。如果maxnode的值为零,则将忽略nodemask参数。

在需要节点掩码的情况下,它必须包含进程的当前cpuset上下文允许的至少一个联机节点(除非指定了MPOL_F_STATIC_NODES模式标志),并且必须包含内存。如果MPOL_F_STATIC_NODES设置为mode,并且必需的节点掩码不包含该进程的当前cpuset上下文所允许的节点,则内存策略将还原为本地分配。这将有效地覆盖指定的策略,直到进程的cpuset上下文包括由nodemask指定的一个或多个节点为止。

mode参数必须包含以下值之一:

MPOL_DEFAULT
此模式指定删除所有非默认线程内存策略,以便内存策略"回退"到系统默认策略。系统默认策略是"本地分配",即在触发分配的CPU节点上分配内存。 nodemask必须指定为NULL。如果"本地节点"不包含可用内存,则系统将尝试从"附近"节点分配内存。
MPOL_BIND
此模式定义了严格的策略,该策略将内存分配限制为在nodemask中指定的节点。如果nodemask指定多个节点,则页面分配将首先从数字节点ID最低的节点开始,直到该节点不包含可用内存。然后,分配将来自具有在节点掩码中指定的下一个最高节点ID的节点,依此类推,直到指定的节点均不包含可用内存为止。页面不会从节点掩码中未指定的任何节点中分配。
MPOL_INTERLEAVE
此模式按数字节点ID顺序在节点掩码中指定的节点之间交错页面分配。通过在多个节点之间分散页面和对这些页面的内存访问,可以优化带宽而不是延迟。但是,对单个页面的访问仍将限于单个节点的内存带宽。
MPOL_PREFERRED
此模式设置要分配的首选节点。如果首选节点的可用内存不足,则内核将尝试首先从该节点分配页面,然后回退到"附近"节点。如果nodemask指定多个节点ID,则将选择掩码中的第一个节点作为首选节点。如果nodemask和maxnode参数指定了空集,则该策略将指定"本地分配"(如上面讨论的系统默认策略)。
MPOL_LOCAL(since Linux 3.8)
此模式指定"本地分配";内存分配在触发分配的CPU的节点上("本地节点")。 nodemask和maxnode参数必须指定空集。如果"本地节点"的可用内存不足,则内核将尝试从其他节点分配内存。只要该节点的内存可用,内核就会从"本地节点"分配内存。如果进程的当前cpuset上下文不允许使用"本地节点",则内核将尝试从其他节点分配内存。只要进程的当前cpuset上下文允许,内核就会从"本地节点"分配内存。

线程内存策略在execve(2)中保留,并由使用fork(2)或clone(2)创建的子线程继承。

错误说明

EFAULT
由nodemask和maxnode点指定的所有内存范围的一部分位于您可访问的地址空间之外。
EINVAL
模式无效。或者,模式为MPOL_DEFAULT,节点掩码为非空,或者模式为MPOL_BIND或MPOL_INTERLEAVE,节点掩码为空。或者,maxnode指定的值不止一页。或者,nodemask指定一个或多个大于最大支持节点ID的节点ID。或者,nodemask指定的所有节点ID都不在线,且进程的当前cpuset上下文允许使用,或者指定的节点均不包含内存。或者,模式参数同时指定了MPOL_F_STATIC_NODES和MPOL_F_RELATIVE_NODES。
ENOMEM
内核内存不足。

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

返回值

成功时,set_mempolicy()返回0;否则,返回0。如果出现错误,则返回-1并将errno设置为指示错误。

版本

set_mempolicy()系统调用已添加到2.6.7版的Linux内核中。

SET_MEMPOLICY - Linux手册页

Linux程序员手册 第2部分
更新日期: 2017-09-15

备注

如果换出页面,则不会记住内存策略。当回切此类页面时,它将使用分配页面时有效的线程或内存范围策略。

有关库支持的信息,请参见numa(7)。

日期:2019-08-20 17:59:19 来源:oir作者:oir