Manpages

名 前

madvise − メ モ リ ー 利 用 に 関 す る ア ド バ イ ス を 与 え る

書 式

#include <sys/mman.h>

int madvise(void *addr, size_t length, int advice);

glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):

madvise(): _BSD_SOURCE

説 明

madvise() シ ス テ ム コ ー ル は 、 ア ド レ ス addr か ら は じ ま る length バ イ ト の メ モ リ ー ブ ロ ッ ク の ペ ー ジ ン グ 入 出 力 を ど う 扱 え ば 良 い か 、 カ ー ネ ル に ア ド バ イ ス す る 。 こ れ を 用 い る と 、 ア プ リ ケ ー シ ョ ン か ら カ ー ネ ル に 、 マ ッ プ さ れ た メ モ リ ー や 共 有 メ モ リ ー を ど の よ う に 扱 っ て ほ し い か 伝 え る こ と が で き 、 カ ー ネ ル は そ れ に 応 じ て 先 読 み や キ ャ ッ シ ュ な ど の 適 切 な 手 法 を 選 択 で き る 。 こ の コ ー ル は ア プ リ ケ ー シ ョ ン の 動 作 そ の も の に は 影 響 し な い (MADV_DONTNEED の 場 合 は 別 ) が 、 性 能 に は 影 響 し う る 。 な お こ の ア ド バ イ ス を 受 け 入 れ る か ど う か は カ ー ネ ル に 任 さ れ る 。 ア ド バ イ ス は 引 き 数 advice に よ っ て 与 え る 。 以 下 の い ず れ か を 指 定 で き る 。
MADV_NORMAL
特 別 な 扱 い は 行 わ な い 。 こ れ が デ フ ォ ル ト で あ る 。
MADV_RANDOM
ペ ー ジ 参 照 は ラ ン ダ ム な 順 序 で 行 わ れ そ う だ 。 (し た が っ て 、 先 読 み は あ ま り 効 果 が な さ そ う だ 。 )
MADV_SEQUENTIAL
ペ ー ジ 参 照 は シ ー ケ ン シ ャ ル な 順 序 で 行 わ れ そ う だ 。 (し た が っ て 与 え た 範 囲 の ペ ー ジ は 積 極 的 に 先 読 み し て お く と 良 い だ ろ う 。 ま た ア ク セ ス が 終 わ っ た ら 速 や か に 解 放 し て 良 い 。 )
MADV_WILLNEED
近 い 将 来 に ア ク セ ス さ れ そ う だ 。 (し た が っ て こ れ ら の ペ ー ジ を 今 の う ち に 先 読 み し て お く と い い だ ろ う 。 )
MADV_DONTNEED
し ば ら く ア ク セ ス は な さ そ う だ 。 (現 時 点 で ア プ リ ケ ー シ ョ ン は 与 え た 範 囲 の 処 理 を 終 え て い る 。 し た が っ て カ ー ネ ル は こ れ に 関 連 す る リ ソ ー ス を 解 放 し て 良 い 。 ) こ れ 以 降 こ の 範 囲 の ペ ー ジ へ の ア ク セ ス が あ る と 、 成 功 は す る が 、 メ モ リ ー の 内 容 を マ ッ プ 元 の フ ァ イ ル か ら ロ ー ド し 直 す こ と に な る (mmap(2) を 見 よ ) か 、 ま た は 元 フ ァ イ ル が な い マ ッ プ ペ ー ジ で は ア ク セ ス が あ っ た と き に 0 埋 め が 行 わ れ る こ と に な る 。
MADV_REMOVE
(Linux 2.6.16 以 降 ) 指 定 さ れ た 範 囲 の ペ ー ジ と 関 連 す る バ ッ キ ン グ ス ト ア を 解 放 す る 。 現 在 の と こ ろ 、 shmfs/tmpfs だ け が こ れ に 対 応 し て い る 。 他 の フ ァ イ ル シ ス テ ム で は ENOSYS が 返 さ れ る 。
MADV_DONTFORK
(Linux 2.6.16 以 降 )

