高速ファイル I/O は、特定の API 呼び出しに関するものではなく、I/O で動作するようにアプリケーションを設計する方法に関するものです。
たとえば、すべての I/O 操作を 1 つのスレッドで順次実行している場合
- ブロックをメモリに読み込む
- 何らかの方法でメモリ内のブロックを処理する
- ブロックをファイルに書き出す
- 完了するまで繰り返します...
単一スレッドの処理ループでシステムの I/O 帯域幅のボトルネックになっています。別のより複雑な設計は、アプリケーションをマルチスレッド化してスループットを最大化し、待ち時間を回避することです。これにより、システムは CPU と I/O コントローラの両方の帯域幅を同時に利用できます。このための典型的な設計は次のようになります。
- 1 つ (または複数) のワーカー スレッドがディスクからデータを読み取り、それらを共有入力キューに追加します。
- 1 つ (または複数) のワーカー スレッドが共有入力キューからブロックを読み取り、それらを処理して共有出力キューに追加します。
- 1 つ (または複数) のワーカー スレッドが、ブロックされた処理を共有出力キューから読み取り、適切な出力ファイルに書き込みます。
これは適切に設計するのが容易なアーキテクチャではなく、メモリー内のロック競合の発生を回避したり、同時 I/O 要求でシステムを圧倒したりするために、かなりの考慮が必要です。また、出力処理の状態がスレッドのコール スタックではなく、入出力作業キューで管理されるように、制御メタデータを提供する必要があります。また、マルチスレッド I/O では、作業が入力キューに確実な順序で配置されていることを確認できないため、正しい順序で出力を変換して書き込むことも確認する必要があります。これは複雑ですが、可能であり、シリアル アプローチと比較してスループットに劇的な違いが生じる可能性があります。
本当に時間があり、システムからすべてのパフォーマンスを引き出したい場合は、I/O 完了ポート(比較的低レベルの API) を使用してスループットを最大化することもできます。
幸運を。