2011-12-23 12 views
2

うまくいけばタイトルは明らかです。私はmmap()で得られたメモリを持っています。しばらくすると、私はこの範囲内のデータはもう必要ないと結論づけました。しかし、私はまだこの範囲を保つことを望みます。つまり、私はmummap()を呼びたくはありません。私は良い市民になろうと努力しており、必要以上にシステムを交換しないようにしています。バックアップ物理ページが必要な場合、swapにmmap()ページを書き込む必要はないということをLinuxに伝えるには?

場合は指定したページが物理ページに裏打ちされ、カーネルがそれを決定する場合は物理ページは、スワップにそのページを書く気にしないことを必要とされたLinuxカーネルを伝える方法はありますか?

この魔法の関数呼び出しは、指定された仮想ページと物理ページ(存在する場合)を最初にスワップしなくてもマップを破壊すると思います。

+0

を探しているのでしょうか?それはまさにあなたが望むことをしています。後でmmapが同じ仮想アドレスを再利用しないようにするには、munmapの後にMAP_FIXED + PROT_NONEを使ってアドレスを予約することができます。 –

+0

これがこれを行うことをどのように知っていますか(バッキング物理ページを書き換えてスワップします)? –

+0

@ChrisDodd mmap()の後続の呼び出し(適切なパラメータで作られたもの)が同じページを再予約することを保証できるのであれば、munmap()しか使用できませんでした。 2番目のmmap()が成功し、munmap()を使用できなくなってしまうのは、この保証の欠如です。特定のページに有用なデータが含まれていないことが何回もわかっていても、私のチャンクの開始と終了は変わらないことが重要です。 – tgoodhart

答えて

5

あなたの質問を使用することができます。

あなたが望むことをカーネルに伝える方法があったとしましょう。

さらに、に余分なRAMが必要であると仮定して、ページを削除してスワップしませんでした。

は今、あなたのプログラムは、(あなたが munmapにデータ、おそらくあなたは それにアクセスしようとするかもしれないしたくなかったので)そのページを読み取ろうとします。カーネルは何をするのですか?私が見る選択肢:

  1. それはあなたに0で満たされた新しいページを与えることができます。あなたは選択肢2たい場合
  2. それはあなたがmunmapと同じ結果を得ることができ、あなたのSIGSEGV

を与えることができます。

あなたは選択肢1を望んでいた場合、あなたはMAP_ANONと、既存のマッピングを超えるmremap(またはmunmapが新しいmmapが続く)ことができます。

どちらの場合でも、必要なときに古いデータに依存することはできません。

カーネルがであることを知らせる追加のメカニズムがある場合(たとえば、特別な信号を送信するなど)、質問が理にかなっている唯一の方法です。しかし、あなたが記述した状況は、複雑さを余儀なくされるほど稀です。

EDIT:

あなたはと、munmapと間違って何madvise(..., MADV_DONTNEED)

+0

パーフェクト! madvise()は私が探していたものです。 (1)のような振る舞いは私が望むものですが、ゼロ充填は不要です。ごみは何でもします。 mremap()はあなたのシステムにMAP_ANONフラグを持っていますか?私の文書にはこれがありません。 – tgoodhart

0

あなたはその交換が必要とされていない初期のマッピング時にわかっている場合、MAP_NORESERVE

で再び、そしてmmapそれを地域のmunmapも意味がありません(述べたように)MAP_NORESERVE

+0

2番目のmmap()が成功するという保証はありません。 – tgoodhart

関連する問題