MBIND

Section: Linux Programmer's Manual (2)
Updated: 2006-02-07
Index JM Home Page roff page
 

名前

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 のノードにメモリ割り当てが行われる。

flagsMPOL_MF_STRICT が 指定され、 policyMPOL_DEFAULT でない場合、 指定されたポリシーに従っていないマッピングにページが存在すると、 mbind() はエラー EIO で失敗する。 2.6.16 以降のカーネルでは、このフラグで要求されたノードに ページを移動しようとする。

flagsMPOL_MF_MOVE が指定されると、そのマッピング内のすべてのページを移動し、 指定されたポリシーに従うようにしようとする。 他のプロセスと共有されているページは移動されない。 MPOL_MF_STRICT も指定された場合、移動できなかったページがあると、 mbind() はエラー EIO で失敗する。

flagsMPOL_MF_MOVE_ALL が指定されると、そのマッピング内のすべてのページを 他のプロセスがページを使用しているかどうかに関わらず移動する。 このフラグを使用するには、呼び出し元のプロセスは特権 (CAP_SYS_NICE) を持っていなければならない。 MPOL_MF_STRICT も指定された場合、移動できなかったページがあると、 mbind() はエラー EIO で失敗する。  

返り値

成功すると、 mbind() は 0 を返す。エラーの場合、-1 を返し、 errno にエラーを示す値を設定する。  

エラー

EFAULT
指定されたメモリ領域にマップされていない部分 (unmapped hole) があった、 もしくは指定されたポインタが有効でなかった。
EINVAL
flagsmode に不正な値が指定された。 または start + lenstart より小さい。 または policyMPOL_DEFAULTnodemask が指す集合が空でなかった。 または policyMPOL_BINDMPOL_INTERLEAVEnodemask が空の集合を指していた。
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 と同様) を選択するには、空の nodemaskpolicyMPOL_PREFERRED を指定すればよい。  

バージョンとライブラリでの対応

システムコール mbind(), get_mempolicy(2), set_mempolicy(2) はバージョン 2.6.7 で Linux カーネルに追加された。 これらは CONFIG_NUMA を有効にしてコンパイルされたカーネルでのみ利用できる。

2.6.16 でヒュージページ・ポリシーへの対応が追加された。 インターリーブ・ポリシーがヒュージページのマッピングで効果を持つには、 ポリシーが適用されるメモリが数十メガバイト以上である必要がある。

MPOL_MF_MOVEMPOL_MF_MOVE_ALL は Linux 2.6.16 以降でのみ利用可能である。

これらのシステムコールを直接使用すべきではない。 代わりに、 numactl パッケージの numa(3) 関数により提供される高レベルのインタフェースを 使うのが望ましい。 numactl パッケージは ftp://ftp.suse.com/pub/people/ak/numa/ で入手できる。

システムコールの定義を得るには、 -lnuma 付きでリンクすればよい。 libnumanumactl パッケージに入っている。 このパッケージには、ヘッダファイル numaif.h も入っている。  

関連項目

numa(3), numactl(8), set_mempolicy(2), get_mempolicy(2), mmap(2)


 

Index

名前
書式
説明
返り値
エラー
準拠
注意
バージョンとライブラリでの対応
関連項目

This document was created by man2html, using the manual pages.
Time: 04:31:51 GMT, November 19, 2007