fork(2) が 行 わ れ た 後 、 指 定 さ れ た 範 囲 の ペ ー ジ を 子 プ ロ セ ス が 利 用 で き な い よ う に す る 。 こ の 機 能 は 、 書 き 込 み 時 コ ピ ー (copy−on−write) 方 式 で 、 fork(2) の 後 で 親 プ ロ セ ス が ペ ー ジ に 書 き 込 み を 行 っ た 場 合 に ペ ー ジ の 物 理 位 置 が 変 化 し な い よ う に す る の に 有 効 で あ る (ペ ー ジ の 再 配 置 は ハ ー ド ウ ェ ア が そ の ペ ー ジ に DMA 転 送 を 行 う よ う な 場 合 に 問 題 を 起 こ す こ と が あ る )。

MADV_DOFORK (Linux 2.6.16 以 降 )

MADV_DONTFORK の 影 響 を 取 り 消 し 、 デ フ ォ ル ト の 動 作 に 戻 す 。 つ ま り 、 fork(2) の 前 後 で マ ッ ピ ン グ は 継 承 さ れ る よ う に な る 。

MADV_HWPOISON (Linux 2.6.32 以 降 ) ペ ー ジ に 毒 入 れ を 行 い 、 ハ ー ド ウ ェ ア メ モ リ ー の 破 損 の よ う に そ の ペ ー ジ を 取 り 扱 う 。 こ の 操 作 は 特 権 (CAP_SYS_ADMIN を 持 っ た ) プ ロ セ ス だ け が 利 用 で き る 。 こ の 操 作 の 結 果 、 呼 び 出 し た プ ロ セ ス は SIGBUS を 受 け 取 り 、 そ の ペ ー ジ は ア ン マ ッ プ さ れ る 。 こ の 機 能 は メ モ リ ー の エ ラ ー 処 理 コ ー ド を テ ス ト す る た め の も の で あ る 。 カ ー ネ ル で CONFIG_MEMORY_FAILURE が 有 効 に な っ て い る 場 合 に の み 利 用 可 能 で あ る 。
MADV_SOFT_OFFLINE
(Linux 2.6.33 以 降 )

addrlength で 指 定 さ れ た 範 囲 の ペ ー ジ を ソ フ ト オ フ ラ イ ン に す る 。 指 定 さ れ た 範 囲 の 各 ペ ー ジ の メ モ リ ー の 内 容 は 保 持 さ れ (す な わ ち 、 次 に ア ク セ ス さ れ た 際 に 、 同 じ 内 容 が 見 え る が 、 新 し い 物 理 ペ ー ジ フ レ ー ム に な る )、 元 の フ レ ー ム は オ フ ラ イ ン に な る (す な わ ち 、 そ の フ レ ー ム は 使 用 さ れ る 、 通 常 の メ モ リ ー 管 理 か ら は 取 り 除 か れ る )。 MADV_SOFT_OFFLINE 操 作 の 影 響 は 呼 び 出 し た プ ロ セ ス に は 見 え な い (つ ま り 呼 び 出 し た プ ロ セ ス の 動 作 は 変 化 し な い )。 こ の 機 能 は メ モ リ ー の エ ラ ー 処 理 コ ー ド を テ ス ト す る こ と を 目 的 に 作 ら れ た 。 カ ー ネ ル で CONFIG_MEMORY_FAILURE が 有 効 に な っ て い る 場 合 に の み 利 用 可 能 で あ る 。

MADV_MERGEABLE (Linux 2.6.32 以 降 )

Kernel Samepage Merging (KSM; カ ー ネ ル に よ る 同 じ ペ ー ジ の 統 合 ) を addrlength で 指 定 さ れ た 領 域 に 対 し て 有 効 に す る 。 カ ー ネ ル は 、 統 合 可 能 の 印 が つ い た ユ ー ザ ー メ モ リ ー の 領 域 を 定 期 的 に ス キ ャ ン し 、 内 容 が 全 く 同 じ ペ ー ジ を 探 す 。 内 容 が 全 く 同 じ ペ ー ジ が あ れ ば 、 そ れ ら の ペ ー ジ は 書 き 込 み 保 護 (write−protected) が か か っ た 一 つ の ペ ー ジ で 置 き 換 え ら れ る (プ ロ セ ス が 後 で ペ ー ジ の 内 容 を 更 新 し よ う と し た 際 に は 自 動 的 に ペ ー ジ の コ ピ ー が 行 わ れ る )。 KSM は プ ラ イ ベ ー ト な 無 名 ペ ー ジ (anonymous pages) だ け を 統 合 す る (mmap(2) 参 照 )。 KSM 機 能 は 、 同 じ デ ー タ の イ ン ス タ ン ス を 大 量 に 生 成 す る ア プ リ ケ ー シ ョ ン (KVM な ど の 仮 想 化 シ ス テ ム ) で の 利 用 を 想 定 し て い る 。 こ の 機 能 は プ ロ セ ッ シ ン グ 能 力 を 大 量 に 消 費 す る 場 合 が あ り 、 注 意 し て 使 用 す る こ と 。 詳 細 は Linux カ ー ネ ル ソ ー ス フ ァ イ ル Documentation/vm/ksm.txt を 参 照 。 MADV_MERGEABLEMADV_UNMERGEABLE は 、 カ ー ネ ル で CONFIG_KSM オ プ シ ョ ン を 有 効 に な っ て い る 場 合 に の み 利 用 で き る 。

