以前に使用されていたメモリのために私のプロセスに仮想アドレス空間を予約したいが、現在は必要ない。私は、ホストカーネルがLinuxであり、オーバーコミット(すべてのコミットされたメモリの詳細なアカウンティングによって行われる)を防ぐように設定されている状況に興味があります。mmap/mprotect-readonlyゼロページはコミットされたメモリにカウントされますか?
私のアプリケーションが物理メモリを占有していないか、ディスクにスワップされている(どちらの方法でもリソースを浪費している)のを防ぐには、madvise
カーネルに不要であるか、mmap
新しいゼロページオーバーそれの上に。しかし、これらのアプローチのどちらも、必然的にコミットされたメモリの量を減らすことはなく、他のプロセスは使用できなくなります。
ページを読み込み専用のゼロページに置き換えるとどうなりますか?私の意図は、彼らがコミットされたメモリにカウントされていないことです。さらに、後でmprotect
を使用して書き込み可能にし、書き込み可能にするとコミットされたメモリ制限を超えた場合に失敗します。私の理解は正しいのですか?これは使えますか?
読み取り専用のページは、プロセスのコミットチャージで考慮されるべきではありません(私は手元にありませんので、これは答えではありません)。LinuxはMAP_NORESERVEフラグを提供します。保証。しかし、私は尋ねる必要があります:あなたはなぜ使用していないメモリを予約する必要性を感じますか? – Anon
プログラムが気がつかないうちに、同じ仮想アドレスが(mmapによって)ランダムに割り当てられた場合、Bad Things(tm)が発生します。 :-) 'MAP_NORESERVE'については、あとで書き込み可能にした後でも、ページの数がカウントされないように心配です。私はちょうど新しいゼロページを使ってそれらを再び「張る」ことができると思います。 –
どのような悪いことが起こるでしょうか?なぜあなたのプログラムは以前に使われたアドレス空間を再利用する必要がないのですか?それは非常に珍しいようです。 – Angus