以前に使用されていたが現在は必要ないメモリ用に、プロセスで予約された仮想アドレス空間を維持したいと考えています。ホスト カーネルが Linux であり、オーバーコミットを防ぐように構成されている状況に興味があります (これは、コミットされたすべてのメモリの詳細なアカウンティングによって行われます)。
アプリケーションが使用しなくなったデータが物理メモリを占有したり、ディスクにスワップされたりするのを防ぎたい場合 (いずれにしてもリソースを浪費する)、madvise
不要なカーネルを削除するか、そのmmap
上に新しいゼロ ページを重ねることができます。しかし、これらのアプローチのどちらも、コミット済みとしてカウントされるメモリの量を必ずしも削減するわけではなく、他のプロセスが使用できなくなります。
ページを読み取り専用としてマークされた新しいゼロ ページに置き換えるとどうなりますか? 私の意図は、それらがコミットされたメモリにカウントされず、後でmprotect
それらを書き込み可能にするために使用できること、およびそれらを書き込み可能にするとコミットされたメモリの制限を超えると失敗することです。私の理解は正しいですか?これは機能しますか?