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