私はかなりの量を見回しましたが、私が探しているものを見つけることができないようです.
私が解決しようとしている問題の背景は次のとおりです。
名前付きパイプのように動作するメモリ マッピング ライブラリを作成しました。バイトを入れたり、そこからバイトを取得したり、読み取り/書き込みに使用できるバイト数を照会したりできます。
それを使用して通信する高速な (ほとんどの場合) プロセスは、8KB 以上のバイトのチャンクを渡す場合、平均 4GB/秒になります。チャンク サイズが 512B に近づくと、パフォーマンスは約 300MB/秒まで低下します。
問題:
非常にまれに、負荷の高いサーバーでは、非常に大きなラグ タイム (5 秒以上) が発生します。この問題の原因についての私の実行中の理論は、大規模な転送が行われている場合 (マップされたメモリのサイズよりも大きい場合)、データを書き込んでいるプロセスがタイト ポーリングを実行して、実装されている循環バッファーで使用可能なスペースが増えるのを待つことです。メモリマップの一番上。スリープの呼び出しがないため、ポーリング プロセスが正当な理由もなく CPU を占有している可能性があります。問題は、最小のスリープ呼び出し (1 ミリ秒) でさえ、パフォーマンスを完全に破壊することです。memmap のサイズは 16KB であるため、16KB ごとに 1ms スリープすると、パフォーマンスは 16MB/s の最良のシナリオまで低下します。
ソリューション:
CPU を放棄する呼び出し可能な関数が必要ですが、オペレーティング システム (この場合は Windows 7) によって再スケジュールされるタイミングに制限はありません。
誰か明るい代替案を持っていますか?/そのような機能が存在するかどうか知っていますか?
ありがとう。