Provided by: manpages-ja-dev_0.5.0.0.20140515+dfsg-2_all bug

名前

       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 個以上のノードから構成される。  メモリポリシーはどのノードからメモリを割り当てる
       かを決定する。

       addrlen で指定されたメモリ範囲に、 メモリの「無名」領域 — 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_MOVEMPOL_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 では、引き数 nodemaskmaxnode にノードの空集合を指定しなければならない。

       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)」を 指定する方法はこれしかない。

       flagsMPOL_MF_STRICT が 指定され、 modeMPOL_DEFAULT でない場合、  指定されたポリシーに従っていない
       メモリ領域にページが存在すると、 mbind()  はエラー EIO で失敗する。

       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 nodemaskmaxnode で指定されたメモリ領域の一部または全部が、  呼び出し元がアクセス可能なアドレス
              空間外を指している。  もしくは指定されたメモリ領域にマップされていない部分 (unmapped hole)  があっ
              た、

       EINVAL flagsmode に不正な値が指定された。 addr + lenaddr より小さい。 addr がシステムのページサイ
              ズの倍数になっていない。 または modeMPOL_DEFAULTnodemask に空でない集合が指定された。 modeMPOL_BINDMPOL_INTERLEAVEnodemask が空であった。 maxnode  がカーネルに適用された上限を超
              えている。  nodemask  に、サポートされている最大ノード  ID より大きいノードが指定された。 nodemask
              に、オンラインで、かつそのプロセスの現在の CPU 集合コンテキストで 許可されているノードが一つも含ま
              れていないか、  メモリを含むノードが一つも指定されていない。  mode 引き数に MPOL_F_STATIC_NODESMPOL_F_RELATIVE_NODES の両方が指定された。

       EIO    MPOL_MF_STRICT が指定されたが、このポリシーに従っていないノードに すでにページが存在していた。  も
              しくは  MPOL_MF_MOVEMPOL_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)  で設定したのと同じように、そのプロセスのポ
       リシーが適用される。  これにより、特定のメモリ領域についてだけ明示的なポリシーを削除し、 デフォルトのポリ
       シーに「戻す」ことができる。     あるメモリ領域に対して「ローカルからの割り当て」を明示的に設定するには、
       modeMPOL_PREFERRED を指定し、 nodemask に空集合のノードを指定すればよい。 この方法は set_mempolicy(2)
       でも通用する。

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

       MPOL_MF_STRICT はヒュージページのマッピングでは無視される。

       MPOL_MF_MOVEMPOL_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.65 の一部 である。プロジェクトの説明とバグ報告
       に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。