migrate_pages -
プロセスの全ページを別のノード集合に移動する
#include <numaif.h>
long migrate_pages(int pid, unsigned long maxnode,
const unsigned long *old_nodes,
const unsigned long *new_nodes);
-lnuma とリンクする。
MIGRATE_PAGES()
は、メモリノード
old_nodes にあるプロセス
pid
の全ページを、メモリノード
new_nodes
に移動しようとする。
old_nodes で
指定されたメモリノードに置かれていないページは移動されない。
カーネルは、
new_nodes
への移動の際に、
old_nodes 内の相対的な
トポロジー関係を可能な限り維持しようとする。
引き数
old_nodes と
new_nodes
は、最大で
maxnode
ビットから
構成されるノード番号のビットマスクへのポインタである。
各ビットマスクは符号なし
long
整数の配列として管理される
(
maxnode
で指定された長さを越えた部分のビットは無視される)。
引き数
maxnode
は最大ノード番号であり、ビットマスクの長さに
1 を 加えた値となる
(これは
mbind(2)
と同じだが、
select(2)
とは違う)。
引き数
pid
は、移動を行うページの所有者のプロセス
ID である。
別のプロセスのページを移動するには、呼び出したプロセスが特権
(
CAP_SYS_NICE)
を持っているか、呼び出したプロセスの実ユーザ
ID か 実効ユーザ ID
がページ移動の対象プロセスの実ユーザ
ID か saved-set ユーザ ID
と一致していなければならない。
pid が 0 の場合、
migrate_pages()
は呼び出したプロセスのページを移動する。
別のプロセスと共有しているページは、呼び出したプロセスが
CAP_SYS_NICE
特権を持っている場合にのみ移動される。
返り値¶
migrate_pages()
は、移動できなかったページ数を返す
(つまり、移動に成功した場合は返り値は
0 となる)。
エラーの場合、 -1
を返し、
errno
にエラーを示す値を設定する。
エラー¶
- EPERM
- pid
で指定されたプロセスのページを移動するのに必要な特権
( CAP_SYS_NICE)
がなかった。または、指定された対象ノードにアクセス
するのに必要な権限 (
CAP_SYS_NICE) がなかった。
- ESRCH
- プロセス ID が pid
のプロセスが見つからなかった。
バージョン¶
migrate_pages()
システムコールは Linux 2.6.16
で初めて登場した。
このシステムコールは
Linux 固有である。
ライブラリによるサポートについては
numa(7) を参照。
呼び出し元プロセスの
CPU
集合で許可されているノード集合を取得するには、
MPOL_F_MEMS_ALLOWED
フラグを付けて
get_mempolicy(2) を使うこと。
この情報は、手動/自動に限らず
CPU
集合の再構成によりいつでも
変更されることがある点に注意してほしい。
migrate_pages
を使用すると、ページが置かれる場所
(ノード) が、指定
されたアドレスに対して設定されたメモリポリシー
(
mbind(2) 参照) や
指定されたプロセスに対して設定されたメモリポリシー
(
set_mempolicy(2) 参照)
に違反する状況になる可能性がある。
すなわち、メモリポリシーによる制約は
migrate_pages() による移動先
ノードの選択には適用されないということである。
ヘッダファイル
<numaif.h>
は glibc
には含まれておらず、
libnuma-devel
か同様のパッケージをインストールする必要がある。
関連項目¶
get_mempolicy(2),
mbind(2),
set_mempolicy(2),
numa(3),
numa_maps(5),
cpuset(7),
numa(7),
migratepages(8),
numastat(8)
Linux カーネルソースの
Documentation/vm/page_migration
この文書について¶
この man ページは Linux
man-pages
プロジェクトのリリース
3.65 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man-pages/
に書かれている。