スポンサーリンク

MADVISE(2) FreeBSD システムコールマニュアル MADVISE(2)

名称

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

ライブラリ

標準 C ライブラリ (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 を使用 するべきです。

戻り値

関数 madvise() は、処理が成功すると値 0 を返します。そうでない場合、値 -1 が返され、グローバル変数 errno が設定されてエラーを示します。

エラー

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() システムコールは 4.4BSD ではじめて登場しました。

FreeBSD 10.0 July 19, 1996 FreeBSD 10.0

スポンサーリンク