posix_fadvise

POSIX_FADVISE(2)            Linux Programmer's Manual           POSIX_FADVISE(2)



名前
       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 引き数が有効なファイルディスクリプターでない。

       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_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,
                                 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/ に書かれている。



Linux                              2014-12-31                   POSIX_FADVISE(2)