38

シングルスレッドプログラミングとマルチスレッドプログラミングの違いを誤解しているので、次の質問に答えてすべてを明確にしたいと思います。

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

マルチスレッド:

スレッド1:

- Execute task 1
- Execute task 2
- Execute task 3

スレッド2:

- Execute task 4
- Execute task 5
- Execute task 6

スレッド3:

- Execute task 7
- Execute task 8
- Execute task 9

私が理解しているように、一度に1つのスレッドのみ実行され(CPUを取得)、クォンタムが終了すると、スレッドスケジューラはCPU時間を別のスレッドに渡します。

では、どのプログラムが早く終了するのでしょうか?それは(論理的に)マルチスレッドプログラムですか?それともシングルスレッドプログラムですか(マルチスレッドには多くのコンテキスト切り替えがあり、時間がかかるため)?なぜ?良い説明が必要です:)

4

6 に答える 6

37

場合によります。

CPUはいくつありますか?あなたのタスクにはどのくらいのI/Oが関わっていますか?

  1. CPUが1つしかなく、タスクにブロッキングI / Oがない場合、スレッドの切り替えにオーバーヘッドがあるため、シングルスレッドはマルチスレッドと同等かそれ以上の速度で終了します。

  2. CPUが1つあるが、タスクに多くのI / Oのブロックが含まれる場合、I / Oの進行中に作業を実行できると仮定すると、スレッドを使用することでスピードアップが見られる場合があります。

  3. 複数のCPUがある場合は、複数のスレッドを並行して実行できるため、シングルスレッドよりもマルチスレッドの実装でスピードアップが見られるはずです。もちろん、タスクがI / Oに支配されている場合を除き、その場合の制限要因は、CPUパワーではなく、デバイスの速度です。

于 2012-04-11T17:10:02.017 に答える
11

私が理解しているように、一度に実行されるスレッドは1つだけです。

これは、CPUにコアが1つしかない場合に当てはまります。最新のCPUには複数のコアがあり、複数のスレッドを並行して実行できます。

3つのスレッドを実行するプログラムは、ほぼ3倍速く実行されます。タスクが独立している場合でも、メモリアクセスなど、スレッド間で共有する必要のあるリソースがコンピュータにあります。

于 2012-04-11T17:10:32.347 に答える
3

仮定セット:ハイパースレッディングのないシングルコア。タスクはCPUバウンドです。各タスクには3クォンタムの時間がかかります。各スケジューラーの割り当ては、1クォンタムの時間に制限されています。FIFOスケジューラ非プリエンプティブ。すべてのスレッドが同時にスケジューラーにヒットします。すべてのコンテキストスイッチには同じ時間が必要です。

プロセスは次のように表されます。

  • テスト1:単一プロセス、単一スレッド(9つのタスクすべてを含む)
  • テスト2:単一プロセス、3つのスレッド(それぞれ3つのタスクを含む)
  • テスト3:3つのプロセス、それぞれシングルスレッド(それぞれ3つのタスクを含む)
  • テスト4:それぞれ3つのスレッドを持つ3つのプロセス(それぞれ1つのタスクを含む)

上記の仮定では、それらはすべて同時に終了します。これは、CPUに同じ時間がスケジュールされ、コンテキストスイッチが同じであり、割り込み処理がなく、IOを待機しているものがないためです。

この性質の詳細については、この本をご覧ください。

于 2012-04-11T17:28:42.007 に答える
2

まあ、これは完全に言語に依存しないわけではありません。一部のインタプリタプログラミング言語は、実際のスレッドをサポートしていません。つまり、実行スレッドはプログラムで定義できますが、インタープリターはシングルスレッドであるため、すべての実行はCPUの1つのコアで行われます。

コンパイルされた言語と真のマルチスレッドをサポートする言語の場合、1つのCPUに多くのコアを含めることができます。実際、ほとんどのデスクトップコンピューターには現在2つまたは4つのコアがあります。したがって、真に独立したタスクを実行するマルチスレッドプログラムは、CPUで使用可能なコアの数に基づいて、2〜4倍速く終了できます。

于 2012-04-11T17:12:58.837 に答える
1

Javaのシングルスレッドとマルチスレッドの主な違いは、シングルスレッドがプロセスのタスクを実行するのに対し、マルチスレッドでは複数のスレッドがプロセスのタスクを実行することです。

プロセスは実行中のプログラムです。プロセスの作成は、リソースを消費するタスクです。したがって、プロセスをスレッドと呼ばれる複数のユニットに分割することができます。スレッドは軽量プロセスです。単一のプロセスを複数のスレッドに分割し、それらにタスクを割り当てることができます。プロセスに1つのスレッドがある場合、それはシングルスレッドアプリケーションと呼ばれます。プロセスに複数のスレッドがある場合、それはマルチスレッドアプリケーションと呼ばれます。

于 2019-07-04T09:28:54.737 に答える
-1

ruby vs python vs nodejs:Webアプリでのパフォーマンス。これは多くのI/Oを必要とします。非blockingrest/dbQueryは多くの影響を及ぼします。そして、3つすべての中で唯一のマルチスレッドであるnodejsは、大きなリードギャップを持つ勝者です

于 2019-02-22T02:11:27.567 に答える