Provided by: manpages-ja-dev_0.5.0.0.20161015+dfsg-1_all
名前
mbind - メモリー領域に対してメモリーポリシーを設定する
書式
#include <numaif.h> long mbind(void *addr, unsigned long len, int mode, const unsigned long *nodemask, unsigned long maxnode, unsigned flags); -lnuma でリンクする。
説明
mbind() は、 addr から始まる長さ len バイトの範囲のメモリーに NUMA メモリーポリシーを設定 する。 NUMA ポリシーはポリシーモードと 0 個以上のノードから構成される。 メモリーポリシーは どのノードからメモリーを割り当てるかを決定する。 addr と len で指定されたメモリー範囲に、 メモリーの「無名」領域 — MAP_ANONYMOUS 付きの mmap(2) システムコールを使って作成されたメモリー領域 — や MAP_PRIVATE 付きの mmap(2) を 使ってマップされたメモリーマップファイルが含まれている場合、アプリケーションがそのページへ の書き込み (データの格納) を行った時には指定されたポリシーのみに基づいてページが割り当てら れる。無名領域の場合、最初の読み出しアクセスの際には カーネル内の全データが 0 である共有 ページが使用される。 MAP_PRIVATE でマップされたファイルの場合、最初の読み出しアクセスがあ ると、 ページ割り当てが発生するきっかけとなったプロセスのデフォルトポリシー にしたがって ページの割り当てが行われる。 ページ割り当てのきっかけとなったプロセスは、 mbind() を呼び 出したプロセスと同じとは限らない。 指定されたメモリー範囲内にある MAP_SHARED のマッピングでは指定されたポリシーは無視され、 ページ割り当てが発生するきっかけとなったプロセスのデフォルトポリシーに したがってページの 割り当てが行われることになる。 繰り返しになるが、ページ割り当てのきっかけとなったプロセス は、 mbind() を呼び出したプロセスと同じとは限らない。 指定されたメモリー範囲に、 shmget(2) システムコールを使って作成されたり、 shmat(2) シス テムコールを使って付加 (attach) されたりした共有メモリー領域が 含まれる場合、無名メモリー 領域や共有メモリー領域に対するページ割り当ては、 共有メモリーセグメントへポリシーの設定を 行ったプロセスがページ割り当て のきっかけとなったかに関わらず、指定されたポリシーにした がって割り当て が行われる。 しかしながら、共有メモリー領域が SHM_HUGETLB フラグを指定して 作成された場合には、ヒュージページ (huge page) の割り当てが 指定されたポリシーにしたがって 行われるのは、その領域に対して mbind() を呼び出したプロセスがページ割り当てのきっかけと なった場合のみである。 デフォルトでは、 mbind() は新規のメモリー割り当てに対してのみ効果を持つ。 ポリシーが設定 される前にすでに使用されている範囲内のページに対しては、 ポリシーは影響しない。 このデフォ ルトの動作は、以下で説明するフラグ MPOL_MF_MOVE や MPOL_MF_MOVE_ALL により上書きされる可能 性がある。 mode 引き数には、 MPOL_DEFAULT, MPOL_BIND, MPOL_INTERLEAVE, MPOL_PREFERRED のいずれか一つ を指定しなければならない。 MPOL_DEFAULT 以外のポリシーモードの場合、呼び出し元は nodemask 引き数でそのポリシーモードを適用するノードを指定する必要がある。 mode 引き数には、追加で モードフラグ を含めることもできる。 サポートされている モードフラ グ は以下の通りである。 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 で指定されたメモリー領域の一部または全部が、 呼び出し元がアクセ ス可能なアドレス空間外を指している。 もしくは addr と len で指定されたメモリー領域 にマップされていない部分 (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) を参照。 NUMA ポリシーは、 MAP_SHARED フラグが指定されてマップされたメモリーマップファイルの領域で は サポートされていない。 MPOL_DEFAULT モードは、 mbind() と set_mempolicy(2) で異なる効果を持つことができる。 set_mempolicy(2) で MPOL_DEFAULT が指定された場合、そのプロセスのポリシーはシステムの デ フォルトポリシー、すなわちローカルからの割り当て、に戻る。 mbind() を使ってメモリーのある 領域に MPOL_DEFAULT が指定された場合、その範囲に対してそれ以降に行われるページの割り当てで は、 set_mempolicy(2) で設定したのと同じように、そのプロセスのポリシーが適用される。 これ により、特定のメモリー領域についてだけ明示的なポリシーを削除し、 デフォルトのポリシーに「 戻す」ことができる。 あるメモリー領域に対して「ローカルからの割り当て」を明示的に設定する には、 mode に MPOL_PREFERRED を指定し、 nodemask に空集合のノードを指定すればよい。 この 方法は set_mempolicy(2) でも通用する。 2.6.16 でヒュージページポリシーへの対応が追加された。 インターリーブポリシーがヒュージペー ジのマッピングで効果を持つには、 ポリシーが適用されるメモリーが数十メガバイト以上である必 要がある。 MPOL_MF_STRICT はヒュージページのマッピングでは無視される。 MPOL_MF_MOVE と MPOL_MF_MOVE_ALL は Linux 2.6.16 以降でのみ利用可能である。
関連項目
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.79 の一部 である。プロジェクト の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。