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) の 前 後 で マ ッ ピ ン グ は 継 承 さ れ る よ う に な る 。
madvise() は 成 功 す る と 0 を 返 す 。 エ ラ ー が 起 こ る と −1 を 返 し 、 errno を 適 切 な 値 に 設 定 す る 。
|
EAGAIN 何 ら か の カ ー ネ ル リ ソ ー ス が 一 時 的 に 利 用 で き な か っ た 。 | |
|
EBADF 指 定 し た マ ッ プ は 存 在 す る が 、 フ ァ イ ル で は な い と こ ろ を マ ッ プ し て い る 。 | |
|
EINVAL |
len の 値 が 負 、 addr が ペ ー ジ 境 界 で な い 、 advice が 正 し い 値 で な い 、 ア プ リ ケ ー シ ョ ン が ロ ッ ク さ れ た ペ ー ジ や 共 有 ペ ー ジ を (MADV_DONTNEED で ) 解 放 し よ う と し て い る 、 な ど 。
|
EIO |
(MADV_WILLNEED の 場 合 ) こ の 範 囲 の ペ ー ジ ン グ を 行 う と 、 プ ロ セ ス の RSS (resident set size) の 最 大 値 を 越 え て し ま う 。 | ||
|
ENOMEM |
(MADV_WILLNEED の 場 合 ) メ モ リ が 足 り ず 、 ペ ー ジ ン グ に 失 敗 し た 。 | ||
|
ENOMEM |
指 定 し た 範 囲 の ア ド レ ス が 、 現 在 マ ッ プ さ れ て い な い 。 あ る い は プ ロ セ ス の ア ド レ ス 空 間 の 内 部 に な い 。
準 拠POSIX.1b. POSIX.1-2001 で は 、 posix_madvise(3) を POSIX_MADV_NORMAL な ど の 定 数 と と も に 記 述 し て い た (そ れ ぞ れ の 振 る 舞 い は こ こ で 述 べ た も の に 近 い )。 フ ァ イ ル ア ク セ ス に 対 し て も posix_fadvise(2) と い う 類 似 の 関 数 が 存 在 す る 。 MADV_REMOVE, MADV_DONTFORK, MADV_DOFORK は 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) COMMENTS |