名称
fadvise() ― ファイルアドバイザリ情報
構文
#include <sys/fcntl.h>
#include <sys/fadvise.h>
int fadvise(
int fad_fd,
off_t fad_offset,
size_t fad_len,
enum fadv_hints fad_advice,
fad_extparms_t *fad_extparms
);
パラメータ
| fad_fd | | fadvise の動作が適用されるオープンファイル記述子 |
| fad_offset | | 指定する範囲の開始位置 (正のバイトオフセット) |
| fad_len | | 指定する範囲の長さ (バイト数) |
| fad_advice | | 範囲に適用するアドバイス (fadvise(5) を参照) |
| fad_extparms | | fad_extparms_t 型の配列へのポインター
(fadvise(5) を参照) |
説明
fadvise() 関数は、オープンファイル記述子 fad_fd に関連付けられたファイル内のデータに関して、アプリケーションに予測される動作をシステムにアドバイス
(通知) します。 開始位置は fad_offset で、そこから fad_len バイト続きます。 指定した範囲は、ファイル内に現在存在していなくてもかまいません。 fad_len がゼロの場合、 fad_offset 以降の全データが指定されます。
fad_offset および fad_len パラメータの扱いは条件付きであり、 fad_extparms 引き数がヌルでない場合は無視されます。 fad_extparms 引き数は、ヌルでない場合、 fad_extparms_t 型の拡張パラメータリストへのポインターとして使用されます (fadvise(5) を参照)。
拡張パラメータリストを使用すると、アプリケーションでは 1 回の呼び出しで複数の範囲にわたるヒントをまとめて指定することができます。 fad_count 個の項目がリストされている順に処理され、範囲が重複している場合は、ヒントリストの低い位置にあるエントリーが優先されます。
指定したファイルオブジェクトに対して、すべてのヒントの効果が累積されることに注意してください。
ヒントはすべて、ファイルオブジェクトの最終クローズを処理する際に削除されます。
fad_advice パラメータは、データに適用するヒントを伝えるために使用され、以下の値のいずれかを取ります。
| FADV_CCNUMA | | メモリーをファイル I/O に割り当てる際に、VM は物理メモリーのローカリティに対して
cc-numa 関連のポリシーを使用します。 この属性は、ファイル全体に対してのみに適用されます。 以下のポリシーのいずれか 1 つを Either one of the following
policies can be combined with the FADV_CCNUMA コマンドと組み合わせることができます
(詳細については fadvise(5) を参照)。 | FADV_VM_MEM_INTERLEAVED | | | | ファイル用のメモリーを、インターリーブメモリーから割り当てることを指定するポリシーです。
インターリーブメモリーは、いくつかのローカリティドメインから割り当てられて
ストライプ化されたメモリーで、同一コストの割り当てが必要な場合に使用します。 | | FADV_VM_MEM_FIRST_TOUCH | | | | ファイル用のメモリーを、呼び出した CPU のローカリティから割り当てることを指定するポリシーです。
最も近いローカリティからメモリーが割り当て可能であれば高速ですが、
そうでなければ、遠くの割り当て可能なメモリーを検索します。 |
|
| FADV_DONTNEED | | アプリケーションが、指定した範囲のデータに近い将来アクセスしないと予測されることを示します。 |
| FADV_LARGEPAGE_HINT |
| | | ファイル I/O へのメモリー割り当てにおいて、VM がラージページを使用するのがアプリケーションに望ましいことを示します。 望ましいページサイズは、 fad_pgsize エイリアスで渡されます (fadvise(5) を参照)。 fad_pgsize エイリアスで指定したページサイズは、システムでサポートされているラージページのサイズに丸め
(切り捨て) られます。 ヒントを指定していない場合には、調整パラメータ vps_pagesize に指定されているページサイズが使用されます。 |
| FADV_NOREUSE | | アプリケーションが、指定した範囲のデータに 1 度アクセスした後、そのデータを再度使用しないと予測されることを示します。 |
| FADV_NORMAL | | 指定したデータに対して、アプリケーションの動作に関するアドバイスがないことを示します。
オープンファイルに対してアドバイスが指定されない場合、これがデフォルトの特性になります。 |
| FADV_RANDOM | | 指定した範囲のデータに、アプリケーションがランダムな順序でアクセスすると予測されることを示します。 |
| FADV_SEQUENTIAL | | 指定した範囲のデータに、アプリケーションが小さいオフセットから大きいオフセットの順にシーケンシャルにアクセスすると予測されることを示します。 |
| FADV_SYNC_NONE | | 指定した fd に関連付けられたページが VM によって sync されないことを示します。 |
| FADV_SYNC_RDWR | | ページアウトするページを選択する際に、VM の sync
処理が fd に対して使用するページングポリシーを設定します。
このポリシーは、ファイル I/O に対応するページが、 fad_synctime エイリアスで指定された時間間隔で sync されることを示します
(fadvise(5) を参照)。 これは、VM が設定した時間間隔でのデフォルト動作です。 |
| FADV_WILLNEED | | アプリケーションが、指定した範囲のデータに近い将来アクセスすると予測されることを示します。 |
これらの値は、 <sys/fadvise.h> で定義されています。
戻り値
| 0 | | 正常終了。 |
| -1 | | 失敗。 エラーを示す値が errno に設定されます。 |
エラー
fadvise() サービスが失敗した場合、 errno に、以下の値のいずれかが設定されます。
| EBADF | | fd 引き数が有効なファイル記述子ではありません。 |
| EINVAL | | fad_advice の値、または他の入力値のいずれかが無効です。 |
| ENOSYS | | 指定されたヒントが、このファイルオブジェクトではサポートされていません。 |
| ENOTTY | | fadvise の動作が、このファイルシステムではサポートされていません。 |
| ESPIPE | | fd 引き数が、パイプまたは FIFO に関連付けられています。 |
指定した fad_advice ヒントの処理中にエラーが発生した場合、関連するエラーを示すエラー番号が返されます
(errno.h を参照)。 したがって、このエラー番号の値は、上記のエラー番号とは無関係です。
例
int fd, ret;
struct fad_extparms *my_fad_extparms;
struct fad_parms *fad_plistp;
/*
* Advise the system that we're sequentially accessing the
* 64KB range and will not be re-using the data.
*/
fd = open (argv[1], O_RDONLY|O_CREAT, 0777);
my_fad_extparms = calloc(1, sizeof(int) + 2 * sizeof(struct fad_parms));
my_fad_extparms->fad_count = 2;
/* Initialize the two fad_parms entries. */
fad_plistp = &my_fad_extparms->fad_plist[0];
/* Hint that we're doing sequential access. */
fad_plistp->fad_advice = FADV_SEQUENTIAL;
fad_plistp->FAD_OFFSET = 0;
fad_plistp->FAD_LEN = 65536; /* first 64k range */
fad_plistp++;
/* Advise that we won't re-use the data. */
fad_plistp->fad_advice = FADV_NOREUSE;
fad_plistp->FAD_OFFSET = 0;
fad_plistp->FAD_LEN = 65536; /* first 64k range */
ret = fadvise (fd, 0, 0, 0, my_fad_extparms);
if (ret == -1)
printf ("fadvise() failure errno %d\n", errno);
著者
fadvise() は、IEEE POSIX 1003.1-2001 規格の機能を
HP で実装したものです。
参照
fcntl(2), posix_fadvise(2), fadvise(5), fcntl(5)
標準準拠
fadvise(): POSIX.1 (2001)