Windows XP で実行されている 2 つのアプリケーション (プロセス) があり、メモリ マップ ファイルを介してデータを共有しています。反復ごとのメモリ割り当てをなくすためのあらゆる努力にもかかわらず、データ転送ごとに約 10 のソフト ページ フォールトが発生します。CreateFileMapping() と CreateFileView() にあるすべてのフラグを試しましたが、それでも発生します。それがメモリマップファイルの仕組みなのかどうか疑問に思い始めています。
メモリ マップド ファイルの背後にある O/S 実装の詳細を知っている人がいる場合は、次の理論に関するコメントをいただければ幸いです。無効として書き込まれます。他のプロセスが無効化されたページに属するメモリ領域を読み取ろうとすると、(設計により) ソフト ページ フォールトが発生し、O/S は無効化されたページをリロードすることを認識します。また、ソフト ページ フォールトの数は、データ書き込みのサイズに正比例します。
私の実験は、上記の理論を裏付けているようです。データを共有するときは、1 つの連続したデータ ブロックを書き込みます。つまり、共有メモリ領域全体が毎回上書きされます。ブロックを大きくすると、それに応じてソフト ページ フォールトの数が増えます。したがって、私の理論が正しい場合、メモリ マップト ファイルを使用しない以外に、ソフト ページ フォールトをなくすためにできることはありません。皮肉なことに、TCP ソケット接続の代わりにメモリ マップド ファイルを使用することを選択したのは、その方が効率的であると考えたからです。
ソフト ページ フォールトが無害である場合は、注意してください。数が多すぎると、ある時点でシステムのパフォーマンスが損なわれる可能性があると聞いています。ソフトページフォールトが本質的にそれほど有害ではない場合、1秒あたりの数が「過剰」であるというガイドラインがある場合は、それを聞きたいです。
ありがとう。