SET_MEMPOLICY(2) | Linux Programmer's Manual | SET_MEMPOLICY(2) |
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_LOCAL (詳細は下記参照) のいずれか一つを指定しなければならない。 MPOL_DEFAULT 以外のポリシーモードの場合、呼び出し元は nodemask 引数でそのポリシーモードを適用するノードを指定する必要がある。
mode 引数には、追加で モードフラグ を含めることもできる。 サポートされている モードフラグ は以下の通りである。
nodemask は、最大で maxnode ビットから構成されるノード ID のビットマスクを指す。 ビットマスクの大きさは、直近の sizeof(unsigned long) の倍数に切り上げられるが、カーネルが使用するのは maxnode 個までのビットだけである。 NULL 値の nodemask もしくは値が 0 の maxnode はノードの空集合を表す。 maxnode の値が 0 の場合、 nodemask 引数は無視される。
nodemask が必須の場面では、 nodemask に、オンラインで、そのプロセスの現在の CPU 集合コンテキストで 許可されており (MPOL_F_STATIC_NODES モードフラグが指定されていない場合)、メモリーがあるノードが 少なくとも一つ入っていなければならない。 mode に MPOL_F_STATIC_NODES がセットされ、 nodemask が必須の場面で、 nodemask に、そのプロセスの現在の CPU 集合コンテキストで許可されたノードが 一つも含まれていない場合には、メモリーのポリシーとしてデフォルトの 「ローカルから割り当て (local allocation)」が適用される。 そのプロセスの CPU 集合コンテキストが nodemask で指定されたノードを少なくとも一つ含むようになるまでは、 結果的に指定された動作が上書きされることになる。
mode 引数には、以下の値のいずれかひとつを含めなければならない。
スレッドのメモリーポリシーは execve(2) の前後で保持され、 fork(2) や clone(2) を使って作成された子スレッドに継承される。
成功すると、 set_mempolicy() は 0 を返す。エラーの場合、-1 を返し、 errno にエラーを示す値を設定する。
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 プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。
2020-12-21 | Linux |