EN JA
MADVISE(2)
MADVISE(2) FreeBSD System Calls Manual MADVISE(2)

名称

madvise, posix_madviseメモリの使用法について助言を与える

ライブラリ

Standard C Library (libc, -lc)

書式

#include < sys/mman.h>

int
madvise( void *addr, size_t len, int behav);

int
posix_madvise( void *addr, size_t len, int behav);

解説

madvise() システムコールによって、自身のメモリ利用の習性の知識があるプロセスは、それをシステムに説明できます。 posix_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 システムに通知します。プロセスはスーパユーザの特権を持っていなければなりません。これは、システムが適切に機能するために実行され続けなければならないプロセス群で、思慮分別を持って使用されるべきです。

posix_madvise() インタフェースを呼び出す移植可能なプログラムは、上記のフラグではなく別名の POSIX_MADV_NORMAL, POSIX_MADV_SEQUENTIAL, POSIX_MADV_RANDOM, POSIX_MADV_WILLNEEDPOSIX_MADV_DONTNEED を使用するべきです。

戻り値

The madvise() function returns the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the error.

エラー

madvise() システムコールは、次の場合に失敗します:
[ EINVAL]
behav 引数が有効ではありません。
[ ENOMEM]
addr 引数と len 引数で指定された仮想アドレス範囲が有効ではありません。
[ EPERM]
MADV_PROTECT が指定され、プロセスがスーパユーザの特権を持っていません。

規格

posix_madvise() インタフェースは、 IEEE Std 1003.1-2001 (“POSIX.1”) に適合しています。

歴史

madvise() システムコールは、 4.4BSD ではじめて登場しました。
July 19, 1996 FreeBSD