Windows XP の 32 ビット アドレス空間内で実行されている、複雑でメモリを大量に消費するマルチ スレッド アプリケーションを考えてみましょう。
特定の操作では、一度にアクセスする必要があるバッファは 1 つだけである、固定サイズの n 個の大きなバッファが必要です。
アプリケーションは、1 つのバッファーのサイズのアドレス空間が早期に予約され、現在必要なバッファーを格納するために使用されるパターンを使用します。
これは次の順序に従います: (最初の実行) VirtualAlloc -> VirtualFree -> MapViewOfFileEx (バッファの変更) UnMapViewOfFile -> MapViewOfFileEx
ここでは、バッファーの場所へのポインターが VirtualAlloc への呼び出しによって提供され、その同じ場所が MapViewOfFileEx への呼び出しごとに使用されます。
問題は、ウィンドウが (私が知る限り) 異なるユーザー間でメモリ空間を渡すためのハンドシェイク タイプの操作を提供しないことです。
したがって、メモリがロックされず、別のスレッドがジャンプしてバッファ内で割り当てを実行できる小さな機会があります (上記の各シーケンスで ->)。
MapViewOfFileEx への次の呼び出しは壊れており、システムはアドレス空間にバッファ用に十分な大きさの空間があることを保証できなくなりました。
より小さなバッファーを使用するようにリファクタリングすると、スペースの再割り当てに失敗する率が明らかに低下します。
HeapLock の一部の使用はある程度成功していますが、これにはまだ問題があります。何かがまだアドレス空間内からメモリを盗むことができます。(GetProcessHeaps を呼び出してから、HeapLock を使用してすべてのヒープをロックしようとしました)
MapViewOfFileEx と互換性のあるアドレス空間の特定のブロックをロックする方法はありますか?
編集:最終的にこのコードは、私の制御外のアプリケーションによって呼び出されるライブラリに存在することを追加する必要があります