SET_MEMPOLICY

Section: Linux Programmer's Manual (2)
Updated: 2014-05-28
Index JM Home Page roff page
 

名前

set_mempolicy - プロセスとその子プロセスの NUMA メモリーの デフォルトポリシーを設定する  

書式

#include <numaif.h>

long set_mempolicy(int mode, const unsigned long *nodemask,
                   unsigned long maxnode);

-lnuma でリンクする。
 

説明

set_mempolicy() は、呼び出し元プロセスの NUMA ポリシーを policy に設定する。 NUMA ポリシーはポリシーモードと 0 個以上のノードから構成され、 設定内容は引き数 mode, nodemask, maxnode により指定される。

NUMA (非対称メモリーアクセス) マシンでは、CPU により メモリーコントローラーが異なり、距離も異なっている。 メモリーポリシーは、どのノードからメモリーをそのプロセスに 割り当てるかを定めるものである。

set_mempolicy() は、プロセスのデフォルトポリシーを定める。 プロセスのポリシーは、 mbind(2) で設定される特定のポリシーにより制御されるメモリー領域以外の プロセスのアドレス空間におけるページの割り当てに適用される。 プロセスのデフォルトポリシーは、 MAP_PRIVATE フラグを指定した mmap(2) を使ってマップされたメモリーマップファイルに対する読み出し専用 (ロードされるだけ) のページの割り当てにも適用される。 また、 MAP_SHARED フラグを指定した mmap(2) を使ってマップされたメモリーマップファイルに対するページの割り当てにも 適用される (この場合はページのアクセス種別に関わらず適用される) 。 設定したポリシーは、プロセスに新規のページが割り当てられるときにのみ 適用される。無名メモリー (anonymous memory) の場合、新規ページの割り当ては アプリケーションが初めてページにアクセスした際に行われる。

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 ビットから構成されるノード ID のビットマスクを指す。 ビットマスクの大きさは、直近の sizeof(unsigned long) の倍数に切り上げられるが、カーネルが使用するのは maxnode 個までのビットだけである。 NULL 値の nodemask もしくは値が 0 の maxnode はノードの空集合を表す。 maxnode の値が 0 の場合、 nodemask 引き数は無視される。

nodemask が必須の場面では、 nodemask に、オンラインで、そのプロセスの現在の CPU 集合コンテキストで 許可されており (MPOL_F_STATIC_NODES モードフラグが指定されていない場合)、メモリーがあるノードが 少なくとも一つ入っていなければならない。 modeMPOL_F_STATIC_NODES がセットされ、 nodemask が必須の場面で、 nodemask に、そのプロセスの現在の CPU 集合コンテキストで許可されたノードが 一つも含まれていない場合には、メモリーのポリシーとしてデフォルトの 「ローカルから割り当て (local allocation)」が適用される。 そのプロセスの CPU 集合コンテキストが nodemask で指定されたノードを少なくとも一つ含むようになるまでは、 結果的に指定された動作が上書きされることになる。

MPOL_DEFAULT モードは、デフォルトではないプロセスのメモリーポリシーを削除することを 指定するものである。これにより、メモリーポリシーはシステムの デフォルトポリシーに「戻る」ことになる。 システムのデフォルトポリシーは「ローカルからの割り当て (local allocation)」、 つまりメモリー割り当てのきっかけとなった CPU のノードのメモリーが割り当てられる。 nodemask には NULL を指定しなければならない。 「自ノード (local node)」に空きメモリーが全くない場合、システムは 「近くの (near by) ノード」からメモリーを割り当てようと試みる。

MPOL_BIND モードは厳密なポリシーで、メモリー割り当ては nodemask に指定されたノードに限定される。 nodemask に 2 個以上のノードが指定された場合、ページの割り当ては ノード ID が数字として最小のノードから開始され、 そのノードに空きメモリーがなくなるまでそのノードから ページ割り当てが行われる。そのノードに空きメモリーがなくなったら、 次に小さなノード ID を持つノードからページ割り当てが行われる。 これを、 nodemask で指定された全てのノードで空きメモリーがなくなるまで繰り返す。 nodemask で指定された以外のノードからはページの割り当ては行われない。

MPOL_INTERLEAVE では、ページ割り当てを nodemask に指定されたノードの間でノード ID の数字順で交互に行う。 このポリシーでは、複数のノードにページを広げて配置し、これらのページへのメモリー アクセスを分散することで、遅延ではなく、帯域を最適化する。 ただし、一つのページへのアクセスに関しては依然として一つのノードのメモリー帯域 が上限となる。

MPOL_PREFERRED は、割り当て時に優先されるノード (preferred node) を設定する。 カーネルはまず優先ノードからページ割り当てを行おうとし、 優先ノードに空きメモリーが少ない場合に「近くの (near by)」ノードから 割り当てを行う。 nodemask に複数のノード ID が指定された場合は、 nodemask 内の最初のノードが優先ノードとして選択される。 引き数 nodemask, maxnode で空集合が指定された場合は、ポリシーは (上述のシステムの デフォルトポリシーと同様に) 「ローカルからの割り当て」となる。

プロセスのメモリーポリシーは execve(2) の前後で保持され、 fork(2) や clone(2) を使って作成された子プロセスに継承される。  

返り値

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

エラー

EFAULT
nodemaskmaxnode で指定されたメモリー領域の一部または全部が、 呼び出し元がアクセス可能なアドレス空間外を指している。
EINVAL
mode が不正である。 modeMPOL_DEFAULT で、 nodemask が空ではない。 modeMPOL_BINDMPOL_INTERLEAVE で、 nodemask が空である。 maxnode で実際に意味があるビット数より多くのビット数が指定された。 nodemask に、サポートされている最大ノード ID より大きいノードが指定された。 nodemask に、オンラインで、かつそのプロセスの現在の CPU 集合コンテキストで 許可されているノードが一つも含まれていないか、 メモリーを含むノードが一つも指定されていない。 mode 引き数に MPOL_F_STATIC_NODESMPOL_F_RELATIVE_NODES の両方が指定された。
ENOMEM
利用可能なカーネルメモリーが十分でなかった。
 

バージョン

set_mempolicy() システムコールはバージョン 2.6.7 で Linux カーネルに追加された。  

準拠

このシステムコールは Linux 固有である。  

注意

ページがスワップアウトされる場合には、 プロセスポリシーの設定は推奨されない。 スワップアウトされたページがページインする際にも、 ページ割り当て時に適用されるプロセスポリシーやメモリー領域ポリシーが 使用される。

ライブラリによるサポートについては numa(7) を参照。  

関連項目

get_mempolicy(2), getcpu(2), mbind(2), mmap(2), numa(3), cpuset(7), numa(7), numactl(8)  

この文書について

この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。


 

Index

名前
書式
説明
返り値
エラー
バージョン
準拠
注意
関連項目
この文書について

This document was created by man2html, using the manual pages.
Time: 03:33:26 GMT, March 14, 2018