get_mempolicy - スレッドの NUMA
メモリーのポリシーを取得する
#include <numaif.h>
long get_mempolicy(int *mode, unsigned long *nodemask,
unsigned long maxnode, void *addr,
unsigned long flags);
-lnuma でリンクする。
get_mempolicy()
は、呼び出し元スレッドもしくは指定されたメモリーアドレスの
NUMA ポリシーを
flags
の設定に従って取得する。
NUMA
(非対称メモリーアクセス)
マシンでは、CPU により
メモリーコントローラーが異なり、距離も異なっている。
メモリーポリシーは、どのノードからメモリーをそのスレッドに
割り当てるかを定めるものである。
If
flags is specified as 0, then information about the calling thread's
default policy (as set by
set_mempolicy(2)) is returned, in the buffers
pointed to by
mode and
nodemask. The value returned in these
arguments may be used to restore the thread's policy to its state at the time
of the call to
get_mempolicy() using
set_mempolicy(2). When
flags is 0,
addr must be specified as NULL.
flags に
MPOL_F_MEMS_ALLOWED (Linux 2.6.24
以降で利用可能)
を指定すると、
mode
引数は無視され、
そのスレッドがその後の
mbind(2) や
set_mempolicy(2) で
(
モードフラグ
が指定されていない場合に)
指定できるノード
(メモリー) の集合が
nodemask に返される。
MPOL_F_MEMS_ALLOWED を、
MPOL_F_ADDR や
MPOL_F_NODE
と同時に指定することはできない。
flags に
MPOL_F_ADDR
が指定された場合、
addr
で指定されたメモリーアドレスに適用されているポリシーに関する情報を返す。
mbind(2) や
numa(3)
で説明されているヘルパー関数を使って、
addr
を含むメモリー領域に対するポリシーが設定されていた場合には、
返されるポリシーはスレッドのデフォルトポリシーと違うことがある。
mode 引数が NULL
でない場合、
get_mempolicy()
は要求された NUMA
ポリシーのモードと追加の
モードフラグ を
mode
が指す場所に格納する。
nodemask が NULL
以外の場合、そのポリシーに対応するノードマスクを
この引数が指す場所に格納する。
maxnode には
nodemask
に格納できるノード ID
の数、つまり最大ノード
ID に 1
を足した値を指定する。
maxnode
で指定された値は常に
sizeof(unsigned long)*8
の倍数に切り上げられる。
flags で
MPOL_F_NODE と
MPOL_F_ADDR
の両方が指定された場合、
get_mempolicy() はアドレス
addr
が割り当てられているノードのノード
ID を
mode
が指す場所に入れて返す。
指定されたアドレスにどのページもまだ割り当てられていない場合、
get_mempolicy()
は、あたかもそのスレッドがそのアドレスに対して読み込みアクセスを
実行したかのようにページの割り当てを行い、ページが割り当てられた
ノードの ID を返す。
flags で
MPOL_F_NODE
は指定されたが、
MPOL_F_ADDR
は指定されていない場合で、かつ
そのスレッドの現在のポリシーが
MPOL_INTERLEAVE の場合、
get_mempolicy()
は、そのスレッドに対して割り当てられたカーネルの内部ページで
次にインターリーブ用に使用されるノードのノード
ID を、 NULL でない
mode
引数が指す場所に入れて返す。これには、読み込みアクセス用として
MAP_PRIVATE フラグ付きで
mmap(2)
したプロセスメモリー領域や、
任意のアクセス用として
MAP_SHARED フラグ付きで
mmap(2)
したメモリー領域の、メモリーマップされたファイルに対するページも含まれる。
他のフラグは予約されている。
設定可能なポリシーの概要については
set_mempolicy(2) を参照。
成功すると、
get_mempolicy() は
0
を返す。エラーの場合、-1
を返し、
errno
にエラーを示す値を設定する。
- EFAULT
-
nodemask と maxnode
で指定されたメモリー領域の一部または全部が、
呼び出し元がアクセス可能なアドレス空間外を指している。
- EINVAL
-
maxnode
で指定された値がシステムがサポートするノード
ID
の数よりも少ない。
または、 flags に MPOL_F_NODE
でも MPOL_F_ADDR
でもない値が指定された。
または、 flags に MPOL_F_ADDR
が指定されており、
addr が NULL である。
または、 flags に MPOL_F_ADDR
がされておらず、
addr が NULL でない。
または、 flags に MPOL_F_NODE
が指定されており、
MPOL_F_ADDR
が指定されておらず、
スレッドの現在のポリシーが
MPOL_INTERLEAVE でない。
または、 flags に
MPOL_F_MEMS_ALLOWED
が指定されており、さらに
MPOL_F_ADDR か MPOL_F_NODE
のいずれかが指定されている。
(他にも 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)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。