#include <numaif.h> int mbind(void *start, unsigned long len, int policy, unsigned long *nodemask, unsigned long maxnode, unsigned flags); cc ... -lnuma
指定可能なポリシーは MPOL_DEFAULT, MPOL_BIND, MPOL_INTERLEAVE, MPOL_PREFERRED である。 MPOL_DEFAULT 以外のポリシーの場合、呼び出し元が nodemask パラメータでポリシーを適用するノードを指定する必要がある。 nodemask はノードのビットマスクであり、 maxnode 個のビットから構成される。 この引き数経由で実際に転送されるバイト数は、直近の sizeof(unsigned long) の倍数に切り上げられるが、カーネルが使用するのは maxnode 個までのビットだけである。 引き数 NULL はノードの空集合を意味する。
MPOL_DEFAULT ポリシーがデフォルトであり、これを指定すると プロセス自体のポリシーが使用される (プロセスのポリシーは set_mempolicy(2) で変更することができる)。 プロセスのポリシーが変更されていない場合、 割り当てのきっかけとなった CPU のノードにメモリが割り当てられること になる。 nodemask には NULL を指定すべきである。
MPOL_BIND は厳しいポリシーで、メモリ割り当ては nodemask に指定されたノードに限定される。 他のノードへの割り当ては行われない。
MPOL_INTERLEAVE では、メモリ割り当てを nodemask に指定されたノードに交互に行う。 このポリシーでは、遅延ではなく、帯域が最適化される。 効果を得るには、メモリ領域をある程度大きくすべきであり、 少なくとも 1MB 以上必要である。
MPOL_PREFERRED は、割り当て時に優先されるノードを設定する。 カーネルはまず優先ノードに割り当てを行おうとし、 優先ノードに空きメモリが少ない場合に他のノードに割り当てを行う。 nodemask の最初のノードだけが使用される。 nodemask にどのノードもセットされていなければ、割り当てのきっかけとなった CPU のノードにメモリ割り当てが行われる。
flags に MPOL_MF_STRICT が 指定され、 policy が MPOL_DEFAULT でない場合、 指定されたポリシーに従っていないマッピングにページが存在すると、 mbind() はエラー EIO で失敗する。 2.6.16 以降のカーネルでは、このフラグで要求されたノードに ページを移動しようとする。
flags に MPOL_MF_MOVE が指定されると、そのマッピング内のすべてのページを移動し、 指定されたポリシーに従うようにしようとする。 他のプロセスと共有されているページは移動されない。 MPOL_MF_STRICT も指定された場合、移動できなかったページがあると、 mbind() はエラー EIO で失敗する。
flags に MPOL_MF_MOVE_ALL が指定されると、そのマッピング内のすべてのページを 他のプロセスがページを使用しているかどうかに関わらず移動する。 このフラグを使用するには、呼び出し元のプロセスは特権 (CAP_SYS_NICE) を持っていなければならない。 MPOL_MF_STRICT も指定された場合、移動できなかったページがあると、 mbind() はエラー EIO で失敗する。
MPOL_MF_STRICT は今現在はヒュージページ (huge page) マッピングでは無視される。
悪いことに、 MPOL_DEFAULT という名前が同じで、 mbind(2) と set_mempolicy(2) で異なる意味を持つフラグが存在する。 mbind() を呼び出す際に 「割り当てのきっかけとなった CPU のノードに割り当てを行う」 (set_mempolicy(2) の MPOL_DEFAULT と同様) を選択するには、空の nodemask で policy に MPOL_PREFERRED を指定すればよい。
2.6.16 でヒュージページ・ポリシーへの対応が追加された。 インターリーブ・ポリシーがヒュージページのマッピングで効果を持つには、 ポリシーが適用されるメモリが数十メガバイト以上である必要がある。
MPOL_MF_MOVE と MPOL_MF_MOVE_ALL は Linux 2.6.16 以降でのみ利用可能である。
これらのシステムコールを直接使用すべきではない。 代わりに、 numactl パッケージの numa(3) 関数により提供される高レベルのインタフェースを 使うのが望ましい。 numactl パッケージは ftp://ftp.suse.com/pub/people/ak/numa/ で入手できる。
システムコールの定義を得るには、 -lnuma 付きでリンクすればよい。 libnuma は numactl パッケージに入っている。 このパッケージには、ヘッダファイル numaif.h も入っている。