Available in

(2) (3) (2)/es (2)/fr (2)/ja

Contents

名 前

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

blog comments powered by Disqus