Manpages

名 前

set_mempolicy − プ ロ セ ス と そ の 子 プ ロ セ ス の NUMA メ モ リ ー の デ フ ォ ル ト ポ リ シ ー を 設 定 す る

書 式

#include <numaif.h>

long set_mempolicy(int mode, const unsigned long *nodemask,
unsigned long
maxnode);

−lnuma で リ ン ク す る 。

説 明

set_mempolicy() は 、 呼 び 出 し 元 プ ロ セ ス の NUMA ポ リ シ ー を policy に 設 定 す る 。 NUMA ポ リ シ ー は ポ リ シ ー モ ー ド と 0 個 以 上 の ノ ー ド か ら 構 成 さ れ 、 設 定 内 容 は 引 き 数 mode, nodemask, maxnode に よ り 指 定 さ れ る 。

NUMA (非 対 称 メ モ リ ー ア ク セ ス ) マ シ ン で は 、 CPU に よ り メ モ リ ー コ ン ト ロ ー ラ ー が 異 な り 、 距 離 も 異 な っ て い る 。 メ モ リ ー ポ リ シ ー は 、 ど の ノ ー ド か ら メ モ リ ー を そ の プ ロ セ ス に 割 り 当 て る か を 定 め る も の で あ る 。

set_mempolicy() は 、 プ ロ セ ス の デ フ ォ ル ト ポ リ シ ー を 定 め る 。 プ ロ セ ス の ポ リ シ ー は 、 mbind(2) で 設 定 さ れ る 特 定 の ポ リ シ ー に よ り 制 御 さ れ る メ モ リ ー 領 域 以 外 の プ ロ セ ス の ア ド レ ス 空 間 に お け る ペ ー ジ の 割 り 当 て に 適 用 さ れ る 。 プ ロ セ ス の デ フ ォ ル ト ポ リ シ ー は 、 MAP_PRIVATE フ ラ グ を 指 定 し た mmap(2) を 使 っ て マ ッ プ さ れ た メ モ リ ー マ ッ プ フ ァ イ ル に 対 す る 読 み 出 し 専 用 (ロ ー ド さ れ る だ け ) の ペ ー ジ の 割 り 当 て に も 適 用 さ れ る 。 ま た 、 MAP_SHARED フ ラ グ を 指 定 し た mmap(2) を 使 っ て マ ッ プ さ れ た メ モ リ ー マ ッ プ フ ァ イ ル に 対 す る ペ ー ジ の 割 り 当 て に も 適 用 さ れ る (こ の 場 合 は ペ ー ジ の ア ク セ ス 種 別 に 関 わ ら ず 適 用 さ れ る ) 。 設 定 し た ポ リ シ ー は 、 プ ロ セ ス に 新 規 の ペ ー ジ が 割 り 当 て ら れ る と き に の み 適 用 さ れ る 。 無 名 メ モ リ ー (anonymous memory) の 場 合 、 新 規 ペ ー ジ の 割 り 当 て は ア プ リ ケ ー シ ョ ン が 初 め て ペ ー ジ に ア ク セ ス し た 際 に 行 わ れ る 。

mode 引 き 数 に は MPOL_DEFAULT, MPOL_BIND, MPOL_INTERLEAVE, MPOL_PREFERRED の い ず れ か 一 つ を 指 定 し て し な け れ ば な ら な い 。 MPOL_DEFAULT 以 外 の ポ リ シ ー の 場 合 、 呼 び 出 し 元 は nodemask 引 き 数 で 一 つ 以 上 の ノ ー ド を 指 定 す る 必 要 が あ る 。

mode 引 き 数 に は 、 追 加 で モ ー ド フ ラ グ を 含 め る こ と も で き る 。 サ ポ ー ト さ れ て い る モ ー ド フ ラ グ は 以 下 の 通 り で あ る 。
MPOL_F_STATIC_NODES
(Linux 2.6.26 以 降 ) 空 で な い nodemask は 、 物 理 ノ ー ド ID で あ る 。 Linux で は 、 そ の プ ロ セ ス が 異 な る CPU 集 合 コ ン テ キ ス ト (cpuset context) に 移 動 し た 場 合 で も 、 そ の プ ロ セ ス の 現 在 の CPU 集 合 コ ン テ キ ス ト で 許 可 さ れ て い る ノ ー ド 集 合 が 変 化 し た 場 合 で も 、 nodemask を マ ッ ピ ン グ し 直 す こ と は な い 。
MPOL_F_RELATIVE_NODES
(Linux 2.6.26 以 降 ) 空 で な い nodemask は 、 そ の プ ロ セ ス の 現 在 の CPU 集 合 で 許 可 さ れ て い る ノ ー ド ID 集 合 に お け る 相 対 的 な ノ ー ド ID で あ る 。

