Rechercher une page de manuel
mbind
Langue: ja
Version: 2006-02-07 (fedora - 25/11/07)
Section: 2 (Appels système)
名前
mbind - メモリ領域に対してメモリポリシーを設定する書式
#include <numaif.h> int mbind(void *start, unsigned long len, int policy, unsigned long *nodemask, unsigned long maxnode, unsigned flags); cc ... -lnuma
説明
mbind() は、 start から始まる長さ len バイトの範囲のメモリに NUMA メモリポリシー policy を設定する。 NUMA (非対称メモリアクセス) マシンのメモリは複数のノードに分割され、 メモリポリシーはどのノードにメモリを割り当てるかを決定する。 mbind() は新規のメモリ割り当てに対してのみ効果を持つ。 ポリシーが設定される前にすでに使用されている範囲内のページに対しては、 ポリシーは影響しない。指定可能なポリシーは 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 で失敗する。
返り値
成功すると、 mbind() は 0 を返す。エラーの場合、-1 を返し、 errno にエラーを示す値を設定する。エラー
- EFAULT
- 指定されたメモリ領域にマップされていない部分 (unmapped hole) があった、 もしくは指定されたポインタが有効でなかった。
- EINVAL
- flags や mode に不正な値が指定された。 または start + len が start より小さい。 または policy が MPOL_DEFAULT で nodemask が指す集合が空でなかった。 または policy が MPOL_BIND か MPOL_INTERLEAVE で nodemask が空の集合を指していた。
- ENOMEM
- システムのメモリ不足である。
- EIO
- MPOL_MF_STRICT が指定されたが、このポリシーに従っていないノードに すでにページが存在していた。
準拠
このシステムコールは Linux 独自である。注意
NUMA ポリシーはファイルマッピングではサポートされていない。MPOL_MF_STRICT は今現在はヒュージページ (huge page) マッピングでは無視される。
悪いことに、 MPOL_DEFAULT という名前が同じで、 mbind(2) と set_mempolicy(2) で異なる意味を持つフラグが存在する。 mbind() を呼び出す際に 「割り当てのきっかけとなった CPU のノードに割り当てを行う」 (set_mempolicy(2) の MPOL_DEFAULT と同様) を選択するには、空の nodemask で policy に MPOL_PREFERRED を指定すればよい。
バージョンとライブラリでの対応
システムコール mbind(), get_mempolicy(2), set_mempolicy(2) はバージョン 2.6.7 で Linux カーネルに追加された。 これらは CONFIG_NUMA を有効にしてコンパイルされたカーネルでのみ利用できる。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 も入っている。
関連項目
numa(3), numactl(8), set_mempolicy(2), get_mempolicy(2), mmap(2)Contenus ©2006-2024 Benjamin Poulain
Design ©2006-2024 Maxime Vantorre