GET_MEMPOLICY(2) | Linux Programmer's Manual | GET_MEMPOLICY(2) |
名前¶
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)
2008-08-15 | Linux |