nodemask は 、 最 大 で maxnode ビ ッ ト か ら 構 成 さ れ る ノ ー ド ID の ビ ッ ト マ ス ク を 指 す 。 ビ ッ ト マ ス ク の 大 き さ は 、 直 近 の sizeof(unsigned long) の 倍 数 に 切 り 上 げ ら れ る が 、 カ ー ネ ル が 使 用 す る の は maxnode 個 ま で の ビ ッ ト だ け で あ る 。 NULL 値 の nodemask も し く は 値 が 0 の maxnode は ノ ー ド の 空 集 合 を 表 す 。 maxnode の 値 が 0 の 場 合 、 nodemask 引 き 数 は 無 視 さ れ る 。

nodemask が 必 須 の 場 面 で は 、 nodemask に 、 オ ン ラ イ ン で 、 そ の プ ロ セ ス の 現 在 の CPU 集 合 コ ン テ キ ス ト で 許 可 さ れ て お り (MPOL_F_STATIC_NODES モ ー ド フ ラ グ が 指 定 さ れ て い な い 場 合 )、 メ モ リ ー が あ る ノ ー ド が 少 な く と も 一 つ 入 っ て い な け れ ば な ら な い 。 modeMPOL_F_STATIC_NODES が セ ッ ト さ れ 、 nodemask が 必 須 の 場 面 で 、 nodemask に 、 そ の プ ロ セ ス の 現 在 の CPU 集 合 コ ン テ キ ス ト で 許 可 さ れ た ノ ー ド が 一 つ も 含 ま れ て い な い 場 合 に は 、 メ モ リ ー の ポ リ シ ー と し て デ フ ォ ル ト の 「 ロ ー カ ル か ら 割 り 当 て (local allocation)」 が 適 用 さ れ る 。 そ の プ ロ セ ス の CPU 集 合 コ ン テ キ ス ト が nodemask で 指 定 さ れ た ノ ー ド を 少 な く と も 一 つ 含 む よ う に な る ま で は 、 結 果 的 に 指 定 さ れ た 動 作 が 上 書 き さ れ る こ と に な る 。

MPOL_DEFAULT モ ー ド は 、 デ フ ォ ル ト で は な い プ ロ セ ス の メ モ リ ー ポ リ シ ー を 削 除 す る こ と を 指 定 す る も の で あ る 。 こ れ に よ り 、 メ モ リ ー ポ リ シ ー は シ ス テ ム の デ フ ォ ル ト ポ リ シ ー に 「 戻 る 」 こ と に な る 。 シ ス テ ム の デ フ ォ ル ト ポ リ シ ー は 「 ロ ー カ ル か ら の 割 り 当 て (local allocation)」 、 つ ま り メ モ リ ー 割 り 当 て の き っ か け と な っ た CPU の ノ ー ド の メ モ リ ー が 割 り 当 て ら れ る 。 nodemask に は NULL を 指 定 し な け れ ば な ら な い 。 「 自 ノ ー ド (local node)」 に 空 き メ モ リ ー が 全 く な い 場 合 、 シ ス テ ム は 「 近 く の (near by) ノ ー ド 」 か ら メ モ リ ー を 割 り 当 て よ う と 試 み る 。

MPOL_BIND モ ー ド は 厳 密 な ポ リ シ ー で 、 メ モ リ ー 割 り 当 て は nodemask に 指 定 さ れ た ノ ー ド に 限 定 さ れ る 。 nodemask に 2 個 以 上 の ノ ー ド が 指 定 さ れ た 場 合 、 ペ ー ジ の 割 り 当 て は ノ ー ド ID が 数 字 と し て 最 小 の ノ ー ド か ら 開 始 さ れ 、 そ の ノ ー ド に 空 き メ モ リ ー が な く な る ま で そ の ノ ー ド か ら ペ ー ジ 割 り 当 て が 行 わ れ る 。 そ の ノ ー ド に 空 き メ モ リ ー が な く な っ た ら 、 次 に 小 さ な ノ ー ド ID を 持 つ ノ ー ド か ら ペ ー ジ 割 り 当 て が 行 わ れ る 。 こ れ を 、 nodemask で 指 定 さ れ た 全 て の ノ ー ド で 空 き メ モ リ ー が な く な る ま で 繰 り 返 す 。 nodemask で 指 定 さ れ た 以 外 の ノ ー ド か ら は ペ ー ジ の 割 り 当 て は 行 わ れ な い 。

