1 .\" Copyright 2003,2004 Andi Kleen, SuSE Labs.
2 .\" and Copyright 2007 Lee Schermerhorn, Hewlett Packard
4 .\" Permission is granted to make and distribute verbatim copies of this
5 .\" manual provided the copyright notice and this permission notice are
6 .\" preserved on all copies.
8 .\" Permission is granted to copy and distribute modified versions of this
9 .\" manual under the conditions for verbatim copying, provided that the
10 .\" entire resulting derived work is distributed under the terms of a
11 .\" permission notice identical to this one.
13 .\" Since the Linux kernel and libraries are constantly changing, this
14 .\" manual page may be incorrect or out-of-date. The author(s) assume no
15 .\" responsibility for errors or omissions, or for damages resulting from
16 .\" the use of the information contained herein.
18 .\" Formatted or processed versions of this manual, if unaccompanied by
19 .\" the source, must acknowledge the copyright and authors of this work.
21 .\" 2006-02-03, mtk, substantial wording changes and other improvements
22 .\" 2007-08-27, Lee Schermerhorn <Lee.Schermerhorn@hp.com>
23 .\" more precise specification of behavior.
25 .\" Japanese Version Copyright (c) 2006 Akihiro MOTOKI
26 .\" all rights reserved.
27 .\" Translated 2006-07-25, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>, LDP v2.36
28 .\" Updated 2008-08-21, Akihiro MOTOKI, LDP v3.07
29 .\" Updated 2008-09-19, Akihiro MOTOKI, LDP v3.08
31 .TH MBIND 2 2008-08-15 Linux "Linux Programmer's Manual"
33 mbind \- メモリ領域に対してメモリポリシーを設定する
36 .B "#include <numaif.h>"
38 .BI "int mbind(void *" addr ", unsigned long " len ", int " mode ,
39 .BI " unsigned long *" nodemask ", unsigned long " maxnode ,
40 .BI " unsigned " flags );
50 バイトの範囲のメモリに NUMA メモリポリシーを設定する。
51 NUMA ポリシーはポリシーモードと 0 個以上のノードから構成される。
52 メモリポリシーはどのノードからメモリを割り当てるかを決定する。
62 システムコールを使って作成されたメモリ領域 \(em や
66 を使ってマップされたメモリマップ・ファイルが含まれている場合、
67 ページが指定されたポリシーに基づいて割り当てられるのは、アプリケーション
68 がそのページへの書き込み (データの格納) を行った時だけである。
69 無名領域の場合、最初の読み出しアクセスの際には
70 カーネル内の全データが 0 である共有ページが使用される。
72 でマップされたファイルの場合、最初の読み出しアクセスがあると、
73 ページ割り当てが発生するきっかけとなったプロセスのデフォルトポリシー
75 ページ割り当てのきっかけとなったプロセスは、
81 のマッピングでは指定されたポリシーは無視され、
82 ページ割り当てが発生するきっかけとなったプロセスのデフォルトポリシーに
83 したがってページの割り当てが行われることになる。
84 繰り返しになるが、ページ割り当てのきっかけとなったプロセスは、
92 システムコールを使って付加 (attach) されたりした共有メモリ領域が
93 含まれる場合、無名メモリ領域や共有メモリ領域に対するページ割り当ては、
94 共有メモリセグメントへポリシーの設定を行ったプロセスがページ割り当て
95 のきっかけとなったかに関わらず、指定されたポリシーにしたがって割り当て
99 フラグを指定して作成された場合には、ヒュージページ (huge page) の割り当てが
100 指定されたポリシーにしたがって行われるのは、その領域に対して
102 を呼び出したプロセスがページ割り当てのきっかけとなった場合のみである。
106 は新規のメモリ割り当てに対してのみ効果を持つ。
107 ポリシーが設定される前にすでに使用されている範囲内のページに対しては、
109 このデフォルトの動作は、以下で説明するフラグ
119 .BR MPOL_INTERLEAVE ,
125 引き数でそのポリシーモードを適用するノードを指定する必要がある。
135 .BR MPOL_F_STATIC_NODES " (Linux-2.6.26 以降)"
139 Linux では、そのプロセスが異なる CPU 集合コンテキスト (cpuset context)
140 に移動した場合でも、そのプロセスの現在の CPU 集合コンテキストで
141 許可されているノード集合が変化した場合でも、
145 .BR MPOL_F_RELATIVE_NODES " (Linux-2.6.26 以降)"
148 は、そのプロセスの現在の CPU 集合で許可されているノード ID 集合
154 ビットから構成されるノードのビットマスクを指す。
156 .I sizeof(unsigned long)
157 の倍数に切り上げられるが、カーネルが使用するのは
172 に、オンラインで、そのプロセスの現在の CPU 集合コンテキストで
174 .RB ( MPOL_F_STATIC_NODES
175 モードフラグが指定されていない場合)、メモリがあるノードが
180 はデフォルトではないプロセスのメモリポリシーを削除し、
181 デフォルトの動作に戻すことを指定するものである。
185 が適用された場合、プロセスのデフォルトポリシーを使用することを意味する。
187 .BR set_mempolicy (2)
191 の場合、システム全体のデフォルトポリシーが使用される。
192 システム全体のデフォルトポリシーでは、割り当てのきっかけとなった
193 CPU のノードからページの割り当てを行う。
199 にノードの空集合を指定しなければならない。
207 に 2 個以上のノードが指定された場合、ページの割り当ては
208 ノード ID が数字として最小のノードから開始され、
209 そのノードに空きメモリがなくなるまでそのノードから
210 ページ割り当てが行われる。そのノードに空きメモリがなくなったら、
211 .\"motoki: the next highest は the next lowest の間違い?
212 次に小さなノード ID を持つノードからページ割り当てが行われる。
215 で指定された全てのノードで空きメモリがなくなるまで繰り返す。
217 で指定された以外のノードからはページの割り当ては行われない。
222 に指定されたノード間で交互に行われることを指定するものである。
223 このポリシーでは、複数のノードにページを広げて配置し、これらのページへの
224 メモリアクセスを分散することで、遅延ではなく、帯域を最適化する。
225 効果を得るには、メモリ領域をある程度大きくすべきであり、
226 メモリアクセスのパターンがかなり均一な場合でも
228 このモードでも、一つのページへのアクセスに関しては
229 一つのノードのメモリ帯域が上限となることは変わりない。
232 は、割り当て時に優先されるノードを設定する。
233 カーネルはまず優先ノードにページ割り当てを行おうとし、
234 優先ノードに空きメモリが少ない場合に他のノードに割り当てを行う。
236 に複数のノード ID が指定された場合は、
238 内の最初のノードが優先ノードとして選択される。
242 で空集合が指定された場合は、割り当てのきっかけとなった CPU のノードに
245 で、あるメモリ領域に対して「ローカルからの割り当て (local allocation)」を
257 指定されたポリシーに従っていないメモリ領域にページが存在すると、
262 .\" According to the kernel code, the following is not true
263 .\" --Lee Schermerhorn
264 .\" .\"O In 2.6.16 or later the kernel will also try to move pages
265 .\" .\"O to the requested node with this flag.
266 .\" 2.6.16 以降のカーネルでは、このフラグで要求されたノードに
272 が指定されると、カーネルはそのメモリ領域内の既存の全てのページを移動し、
273 指定されたポリシーに従うようにしようとする。
274 他のプロセスと共有されているページは移動されない。
276 も指定された場合、移動できなかったページがあると、
285 が指定されると、カーネルはそのメモリ領域内の既存の全てのページを、
286 他のプロセスがページを使用しているかどうかに関わらず移動する。
287 このフラグを使用するには、呼び出し元のプロセスは特権
291 も指定された場合、移動できなかったページがあると、
296 .\" ---------------------------------------------------------------
300 は 0 を返す。エラーの場合、\-1 を返し、
303 .\" ---------------------------------------------------------------
305 .\" I think I got all of the error returns. --Lee Schermerhorn
311 で指定されたメモリ領域の一部または全部が、
312 呼び出し元がアクセス可能なアドレス空間外を指している。
313 もしくは指定されたメモリ領域にマップされていない部分 (unmapped hole)
326 がシステムのページサイズの倍数になっていない。
344 .\" As at 2.6.23, this limit is "a page worth of bits", e.g.,
345 .\" 8 * 4096 bits, assuming a 4kB page size.
347 に、サポートされている最大ノード ID より大きいノードが指定された。
349 に、オンラインで、かつそのプロセスの現在の CPU 集合コンテキストで
350 許可されているノードが一つも含まれていないか、
351 メモリを含むノードが一つも指定されていない。
354 .B MPOL_F_STATIC_NODES
356 .B MPOL_F_RELATIVE_NODES
361 が指定されたが、このポリシーに従っていないノードに
367 が指定されたが、カーネルが指定された領域内の既存の全てのページを
380 .\" ---------------------------------------------------------------
383 システムコールはバージョン 2.6.7 で Linux カーネルに追加された。
385 このシステムコールは Linux 独自である。
393 フラグが指定されてマップされたメモリマップ・ファイルの領域では
400 .BR set_mempolicy (2)
402 .BR set_mempolicy (2)
405 が指定された場合、そのプロセスのポリシーはシステムの
406 デフォルトポリシー、すなわちローカルからの割り当て、に戻る。
410 が指定された場合、その範囲に対してそれ以降に行われるページの割り当てでは、
411 .BR set_mempolicy (2)
412 で設定したのと同じように、そのプロセスのポリシーが適用される。
413 .\"0motoki: possibly nondefault policy は default policy の間違い?
414 これにより、特定のメモリ領域についてだけ明示的なポリシーを削除し、
415 デフォルトのポリシーに「戻す」ことができる。
416 あるメモリ領域に対して「ローカルからの割り当て」を明示的に設定するには、
424 .BR set_mempolicy (2)
427 2.6.16 でヒュージページ・ポリシーへの対応が追加された。
428 インターリーブ・ポリシーがヒュージページのマッピングで効果を持つには、
429 ポリシーが適用されるメモリが数十メガバイト以上である必要がある。
432 はヒュージページのマッピングでは無視される。
437 は Linux 2.6.16 以降でのみ利用可能である。
439 .BR get_mempolicy (2),
442 .BR set_mempolicy (2),