MADV_UNMERGEABLE (Linux 2.6.32 以 降 ) 指 定 さ れ た ア ド レ ス 範 囲 に 関 し て 、 そ れ 以 前 に 行 わ れ た MADV_MERGEABLE 操 作 の 効 果 を 取 り 消 す 。 KSM は 、 addrlength で 指 定 さ れ た ア ド レ ス 範 囲 の 統 合 済 み の す べ て の ペ ー ジ の 統 合 解 除 を 行 う 。
MADV_HUGEPAGE
(Linux 2.6.38 以 降 )

Transparent Huge Pages (THP) を addrlength で 指 定 さ れ た 領 域 に 対 し て 有 効 に す る 。 現 在 の と こ ろ 、 Transparent Huge Pages は プ ラ イ ベ ー ト な 無 名 ペ ー ジ (anonymous pages) に つ い て の み 機 能 す る 。 カ ー ネ ル は 定 期 的 に ヒ ュ ー ジ ペ ー ジ (huge page) 候 補 の 印 が つ い た ペ ー ジ を ス キ ャ ン し 、 ヒ ュ ー ジ ペ ー ジ と 置 き 換 え る 。 ま た 、 カ ー ネ ル は そ の 領 域 が ヒ ュ ー ジ ペ ー ジ の サ イ ズ に 合 っ て い る 場 合 、 ヒ ュ ー ジ ペ ー ジ を 直 接 割 り 当 て る (posix_memalign(2) 参 照 )。 こ の 機 能 は 、 大 き な デ ー タ マ ッ ピ ン グ を 使 用 し 、 一 度 に そ の メ モ リ ー の 大 き な 範 囲 に ア ク セ ス す る よ う な ア プ リ ケ ー シ ョ ン (例 え ば QEMU の よ う な 仮 想 化 シ ス テ ム ) で 使 う こ と を 主 に 想 定 さ れ て い る 。 こ の 機 能 は 非 常 に 簡 単 に メ モ リ ー を 浪 費 し て し ま う (例 え ば 、 1 バ イ ト し か ア ク セ ス し な い 2MB の マ ッ ピ ン グ が 、 4KB ペ ー ジ で は な く 2MB の 実 際 の メ モ リ ー を 使 っ て し ま う )。 詳 細 は Linux カ ー ネ ル ソ ー ス フ ァ イ ル Documentation/vm/transhuge.txt を 参 照 。 MADV_HUGEPAGEMADV_NOHUGEPAGE は 、 カ ー ネ ル で CONFIG_TRANSPARENT_HUGEPAGE オ プ シ ョ ン を 有 効 に な っ て い る 場 合 に の み 利 用 で き る 。

MADV_NOHUGEPAGE (Linux 2.6.38 以 降 )

addrlength で 指 定 さ れ た ア ド レ ス 範 囲 の メ モ リ ー が ヒ ュ ー ジ ペ ー ジ に 組 み 込 ま れ な い よ う に す る 。

MADV_DONTDUMP (Linux 3.4 以 降 ) コ ア ダ ン プ か ら addrlength で 指 定 さ れ た 範 囲 の ペ ー ジ を 除 外 す る 。 こ れ は 、 コ ア ダ ン プ に 含 め て も 役 に 立 た な い こ と が 分 か っ て い る 大 き な メ モ リ ー 領 域 が あ る ア プ リ ケ ー シ ョ ン で 有 用 で あ る 。 MADV_DONTDUMP の 効 果 は /proc/PID/coredump_filter フ ァ イ ル 経 由 で 設 定 さ れ た ビ ッ ト マ ス ク よ り も 優 先 さ れ る (core(5) 参 照 )。
MADV_DODUMP
(Linux 3.4 以 降 ) 以 前 の MADV_DONTDUMP の 効 果 を 取 り 消 す 。

