Manpages

名 前

posix_fadvise − フ ァ イ ル デ ー タ の ア ク セ ス パ タ ー ン を あ ら か じ め 宣 言 す る

書 式

#include <fcntl.h>

int posix_fadvise(int fd, off_t offset, off_t len, int advice);

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

posix_fadvise():

_XOPEN_SOURCE >= 600 || _POSIX_C_SOURCE >= 200112L

説 明

プ ロ グ ラ ム は 、 将 来 特 定 の パ タ ー ン で フ ァ イ ル デ ー タ に ア ク セ ス す る 意 思 を 伝 え る た め に posix_fadvise() を 使 う こ と が で き る 。 こ れ に よ り 、 カ ー ネ ル が 適 切 な 最 適 化 を 実 行 す る こ と が 可 能 に な る 。

advicefd が 参 照 し て い る フ ァ イ ル の offset か ら 始 ま る len バ イ ト の 範 囲 内 (len が 0 の 場 合 は フ ァ イ ル の 終 り ま で ) の (必 ず し も 存 在 し な い ) 領 域 に 適 用 さ れ る 。 advice は 義 務 づ け で は な い 。 advice は 単 に ア プ リ ケ ー シ ョ ン の た め に 可 能 性 を 構 成 す る だ け で あ る 。

advice に 許 さ れ る 値 に は 、 以 下 の も の が 含 ま れ る :
POSIX_FADV_NORMAL
指 定 さ れ た デ ー タ の ア ク セ ス パ タ ー ン を 指 示 す る ア ド バ イ ス を ア プ リ ケ ー シ ョ ン が 何 も 持 っ て い な い こ と を 示 す 。 オ ー プ ン さ れ た フ ァ イ ル に ア ド バ イ ス が 指 定 さ れ な い 場 合 、 こ れ が デ フ ォ ル ト で 仮 定 さ れ る 。
POSIX_FADV_SEQUENTIAL
ア プ リ ケ ー シ ョ ン は 指 定 さ れ た デ ー タ が シ ー ケ ン シ ャ ル に (大 き な オ フ セ ッ ト の 前 に 小 さ な オ フ セ ッ ト の デ ー タ を 読 む よ う に ) ア ク セ ス さ れ る こ と を 期 待 す る 。
POSIX_FADV_RANDOM
指 定 さ れ た デ ー タ が ラ ン ダ ム な 順 番 で ア ク セ ス さ れ る 。
POSIX_FADV_NOREUSE
指 定 さ れ た デ ー タ は 1 度 し か ア ク セ ス さ れ な い 。
POSIX_FADV_WILLNEED
指 定 さ れ た デ ー タ は 近 い 将 来 ア ク セ ス さ れ る 。
POSIX_FADV_DONTNEED
指 定 さ れ た デ ー タ は 近 い 将 来 ア ク セ ス さ れ な い 。

返 り 値

成 功 し た 場 合 は 0 が 返 さ れ る 。 失 敗 し た 場 合 は エ ラ ー 番 号 が 返 さ れ る 。

エ ラ ー

EBADF

fd 引 き 数 が 有 効 な フ ァ イ ル デ ィ ス ク リ プ タ ー で な い 。

EINVAL

無 効 な 値 が advice に 指 定 さ れ た 。

ESPIPE 指 定 さ れ た フ

ァ イ ル デ ィ ス ク リ プ タ ー が パ イ プ ま た は FIFO を 参 照 し て い る (ESPIPE は POSIX で 規 定 さ れ て い る エ ラ ー だ が 、 バ ー ジ ョ ン 2.16 よ り 前 の カ ー ネ ル で は 、 こ の 場 合 に EINVAL を 返 し て い た 。 )

バ ー ジ ョ ン

カ ー ネ ル に よ る サ ポ ー ト は Linux 2.5.60 で 最 初 に 登 場 し 、 対 応 す る シ ス テ ム コ ー ル は fadvise64() と い う 名 前 で あ る 。 ラ イ ブ ラ リ に よ る サ ポ ー ト は glibc バ ー ジ ョ ン 2.2 以 降 で 提 供 さ れ て お り 、 ラ ッ パ ー 関 数 は posix_fadvise() と い う 名 前 で あ る 。

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

準 拠

POSIX.1−2001. len 引 き 数 の 型 が POSIX.1−2003 TC1 に お い て size_t か ら off_t に 変 更 さ れ た 点 に 注 意 す る こ と 。

注 意

Linux で は 、 POSIX_FADV_NORMAL は バ ッ キ ン グ デ バ イ ス の デ フ ォ ル ト サ イ ズ に 先 読 み (readahead) ウ イ ン ド ウ を 設 定 す る 。 POSIX_FADV_SEQUENTIAL は こ の サ イ ズ を 2 倍 し 、 POSIX_FADV_RANDOM は 先 読 み を 全 く 無 効 に す る 。 こ れ ら の 変 更 は フ ァ イ ル 全 体 に 影 響 し 、 指 定 さ れ た 領 域 の み に 影 響 す る わ け で は な い (し か し 同 じ フ ァ イ ル に 対 す る 他 の オ ー プ ン フ ァ イ ル ハ ン ド ル は 影 響 を 受 け な い )。

