Man page - mbind(2)

Packages contains this manual

Available languages:

en fr ja ru

Manual

MBIND

名 前
書 式
説 明
返 り 値
エ ラ ー
バ ー ジ ョ ン
準 拠
注 意
関 連 項 目
こ の 文 書 に つ い て

名 前

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 個 以 上 の ノ ー ド か ら 構 成 さ れ る 。 メ モ リ ー ポ リ シ ー は ど の ノ ー ド か ら メ モ リ ー を 割 り 当 て る か を 決 定 す る 。

addr len で 指 定 さ れ た メ モ リ ー 範 囲 に 、 メ モ リ ー の 「 無 名 」 領 域 — 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_MOVE MPOL_MF_MOVE_ALL に よ り 上 書 き さ れ る 可 能 性 が あ る 。

mode 引 数 に は 、 MPOL_DEFAULT , MPOL_BIND , MPOL_INTERLEAVE , MPOL_PREFERRED , MPOL_LOCAL (詳 細 は 下 記 参 照 ) の い ず れ か 一 つ を 指 定 し な け れ ば な ら な い 。 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 モ ー ド フ ラ グ が 指 定 さ れ て い な い 場 合 )、 メ モ リ ー が あ る ノ ー ド が 少 な く と も 一 つ 入 っ て い な け れ ば な ら な い 。

mode 引 数 に は 、 以 下 の 値 の い ず れ か ひ と つ を 含 め な け れ ば な ら な い 。
MPOL_DEFAULT

こ の モ ー ド は デ フ ォ ル ト で は な い メ モ リ ー ポ リ シ ー を 削 除 し 、 デ フ ォ ル ト の 動 作 に 戻 す こ と を 指 定 す る も の で あ る 。 mbind () 経 由 で 、 あ る メ モ リ ー 領 域 に 対 し て MPOL_DEFAULT が 適 用 さ れ た 場 合 、 ス レ ッ ド の メ モ リ ポ リ シ ー を 使 用 す る こ と を 意 味 す る 。 ス レ ッ ド の メ モ リ ポ リ シ ー は 、 set_mempolicy (2) で 変 更 さ れ て い る か も し れ な い 。 ス レ ッ ド の メ モ リ ポ リ シ ー の モ ー ド も MPOL_DEFAULT の 場 合 、 シ ス テ ム 全 体 の デ フ ォ ル ト ポ リ シ ー が 使 用 さ れ る 。 シ ス テ ム 全 体 の デ フ ォ ル ト ポ リ シ ー で は 、 割 り 当 て の き っ か け と な っ た CPU の ノ ー ド か ら ペ ー ジ の 割 り 当 て を 行 う 。 MPOL_DEFAULT で は 、 引 数 nodemask maxnode に ノ ー ド の 空 集 合 を 指 定 し な け れ ば な ら な い 。

MPOL_BIND

This mode specifies a strict policy that restricts memory allocation to the nodes specified in nodemask . If nodemask specifies more than one node, page allocations will come from the node with sufficient free memory that is closest to the node where the allocation takes place. Pages will not be allocated from any node not specified in the IR nodemask . (Before Linux 2.6.26, page allocations came from the node with the lowest numeric node ID first, until that node contained no free memory. Allocations then came from the node with the next highest node ID specified in nodemask and so forth, until none of the specified nodes contained free memory.)

MPOL_INTERLEAVE

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

MPOL_PREFERRED

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

MPOL_LOCAL (Linux 3.8 以 降 )

This mode specifies "local allocation"; the memory is allocated on the node of the CPU that triggered the allocation (the "local node"). The nodemask and maxnode arguments must specify the empty set. If the "local node" is low on free memory, the kernel will try to allocate memory from other nodes. The kernel will allocate memory from the "local node" whenever memory for this node is available. If the "local node" is not allowed by the thread’s current cpuset context, the kernel will try to allocate memory from other nodes. The kernel will allocate memory from the "local node" whenever it becomes allowed by the thread’s current cpuset context. By contrast, MPOL_DEFAULT reverts to the memory policy of the thread (which may be set via set_mempolicy (2)); that policy may be something other than "local allocation".

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

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

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

返 り 値

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

エ ラ ー

EFAULT

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

EINVAL

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

EIO

MPOL_MF_STRICT が 指 定 さ れ た が 、 こ の ポ リ シ ー に 従 っ て い な い ノ ー ド に す で に ペ ー ジ が 存 在 し て い た 。 も し く は MPOL_MF_MOVE MPOL_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) で 設 定 し た の と 同 じ よ う に 、 そ の ス レ ッ ド の メ モ リ ポ リ シ ー が 適 用 さ れ る 。 こ れ に よ り 、 特 定 の メ モ リ ー 領 域 に つ い て だ け 明 示 的 な ポ リ シ ー を 削 除 し 、 デ フ ォ ル ト の ポ リ シ ー に 「 戻 す 」 こ と が で き る 。 あ る メ モ リ ー 領 域 に 対 し て 「 ロ ー カ ル か ら の 割 り 当 て 」 を 明 示 的 に 設 定 す る に は 、 mode MPOL_LOCAL MPOL_PREFERRED を 指 定 し 、 nodemask に 空 集 合 の ノ ー ド を 指 定 す れ ば よ い 。 こ の 方 法 は set_mempolicy (2) で も 通 用 す る 。

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

Linux 5.7 よ り 前 で は 、 MPOL_MF_STRICT は ヒ ュ ー ジ ペ ー ジ の マ ッ ピ ン グ で は 無 視 さ れ て い た 。

MPOL_MF_MOVE MPOL_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 プ ロ ジ ェ ク ト の リ リ ー ス 5.10 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は https://www.kernel.org/doc/man-pages/ に 書 か れ て い る 。