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