MADVISE(2)

名称
madvise - メモリの使用法について助言を与える

ライブラリ
libc

書式
<sys/types.h> <sys/mman.h> int madvise(void *addr, size_t len, int behav)

解説
madvise() システムコールによって、自身のメモリ利用の習性の知識があるプロセスは、それを システムに説明できます。 これまで知られている習性は、 <sys/mman.h> で定義されており、次のとおりです。

    #define	MADV_NORMAL	0 /* これ以降、特殊な処理は必要ない */
    #define	MADV_RANDOM	1 /* ランダムなページ参照が予測される */
    #define	MADV_SEQUENTIAL	2 /* シーケンシャルな参照が予測される */
    #define	MADV_WILLNEED	3 /* これらのページを必要とする */
    #define	MADV_DONTNEED	4 /* これらのページを必要としない */
    #define	MADV_FREE	5 /* データは今や重要ではない */
    #define MADV_NOSYNC     6 /* 明示的に物理的バッキングストアが
    				コミットされない場合 */
    #define MADV_AUTOSYNC   7 /* デフォルトは物理的バッキングストアに
    				コミットされる */
    #define MADV_NOCORE     8 /* コアファイルにページを含まないこと */
    #define MADV_CORE       9 /* コアファイルにページを復帰させる */

MADV_NORMAL
    デフォルトのページング動作に戻るようにシステムに指示します。

MADV_RANDOM
    ページがランダムにアクセスされ、プリフェッチが有利ではないと考えられるという ヒントです。

MADV_SEQUENTIAL
    指定のページがフォルトで読み込まれたとき、そのページの直前のページの 優先順位を VM システムが下げるようにします。

MADV_WILLNEED
    指定の仮想アドレス範囲内にあるページが一時的に高い優先順位を持つようにし、 それらがメモリ内にある場合、解放される可能性を減少させます。 さらに既にメモリ内にあるページはただちにプロセスにマップされ、 それによってプロセス全体にわたるフォルトによる読み込みによる 不要なオーバーヘッドを除去します。 これは、フォルトによるページのバッキングストアからの 読み込みを生じさせるのではなく、 メモリ内に既にあるページを呼び出し側のプロセスに素早くマップさせます。

MADV_DONTNEED
    VM システムに、指定の範囲内のページのメモリ内優先順位の減少を許可します。 今後、このアドレス範囲への参照はページフォルトを発生させるでしょう。

MADV_FREE
    VM システムにページを解放する自由を与え、指定ページ範囲内の情報がもはや 重要でないことをシステムに通知します。これは、アドレス空間を有効にしたままで malloc(3) がアドレス空間内の任意の位置のページを解放できるようにする効率的な方法です。 ページが次に参照される時には、そのページは要求時ゼロクリアの対象に なっている可能性もありますし、または MADV_FREE 呼び出しの前にそこにあったデータが残っているかもしれません。 ページが再び修正されるまで、そのアドレス空間範囲に対する参照だけでは、 VM システムはバッキングストアから情報をページに読み込む動作を行わなくなります。

MADV_NOSYNC
    このマップに関連づけられているデータを 物理的バッキングストアにフラッシュしないようにシステムに要求します。 通常、これにより、ファイルシステムアップデートデーモンが VM システムが汚したページを特に理由もないのに 物理ディスクに書込む不要な動作を防止します。 VM とファイルシステムの一貫性は常に維持されることに注意してください。 この機能は、マップされたデータが必要なときだけ、 (通常、システムページャにより) フラッシュされることを 保証しているに過ぎません。

    この機能を使用する典型的な場合とは、 ファイルを裏に持つ共有メモリ領域をプロセス (IPC) 間通信で使いたいとき、 特に、その領域に格納されるデータを物理的ディスクに書き込む必要がない場合です。 この機能は、SysV 共有メモリ呼び出しで得られる mmap 性能と 同等の性能を与えてくれますし、かつ、SysV 共有メモリ呼び出しを使うより、 きめ細かい制御が可能でより制約が少ない方法でもあります。 しかしこの機能は UNIX プラットホーム間で移植性がないことに注意してください (いくつかのプラットホームではデフォルトで正しく振る舞うかも知れませんが)。 詳しい情報に関しては、 mmap(2) の MAP_NOSYNC セクションを参照してください。

MADV_AUTOSYNC
    将来、アドレス範囲内のページが汚された場合のために MADV_NOSYNC の効果を元に戻します。 既に汚されているページについての効果は不定です。 書き戻しするかもしれませんし、しないかもしれません。 書き戻しを確実に行なうには、 msync(2) または fsync(2) システムコールを使用します。

MADV_NOCORE
    領域は、コアファイルに含まれません。

MADV_CORE
    コアファイルの領域を含みます。

戻り値

エラー
madvise() 関数は次の場合に失敗します。

[EINVAL]
    addr 引数と len 引数で指定された仮想アドレス範囲が有効ではありません。

関連項目
mincore(2), mprotect(2), msync(2), munmap(2)

歴史
madvise() 関数は 4.4BSD ではじめて登場しました。