MBIND(2) | Linux Programmer's Manual | MBIND(2) |
名前
mbind -メモリ領域に対してメモリポリシーを設定する書式
#include <numaif.h>
int mbind(void * addr , unsigned long len , int mode ,
unsigned long * nodemask , unsigned long maxnode ,
unsigned flags );
-lnuma でリンクする。
説明
mbind() は、 addr から始まる長さ len バイトの範囲のメモリに NUMA メモリポリシーを設定する。 NUMA ポリシーはポリシーモードと 0 個以上のノードから構成される。メモリポリシーはどのノードからメモリを割り当てるかを決定する。- MPOL_F_STATIC_NODES (Linux-2.6.26 以降)
- 空でない nodemask は、物理ノード ID である。 Linux では、そのプロセスが異なる CPU 集合コンテキスト (cpuset context) に移動した場合でも、そのプロセスの現在の CPU 集合コンテキストで許可されているノード集合が変化した場合でも、 nodemask をマッピングし直すことはない。
- MPOL_F_RELATIVE_NODES (Linux-2.6.26 以降)
- 空でない nodemask は、そのプロセスの現在の CPU 集合で許可されているノード ID 集合における相対的なノード ID である。
nodemask は、最大で maxnode ビットから構成されるノードのビットマスクを指す。ビットマスクの大きさは、直近の sizeof(unsigned long) の倍数に切り上げられるが、カーネルが使用するのは maxnode 個までのビットだけである。 NULL 値の nodemask もしくは値が 0 の maxnode はノードの空集合を表す。 maxnode の値が 0 の場合、 nodemask 引き数は無視される。 nodemask が必須の場面では、 nodemask に、オンラインで、そのプロセスの現在の CPU 集合コンテキストで許可されており ( MPOL_F_STATIC_NODES モードフラグが指定されていない場合)、メモリがあるノードが少なくとも一つ入っていなければならない。
モード MPOL_DEFAULT はデフォルトではないプロセスのメモリポリシーを削除し、デフォルトの動作に戻すことを指定するものである。 mbind() 経由で、あるメモリ領域に対して MPOL_DEFAULT が適用された場合、プロセスのデフォルトポリシーを使用することを意味する。プロセスのデフォルトポリシーは、 set_mempolicy(2) で変更されているかもしれない。プロセスのポリシーのモードも MPOL_DEFAULT の場合、システム全体のデフォルトポリシーが使用される。システム全体のデフォルトポリシーでは、割り当てのきっかけとなった CPU のノードからページの割り当てを行う。 MPOL_DEFAULT では、引き数 nodemask と maxnode にノードの空集合を指定しなければならない。
MPOL_BIND は厳しいポリシーで、メモリ割り当ては nodemask に指定されたノードに限定される。他のノードへの割り当ては行われない。 nodemask に 2 個以上のノードが指定された場合、ページの割り当てはノード ID が数字として最小のノードから開始され、そのノードに空きメモリがなくなるまでそのノードからページ割り当てが行われる。そのノードに空きメモリがなくなったら、次に小さなノード ID を持つノードからページ割り当てが行われる。これを、 nodemask で指定された全てのノードで空きメモリがなくなるまで繰り返す。 nodemask で指定された以外のノードからはページの割り当ては行われない。
MPOL_INTERLEAVE は、メモリ割り当てが nodemask に指定されたノード間で交互に行われることを指定するものである。このポリシーでは、複数のノードにページを広げて配置し、これらのページへのメモリアクセスを分散することで、遅延ではなく、帯域を最適化する。効果を得るには、メモリ領域をある程度大きくすべきであり、メモリアクセスのパターンがかなり均一な場合でも少なくとも 1MB 以上にすべきである。このモードでも、一つのページへのアクセスに関しては一つのノードのメモリ帯域が上限となることは変わりない。
MPOL_PREFERRED は、割り当て時に優先されるノードを設定する。カーネルはまず優先ノードにページ割り当てを行おうとし、優先ノードに空きメモリが少ない場合に他のノードに割り当てを行う。 nodemask に複数のノード ID が指定された場合は、 nodemask 内の最初のノードが優先ノードとして選択される。引き数 nodemask, maxnode で空集合が指定された場合は、割り当てのきっかけとなった CPU のノードにメモリ割り当てが行われる。 mbind(2) で、あるメモリ領域に対して「ローカルからの割り当て (local allocation)」を指定する方法はこれしかない。
flags に MPOL_MF_STRICT が指定され、 mode が MPOL_DEFAULT でない場合、指定されたポリシーに従っていないメモリ領域にページが存在すると、 mbind() はエラー EIO で失敗する。
flags に MPOL_MF_MOVE が指定されると、カーネルはそのメモリ領域内の既存の全てのページを移動し、指定されたポリシーに従うようにしようとする。他のプロセスと共有されているページは移動されない。 MPOL_MF_STRICT も指定された場合、移動できなかったページがあると、 mbind() はエラー EIO で失敗する。
flags に MPOL_MF_MOVE_ALL が指定されると、カーネルはそのメモリ領域内の既存の全てのページを、他のプロセスがページを使用しているかどうかに関わらず移動する。このフラグを使用するには、呼び出し元のプロセスは特権 ( CAP_SYS_NICE) を持っていなければならない。 MPOL_MF_STRICT も指定された場合、移動できなかったページがあると、 mbind() はエラー EIO で失敗する。
返り値
成功すると、 mbind() は 0 を返す。エラーの場合、-1 を返し、 errno にエラーを示す値を設定する。エラー
- EFAULT
- nodemask と maxnode で指定されたメモリ領域の一部または全部が、呼び出し元がアクセス可能なアドレス空間外を指している。もしくは指定されたメモリ領域にマップされていない部分 (unmapped hole) があった、
- EINVAL
- flags や mode に不正な値が指定された。 addr + len が addr より小さい。 addr がシステムのページサイズの倍数になっていない。または mode が MPOL_DEFAULT で nodemask に空でない集合が指定された。 mode が MPOL_BIND か MPOL_INTERLEAVE で nodemask が空であった。 maxnode がカーネルに適用された上限を超えている。 nodemask に、サポートされている最大ノード ID より大きいノードが指定された。 nodemask に、オンラインで、かつそのプロセスの現在の CPU 集合コンテキストで許可されているノードが一つも含まれていないか、メモリを含むノードが一つも指定されていない。 mode 引き数に MPOL_F_STATIC_NODES と MPOL_F_RELATIVE_NODES の両方が指定された。
- EIO
- MPOL_MF_STRICT が指定されたが、このポリシーに従っていないノードにすでにページが存在していた。もしくは MPOL_MF_MOVE か MPOL_MF_MOVE_ALL が指定されたが、カーネルが指定された領域内の既存の全てのページを移動することができなかった。
- ENOMEM
- 利用可能なカーネルメモリが十分でなかった。
- EPERM
- flags 引き数に MPOL_MF_MOVE_ALL フラグが含まれているが、呼び出し元が CAP_SYS_NICE 特権を持たない。
バージョン
mbind() システムコールはバージョン 2.6.7 で Linux カーネルに追加された。準拠
このシステムコールは Linux 固有である。注意
ライブラリによるサポートについては numa(7) を参照。関連項目
get_mempolicy(2), getcpu(2), mmap(2), set_mempolicy(2), shmat(2), shmget(2), numa(3), cpuset(7), numa(7), numactl(8)この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.51 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。2008-08-15 | Linux |