bionic (2) madvise.2.gz

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

名前

       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 以降)
              addrlength  で指定された範囲のページをソフトオフラインにする。  指定された範囲の各ページのメモ
              リーの内容は保持され (すなわち、次にアクセスされた際に、同じ内容が見えるが、新しい物理ページフレー
              ムになる)、 元のフレームはオフラインになる (すなわち、  そのフレームは使用される、通常のメモリー管
              理からは取り除かれる)。 MADV_SOFT_OFFLINE 操作の影響は呼び出したプロセスには見えない (つまり呼び出
              したプロセスの動作は変化しない)。 この機能はメモリーのエラー処理コードをテストすることを目的に作ら
              れた。 カーネルで CONFIG_MEMORY_FAILURE が有効になっている場合にのみ利用可能である。

       MADV_MERGEABLE (Linux 2.6.32 以降)
              Kernel Samepage Merging (KSM; カーネルによる同じページの統合) を addrlength で指定された領域に
              対して有効にする。 カーネルは、 統合可能の印がついたユーザーメモリーの領域を定期的にスキャンし、内
              容が全く同じページを探す。              内容が全く同じページがあれば、それらのページは書き込み保護
              (write-protected) がかかった一つのページで置き換えられる (プロセスが後でページの内容を更新しようと
              した際には自動的にページのコピーが行われる)。  KSM はプライベートな無名ページ (anonymous pages) だ
              けを統合する (mmap(2) 参照)。 KSM 機能は、  同じデータのインスタンスを大量に生成するアプリケーショ
              ン  (KVM などの仮想化システム) での利用を想定している。 この機能はプロセッシング能力を大量に消費す
              る場合があり、注意して使用すること。 詳細は Linux カーネルソースファイル  Documentation/vm/ksm.txt
              を参照。  MADV_MERGEABLEMADV_UNMERGEABLE は、 カーネルで CONFIG_KSM オプションを有効になってい
              る場合にのみ利用できる。

       MADV_UNMERGEABLE (Linux 2.6.32 以降)
              指定されたアドレス範囲に関して、それ以前に行われた MADV_MERGEABLE 操作の効果を取り消す。 KSM  は、
              addrlength で指定されたアドレス範囲の統合済みのすべてのページの統合解除を行う。

       MADV_HUGEPAGE (Linux 2.6.38 以降)
              Transparent  Huge  Pages  (THP)  を addrlength で指定された領域に対して有効にする。 現在のとこ
              ろ、Transparent Huge Pages  はプライベートな無名ページ  (anonymous  pages)  についてのみ機能する。
              カーネルは定期的にヒュージページ  (huge page) 候補の印がついたページをスキャンし、ヒュージページと
              置き換える。  また、カーネルはその領域がヒュージページのサイズに合っている場合、ヒュージページを直
              接割り当てる (posix_memalign(2) 参照)。 この機能は、大きなデータマッピングを使用し、一度にそのメモ
              リーの大きな範囲にアクセスするようなアプリケーション (例えば QEMU のような仮想化システム) で使うこ
              とを主に想定されている。  この機能は非常に簡単にメモリーを浪費してしまう (例えば、1 バイトしかアク
              セスしない 2MB のマッピングが、 4KB ページではなく  2MB  の実際のメモリーを使ってしまう)。  詳細は
              Linux    カーネルソースファイル    Documentation/vm/transhuge.txt    を参照。   MADV_HUGEPAGEMADV_NOHUGEPAGE は、 カーネルで CONFIG_TRANSPARENT_HUGEPAGE オプションを有効になっている場合にのみ
              利用できる。

       MADV_NOHUGEPAGE (Linux 2.6.38 以降)
              addrlength で指定されたアドレス範囲のメモリーがヒュージページに組み込まれないようにする。

       MADV_DONTDUMP (Linux 3.4 以降)
              コアダンプから addrlength で指定された範囲のページを除外する。 これは、 コアダンプに含めても役
              に立たないことが分かっている大きなメモリー領域があるアプリケーションで有用である。   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 で) 解放 しようとしている。

              *  adviceMADV_MERGEABLEMADV_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/ に書かれている。