MPOL_INTERLEAVE で は 、 ペ ー ジ 割 り 当 て を nodemask に 指 定 さ れ た ノ ー ド の 間 で ノ ー ド ID の 数 字 順 で 交 互 に 行 う 。 こ の ポ リ シ ー で は 、 複 数 の ノ ー ド に ペ ー ジ を 広 げ て 配 置 し 、 こ れ ら の ペ ー ジ へ の メ モ リ ー ア ク セ ス を 分 散 す る こ と で 、 遅 延 で は な く 、 帯 域 を 最 適 化 す る 。 た だ し 、 一 つ の ペ ー ジ へ の ア ク セ ス に 関 し て は 依 然 と し て 一 つ の ノ ー ド の メ モ リ ー 帯 域 が 上 限 と な る 。

MPOL_PREFERRED は 、 割 り 当 て 時 に 優 先 さ れ る ノ ー ド (preferred node) を 設 定 す る 。 カ ー ネ ル は ま ず 優 先 ノ ー ド か ら ペ ー ジ 割 り 当 て を 行 お う と し 、 優 先 ノ ー ド に 空 き メ モ リ ー が 少 な い 場 合 に 「 近 く の (near by)」 ノ ー ド か ら 割 り 当 て を 行 う 。 nodemask に 複 数 の ノ ー ド ID が 指 定 さ れ た 場 合 は 、 nodemask 内 の 最 初 の ノ ー ド が 優 先 ノ ー ド と し て 選 択 さ れ る 。 引 き 数 nodemask, maxnode で 空 集 合 が 指 定 さ れ た 場 合 は 、 ポ リ シ ー は (上 述 の シ ス テ ム の デ フ ォ ル ト ポ リ シ ー と 同 様 に ) 「 ロ ー カ ル か ら の 割 り 当 て 」 と な る 。 プ ロ セ ス の メ モ リ ー ポ リ シ ー は execve(2) の 前 後 で 保 持 さ れ 、 fork(2)clone(2) を 使 っ て 作 成 さ れ た 子 プ ロ セ ス に 継 承 さ れ る 。

返 り 値

成 功 す る と 、 set_mempolicy() は 0 を 返 す 。 エ ラ ー の 場 合 、 −1 を 返 し 、 errno に エ ラ ー を 示 す 値 を 設 定 す る 。

エ ラ ー

EFAULT

nodemaskmaxnode で 指 定 さ れ た メ モ リ ー 領 域 の 一 部 ま た は 全 部 が 、 呼 び 出 し 元 が ア ク セ ス 可 能 な ア ド レ ス 空 間 外 を 指 し て い る 。

EINVAL

mode が 不 正 で あ る 。 modeMPOL_DEFAULT で 、 nodemask が 空 で は な い 。 modeMPOL_BINDMPOL_INTERLEAVE で 、 nodemask が 空 で あ る 。 maxnode で 実 際 に 意 味 が あ る ビ ッ ト 数 よ り 多 く の ビ ッ ト 数 が 指 定 さ れ た 。 nodemask に 、 サ ポ ー ト さ れ て い る 最 大 ノ ー ド ID よ り 大 き い ノ ー ド が 指 定 さ れ た 。 nodemask に 、 オ ン ラ イ ン で 、 か つ そ の プ ロ セ ス の 現 在 の CPU 集 合 コ ン テ キ ス ト で 許 可 さ れ て い る ノ ー ド が 一 つ も 含 ま れ て い な い か 、 メ モ リ ー を 含 む ノ ー ド が 一 つ も 指 定 さ れ て い な い 。 mode 引 き 数 に MPOL_F_STATIC_NODESMPOL_F_RELATIVE_NODES の 両 方 が 指 定 さ れ た 。

ENOMEM

利 用 可 能 な カ ー ネ ル メ モ リ ー が 十 分 で な か っ た 。

バ ー ジ ョ ン

set_mempolicy() シ ス テ ム コ ー ル は バ ー ジ ョ ン 2.6.7 で Linux カ ー ネ ル に 追 加 さ れ た 。

準 拠

こ の シ ス テ ム コ ー ル は Linux 固 有 で あ る 。

注 意

ペ ー ジ が ス ワ ッ プ ア ウ ト さ れ る 場 合 に は 、 プ ロ セ ス ポ リ シ ー の 設 定 は 推 奨 さ れ な い 。 ス ワ ッ プ ア ウ ト さ れ た ペ ー ジ が ペ ー ジ イ ン す る 際 に も 、 ペ ー ジ 割 り 当 て 時 に 適 用 さ れ る プ ロ セ ス ポ リ シ ー や メ モ リ ー 領 域 ポ リ シ ー が 使 用 さ れ る 。 ラ イ ブ ラ リ に よ る サ ポ ー ト に つ い て は numa(7) を 参 照 。

関 連 項 目

get_mempolicy(2), getcpu(2), mbind(2), mmap(2), numa(3), cpuset(7), numa(7), numactl(8)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。