readahead -
前もってファイルをページキャッシュに読み込む
#define _GNU_SOURCE /* feature_test_macros(7) 参照 */
#include <fcntl.h>
ssize_t readahead(int fd, off64_t offset, size_t count);
readahead()
はファイルの先読みを行い、そのファイルに対する後の読み込みがキャッシュから行われ、ディスク
I/O
で停止しないようにする
(この条件を満たせるのは、先読みは十分早く行われ、システムの他の動作によりその後にキャッシュからページがフラッシュされない場合である)。
fd
引数は読み込みを行うファイルを識別するファイルディスクリプターである。
offset
引数はデータの読み込み開始位置を指定し、
count
は読み込むデータのバイト数を指定する。
ディスク I/O
はページ単位で実行されるので、
実際には
offset
はページ境界に切り下げられ、読み込みバイト数は
(offset+count)
より小さくない次のページ境界まで切り上げられる。
readahead()
はファイルの末尾を越えた範囲まで読み出しを行うことはない。ファイルディスクリプター
fd
で参照されたオープン済のファイル記述のファイルオフセットは
変更されない。
readahead() は成功すると 0
を返す。失敗した場合
-1 を返し、
errno
にエラーの原因を示す値を設定する。
- EBADF
-
fd
が有効なファイルディスクリプターでない、または
読み込み用にオープンされていない。
- EINVAL
-
fd
が参照しているファイルが、
readahead()
を行うことができないタイプのファイルであった。
readahead()
システムコールは Linux 2.4.13
で登場した。 glibc
でのサポートは glibc
バージョン 2.3
以降で行われている。
readahead()
システムコールは Linux
固有であり、移植を考慮したプログラムでは
使用を避けるべきである。
いくつかの 32
ビットアーキテクチャーでは、このシステムコールの呼び出しシグネチャーが違っている。
理由は
syscall(2)
で説明されている。
readahead()
は読み込みをバックグラウンドで行うようにスケジューリングを行い、すぐに返る。
しかしながら、要求されたブロックの位置を知るために必要なファイルシステムのメタデータを読み込む間は
readahead()
は停止することがある。
これは ext[234]
で大きなファイルをエクステントではなく間接ブロックを使う場合にしばしば発生し、
要求したデータが読み込まれるまで呼び出しが停止しているように見える。
lseek(2),
madvise(2),
mmap(2),
posix_fadvise(2),
read(2)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。