Manpages

名 前

mbind − メ モ リ ー 領 域 に 対 し て メ モ リ ー ポ リ シ ー を 設 定 す る

書 式

#include <numaif.h>

long mbind(void *addr, unsigned long len, int mode,
const unsigned long *
nodemask, unsigned long maxnode,
unsigned
flags);

−lnuma で リ ン ク す る 。

説 明

mbind() は 、 addr か ら 始 ま る 長 さ len バ イ ト の 範 囲 の メ モ リ ー に NUMA メ モ リ ー ポ リ シ ー を 設 定 す る 。 NUMA ポ リ シ ー は ポ リ シ ー モ ー ド と 0 個 以 上 の ノ ー ド か ら 構 成 さ れ る 。 メ モ リ ー ポ リ シ ー は ど の ノ ー ド か ら メ モ リ ー を 割 り 当 て る か を 決 定 す る 。

addrlen で 指 定 さ れ た メ モ リ ー 範 囲 に 、 メ モ リ ー の 「 無 名 」 領 域 — MAP_ANONYMOUS 付 き の mmap(2) シ ス テ ム コ ー ル を 使 っ て 作 成 さ れ た メ モ リ ー 領 域 — や MAP_PRIVATE 付 き の mmap(2) を 使 っ て マ ッ プ さ れ た メ モ リ ー マ ッ プ フ ァ イ ル が 含 ま れ て い る 場 合 、 ア プ リ ケ ー シ ョ ン が そ の ペ ー ジ へ の 書 き 込 み (デ ー タ の 格 納 ) を 行 っ た 時 に は 指 定 さ れ た ポ リ シ ー の み に 基 づ い て ペ ー ジ が 割 り 当 て ら れ る 。 無 名 領 域 の 場 合 、 最 初 の 読 み 出 し ア ク セ ス の 際 に は カ ー ネ ル 内 の 全 デ ー タ が 0 で あ る 共 有 ペ ー ジ が 使 用 さ れ る 。 MAP_PRIVATE で マ ッ プ さ れ た フ ァ イ ル の 場 合 、 最 初 の 読 み 出 し ア ク セ ス が あ る と 、 ペ ー ジ 割 り 当 て が 発 生 す る き っ か け と な っ た プ ロ セ ス の デ フ ォ ル ト ポ リ シ ー に し た が っ て ペ ー ジ の 割 り 当 て が 行 わ れ る 。 ペ ー ジ 割 り 当 て の き っ か け と な っ た プ ロ セ ス は 、 mbind() を 呼 び 出 し た プ ロ セ ス と 同 じ と は 限 ら な い 。 指 定 さ れ た メ モ リ ー 範 囲 内 に あ る MAP_SHARED の マ ッ ピ ン グ で は 指 定 さ れ た ポ リ シ ー は 無 視 さ れ 、 ペ ー ジ 割 り 当 て が 発 生 す る き っ か け と な っ た プ ロ セ ス の デ フ ォ ル ト ポ リ シ ー に し た が っ て ペ ー ジ の 割 り 当 て が 行 わ れ る こ と に な る 。 繰 り 返 し に な る が 、 ペ ー ジ 割 り 当 て の き っ か け と な っ た プ ロ セ ス は 、 mbind() を 呼 び 出 し た プ ロ セ ス と 同 じ と は 限 ら な い 。 指 定 さ れ た メ モ リ ー 範 囲 に 、 shmget(2) シ ス テ ム コ ー ル を 使 っ て 作 成 さ れ た り 、 shmat(2) シ ス テ ム コ ー ル を 使 っ て 付 加 (attach) さ れ た り し た 共 有 メ モ リ ー 領 域 が 含 ま れ る 場 合 、 無 名 メ モ リ ー 領 域 や 共 有 メ モ リ ー 領 域 に 対 す る ペ ー ジ 割 り 当 て は 、 共 有 メ モ リ ー セ グ メ ン ト へ ポ リ シ ー の 設 定 を 行 っ た プ ロ セ ス が ペ ー ジ 割 り 当 て の き っ か け と な っ た か に 関 わ ら ず 、 指 定 さ れ た ポ リ シ ー に し た が っ て 割 り 当 て が 行 わ れ る 。 し か し な が ら 、 共 有 メ モ リ ー 領 域 が SHM_HUGETLB フ ラ グ を 指 定 し て 作 成 さ れ た 場 合 に は 、 ヒ ュ ー ジ ペ ー ジ (huge page) の 割 り 当 て が 指 定 さ れ た ポ リ シ ー に し た が っ て 行 わ れ る の は 、 そ の 領 域 に 対 し て mbind() を 呼 び 出 し た プ ロ セ ス が ペ ー ジ 割 り 当 て の き っ か け と な っ た 場 合 の み で あ る 。 デ フ ォ ル ト で は 、 mbind() は 新 規 の メ モ リ ー 割 り 当 て に 対 し て の み 効 果 を 持 つ 。 ポ リ シ ー が 設 定 さ れ る 前 に す で に 使 用 さ れ て い る 範 囲 内 の ペ ー ジ に 対 し て は 、 ポ リ シ ー は 影 響 し な い 。 こ の デ フ ォ ル ト の 動 作 は 、 以 下 で 説 明 す る フ ラ グ MPOL_MF_MOVEMPOL_MF_MOVE_ALL に よ り 上 書 き さ れ る 可 能 性 が あ る 。

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 ビ ッ ト か ら 構 成 さ れ る ノ ー ド の ビ ッ ト マ ス ク を 指 す 。 ビ ッ ト マ ス ク の 大 き さ は 、 直 近 の sizeof(unsigned long) の 倍 数 に 切 り 上 げ ら れ る が 、 カ ー ネ ル が 使 用 す る の は maxnode 個 ま で の ビ ッ ト だ け で あ る 。 NULL 値 の nodemask も し く は 値 が 0 の maxnode は ノ ー ド の 空 集 合 を 表 す 。 maxnode の 値 が 0 の 場 合 、 nodemask 引 き 数 は 無 視 さ れ る 。 nodemask が 必 須 の 場 面 で は 、 nodemask に 、 オ ン ラ イ ン で 、 そ の プ ロ セ ス の 現 在 の CPU 集 合 コ ン テ キ ス ト で 許 可 さ れ て お り (MPOL_F_STATIC_NODES モ ー ド フ ラ グ が 指 定 さ れ て い な い 場 合 )、 メ モ リ ー が あ る ノ ー ド が 少 な く と も 一 つ 入 っ て い な け れ ば な ら な い 。 モ ー ド MPOL_DEFAULT は デ フ ォ ル ト で は な い プ ロ セ ス の メ モ リ ー ポ リ シ ー を 削 除 し 、 デ フ ォ ル ト の 動 作 に 戻 す こ と を 指 定 す る も の で あ る 。 mbind() 経 由 で 、 あ る メ モ リ ー 領 域 に 対 し て MPOL_DEFAULT が 適 用 さ れ た 場 合 、 プ ロ セ ス の デ フ ォ ル ト ポ リ シ ー を 使 用 す る こ と を 意 味 す る 。 プ ロ セ ス の デ フ ォ ル ト ポ リ シ ー は 、 set_mempolicy(2) で 変 更 さ れ て い る か も し れ な い 。 プ ロ セ ス の ポ リ シ ー の モ ー ド も MPOL_DEFAULT の 場 合 、 シ ス テ ム 全 体 の デ フ ォ ル ト ポ リ シ ー が 使 用 さ れ る 。 シ ス テ ム 全 体 の デ フ ォ ル ト ポ リ シ ー で は 、 割 り 当 て の き っ か け と な っ た CPU の ノ ー ド か ら ペ ー ジ の 割 り 当 て を 行 う 。 MPOL_DEFAULT で は 、 引 き 数 nodemaskmaxnode に ノ ー ド の 空 集 合 を 指 定 し な け れ ば な ら な い 。

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

