名前


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

書式


#include <numaif.h>

int set_mempolicy(int policy, unsigned long *nodemask, unsigned long maxnode);

説明


set_mempolicy() は、呼び出し元プロセスの NUMA ポリシーを policy に設定する。

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

set_mempolicy() は、プロセスのデフォルトのポリシーを定める。 さらに、 mbind(2) を使って、特定のメモリ領域に対してポリシーを設定することができる。 設定したポリシーは、プロセスに新規のページが割り当てられるときにのみ 適用される。無名メモリ (anonymous memory) の場合、新規ページの割り当ては アプリケーションが初めてページにアクセスした際に行われる。

指定可能なポリシーは MPOL_DEFAULT, MPOL_BIND, MPOL_INTERLEAVE, MPOL_PREFERRED である。 MPOL_DEFAULT 以外のポリシーの場合、呼び出し元が nodemask パラメータでポリシーを適用するノードを指定する必要がある。 nodemask はノードを表すビットフィールドへのポインタであり、 maxnode 個のビットから構成される。 ビットフィールドの大きさは、直近の sizeof(unsigned long) の倍数に切り上げられるが、カーネルが使用するのは maxnode 個までのビットだけである。

MPOL_DEFAULT ポリシーがデフォルトであり、これを指定するとローカルのメモリが 割り当てられる、つまりメモリ割り当てのきっかけとなった CPU の ノードにメモリが割り当てられる。 nodemask には NULL を指定すべきである。

MPOL_BIND は厳しいポリシーで、メモリ割り当ては nodemask に指定されたノードに限定される。 他のノードへの割り当ては行われない。

MPOL_INTERLEAVE では、メモリ割り当てを nodemask に指定されたノードに交互に行う。 このポリシーでは、遅延ではなく、帯域が最適化される。 効果を得るには、メモリ領域をある程度大きくすべきであり、 少なくとも 1MB 以上必要である。

MPOL_PREFERRED は、割り当て時に優先されるノードを設定する。 カーネルはまず優先ノードに割り当てを行おうとし、 優先ノードに空きメモリが少ない場合に他のノードに割り当てを行う。 nodemask の最初のノードだけが使用される。 nodemask にどのノードもセットされていなければ、 (MPOL_DEFAULT と同じように) 割り当てのきっかけとなった CPU のノードにメモリ割り当てが行われる。

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

返り値


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

準拠


このシステムコールは Linux 独自である。

注意


ページがスワップ・アウトされる場合には、 プロセスポリシーの設定は推奨されない。

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

mbind(2) 参照。

関連項目


mbind(2), get_mempolicy(2), numactl(8), numa(3)

openSUSE Logo

コンテンツ