MADVISE(2)

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

ライブラリ
libc

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

解説
madvise() システムコールによって、自身のメモリ利用の習性の知識があるプロセスは、それを システムに説明できます。

知られた習性は以下のとおりです:

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

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

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

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

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

MADV_FREE
    VM システムにページを解放する自由を与え、指定ページ範囲内の情報がもはや 重要でないことをシステムに通知します。 これは、アドレス空間を有効にしたままで malloc(3) がアドレス空間内の任意の位置のページを解放できるようにする効率的な方法です。 ページが次に参照される時には、そのページは要求時 0 クリアの対象に なっている可能性もありますし、または 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
    コアファイルの領域を含みます。

MADV_PROTECT
    スワップ空間を使い果たした時に、 このプロセスは終了させられるべきではないことを、VM システムに通知します。 プロセスはスーパユーザの特権を持っていなければなりません。 これは、システムが適切に機能するために実行され続けなければならない プロセス群で、思慮分別を持って使用されるべきです。

戻り値

エラー
madvise() システムコールは次の場合に失敗します:

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

[EPERM]
    MADV_PROTECT が指定され、プロセスがスーパユーザの特権を持っていません。

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

歴史
madvise() システムコールは 4.4BSD ではじめて登場しました。