get_mempolicy - プロセスの NUMA
メモリのポリシーを取得する
#include <numaif.h>
int get_mempolicy(int *mode, unsigned long *nodemask,
unsigned long maxnode, unsigned long addr,
unsigned long flags);
-lnuma でリンクする。
get_mempolicy()
は、呼び出し元プロセスもしくは指定されたメモリアドレスの
NUMA ポリシーを
flags
の設定に従って取得する。
NUMA
(非対称メモリアクセス)
マシンでは、CPU により
メモリコントローラが異なり、距離も異なっている。
メモリポリシーは、どのノードからメモリをそのプロセスに
割り当てるかを定めるものである。
flags に 0
が指定された場合、 (
set_mempolicy(2) で設定された)
呼び出し元プロセスのデフォルトポリシーに関する情報を返す。
返されたポリシー [
mode
と
nodemask] を
set_mempolicy(2)
に渡すことで、そのプロセスのポリシーを
get_mempolicy()
を呼び出した時点の状態に戻すことができる。
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)
の倍数に切り上げられる。
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
プロジェクトのリリース
3.65 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man-pages/
に書かれている。