複数のスレッドから同じファイルの異なる部分に同時に書き込むことはできますか?つまり、ディスクのヘッドが1つしかないので、書き込みは何らかの順序で、つまり並行ではなく、正しく実行できます。複数のスレッドから同じファイルの異なる部分に書き込むことは可能ですか?
編集:
私は余分な速度を得ることができます、私は大きなバイナリファイルをソートしますが、時間の大半はまだ私はO /ディスクに費やされているプログラムを書いているので、私はただ思ったんだけどI/Oを並行して実行します。
複数のスレッドから同じファイルの異なる部分に同時に書き込むことはできますか?つまり、ディスクのヘッドが1つしかないので、書き込みは何らかの順序で、つまり並行ではなく、正しく実行できます。複数のスレッドから同じファイルの異なる部分に書き込むことは可能ですか?
編集:
私は余分な速度を得ることができます、私は大きなバイナリファイルをソートしますが、時間の大半はまだ私はO /ディスクに費やされているプログラムを書いているので、私はただ思ったんだけどI/Oを並行して実行します。
同じファイルのさまざまな部分への書き込みを複数のスレッドを持っていることからあなたを停止することは何もありません。
私は大きなバイナリファイルをソートしますが、時間の大半はまだ私はO /ディスクに費やされているので、私はちょうど私が並行してI/Oを行うことによって、余分な速度を得ることができます思ったんだけど、プログラムを持っています。
プログラムがディスクにバインドされている場合、マルチスレッド化すると(同じディスクに同じ量のデータを書き込んでも)高速化されません。
従来のハードドライブについて言えば、シーケンシャルI/Oは一般的にディスクヘッドを前後に動かすI/Oよりも高速です。これを念頭に置いて、I/Oをスレッド間で分割することは、生産性を向上させる可能性があります。
限り高速化物事アップとして探求するには、いくつかの道があります。
ファイル操作は多少異なりますが、これを可能にする特定のファイルモードが必要な場合もあります(詳細はanswer of bizzehdeeを参照してください)。
実行中のオペレーティングシステムでは、「ファイル」は実際には論理エンティティであり、ある時点でディスクに格納されている状態もありますが、カーネルバッファ内にのみ変更されています。したがって、ファイルへの書き込みは、共有メモリのブロックへの書き込みと同じですが、APIのみが異なります(mmap
を使用する場合でもそうではありません)。
しかし要するに、シークとライトだけで、ファイルの古いバイトが上書きされます。 2つのプロセスが同じバイトを重複して書き込む場合、最終結果は未定義であり、いずれにしても正常に機能するシステムでは起こらないはずであり、これを実行するプログラムは重複した書き込みを防止するメカニズムを持つべきです。
スピードアップについて:実際に行っていることによります。未処理の書き込みを実行するだけでは、従来のスピンハードディスクでは処理が遅くなるか、ファイルが断片化しやすくなる可能性があります。 SSD上では、おそらく速度低下はありませんが、スピードアップもありません。
一方、操作がCPUにバインドされていて、複数のコアがあり、並列処理を行うと、合計CPU使用率が高くなり、同じ出力ファイルの異なる部分を並列処理すると、ファイルに書き込まれたバイトと比較して多くの処理がある場合は、さらに多くの処理が必要になります。
CreateFileEx
およびWriteFileEx
をご覧になり、lpOverlapped
を使用する必要があります。これにより、同時に複数のスレッドで同じファイルからの非同期読み取りおよび/または書き込みが可能になります。
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365748(v=vs.85).aspx
はい、可能ですが、他の人が言っているように、のほとんどは一般的な場合のパフォーマンスを向上させる可能性は低いです。
ただし、お客様のステートメントの1つが実際には正しくありません。
一つだけのディスクヘッドがあります
まず第一に、一般的にそうであっても、シングルプラッタHDDは、二つのヘッドを持つことになり、表面ごとに、あります。マルチプラッターのものは、もちろんもっと多い。
複数のプラッタを持つドライブの中には、同時にすべてのプラッタを読み書きすることもできます。 '80年代の一部のFujitsu Eagle drivesがこれを行い、非圧縮デジタルビデオ信号を記録できる最初のシステムに使用されました。これはもちろん、すべてのヘッドが一緒に動くので、もちろん「ランダムアクセス」ではありません。現代のドライバーがこの技術を使用しているかどうかはわかりません。
それが可能でなければならないし、それはどのようにutorrentソフトウェアが動作している..です! –
あなたは物理的な並列性について話していますか?あなたが物理的な並列性について話しているなら、それがどのようにシングルコアプロセッサで動作するかを考えてください。 – Andrey
IOの問題は解決しません。 CPUバインドの制限*を解決するために別のスレッド*から同じファイルに書き込む必要が生じても、IOスピードは向上しません。何かあれば、それは少し減少するでしょう。 –