名 前
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 以 降 )
addr と length で 指 定 さ れ た 範 囲 の ペ ー ジ を ソ フ ト オ フ ラ イ ン に す る 。 指 定 さ れ た 範 囲 の 各 ペ ー ジ の メ モ リ ー の 内 容 は 保 持 さ れ (す な わ ち 、 次 に ア ク セ ス さ れ た 際 に 、 同 じ 内 容 が 見 え る が 、 新 し い 物 理 ペ ー ジ フ レ ー ム に な る )、 元 の フ レ ー ム は オ フ ラ イ ン に な る (す な わ ち 、 そ の フ レ ー ム は 使 用 さ れ る 、 通 常 の メ モ リ ー 管 理 か ら は 取 り 除 か れ る )。 MADV_SOFT_OFFLINE 操 作 の 影 響 は 呼 び 出 し た プ ロ セ ス に は 見 え な い (つ ま り 呼 び 出 し た プ ロ セ ス の 動 作 は 変 化 し な い )。 こ の 機 能 は メ モ リ ー の エ ラ ー 処 理 コ ー ド を テ ス ト す る こ と を 目 的 に 作 ら れ た 。 カ ー ネ ル で CONFIG_MEMORY_FAILURE が 有 効 に な っ て い る 場 合 に の み 利 用 可 能 で あ る 。
MADV_MERGEABLE (Linux 2.6.32 以 降 )
Kernel Samepage Merging (KSM; カ ー ネ ル に よ る 同 じ ペ ー ジ の 統 合 ) を addr と length で 指 定 さ れ た 領 域 に 対 し て 有 効 に す る 。 カ ー ネ ル は 、 統 合 可 能 の 印 が つ い た ユ ー ザ ー メ モ リ ー の 領 域 を 定 期 的 に ス キ ャ ン し 、 内 容 が 全 く 同 じ ペ ー ジ を 探 す 。 内 容 が 全 く 同 じ ペ ー ジ が あ れ ば 、 そ れ ら の ペ ー ジ は 書 き 込 み 保 護 (write−protected) が か か っ た 一 つ の ペ ー ジ で 置 き 換 え ら れ る (プ ロ セ ス が 後 で ペ ー ジ の 内 容 を 更 新 し よ う と し た 際 に は 自 動 的 に ペ ー ジ の コ ピ ー が 行 わ れ る )。 KSM は プ ラ イ ベ ー ト な 無 名 ペ ー ジ (anonymous pages) だ け を 統 合 す る (mmap(2) 参 照 )。 KSM 機 能 は 、 同 じ デ ー タ の イ ン ス タ ン ス を 大 量 に 生 成 す る ア プ リ ケ ー シ ョ ン (KVM な ど の 仮 想 化 シ ス テ ム ) で の 利 用 を 想 定 し て い る 。 こ の 機 能 は プ ロ セ ッ シ ン グ 能 力 を 大 量 に 消 費 す る 場 合 が あ り 、 注 意 し て 使 用 す る こ と 。 詳 細 は Linux カ ー ネ ル ソ ー ス フ ァ イ ル Documentation/vm/ksm.txt を 参 照 。 MADV_MERGEABLE と MADV_UNMERGEABLE は 、 カ ー ネ ル で CONFIG_KSM オ プ シ ョ ン を 有 効 に な っ て い る 場 合 に の み 利 用 で き る 。
MADV_UNMERGEABLE (Linux
2.6.32 以 降 ) 指 定 さ
れ た ア ド レ ス
範 囲 に 関 し て
、 そ れ 以 前 に
行 わ れ た MADV_MERGEABLE
操 作 の 効 果 を
取 り 消 す 。 KSM は
、 addr と length で
指 定 さ れ た ア
ド レ ス 範 囲 の
統 合 済 み の す
べ て の ペ ー ジ
の 統 合 解 除 を
行 う 。
MADV_HUGEPAGE (Linux 2.6.38 以 降 )
Transparent Huge Pages (THP) を addr と length で 指 定 さ れ た 領 域 に 対 し て 有 効 に す る 。 現 在 の と こ ろ 、 Transparent Huge Pages は プ ラ イ ベ ー ト な 無 名 ペ ー ジ (anonymous pages) に つ い て の み 機 能 す る 。 カ ー ネ ル は 定 期 的 に ヒ ュ ー ジ ペ ー ジ (huge page) 候 補 の 印 が つ い た ペ ー ジ を ス キ ャ ン し 、 ヒ ュ ー ジ ペ ー ジ と 置 き 換 え る 。 ま た 、 カ ー ネ ル は そ の 領 域 が ヒ ュ ー ジ ペ ー ジ の サ イ ズ に 合 っ て い る 場 合 、 ヒ ュ ー ジ ペ ー ジ を 直 接 割 り 当 て る (posix_memalign(2) 参 照 )。 こ の 機 能 は 、 大 き な デ ー タ マ ッ ピ ン グ を 使 用 し 、 一 度 に そ の メ モ リ ー の 大 き な 範 囲 に ア ク セ ス す る よ う な ア プ リ ケ ー シ ョ ン (例 え ば QEMU の よ う な 仮 想 化 シ ス テ ム ) で 使 う こ と を 主 に 想 定 さ れ て い る 。 こ の 機 能 は 非 常 に 簡 単 に メ モ リ ー を 浪 費 し て し ま う (例 え ば 、 1 バ イ ト し か ア ク セ ス し な い 2MB の マ ッ ピ ン グ が 、 4KB ペ ー ジ で は な く 2MB の 実 際 の メ モ リ ー を 使 っ て し ま う )。 詳 細 は Linux カ ー ネ ル ソ ー ス フ ァ イ ル Documentation/vm/transhuge.txt を 参 照 。 MADV_HUGEPAGE と MADV_NOHUGEPAGE は 、 カ ー ネ ル で CONFIG_TRANSPARENT_HUGEPAGE オ プ シ ョ ン を 有 効 に な っ て い る 場 合 に の み 利 用 で き る 。
MADV_NOHUGEPAGE (Linux 2.6.38 以 降 )
addr と length で 指 定 さ れ た ア ド レ ス 範 囲 の メ モ リ ー が ヒ ュ ー ジ ペ ー ジ に 組 み 込 ま れ な い よ う に す る 。
MADV_DONTDUMP (Linux 3.4
以 降 ) コ ア ダ ン
プ か ら addr と
length で 指 定 さ れ
た 範 囲 の ペ ー
ジ を 除 外 す る
。 こ れ は 、 コ
ア ダ ン プ に 含
め て も 役 に 立
た な い こ と が
分 か っ て い る
大 き な メ モ リ
ー 領 域 が あ る
ア プ リ ケ ー シ
ョ ン で 有 用 で
あ る 。 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
で ) 解 放 し よ う
と し て い る 。 advice に MADV_MERGEABLE か MADV_UNMERGEABLE が 指 定 さ れ た が 、 カ ー ネ ル の 設 定 が CONFIG_KSM が 有 効 に な っ て い な か っ た 。 EIO (MADV_WILLNEED の 場 合 ) こ の 範 囲 の ペ ー ジ ン グ を 行 う と 、 プ ロ セ ス の RSS (resident set size) の 最 大 値 を 越 え て し ま う 。
指 定 し た 範 囲 の ア ド レ ス が 、 現 在 マ ッ プ さ れ て い な い 。 あ る い は プ ロ セ ス の ア ド レ ス 空 間 の 内 部 に な い 。
|