MPOL_INTERLEAVE は 、 メ モ リ ー 割 り 当 て が nodemask に 指 定 さ れ た ノ ー ド 間 で 交 互 に 行 わ れ る こ と を 指 定 す る も の で あ る 。 こ の ポ リ シ ー で は 、 複 数 の ノ ー ド に ペ ー ジ を 広 げ て 配 置 し 、 こ れ ら の ペ ー ジ へ の メ モ リ ー ア ク セ ス を 分 散 す る こ と で 、 遅 延 で は な く 、 帯 域 を 最 適 化 す る 。 効 果 を 得 る に は 、 メ モ リ ー 領 域 を あ る 程 度 大 き く す べ き で あ り 、 メ モ リ ー ア ク セ ス の パ タ ー ン が か な り 均 一 な 場 合 で も 少 な く と も 1MB 以 上 に す べ き で あ る 。 こ の モ ー ド で も 、 一 つ の ペ ー ジ へ の ア ク セ ス に 関 し て は 一 つ の ノ ー ド の メ モ リ ー 帯 域 が 上 限 と な る こ と は 変 わ り な い 。

MPOL_PREFERRED は 、 割 り 当 て 時 に 優 先 さ れ る ノ ー ド を 設 定 す る 。 カ ー ネ ル は ま ず 優 先 ノ ー ド に ペ ー ジ 割 り 当 て を 行 お う と し 、 優 先 ノ ー ド に 空 き メ モ リ ー が 少 な い 場 合 に 他 の ノ ー ド に 割 り 当 て を 行 う 。 nodemask に 複 数 の ノ ー ド ID が 指 定 さ れ た 場 合 は 、 nodemask 内 の 最 初 の ノ ー ド が 優 先 ノ ー ド と し て 選 択 さ れ る 。 引 き 数 nodemask, maxnode で 空 集 合 が 指 定 さ れ た 場 合 は 、 割 り 当 て の き っ か け と な っ た CPU の ノ ー ド に メ モ リ ー 割 り 当 て が 行 わ れ る 。 mbind(2) で 、 あ る メ モ リ ー 領 域 に 対 し て 「 ロ ー カ ル か ら の 割 り 当 て (local allocation)」 を 指 定 す る 方 法 は こ れ し か な い 。

