2

うまくいけば、タイトルは明確です。mmap()を介して取得したメモリのチャンクがあります。しばらくして、私はこの範囲内のデータはもう必要ないと結論付けました。ただし、この範囲を維持したいと思います。つまり、mummap()を呼び出したくありません。私は良き市民になりたいと思っており、必要以上にシステムを交換しないようにしています。

Linuxカーネルに、特定のページが物理ページに裏打ちされていて、カーネルがその物理ページが必要であると判断した場合、わざわざそのページを書き込んでスワップしないように指示する方法はありますか

内部的には、この魔法の関数呼び出しは、最初にスワップに書き込むことなく、指定された仮想ページと物理ページ(存在する場合)の間のマッピングを破棄すると思います。

4

2 に答える 2

5

(述べたように)あなたの質問は意味がありません。

カーネルにやりたいことをするように指示する方法があったとしましょう。

さらに、追加のRAMが必要だったため、ページが削除され、スワップアウトされなかった仮定しましょう。

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

  1. それはあなたに0で満たされた新しいページを与えることができます。
  2. それはあなたに与えることができますSIGSEGV

選択肢2が必要な場合は、で同じ結果を得ることができますmunmap

選択肢1が必要な場合はmremap、既存のマッピングをでMAP_ANON(またはmunmapその後にnewでmmap)上書きできます。

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

あなたの質問が理にかなっている唯一の方法は、カーネルがあなたのページを奪っていることをあなたに知らせるための追加のメカニズムがあったかどうかです(例えばあなたに特別な信号を送る。しかし、あなたが説明した状況は、さらに複雑になることを正当化するほどまれである可能性があります。

編集:

あなたが探しているかもしれませんmadvise(..., MADV_DONTNEED)

于 2011-12-23T19:23:29.700 に答える
0

あなたはmunmapその地域である可能性がありmmapますMAP_NORESERVE

最初のマッピング時にスワッピングが不要であることがわかっている場合は、MAP_NORESERVE

于 2011-12-23T19:23:00.723 に答える