返 り 値

madvise() は 成 功 す る と 0 を 返 す 。 エ ラ ー が 起 こ る と −1 を 返 し 、 errno を 適 切 な 値 に 設 定 す る 。

エ ラ ー

EAGAIN 何 ら か の カ ー ネ ル リ ソ ー ス が 一 時 的 に 利 用 で き な か っ た 。

EBADF 指 定 し た マ ッ プ は 存 在 す る が 、 フ ァ イ ル で は な い と こ ろ を マ ッ プ し て い る 。

EINVAL こ の エ ラ ー は 以 下 の 理 由 で 発 生 す る 。

*

len が 負 の 値 で あ る 。

*

addr が ペ ー ジ 境 界 で は な い 。

*

advice が 有 効 な 値 で な い 。

*

ア プ リ ケ ー シ ョ ン が ロ ッ ク さ れ た ペ ー ジ や 共 有 ペ ー ジ を (MADV_DONTNEED で ) 解 放 し よ う と し て い る 。
*

adviceMADV_MERGEABLEMADV_UNMERGEABLE が 指 定 さ れ た が 、 カ ー ネ ル の 設 定 が CONFIG_KSM が 有 効 に な っ て い な か っ た 。

EIO

(MADV_WILLNEED の 場 合 ) こ の 範 囲 の ペ ー ジ ン グ を 行 う と 、 プ ロ セ ス の RSS (resident set size) の 最 大 値 を 越 え て し ま う 。

ENOMEM

(MADV_WILLNEED の 場 合 ) メ モ リ ー が 足 り ず 、 ペ ー ジ ン グ に 失 敗 し た 。

ENOMEM

指 定 し た 範 囲 の ア ド レ ス が 、 現 在 マ ッ プ さ れ て い な い 。 あ る い は プ ロ セ ス の ア ド レ ス 空 間 の 内 部 に な い 。

バ ー ジ ョ ン

Linux 3.18 以 降 で は 、 こ の シ ス テ ム コ ー ル の サ ポ ー ト は 任 意 と な り 、 利 用 で き る か は カ ー ネ ル が CONFIG_ADVISE_SYSCALLS オ プ シ ョ ン を 有 効 に し て コ ン パ イ ル さ れ て い る か に 依 存 す る 。

準 拠

POSIX.1b. POSIX.1−2001 で は 、 posix_madvise(3)POSIX_MADV_NORMAL, POSIX_MADV_RANDOM な ど の 定 数 と と も に 記 述 し て い た (そ れ ぞ れ の 振 る 舞 い は こ こ で 述 べ た も の に 近 い )。 フ ァ イ ル ア ク セ ス に 対 し て も posix_fadvise(2) と い う 類 似 の 関 数 が 存 在 す る 。

MADV_REMOVE, MADV_DONTFORK, MADV_DOFORK, MADV_HWPOISON, MADV_MERGEABLE, MADV_UNMERGEABLE は Linux 固 有 で あ る 。

注 意

Linux で の 注 意 現 在 の Linux の 実 装 (2.4.0) で は 、 こ の シ ス テ ム コ ー ル を ア ド バ イ ス と い う よ り は 命 令 と 見 て い る 。 し た が っ て こ の ア ド バ イ ス に 対 し て 通 常 行 わ れ る 動 作 が 不 可 能 な 場 合 は 、 エ ラ ー を 返 す こ と が あ る (上 記 の エ ラ ー の 記 述 を 参 照 )。 こ の 振 舞 い は 標 準 と は 異 な る 。

Linux の 実 装 で は addr の ア ド レ ス は ペ ー ジ 境 界 の 値 で な け れ ば な ら な い 。 ま た length は 0 で あ っ て も 構 わ な い 。 ま た Linux 版 の madvise() で は 、 指 定 さ れ た ア ド レ ス 範 囲 に マ ッ プ さ れ て い な い 部 分 が あ る と 、 こ れ ら を 無 視 し て 残 り の 部 分 に ア ド バ イ ス を 適 用 す る (し か し シ ス テ ム コ ー ル に 対 し て は ち ゃ ん と ENOMEM を 返 す )。

関 連 項 目

getrlimit(2), mincore(2), mmap(2), mprotect(2), msync(2), munmap(2), prctl(2), core(5)

こ の 文 書 に つ い て

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