GET_MEMPOLICY - Linux手册页

时间:2019-08-20 17:58:46  来源:igfitidea点击:

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

名称

get_mempolicy-检索线程的NUMA内存策略

语法

#包括

long get_mempolicy(int *mode, unsigned long *nodemask,
                  unsigned long maxnode, void *addr,
                  unsigned long flags);

Link with -lnuma.

说明

get_mempolicy()检索调用线程或内存地址的NUMA策略,具体取决于标志的设置。

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

如果将标志指定为0,则在mode和nodemask指向的缓冲区中返回有关调用线程的默认策略(由set_mempolicy(2)设置)的信息。在使用set_mempolicy(2)调用get_mempolicy()时,可以使用这些参数中返回的值将线程的策略恢复到其状态。当标志为0时,必须将addr指定为NULL。

如果标志指定MPOL_F_MEMS_ALLOWED(从Linux 2.6.24开始可用),则将忽略mode参数,并允许线程在随后对mbind(2)或set_mempolicy(2)的调用中指定的节点(内存)集节点掩码中返回任何模式标志的值)。不允许将MPOL_F_MEMS_ALLOWED与MPOL_F_ADDR或MPOL_F_NODE结合使用。

如果标志指定MPOL_F_ADDR,则返回有关控制addr中给定的内存地址的策略的信息。如果已使用mbind(2)或numa(3)中描述的一个辅助函数之一为包含addr的内存范围建立策略,则此策略可能与线程的默认策略不同。

如果mode参数不为NULL,则get_mempolicy()将在此参数指向的位置存储请求的NUMA策略的策略模式和任何可选的模式标志。如果nodemask不为NULL,则与策略关联的nodemask将存储在此参数指向的位置。 maxnode指定可以存储到节点掩码中的节点ID的数量,即最大节点ID加1。 maxnode指定的值始终四舍五入为sizeof(unsigned long)* 8的倍数。

如果标志同时指定了MPOL_F_NODE和MPOL_F_ADDR,则get_mempolicy()会将将地址addr分配到的节点的节点ID返回到mode指向的位置。如果尚未为指定地址分配页面,则get_mempolicy()将分配一个页面,就好像线程已对该地址执行读取(加载)访问,并返回分配该页面的节点的ID。

如果标志指定MPOL_F_NODE而不是MPOL_F_ADDR,并且线程的当前策略是MPOL_INTERLEAVE,则get_mempolicy()将在非NULL模式参数所指向的位置返回,该下一个节点的节点ID将用于交织内部内核页代表线程分配。这些分配包括用于内存映射文件的页面,这些页面位于使用mmap(2)调用映射并带有MAP_PRIVATE标志的进程内存范围内,以进行读取访问,而位于带有MAP_SHARED标志映射的内存范围内的所有访问范围。

其他标志值保留。

有关可能的策略的概述,请参见set_mempolicy(2)。

返回值

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

错误说明

EFAULT
由nodemask和maxnode点指定的所有内存范围的一部分位于您可访问的地址空间之外。
EINVAL
maxnode指定的值小于系统支持的节点ID的数量。或标记除MPOL_F_NODE或MPOL_F_ADDR以外的指定值;或标志指定为MPOL_F_ADDR并且addr为NULL,或者标志未指定MPOL_F_ADDR并且addr不为NULL。或者,标志指定为MPOL_F_NODE,但不是MPOL_F_ADDR,并且当前线程策略不是MPOL_INTERLEAVE。或者,用MPOL_F_ADDR或MPOL_F_NODE指定指定的MPOL_F_MEMS_ALLOWED标志。 (还有其他EINVAL案例。)

版本

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

遵循规范

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

备注

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

另外参见

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

出版信息

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