.\" Copyright 2003,2004 Andi Kleen, SuSE Labs. .\" and Copyright 2007 Lee Schermerhorn, Hewlett Packard .\" .\" %%%LICENSE_START(VERBATIM_PROF) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\" 2006-02-03, mtk, substantial wording changes and other improvements .\" 2007-08-27, Lee Schermerhorn .\" more precise specification of behavior. .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .\" .\" Translated 2006-08-14, Akihiro MOTOKI , LDP v2.39 .\" Updated 2007-01-07, Akihiro MOTOKI, LDP v2.43 .\" Updated 2008-02-13, Akihiro MOTOKI, LDP v2.77 .\" Updated 2008-08-06, Akihiro MOTOKI, LDP v3.05 .\" Updated 2008-08-21, Akihiro MOTOKI, LDP v3.07 .\" Updated 2008-09-02, Akihiro MOTOKI, LDP v3.08 .\" Updated 2008-11-19, Akihiro MOTOKI, LDP v3.13 .\" .TH SET_MEMPOLICY 2 2014\-05\-28 Linux "Linux Programmer's Manual" .SH 名前 set_mempolicy \- プロセスとその子プロセスの NUMA メモリーの デフォルトポリシーを設定する .SH 書式 .nf \fB#include \fP .sp \fBlong set_mempolicy(int \fP\fImode\fP\fB, const unsigned long *\fP\fInodemask\fP\fB,\fP \fB unsigned long \fP\fImaxnode\fP\fB);\fP .sp \fI\-lnuma\fP でリンクする。 .fi .SH 説明 \fBset_mempolicy\fP() は、呼び出し元プロセスの NUMA ポリシーを \fIpolicy\fP に設定する。 NUMA ポリシーはポリシーモードと 0 個以上のノードから構成され、 設定内容は引き数 \fImode\fP, \fInodemask\fP, \fImaxnode\fP により指定される。 NUMA (非対称メモリーアクセス) マシンでは、CPU により メモリーコントローラーが異なり、距離も異なっている。 メモリーポリシーは、どのノードからメモリーをそのプロセスに 割り当てるかを定めるものである。 \fBset_mempolicy\fP() は、プロセスのデフォルトポリシーを定める。 プロセスのポリシーは、 \fBmbind\fP(2) で設定される特定のポリシーにより制御されるメモリー領域以外の プロセスのアドレス空間におけるページの割り当てに適用される。 プロセスのデフォルトポリシーは、 \fBMAP_PRIVATE\fP フラグを指定した \fBmmap\fP(2) を使ってマップされたメモリーマップファイルに対する読み出し専用 (ロードされるだけ) のページの割り当てにも適用される。 また、 \fBMAP_SHARED\fP フラグを指定した \fBmmap\fP(2) を使ってマップされたメモリーマップファイルに対するページの割り当てにも 適用される (この場合はページのアクセス種別に関わらず適用される) 。 設定したポリシーは、プロセスに新規のページが割り当てられるときにのみ 適用される。無名メモリー (anonymous memory) の場合、新規ページの割り当ては アプリケーションが初めてページにアクセスした際に行われる。 \fImode\fP 引き数には \fBMPOL_DEFAULT\fP, \fBMPOL_BIND\fP, \fBMPOL_INTERLEAVE\fP, \fBMPOL_PREFERRED\fP のいずれか一つを指定してしなければならない。 \fBMPOL_DEFAULT\fP 以外のポリシーの場合、呼び出し元は \fInodemask\fP 引き数で一つ以上のノードを指定する必要がある。 \fImode\fP 引き数には、追加で \fIモードフラグ\fP を含めることもできる。 サポートされている \fIモードフラグ\fP は以下の通りである。 .TP \fBMPOL_F_STATIC_NODES\fP (Linux 2.6.26 以降) 空でない \fInodemask\fP は、物理ノード ID である。 Linux では、そのプロセスが異なる CPU 集合コンテキスト (cpuset context) に移動した場合でも、そのプロセスの現在の CPU 集合コンテキストで 許可されているノード集合が変化した場合でも、 \fInodemask\fP をマッピングし直すことはない。 .TP \fBMPOL_F_RELATIVE_NODES\fP (Linux 2.6.26 以降) 空でない \fInodemask\fP は、そのプロセスの現在の CPU 集合で許可されているノード ID 集合 における相対的なノード ID である。 .PP \fInodemask\fP は、最大で \fImaxnode\fP ビットから構成されるノード ID のビットマスクを指す。 ビットマスクの大きさは、直近の \fIsizeof(unsigned long)\fP の倍数に切り上げられるが、カーネルが使用するのは \fImaxnode\fP 個までのビットだけである。 NULL 値の \fInodemask\fP もしくは値が 0 の \fImaxnode\fP はノードの空集合を表す。 \fImaxnode\fP の値が 0 の場合、 \fInodemask\fP 引き数は無視される。 \fInodemask\fP が必須の場面では、 \fInodemask\fP に、オンラインで、そのプロセスの現在の CPU 集合コンテキストで 許可されており (\fBMPOL_F_STATIC_NODES\fP モードフラグが指定されていない場合)、メモリーがあるノードが 少なくとも一つ入っていなければならない。 \fImode\fP に \fBMPOL_F_STATIC_NODES\fP がセットされ、 \fInodemask\fP が必須の場面で、 \fInodemask\fP に、そのプロセスの現在の CPU 集合コンテキストで許可されたノードが 一つも含まれていない場合には、メモリーのポリシーとしてデフォルトの 「ローカルから割り当て (local allocation)」が適用される。 そのプロセスの CPU 集合コンテキストが \fInodemask\fP で指定されたノードを少なくとも一つ含むようになるまでは、 結果的に指定された動作が上書きされることになる。 \fBMPOL_DEFAULT\fP モードは、デフォルトではないプロセスのメモリーポリシーを削除することを 指定するものである。これにより、メモリーポリシーはシステムの デフォルトポリシーに「戻る」ことになる。 システムのデフォルトポリシーは「ローカルからの割り当て (local allocation)」、 つまりメモリー割り当てのきっかけとなった CPU のノードのメモリーが割り当てられる。 \fInodemask\fP には NULL を指定しなければならない。 「自ノード (local node)」に空きメモリーが全くない場合、システムは 「近くの (near by) ノード」からメモリーを割り当てようと試みる。 \fBMPOL_BIND\fP モードは厳密なポリシーで、メモリー割り当ては \fInodemask\fP に指定されたノードに限定される。 \fInodemask\fP に 2 個以上のノードが指定された場合、ページの割り当ては ノード ID が数字として最小のノードから開始され、 そのノードに空きメモリーがなくなるまでそのノードから ページ割り当てが行われる。そのノードに空きメモリーがなくなったら、 次に小さなノード ID を持つノードからページ割り当てが行われる。 これを、 \fInodemask\fP で指定された全てのノードで空きメモリーがなくなるまで繰り返す。 \fInodemask\fP で指定された以外のノードからはページの割り当ては行われない。 .\" NOTE: the following sentence doesn't make sense in the context .\" of set_mempolicy() -- no memory area specified. .\" To be effective the memory area should be fairly large, .\" at least 1MB or bigger. \fBMPOL_INTERLEAVE\fP では、ページ割り当てを \fInodemask\fP に指定されたノードの間でノード ID の数字順で交互に行う。 このポリシーでは、複数のノードにページを広げて配置し、これらのページへのメモリー アクセスを分散することで、遅延ではなく、帯域を最適化する。 ただし、一つのページへのアクセスに関しては依然として一つのノードのメモリー帯域 が上限となる。 \fBMPOL_PREFERRED\fP は、割り当て時に優先されるノード (preferred node) を設定する。 カーネルはまず優先ノードからページ割り当てを行おうとし、 優先ノードに空きメモリーが少ない場合に「近くの (near by)」ノードから 割り当てを行う。 \fInodemask\fP に複数のノード ID が指定された場合は、 \fInodemask\fP 内の最初のノードが優先ノードとして選択される。 引き数 \fInodemask\fP, \fImaxnode\fP で空集合が指定された場合は、ポリシーは (上述のシステムの デフォルトポリシーと同様に) 「ローカルからの割り当て」となる。 プロセスのメモリーポリシーは \fBexecve\fP(2) の前後で保持され、 \fBfork\fP(2) や \fBclone\fP(2) を使って作成された子プロセスに継承される。 .SH 返り値 成功すると、 \fBset_mempolicy\fP() は 0 を返す。エラーの場合、\-1 を返し、 \fIerrno\fP にエラーを示す値を設定する。 .SH エラー .TP \fBEFAULT\fP \fInodemask\fP と \fImaxnode\fP で指定されたメモリー領域の一部または全部が、 呼び出し元がアクセス可能なアドレス空間外を指している。 .TP \fBEINVAL\fP \fImode\fP が不正である。 \fImode\fP が \fBMPOL_DEFAULT\fP で、 \fInodemask\fP が空ではない。 \fImode\fP が \fBMPOL_BIND\fP か \fBMPOL_INTERLEAVE\fP で、 \fInodemask\fP が空である。 \fImaxnode\fP で実際に意味があるビット数より多くのビット数が指定された。 \fInodemask\fP に、サポートされている最大ノード ID より大きいノードが指定された。 \fInodemask\fP に、オンラインで、かつそのプロセスの現在の CPU 集合コンテキストで 許可されているノードが一つも含まれていないか、 メモリーを含むノードが一つも指定されていない。 \fImode\fP 引き数に \fBMPOL_F_STATIC_NODES\fP と \fBMPOL_F_RELATIVE_NODES\fP の両方が指定された。 .TP \fBENOMEM\fP 利用可能なカーネルメモリーが十分でなかった。 .SH バージョン \fBset_mempolicy\fP() システムコールはバージョン 2.6.7 で Linux カーネルに追加された。 .SH 準拠 このシステムコールは Linux 固有である。 .SH 注意 ページがスワップアウトされる場合には、 プロセスポリシーの設定は推奨されない。 スワップアウトされたページがページインする際にも、 ページ割り当て時に適用されるプロセスポリシーやメモリー領域ポリシーが 使用される。 ライブラリによるサポートについては \fBnuma\fP(7) を参照。 .SH 関連項目 \fBget_mempolicy\fP(2), \fBgetcpu\fP(2), \fBmbind\fP(2), \fBmmap\fP(2), \fBnuma\fP(3), \fBcpuset\fP(7), \fBnuma\fP(7), \fBnumactl\fP(8) .SH この文書について この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man\-pages/ に書かれている。