シングルスレッドプログラミングとマルチスレッドプログラミングの違いを誤解しているので、次の質問に回答して、すべてを明確にします。
9つの独立したタスクがあり、それらをシングルスレッドプログラムとマルチスレッドプログラムで達成したいとします。基本的には次のようになります。
シングルスレッド:
- Execute task 1
- Execute task 2
- Execute task 3
- Execute task 4
- Execute task 5
- Execute task 6
- Execute task 7
- Execute task 8
- Execute task 9
マルチスレッド:
Thread1:
- Execute task 1
- Execute task 2
- Execute task 3
Thread2:
- Execute task 4
- Execute task 5
- Execute task 6
Thread3:
- Execute task 7
- Execute task 8
- Execute task 9
私が理解しているように、[〜#〜] one [〜#〜]スレッドのみが一度に実行され(CPUを取得)、クォンタムが終了すると、スレッドスケジューラはCPU時間を別のスレッドに割り当てます。
では、どのプログラムが早く終了するのでしょうか?それは(論理的に)マルチスレッドプログラムですか?それともシングルスレッドプログラムですか(マルチスレッドには多くのコンテキスト切り替えがあり、時間がかかるため)?なぜ?良い説明が必要です:)
場合によります。
CPUはいくつありますか?どのくらいのI/Oがタスクに関係していますか?
CPUが1つしかなく、タスクにブロッキングI/Oがない場合、スレッドの切り替えにオーバーヘッドがあるため、シングルスレッドはマルチスレッドと同等かそれ以上の速度で終了します。
CPUが1つあるが、タスクに多くのブロッキングI/Oが含まれる場合、I/Oの進行中に作業を実行できると想定して、スレッド化を使用すると速度が向上する場合があります。
複数のCPUがある場合は、複数のスレッドが並列に実行できるため、シングルスレッドよりもマルチスレッドの実装で速度が向上するはずです。もちろん、タスクがI/O主体である場合を除き、その場合の制限要因は、CPU電力ではなくデバイス速度です。
私が理解しているように、一度に1つのスレッドのみが実行されます
CPUのコアが1つだけの場合がそうです。最近のCPUには複数のコアがあり、複数のスレッドを並行して実行できます。
3つのスレッドを実行するプログラムは、ほぼ3倍速く実行されます。タスクが独立している場合でも、メモリアクセスのように、スレッド間で共有する必要があるリソースがコンピューターに残っています。
仮定セット:ハイパースレッディングのない単一コア。タスクはCPUバウンドです。各タスクには3クォンタムの時間がかかります。各スケジューラー割り当ては、1クォンタムの時間に制限されています。 FIFOスケジューラー非プリエンプティブ;すべてのスレッドが同時にスケジューラーにヒットします;すべてのコンテキストスイッチは同じ時間を必要とします。
プロセスの概要は次のとおりです。
上記の仮定では、それらはすべて同時に終了します。これは、CPUにスケジュールされた時間量が同一であり、コンテキストスイッチが同一であり、割り込み処理がなく、IOを待機しているものがないためです。
この性質の詳細については、 この本 を参照してください。
まあ、これは完全に言語に依存しないわけではありません。一部のインタープリター型プログラミング言語は、実際のスレッドをサポートしていません。つまり、実行のスレッドはプログラムで定義できますが、インタープリターはシングルスレッドなので、すべての実行はCPUの1つのコアで行われます。
コンパイルされた言語および真のマルチスレッドをサポートする言語の場合、単一のCPUに多くのコアを搭載できます。実際、ほとんどのデスクトップコンピューターには2コアまたは4コアが搭載されています。そのため、完全に独立したタスクを実行するマルチスレッドプログラムは、CPUで使用可能なコアの数に基づいて、2〜4倍速く完了できます。
Javaのシングルスレッドとマルチスレッドの主な違いは、シングルスレッドがプロセスのタスクを実行するのに対し、マルチスレッドでは、複数のスレッドがプロセスのタスクを実行することです。
プロセスは実行中のプログラムです。プロセスの作成は、リソースを消費するタスクです。したがって、プロセスをスレッドと呼ばれる複数のユニットに分割することが可能です。スレッドは軽量のプロセスです。単一のプロセスを複数のスレッドに分割し、それらにタスクを割り当てることができます。プロセスに1つのスレッドがある場合、それはシングルスレッドアプリケーションと呼ばれます。プロセスに複数のスレッドがある場合、それはマルチスレッドアプリケーションと呼ばれます。