2

メモリ マップ ファイルと、現在コミットされているビューのページがあります。デコミットしたいと思います。MapViewOfFile は、ファイル マップされたページでは VirtualFree を使用できないことを示しています。それを行う他の方法はありますか?

4

1 に答える 1

4

コミットを解除することはできませんが、本当に必要なのはコミットを解除することではありません...

本当に欲しいのは、ページをメモリから解放することです。これは、VirtualUnlock を使用して行うことができます。VirtualUnlock の備考を参照してください。

ロックされていないメモリ範囲で VirtualUnlock を呼び出すと、プロセスのワーキング セットからページが解放されます。

注: 文書化されているように、関数は FALSE (ページがロックされていない) を返し、GetLastError は ERROR_NOT_LOCKED を返します。

これは、Guillermo Prandi の質問 CreateFileMapping, MapViewOfFile, how to avoid hold up the system memory で説明されています

備考: このように見ることができると思います: マップされたページをデコミットするのはナンセンスです - ページは、メモリであろうとファイルであろうと、物理ストレージに支えられているときはいつでもコミットされます。ファイルにマップされたページは、常にファイルによってサポートされるため、この意味でデコミットすることはできません。


ただし、言及された質問のコードはメモリフットプリントを測定していますが、ページがプロセスワーキングセットから削除されたからといって、ページがメモリに存在しなくなったことを必ずしも意味しないため、測定値は代表的なものではありません。

別の実験を行い、メモリ マップ ページから 1 バイトを読み取るのにかかる時間を測定しました。ページのロックを解除するか、ビューのマッピングを解除してマッピング ハンドルを閉じた後でも、アクセスは高速でした。

アクセスを遅くする (つまり、実際にメモリからページを破棄する) には、ビューのマップを解除し、メモリ マッピング ハンドルとファイル ハンドルの両方を閉じる必要がありました (ビューのマップを解除してファイル ハンドルを閉じることを期待していたので、最後は驚きでした)。マッピング ハンドルで十分です)。

システムが VirtualUnlocked をヒントとして取得し、何かを破棄する必要がある場合、ページをすぐに破棄する可能性はまだありますが、これはまだ証明する方法について考えなければならないことです。

于 2010-08-19T19:03:58.317 に答える