.\" 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. .\" .\" FIXME .\" Linux 3.8 added the following, which need to be documented. .\" And do they also apply for move_pages()? .\" .\" MPOL_LOCAL .\" commit 479e2802d09f1e18a97262c4c6f8f17ae5884bd8 .\" Author: Peter Zijlstra .\" Date: Thu Oct 25 14:16:28 2012 +0200 .\" .\" commit f2a07f40dbc603c15f8b06e6ec7f768af67b424f .\" Author: Hugh Dickins .\" Date: Wed Jan 2 02:01:33 2013 -0800 .\" .\" MPOL_MF_LAZY .\" commit b24f53a0bea38b266d219ee651b22dba727c44ae .\" Author: Lee Schermerhorn .\" Date: Thu Oct 25 14:16:32 2012 +0200 .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .\" .\" Japanese Version Copyright (c) 2006 Akihiro MOTOKI .\" all rights reserved. .\" Translated 2006-07-25, Akihiro MOTOKI , LDP v2.36 .\" Updated 2008-08-21, Akihiro MOTOKI, LDP v3.07 .\" Updated 2008-09-19, Akihiro MOTOKI, LDP v3.08 .\" Updated 2013-03-26, Akihiro MOTOKI .\" Updated 2013-05-01, Akihiro MOTOKI .\" .TH MBIND 2 2015\-01\-22 Linux "Linux Programmer's Manual" .SH 名前 mbind \- メモリー領域に対してメモリーポリシーを設定する .SH 書式 .nf \fB#include \fP .sp \fBlong mbind(void *\fP\fIaddr\fP\fB, unsigned long \fP\fIlen\fP\fB, int \fP\fImode\fP\fB,\fP \fB const unsigned long *\fP\fInodemask\fP\fB, unsigned long \fP\fImaxnode\fP\fB,\fP \fB unsigned \fP\fIflags\fP\fB);\fP .sp \fI\-lnuma\fP でリンクする。 .fi .SH 説明 \fBmbind\fP() は、 \fIaddr\fP から始まる長さ \fIlen\fP バイトの範囲のメモリーに NUMA メモリーポリシーを設定する。 NUMA ポリシーはポリシーモードと 0 個以上のノードから構成される。 メモリーポリシーはどのノードからメモリーを割り当てるかを決定する。 \fIaddr\fP と \fIlen\fP で指定されたメモリー範囲に、 メモリーの「無名」領域 \(em \fBMAP_ANONYMOUS\fP 付きの \fBmmap\fP(2) システムコールを使って作成されたメモリー領域 \(em や \fBMAP_PRIVATE\fP 付きの \fBmmap\fP(2) を使ってマップされたメモリーマップファイルが含まれている場合、アプリケーションがそのページへの書き込み (データの格納) を行った時には指定されたポリシーのみに基づいてページが割り当てられる。無名領域の場合、最初の読み出しアクセスの際には カーネル内の全データが 0 である共有ページが使用される。 \fBMAP_PRIVATE\fP でマップされたファイルの場合、最初の読み出しアクセスがあると、 ページ割り当てが発生するきっかけとなったプロセスのデフォルトポリシー にしたがってページの割り当てが行われる。 ページ割り当てのきっかけとなったプロセスは、 \fBmbind\fP() を呼び出したプロセスと同じとは限らない。 指定されたメモリー範囲内にある \fBMAP_SHARED\fP のマッピングでは指定されたポリシーは無視され、 ページ割り当てが発生するきっかけとなったプロセスのデフォルトポリシーに したがってページの割り当てが行われることになる。 繰り返しになるが、ページ割り当てのきっかけとなったプロセスは、 \fBmbind\fP() を呼び出したプロセスと同じとは限らない。 指定されたメモリー範囲に、 \fBshmget\fP(2) システムコールを使って作成されたり、 \fBshmat\fP(2) システムコールを使って付加 (attach) されたりした共有メモリー領域が 含まれる場合、無名メモリー領域や共有メモリー領域に対するページ割り当ては、 共有メモリーセグメントへポリシーの設定を行ったプロセスがページ割り当て のきっかけとなったかに関わらず、指定されたポリシーにしたがって割り当て が行われる。 しかしながら、共有メモリー領域が \fBSHM_HUGETLB\fP フラグを指定して作成された場合には、ヒュージページ (huge page) の割り当てが 指定されたポリシーにしたがって行われるのは、その領域に対して \fBmbind\fP() を呼び出したプロセスがページ割り当てのきっかけとなった場合のみである。 デフォルトでは、 \fBmbind\fP() は新規のメモリー割り当てに対してのみ効果を持つ。 ポリシーが設定される前にすでに使用されている範囲内のページに対しては、 ポリシーは影響しない。 このデフォルトの動作は、以下で説明するフラグ \fBMPOL_MF_MOVE\fP や \fBMPOL_MF_MOVE_ALL\fP により上書きされる可能性がある。 \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 ビットから構成されるノードのビットマスクを指す。 ビットマスクの大きさは、直近の \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 モードフラグが指定されていない場合)、メモリーがあるノードが 少なくとも一つ入っていなければならない。 モード \fBMPOL_DEFAULT\fP はデフォルトではないプロセスのメモリーポリシーを削除し、 デフォルトの動作に戻すことを指定するものである。 \fBmbind\fP() 経由で、あるメモリー領域に対して \fBMPOL_DEFAULT\fP が適用された場合、プロセスのデフォルトポリシーを使用することを意味する。 プロセスのデフォルトポリシーは、 \fBset_mempolicy\fP(2) で変更されているかもしれない。 プロセスのポリシーのモードも \fBMPOL_DEFAULT\fP の場合、システム全体のデフォルトポリシーが使用される。 システム全体のデフォルトポリシーでは、割り当てのきっかけとなった CPU のノードからページの割り当てを行う。 \fBMPOL_DEFAULT\fP では、引き数 \fInodemask\fP と \fImaxnode\fP にノードの空集合を指定しなければならない。 \fBMPOL_BIND\fP は厳しいポリシーで、メモリー割り当ては \fInodemask\fP に指定されたノードに限定される。 他のノードへの割り当ては行われない。 \fInodemask\fP に 2 個以上のノードが指定された場合、ページの割り当ては ノード ID が数字として最小のノードから開始され、 そのノードに空きメモリーがなくなるまでそのノードから ページ割り当てが行われる。そのノードに空きメモリーがなくなったら、 次に小さなノード ID を持つノードからページ割り当てが行われる。 これを、 \fInodemask\fP で指定された全てのノードで空きメモリーがなくなるまで繰り返す。 \fInodemask\fP で指定された以外のノードからはページの割り当ては行われない。 \fBMPOL_INTERLEAVE\fP は、メモリー割り当てが \fInodemask\fP に指定されたノード間で交互に行われることを指定するものである。 このポリシーでは、複数のノードにページを広げて配置し、これらのページへの メモリーアクセスを分散することで、遅延ではなく、帯域を最適化する。 効果を得るには、メモリー領域をある程度大きくすべきであり、 メモリーアクセスのパターンがかなり均一な場合でも 少なくとも 1MB 以上にすべきである。 このモードでも、一つのページへのアクセスに関しては 一つのノードのメモリー帯域が上限となることは変わりない。 \fBMPOL_PREFERRED\fP は、割り当て時に優先されるノードを設定する。 カーネルはまず優先ノードにページ割り当てを行おうとし、 優先ノードに空きメモリーが少ない場合に他のノードに割り当てを行う。 \fInodemask\fP に複数のノード ID が指定された場合は、 \fInodemask\fP 内の最初のノードが優先ノードとして選択される。 引き数 \fInodemask\fP, \fImaxnode\fP で空集合が指定された場合は、割り当てのきっかけとなった CPU のノードに メモリー割り当てが行われる。 \fBmbind\fP(2) で、あるメモリー領域に対して「ローカルからの割り当て (local allocation)」を 指定する方法はこれしかない。 .\" According to the kernel code, the following is not true .\" --Lee Schermerhorn .\" In 2.6.16 or later the kernel will also try to move pages .\" to the requested node with this flag. \fIflags\fP に \fBMPOL_MF_STRICT\fP が 指定され、 \fImode\fP が \fBMPOL_DEFAULT\fP でない場合、 指定されたポリシーに従っていないメモリー領域にページが存在すると、 \fBmbind\fP() はエラー \fBEIO\fP で失敗する。 \fIflags\fP に \fBMPOL_MF_MOVE\fP が指定されると、カーネルはそのメモリー領域内の既存の全てのページを移動し、 指定されたポリシーに従うようにしようとする。 他のプロセスと共有されているページは移動されない。 \fBMPOL_MF_STRICT\fP も指定された場合、移動できなかったページがあると、 \fBmbind\fP() はエラー \fBEIO\fP で失敗する。 .\" --------------------------------------------------------------- \fIflags\fP に \fBMPOL_MF_MOVE_ALL\fP が指定されると、カーネルはそのメモリー領域内の既存の全てのページを、 他のプロセスがページを使用しているかどうかに関わらず移動する。 このフラグを使用するには、呼び出し元のプロセスは特権 (\fBCAP_SYS_NICE\fP) を持っていなければならない。 \fBMPOL_MF_STRICT\fP も指定された場合、移動できなかったページがあると、 \fBmbind\fP() はエラー \fBEIO\fP で失敗する。 .SH 返り値 .\" --------------------------------------------------------------- 成功すると、 \fBmbind\fP() は 0 を返す。エラーの場合、\-1 を返し、 \fIerrno\fP にエラーを示す値を設定する。 .SH エラー .\" I think I got all of the error returns. --Lee Schermerhorn .TP \fBEFAULT\fP \fInodemask\fP と \fImaxnode\fP で指定されたメモリー領域の一部または全部が、 呼び出し元がアクセス可能なアドレス空間外を指している。 もしくは \fIaddr\fP と \fIlen\fP で指定されたメモリー領域にマップされていない部分 (unmapped hole) があった、 .TP \fBEINVAL\fP .\" As at 2.6.23, this limit is "a page worth of bits", e.g., .\" 8 * 4096 bits, assuming a 4kB page size. \fIflags\fP や \fImode\fP に不正な値が指定された。 \fIaddr + len\fP が \fIaddr\fP より小さい。 \fIaddr\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 \fBEIO\fP \fBMPOL_MF_STRICT\fP が指定されたが、このポリシーに従っていないノードに すでにページが存在していた。 もしくは \fBMPOL_MF_MOVE\fP か \fBMPOL_MF_MOVE_ALL\fP が指定されたが、カーネルが指定された領域内の既存の全てのページを 移動することができなかった。 .TP \fBENOMEM\fP 利用可能なカーネルメモリーが十分でなかった。 .TP \fBEPERM\fP .\" --------------------------------------------------------------- \fIflags\fP 引き数に \fBMPOL_MF_MOVE_ALL\fP フラグが含まれているが、呼び出し元が \fBCAP_SYS_NICE\fP 特権を持たない。 .SH バージョン \fBmbind\fP() システムコールはバージョン 2.6.7 で Linux カーネルに追加された。 .SH 準拠 このシステムコールは Linux 固有である。 .SH 注意 ライブラリによるサポートについては \fBnuma\fP(7) を参照。 NUMA ポリシーは、 \fBMAP_SHARED\fP フラグが指定されてマップされたメモリーマップファイルの領域では サポートされていない。 \fBMPOL_DEFAULT\fP モードは、 \fBmbind\fP() と \fBset_mempolicy\fP(2) で異なる効果を持つことができる。 \fBset_mempolicy\fP(2) で \fBMPOL_DEFAULT\fP が指定された場合、そのプロセスのポリシーはシステムの デフォルトポリシー、すなわちローカルからの割り当て、に戻る。 \fBmbind\fP() を使ってメモリーのある領域に \fBMPOL_DEFAULT\fP が指定された場合、その範囲に対してそれ以降に行われるページの割り当てでは、 \fBset_mempolicy\fP(2) で設定したのと同じように、そのプロセスのポリシーが適用される。 これにより、特定のメモリー領域についてだけ明示的なポリシーを削除し、 デフォルトのポリシーに「戻す」ことができる。 あるメモリー領域に対して「ローカルからの割り当て」を明示的に設定するには、 \fImode\fP に \fBMPOL_PREFERRED\fP を指定し、 \fInodemask\fP に空集合のノードを指定すればよい。 この方法は \fBset_mempolicy\fP(2) でも通用する。 2.6.16 でヒュージページポリシーへの対応が追加された。 インターリーブポリシーがヒュージページのマッピングで効果を持つには、 ポリシーが適用されるメモリーが数十メガバイト以上である必要がある。 \fBMPOL_MF_STRICT\fP はヒュージページのマッピングでは無視される。 \fBMPOL_MF_MOVE\fP と \fBMPOL_MF_MOVE_ALL\fP は Linux 2.6.16 以降でのみ利用可能である。 .SH 関連項目 \fBget_mempolicy\fP(2), \fBgetcpu\fP(2), \fBmmap\fP(2), \fBset_mempolicy\fP(2), \fBshmat\fP(2), \fBshmget\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/ に書かれている。