Windows アプリケーションには、ファイル名とバッファをラップするクラスがあります。ファイル名でそれを構築し、オブジェクトをクエリして、バッファがまだいっぱいかどうかを確認できます。そうでない場合は nullptr を返し、そうである場合はバッファ アドレスを返します。オブジェクトがスコープ外になると、バッファが解放されます。
class file_buffer
{
public:
file_buffer(const std::string& file_name);
~file_buffer();
void* buffer();
private:
...
}
データを非同期的にメモリに入れたいのですが、私が見る限り、2 つの選択肢があります。バッファを作成して ReadFileEx を介してオーバーラップ IO を使用するか、MapViewOfFile を使用して別のスレッドのアドレスにアクセスします。
現時点では、約 16MB を超えるリクエストは失敗する傾向があるため、いくつかの問題を提示する ReadFileEx を使用しています。バッファ クリーンアップの問題があります。また、クラスの複数のインスタンスが立て続けに作成されると、非常に面倒になります。
上限の問題がないため、別のスレッドでのデータのマッピングとタッチはかなり簡単に思えます。また、クライアントが今すぐデータを絶対に取得する必要がある場合は、単にアドレスを逆参照して、OS に心配させることができます。ページ フォールトが発生し、ブロッキング ヒットが発生します。
このアプリケーションはシングル コア マシンをサポートする必要があるため、私の質問は次のとおりです。別のソフトウェア スレッドでのページ フォールトは、現在のスレッドでのオーバーラップ IO よりも高くつくのでしょうか? 彼らはプロセスを停止しますか?オーバーラップした IO は同じようにプロセスを停止させますか、それとも私が理解できない OS マジックがありますか? ページ フォールトはオーバーラップ IO を使用して実行されますか?
私は次のトピックをよく読んで います 。 microsoft.com/en-us/library/windows/desktop/aa366556(v=vs.85).aspx (ファイル マッピング) しかし、パフォーマンスのトレードオフを行う方法を推測できないようです。