flagsMPOL_MF_STRICT が 指 定 さ れ 、 modeMPOL_DEFAULT で な い 場 合 、 指 定 さ れ た ポ リ シ ー に 従 っ て い な い メ モ リ ー 領 域 に ペ ー ジ が 存 在 す る と 、 mbind() は エ ラ ー EIO で 失 敗 す る 。

flagsMPOL_MF_MOVE が 指 定 さ れ る と 、 カ ー ネ ル は そ の メ モ リ ー 領 域 内 の 既 存 の 全 て の ペ ー ジ を 移 動 し 、 指 定 さ れ た ポ リ シ ー に 従 う よ う に し よ う と す る 。 他 の プ ロ セ ス と 共 有 さ れ て い る ペ ー ジ は 移 動 さ れ な い 。 MPOL_MF_STRICT も 指 定 さ れ た 場 合 、 移 動 で き な か っ た ペ ー ジ が あ る と 、 mbind() は エ ラ ー EIO で 失 敗 す る 。

flagsMPOL_MF_MOVE_ALL が 指 定 さ れ る と 、 カ ー ネ ル は そ の メ モ リ ー 領 域 内 の 既 存 の 全 て の ペ ー ジ を 、 他 の プ ロ セ ス が ペ ー ジ を 使 用 し て い る か ど う か に 関 わ ら ず 移 動 す る 。 こ の フ ラ グ を 使 用 す る に は 、 呼 び 出 し 元 の プ ロ セ ス は 特 権 (CAP_SYS_NICE) を 持 っ て い な け れ ば な ら な い 。 MPOL_MF_STRICT も 指 定 さ れ た 場 合 、 移 動 で き な か っ た ペ ー ジ が あ る と 、 mbind() は エ ラ ー EIO で 失 敗 す る 。

返 り 値

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

エ ラ ー

EFAULT

nodemaskmaxnode で 指 定 さ れ た メ モ リ ー 領 域 の 一 部 ま た は 全 部 が 、 呼 び 出 し 元 が ア ク セ ス 可 能 な ア ド レ ス 空 間 外 を 指 し て い る 。 も し く は addrlen で 指 定 さ れ た メ モ リ ー 領 域 に マ ッ プ さ れ て い な い 部 分 (unmapped hole) が あ っ た 、

EINVAL

flagsmode に 不 正 な 値 が 指 定 さ れ た 。 addr + lenaddr よ り 小 さ い 。 addr が シ ス テ ム の ペ ー ジ サ イ ズ の 倍 数 に な っ て い な い 。 ま た は modeMPOL_DEFAULTnodemask に 空 で な い 集 合 が 指 定 さ れ た 。 modeMPOL_BINDMPOL_INTERLEAVEnodemask が 空 で あ っ た 。 maxnode が カ ー ネ ル に 適 用 さ れ た 上 限 を 超 え て い る 。 nodemask に 、 サ ポ ー ト さ れ て い る 最 大 ノ ー ド ID よ り 大 き い ノ ー ド が 指 定 さ れ た 。 nodemask に 、 オ ン ラ イ ン で 、 か つ そ の プ ロ セ ス の 現 在 の CPU 集 合 コ ン テ キ ス ト で 許 可 さ れ て い る ノ ー ド が 一 つ も 含 ま れ て い な い か 、 メ モ リ ー を 含 む ノ ー ド が 一 つ も 指 定 さ れ て い な い 。 mode 引 き 数 に MPOL_F_STATIC_NODESMPOL_F_RELATIVE_NODES の 両 方 が 指 定 さ れ た 。