POSIX_FADV_WILLNEED は 、 ペ ー ジ キ ャ ッ シ ュ に 指 定 領 域 の ブ ロ ッ ク さ れ な い 読 み 込 み を 開 始 す る 。 読 み 込 ま れ る デ ー タ の 総 量 は 、 仮 想 メ モ リ ー の 負 荷 に 依 っ て カ ー ネ ル が 減 ら す か も し れ な い (数 メ ガ バ イ ト で あ れ ば 通 常 は 全 く 十 分 で あ り 、 そ れ よ り 多 く て も め っ た に 役 に 立 た な い )。

2.6.18 よ り 前 の カ ー ネ ル で は 、 POSIX_FADV_NOREUSEPOSIX_FADV_WILLNEED と 同 じ 意 味 で あ っ た 。 こ れ は 多 分 バ グ で あ っ た 。 カ ー ネ ル 2.6.18 以 降 で は 、 こ の フ ラ グ は 何 も 行 わ な い 。

POSIX_FADV_DONTNEED は 指 定 さ れ た 領 域 に 関 連 付 け ら れ た キ ャ ッ シ ュ ペ ー ジ を 解 放 し よ う と す る 。 例 え ば 、 こ れ は 大 き な フ ァ イ ル を ス ト リ ー ミ ン グ す る と き に 役 立 つ 。 プ ロ グ ラ ム は 、 使 用 済 み の キ ャ ッ シ ュ さ れ た デ ー タ を 解 放 す る よ う に 、 定 期 的 に カ ー ネ ル に 要 求 す る か も し れ な い 。 そ う す る こ と に よ り 、 さ ら に 有 効 な キ ャ ッ シ ュ さ れ た ペ ー ジ が 、 代 わ り に 破 棄 さ れ る こ と は な い 。 ペ ー ジ の 一 部 分 の 破 棄 要 求 は 無 視 さ れ る 。 不 要 な デ ー タ を 破 棄 す る よ り も 必 要 な デ ー タ を 保 持 す る 方 が よ い 。 ア プ リ ケ ー シ ョ ン が デ ー タ を 破 棄 し た 方 が よ い と 思 う 場 合 は 、 offsetlen が ペ ー ジ 境 界 に 合 っ て い な け れ ば な ら な い 。 ま だ 書 き 出 さ れ て い な い ペ ー ジ は 影 響 を 受 け な い の で 、 そ の ペ ー ジ の 解 放 が 保 証 さ れ る こ と を ア プ リ ケ ー シ ョ ン が 望 ん で い る な ら 、 最 初 に fsync(2) ま た は fdatasync(2) を 呼 ぶ べ き で あ る 。 ア ー キ テ ク チ ャ ー 固 有 の 派 生 バ ー ジ ョ ン い く つ か の ア ー キ テ ク チ ャ ー で は 、 64 ビ ッ ト の 引 き 数 は 適 切 な レ ジ ス タ ー の 組 に 割 り 当 て る 必 要 が あ る (syscall(2) 参 照 )。 こ の よ う な ア ー キ テ ク チ ャ ー で は 、 「 書 式 」 に 書 か れ て い る posix_fadvise() の 呼 び 出 し シ グ ネ チ ャ ー で 、 引 き 数 fdoffset の 間 の パ デ ィ ン グ (詰 め も の ) で レ ジ ス タ ー が 一 つ 消 費 さ れ て し ま う 。 そ の た め 、 こ れ ら の ア ー キ テ ク チ ャ ー で は 引 き 数 が 適 切 な 順 序 に な っ た 別 の シ ス テ ム コ ー ル が 定 義 さ れ て い る が 、 そ れ 以 外 は posix_fadvise() と 全 く 同 じ で あ る 。 例 え ば 、 Linux 2.6.14 以 降 で は 、 ARM に は 以 下 の シ ス テ ム コ ー ル が 存 在 す る 。

long arm_fadvise64_64(int fd, int advice,
loff_t
offset, loff_t len); 通 常 、 glibc の posix_fadvise() ラ ッ パ ー 関 数 に よ り 、 こ れ ら の ア ー キ テ ク チ ャ ー 固 有 の 詳 細 は ア プ リ ケ ー シ ョ ン に は 見 え な い 。 glibc の ラ ッ パ ー 関 数 で は 、 適 切 な ア ー キ テ ク チ ャ ー 固 有 の シ ス テ ム コ ー ル が 呼 び 出 さ れ る 。

バ グ

2.6.6 よ り 前 の カ ー ネ ル で は 、 len に 0 が 指 定 さ れ た 場 合 、 「 フ ァ イ ル の 終 り ま で の 全 て の バ イ ト 」 と い う 意 味 で は な く 、 文 字 通 り 「 0 バ イ ト 」 と し て 解 釈 さ れ て い た 。

関 連 項 目

readahead(2), sync_file_range(2), posix_fallocate(3), posix_madvise(3)

こ の 文 書 に つ い て

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