#include <numaif.h> int set_mempolicy(int policy, unsigned long *nodemask, unsigned long maxnode);
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) を使って作成された子プロセスに継承される。