web-dev-qa-db-ja.com

マルチスレッドプログラムでのハードディスクへの順次または並列アクセス?

マルチスレッドJavaプログラムでは、以下の詳細で4つの同時スレッドを開始します

1.  Thread 1 writing file F1 
2.  Thread 2 writing file F2
3.  Thread 3 reading file F3
4.  Thread 4 reading file F4

そのオクタコアプロセッサ、私の質問は、4つのスレッドが並行してハードディスク上で読み取りまたは書き込みを行うことができますか、それともすべてが単一のリソース、つまりハードディスクに対して競合しているため、内部的にシーケンシャルになりますか?

1
user3198603

すべてが同じディスクに対するものであると仮定すると、すべての読み取りと書き込みは最終的に一度に1つずつ実行されます。各ファイル自体がほぼ同じ時間を要すると仮定すると、コアの数に関係なく、ジョブ全体で約4倍の時間がかかります。

ただし、必ずしも順番に実行されるわけではなく、4つすべてが実行されているように見えても、ハードドライブは一度に1つの読み取り/書き込みしか実行しません。操作が行われる正確な順序は、スケジューラと時計の気まぐれに応じて、ランダムに見えるようになります。

そのため、必要なIOジョブをキューに入れるようにシステムを自分でセットアップすることをお勧めします。自分でそれらが順番に実行されることを確認するためです。さまざまなリクエストへの対応に関するディスクのスラッシング。

2
whatsisname

ドライブレベルで最終的に何が起こるかを知るのは困難です。 Javaプログラムとハードドライブの物理ヘッドの間には、書き込みプロセスをより効率的にするために、バッファリングとスケジューリングの複数の段階があります。

まず、OSファイルシステムが出力を非同期に保存し、都合のよいときにデバイスドライバーに送信する場合があります。これは、後書きキャッシングと呼ばれます。それにはポリシーがあり、誰もそれを読みたくない間は長い間何も書かないことがあります。通常、同じファイルに大量のデータを順次書き込む方が、異なるファイルの小さな断片を交互に書き込むよりも高速であるため、パフォーマンスが向上する可能性があります。

ハードドライブは基本的にブロックデバイスであるため、ドライバーソフトウェアは出力を積み重ねて、それ以上待つことがあります。いくつかの完全なブロックが積み重ねられた後、またはしばらくしてから、新しいブロックを書き込むことでデバイスを悩ませる場合があります。

次に、ハードディスクデバイス自体が下位レベルに独自のファイルシステムを持ちます(ファイルについてはわかりませんが、ブロックがディスク上のどこにあるかを知っています。頭は現在です)。そのため、ドライバーから受け取ったブロックを積み上げ、ディスクに書き込むためのスマートシーケンスを見つけ出し、不必要なヘッドの動きを可能な限り防ぎます。

したがって、心配する必要がほとんどなく、アプリケーションレベルでどの順序を選択しても、書き込みが非常に高速である場合、ディスク上で最終的に発生する順序を実質的に制御できません。アプリケーションの書き込みパフォーマンスが重要である場合、最善の方法は、いくつかの異なるシナリオを試して、システムでそれらがどのように機能するかを確認することです。

3
Martin Maat