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);
posix_fadvise():
プログラムは、将来特定のパターンでファイルデータに アクセスする意思を伝えるために posix_fadvise() を使うことができる。 これにより、カーネルが適切な最適化を実行することが可能になる。
advice は fd が参照しているファイルの offset から始まる len バイ トの範囲内 (len が 0 の場合はファイルの終りまで) の (必ずしも存在しない) 領域に適用される。 advice は義務づけではない。 advice は単にアプリケー ションのために可能性を構成するだけである。
advice に許される値には、以下のものが含まれる:
成功した場合は 0 が返される。 失敗した場合はエラー番号が返される。
カーネルによるサポートは Linux 2.5.60 で最初に登場し、 対応するシステムコールは fadvise64() という名前である。 ライブラリによるサポートは glibc バージョン 2.2 以降で提供されており、 ラッパー関数は posix_fadvise() という名前である。
Linux 3.18 以降では、対応するシステムコールのサポートは任意となり、利用できるかはカーネルが CONFIG_ADVISE_SYSCALLS オプションを有効にしてコンパイルされているかに依存する。
POSIX.1-2001, POSIX.1-2008. len 引数の型が POSIX.1-2001 TC1 において size_t から off_t に変更された点に注意すること。
Linux では、POSIX_FADV_NORMAL はバッキングデバイスの デフォルトサイズに先読み (readahead) ウインドウを設定する。 POSIX_FADV_SEQUENTIAL はこのサイズを 2 倍し、 POSIX_FADV_RANDOM は先読みを全く無効にする。 これらの変更はファイル全体に影響し、指定された領域のみに影響するわけではない (しかし同じファイルに対する他のオープンファイルハンドルは影響を受けない)。
The contents of the kernel buffer cache can be cleared via the /proc/sys/vm/drop_caches interface described in proc(5).
One can obtain a snapshot of which pages of a file are resident in the buffer cache by opening a file, mapping it with mmap(2), and then applying mincore(2) to the mapping.
The name of the wrapper function in the C library is posix_fadvise(). The underlying system call is called fadvise64() (or, on some architectures, fadvise64_64()); the difference between the two is that the former system call assumes that the type of the len argument is size_t, while the latter expects loff_t there.
いくつかのアーキテクチャーでは、 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 バイト」として解釈されていた。
fincore(1), mincore(2), readahead(2), sync_file_range(2), posix_fallocate(3), posix_madvise(3)
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。
2019-03-06 | Linux |