EIO

MPOL_MF_STRICT が 指 定 さ れ た が 、 こ の ポ リ シ ー に 従 っ て い な い ノ ー ド に す で に ペ ー ジ が 存 在 し て い た 。 も し く は MPOL_MF_MOVEMPOL_MF_MOVE_ALL が 指 定 さ れ た が 、 カ ー ネ ル が 指 定 さ れ た 領 域 内 の 既 存 の 全 て の ペ ー ジ を 移 動 す る こ と が で き な か っ た 。

ENOMEM

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

EPERM

flags 引 き 数 に MPOL_MF_MOVE_ALL フ ラ グ が 含 ま れ て い る が 、 呼 び 出 し 元 が CAP_SYS_NICE 特 権 を 持 た な い 。

バ ー ジ ョ ン

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

準 拠

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

注 意

ラ イ ブ ラ リ に よ る サ ポ ー ト に つ い て は numa(7) を 参 照 。

NUMA ポ リ シ ー は 、 MAP_SHARED フ ラ グ が 指 定 さ れ て マ ッ プ さ れ た メ モ リ ー マ ッ プ フ ァ イ ル の 領 域 で は サ ポ ー ト さ れ て い な い 。

MPOL_DEFAULT モ ー ド は 、 mbind() と set_mempolicy(2) で 異 な る 効 果 を 持 つ こ と が で き る 。 set_mempolicy(2)MPOL_DEFAULT が 指 定 さ れ た 場 合 、 そ の プ ロ セ ス の ポ リ シ ー は シ ス テ ム の デ フ ォ ル ト ポ リ シ ー 、 す な わ ち ロ ー カ ル か ら の 割 り 当 て 、 に 戻 る 。 mbind() を 使 っ て メ モ リ ー の あ る 領 域 に MPOL_DEFAULT が 指 定 さ れ た 場 合 、 そ の 範 囲 に 対 し て そ れ 以 降 に 行 わ れ る ペ ー ジ の 割 り 当 て で は 、 set_mempolicy(2) で 設 定 し た の と 同 じ よ う に 、 そ の プ ロ セ ス の ポ リ シ ー が 適 用 さ れ る 。 こ れ に よ り 、 特 定 の メ モ リ ー 領 域 に つ い て だ け 明 示 的 な ポ リ シ ー を 削 除 し 、 デ フ ォ ル ト の ポ リ シ ー に 「 戻 す 」 こ と が で き る 。 あ る メ モ リ ー 領 域 に 対 し て 「 ロ ー カ ル か ら の 割 り 当 て 」 を 明 示 的 に 設 定 す る に は 、 modeMPOL_PREFERRED を 指 定 し 、 nodemask に 空 集 合 の ノ ー ド を 指 定 す れ ば よ い 。 こ の 方 法 は set_mempolicy(2) で も 通 用 す る 。

2.6.16 で ヒ ュ ー ジ ペ ー ジ ポ リ シ ー へ の 対 応 が 追 加 さ れ た 。 イ ン タ ー リ ー ブ ポ リ シ ー が ヒ ュ ー ジ ペ ー ジ の マ ッ ピ ン グ で 効 果 を 持 つ に は 、 ポ リ シ ー が 適 用 さ れ る メ モ リ ー が 数 十 メ ガ バ イ ト 以 上 で あ る 必 要 が あ る 。

MPOL_MF_STRICT は ヒ ュ ー ジ ペ ー ジ の マ ッ ピ ン グ で は 無 視 さ れ る 。

MPOL_MF_MOVEMPOL_MF_MOVE_ALL は Linux 2.6.16 以 降 で の み 利 用 可 能 で あ る 。

関 連 項 目

get_mempolicy(2), getcpu(2), mmap(2), set_mempolicy(2), shmat(2), shmget(2), numa(3), cpuset(7), numa(7), numactl(8)

こ の 文 書 に つ い て

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