Provided by: manpages-ja-dev_0.5.0.0.20161015+dfsg-1_all 

名前
madvise - メモリー利用に関するアドバイスを与える
書式
#include <sys/mman.h> int madvise(void *addr, size_t length, int advice); glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照): madvise(): _BSD_SOURCE
説明
madvise() システムコールは、アドレス addr からはじまる length バイトのメモリーブロックのページング入出力 をどう扱えば良いか、 カーネルにアドバイスする。 これを用いると、 アプリケーションからカーネルに、 マップ されたメモリーや共有メモリーをどのように扱ってほしいか伝えることができ、 カーネルはそれに応じて先読みや キャッシュなどの適切な手法を選択できる。 このコールはアプリケーションの動作そのものには影響しない (MADV_DONTNEED の場合は別) が、 性能には影響しうる。 なおこのアドバイスを受け入れるかどうかはカーネルに任 される。 アドバイスは引き数 advice によって与える。以下のいずれかを指定できる。 MADV_NORMAL 特別な扱いは行わない。これがデフォルトである。 MADV_RANDOM ページ参照はランダムな順序で行われそうだ。 (したがって、先読みはあまり効果がなさそうだ。) MADV_SEQUENTIAL ページ参照はシーケンシャルな順序で行われそうだ。 (したがって与えた範囲のページは積極的に先読みして おくと良いだろう。 またアクセスが終わったら速やかに解放して良い。) MADV_WILLNEED 近い将来にアクセスされそうだ。 (したがってこれらのページを今のうちに先読みしておくといいだろう。) MADV_DONTNEED しばらくアクセスはなさそうだ。 (現時点でアプリケーションは与えた範囲の処理を終えている。 したがっ てカーネルはこれに関連するリソースを解放して良い。) これ以降この範囲のページへのアクセスがあると、 成功はするが、メモリーの内容をマップ元のファイルからロードし直すことになる (mmap(2) を見よ) か、 または元ファイルがないマップページでは アクセスがあったときに 0 埋めが行われることになる。 MADV_REMOVE (Linux 2.6.16 以降) 指定された範囲のページと関連するバッキングストアを解放する。 現在のところ、 shmfs/tmpfs だけがこれ に対応している。 他のファイルシステムでは ENOSYS が返される。 MADV_DONTFORK (Linux 2.6.16 以降) fork(2) が行われた後、指定された範囲のページを子プロセスが利用できないようにする。 この機能は、書 き込み時コピー (copy-on-write) 方式で、 fork(2) の後で親プロセスがページに書き込みを行った場合に ページの物理位置が変化しないようにするのに有効である (ページの再配置はハードウェアがそのページに DMA 転送を行うような場合に 問題を起こすことがある)。 MADV_DOFORK (Linux 2.6.16 以降) MADV_DONTFORK の影響を取り消し、デフォルトの動作に戻す。 つまり、 fork(2) の前後でマッピングは継承 されるようになる。 MADV_HWPOISON (Linux 2.6.32 以降) ページに毒入れを行い、ハードウェアメモリーの破損のようにそのページを取り扱う。 この操作は特権 (CAP_SYS_ADMIN を持った) プロセスだけが利用できる。 この操作の結果、呼び出したプロセスは SIGBUS を 受け取り、そのページはアンマップされる。 この機能はメモリーのエラー処理コードをテストするためのも のである。 カーネルで CONFIG_MEMORY_FAILURE が有効になっている場合にのみ利用可能である。 MADV_SOFT_OFFLINE (Linux 2.6.33 以降) addr と length で指定された範囲のページをソフトオフラインにする。 指定された範囲の各ページのメモ リーの内容は保持され (すなわち、次にアクセスされた際に、同じ内容が見えるが、新しい物理ページフレー ムになる)、 元のフレームはオフラインになる (すなわち、 そのフレームは使用される、通常のメモリー管 理からは取り除かれる)。 MADV_SOFT_OFFLINE 操作の影響は呼び出したプロセスには見えない (つまり呼び出 したプロセスの動作は変化しない)。 この機能はメモリーのエラー処理コードをテストすることを目的に作ら れた。 カーネルで CONFIG_MEMORY_FAILURE が有効になっている場合にのみ利用可能である。 MADV_MERGEABLE (Linux 2.6.32 以降) Kernel Samepage Merging (KSM; カーネルによる同じページの統合) を addr と length で指定された領域に 対して有効にする。 カーネルは、 統合可能の印がついたユーザーメモリーの領域を定期的にスキャンし、内 容が全く同じページを探す。 内容が全く同じページがあれば、それらのページは書き込み保護 (write-protected) がかかった一つのページで置き換えられる (プロセスが後でページの内容を更新しようと した際には自動的にページのコピーが行われる)。 KSM はプライベートな無名ページ (anonymous pages) だ けを統合する (mmap(2) 参照)。 KSM 機能は、 同じデータのインスタンスを大量に生成するアプリケーショ ン (KVM などの仮想化システム) での利用を想定している。 この機能はプロセッシング能力を大量に消費す る場合があり、注意して使用すること。 詳細は Linux カーネルソースファイル Documentation/vm/ksm.txt を参照。 MADV_MERGEABLE と MADV_UNMERGEABLE は、 カーネルで CONFIG_KSM オプションを有効になってい る場合にのみ利用できる。 MADV_UNMERGEABLE (Linux 2.6.32 以降) 指定されたアドレス範囲に関して、それ以前に行われた MADV_MERGEABLE 操作の効果を取り消す。 KSM は、 addr と length で指定されたアドレス範囲の統合済みのすべてのページの統合解除を行う。 MADV_HUGEPAGE (Linux 2.6.38 以降) Transparent Huge Pages (THP) を addr と length で指定された領域に対して有効にする。 現在のとこ ろ、Transparent Huge Pages はプライベートな無名ページ (anonymous pages) についてのみ機能する。 カーネルは定期的にヒュージページ (huge page) 候補の印がついたページをスキャンし、ヒュージページと 置き換える。 また、カーネルはその領域がヒュージページのサイズに合っている場合、ヒュージページを直 接割り当てる (posix_memalign(2) 参照)。 この機能は、大きなデータマッピングを使用し、一度にそのメモ リーの大きな範囲にアクセスするようなアプリケーション (例えば QEMU のような仮想化システム) で使うこ とを主に想定されている。 この機能は非常に簡単にメモリーを浪費してしまう (例えば、1 バイトしかアク セスしない 2MB のマッピングが、 4KB ページではなく 2MB の実際のメモリーを使ってしまう)。 詳細は Linux カーネルソースファイル Documentation/vm/transhuge.txt を参照。 MADV_HUGEPAGE と MADV_NOHUGEPAGE は、 カーネルで CONFIG_TRANSPARENT_HUGEPAGE オプションを有効になっている場合にのみ 利用できる。 MADV_NOHUGEPAGE (Linux 2.6.38 以降) addr と length で指定されたアドレス範囲のメモリーがヒュージページに組み込まれないようにする。 MADV_DONTDUMP (Linux 3.4 以降) コアダンプから addr と length で指定された範囲のページを除外する。 これは、 コアダンプに含めても役 に立たないことが分かっている大きなメモリー領域があるアプリケーションで有用である。 MADV_DONTDUMP の効果は /proc/PID/coredump_filter ファイル経由で設定されたビットマスクよりも優先される (core(5) 参照)。 MADV_DODUMP (Linux 3.4 以降) 以前の MADV_DONTDUMP の効果を取り消す。
返り値
madvise() は成功すると 0 を返す。 エラーが起こると -1 を返し、 errno を適切な値に設定する。
エラー
EAGAIN 何らかのカーネルリソースが一時的に利用できなかった。 EBADF 指定したマップは存在するが、ファイルではないところをマップしている。 EINVAL このエラーは以下の理由で発生する。 * len が負の値である。 * addr がページ境界ではない。 * advice が有効な値でない。 * アプリケーションがロックされたページや共有ページを (MADV_DONTNEED で) 解放 しようとしている。 * advice に MADV_MERGEABLE か MADV_UNMERGEABLE が指定されたが、 カーネルの設定が CONFIG_KSM が有 効になっていなかった。 EIO (MADV_WILLNEED の場合) この範囲のページングを行うと、 プロセスの RSS (resident set size) の最大値 を越えてしまう。 ENOMEM (MADV_WILLNEED の場合) メモリーが足りず、ページングに失敗した。 ENOMEM 指定した範囲のアドレスが、現在マップされていない。 あるいはプロセスのアドレス空間の内部にない。
バージョン
Linux 3.18 以降では、このシステムコールのサポートは任意となり、利用できるかはカーネルが CONFIG_ADVISE_SYSCALLS オプションを有効にしてコンパイルされているかに依存する。
準拠
POSIX.1b. POSIX.1-2001 では、 posix_madvise(3) を POSIX_MADV_NORMAL, POSIX_MADV_RANDOM などの定数ととも に記述していた (それぞれの振る舞いはここで述べたものに近い)。 ファイルアクセスに対しても posix_fadvise(2) という類似の関数が存在する。 MADV_REMOVE, MADV_DONTFORK, MADV_DOFORK, MADV_HWPOISON, MADV_MERGEABLE, MADV_UNMERGEABLE は Linux 固有で ある。
注意
Linux での注意 現在の Linux の実装 (2.4.0) では、 このシステムコールをアドバイスというよりは命令と見ている。 したがって このアドバイスに対して通常行われる動作が不可能な場合は、 エラーを返すことがある (上記の エラー の記述を参 照)。 この振舞いは標準とは異なる。 Linux の実装では addr のアドレスはページ境界の値でなければならない。また length は 0 であっても構わない。 また Linux 版の madvise() では、指定されたアドレス範囲にマップされていない部分があると、 これらを無視し て残りの部分にアドバイスを適用する (しかしシステムコールに対してはちゃんと ENOMEM を返す)。
関連項目
getrlimit(2), mincore(2), mmap(2), mprotect(2), msync(2), munmap(2), prctl(2), core(5)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告 に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。