tail head cat sleep
QR code linking to this page

manページ  — MADVISE

名称

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_WILLNEED および POSIX_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 が指定され、プロセスがスーパユーザの特権を持っていません。

関連項目

mincore(2), mprotect(2), msync(2), munmap(2)

規格

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

歴史

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

MADVISE (2) July 19, 1996

tail head cat sleep
QR code linking to this page


このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.

Modern Unix impedes progress in computer science, wastes billions of dollars, and destroys the common sense of many who seriously use it.
— The Unix Haters' handbook