MOVE_PAGES(2) | Linux Programmer's Manual | MOVE_PAGES(2) |
move_pages - あるプロセスの個々のページを別のノードに移動する
#include <numaif.h>
long move_pages(int pid, unsigned long count, void **pages, const int *nodes, int *status, int flags);
-lnuma とリンクする。
move_pages() は、プロセス pid の指定されたページ pages を nodes で指定されたメモリーノードに移動する。 移動の結果は status に反映される。 flags では移動されるページに関する制約を指定する。
pid is the ID of the process in which pages are to be moved. If pid is 0, then move_pages() moves pages of the calling process.
To move pages in another process requires the following privileges:
count は移動するページ数である。 count により pages, nodes, status の 3 つの配列の大きさが定義される。
pages は、移動すべきページへのポインターの配列であり、 各ポインターはページ境界に揃えた値を指定すべきである。 pid で指定されたプロセスで見えるアドレスを指定する。
nodes は、各ページの希望の移動場所を示す整数値の配列であり、 配列の各要素はノード番号である。 nodes には NULL を指定することもでき、この場合には move_pages() はどのページも移動しないが、各ページが現在配置されているノードを配列 status に格納して返す。どのページを移動する必要があるかを判断するために、 各ページの状態の取得が必要な場合もある。
status is an array of integers that return the status of each page. The array contains valid values only if move_pages() did not return an error. Preinitialization of the array to a value which cannot represent a real numa node or valid error of status array could help to identify pages that have been migrated.
flags には、どの種類のページを移動するかを指定する。 MPOL_MF_MOVE は、そのプロセスが排他的に使用しているページだけを移動することを意味する。 MPOL_MF_MOVE_ALL は、複数のプロセス間で共有されているページも移動できることを意味する。 MPOL_MF_MOVE_ALL を使用するためには、そのプロセスが特権 (CAP_SYS_NICE) を持っていなければならない。
status 配列の各要素として、以下の値が返される。
On success move_pages() returns zero. On error, it returns -1, and sets errno to indicate the error. If positive value is returned, it is the number of nonmigrated pages.
move_pages() は、バージョン 2.6.18 で初めて Linux に登場した。
このシステムコールは Linux 固有である。
ライブラリによるサポートについては numa(7) を参照。
現在の CPU 集合で許可されているノードの集合を取得するには、フラグ MPOL_F_MEMS_ALLOWED を指定して get_mempolicy(2) を使用すればよい。 取得した情報は、CPU 集合の手動または自動での再構成により いつ何時変化してしまうか分からない。
この関数を使用すると、ページの位置 (ノード) が 指定されたアドレスに対して設定されたメモリーポリシー (mbind(2) 参照) や指定されたプロセスに対して設定されたメモリーポリシー (set_mempolicy(2) 参照) に違反してしまう可能性がある。 つまり、メモリーポリシーは move_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)
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。
2020-06-09 | Linux |