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_WILLNEED
および
POSIX_MADV_DONTNEED
を使用するべきです。