web-dev-qa-db-ja.com

スレッドとプロセス対マルチスレッドとマルチコア/マルチプロセッサ:どのようにマッピングされていますか?

私は非常に混乱していましたが、次のスレッドは私の疑問をクリアしました:

マルチプロセッシング、マルチスレッド、ハイパースレッド、マルチコア

ただし、ハードウェアの観点からクエリに対処します。これらのハードウェア機能がソフトウェアにどのようにマッピングされているか知りたいですか?

明らかなことの1つは、MultiProcessor(= Mutlicpu)とMultiCoreの間に違いはないことです。マルチコアの場合、すべてのCPUは1つのチップ(ダイ)にあります。

したがって、マルチコア/マルチプロセッサシステムは、「同じ時間」で複数のプロセス(firefox、mediaplayer、googletalk)を実行できます(シングルプロセッサシステムでこれらのプロセスを切り替えるコンテキストとは異なります)。

正しい場合。私はこれまでのところ明確です。しかし、マルチスレッドが登場すると混乱が生じます。

  1. マルチスレッドは、並列処理の「対象」です。正しい?

  2. CPU内部のマルチスレッドに関与する要素は何ですか?図? 2つの独立したタスクの並列処理の力を活用するには、CPUの要件はどうあるべきでしょうか?

  3. スレッドのコンテキストスイッチングを言うとき。よくわかりません。その理由は、スレッドのコンテキスト切り替えが並列処理ではないためです。スレッドは「同時に」実行される必要があります。正しい?

    マルチスレッドの私の考えは、次のとおりです。単一のCPUを備えたシステムを検討する。プロセスがFirefoxにコンテキスト切り替えされたとき。 (仮定)firefoxの各タブはスレッドであり、すべてのスレッドは厳密に同時に実行されています。あるスレッドがしばらく実行された後、別のスレッドがコンテキスト切り替え時間に到達するまで再びかかったようにではありません。

  4. スレッドを処理できないプロセッサでマルチスレッドソフトウェアを実行するとどうなりますか? CPUがそのようなソフトウェアをどのように処理するのですか?

  5. これまでのところすべてがうまくいけば、今の質問はどのくらいのスレッドですか?ハードウェアによって制限される必要があると思いますか?ハードウェアが2スレッドしかサポートできず、プロセスで10スレッドを開始する場合。 CPUはどのようにそれを処理しますか?長所短所?ソフトウェアエンジニアリングの観点から、さまざまなシステムのユーザーが使用するソフトウェアを開発している間に、マルチスレッド化をどのように決定すればよいでしょうか?もしそうなら、いくつのスレッド?

43
claws

まず、「プロセス」と「スレッド」の概念を理解してください。スレッドは実行の基本単位です。スレッドはオペレーティングシステムによってスケジュールされ、CPUによって実行されます。プロセスは、複数のスレッドを保持する一種のコンテナです。

  1. はい、マルチプロセッシングまたはマルチスレッドは並列処理用です。より正確には、スレッドレベルの並列処理を活用します。

  2. さて、マルチスレッドとはハードウェアマルチスレッドを意味します(1つの例はハイパースレッディングです)。しかし、私はあなたがソフトウェアでマルチスレッドを言っていると仮定しています。この意味で、CPUはコンテキストスイッチングをサポートする必要があります。

  3. 時分割による物理的に単一のコアでもマルチタスクを実装するには、コンテキストの切り替えが必要です。

  4. 2つの物理コアと4つの非常にビジーなスレッドがあるとします。この場合、2つのスレッドはCPUを使用する機会を得るまで待機しています。プリエンプティブOSスケジューリングに関連するいくつかの記事を読んでください。

  5. 物理的に並行して実行できるスレッドの数は、#of logical processorとまったく同じです。ラウンドロビンなどのOSの文献で一般的なスレッドスケジューリングの問題を尋ねています。

I 強く最初にオペレーティングシステムの基本を学ぶことをお勧めします。次に、マルチスレッドの問題に進みます。コンテキストの切り替えやスケジューリングなどの重要な概念についてはまだ不明なようです。数か月かかりますが、コンピュータソフトウェアの専門家になりたい場合は、このような非常に基本的な概念を知っておく必要があります。 OSの本や講義のスライドは何でも入手してください。

43
minjang

同じコアで実行されるスレッドは、技術的に並列ではありません。 CPUは非常に高速に(私たちにとっては)切り替えを行うため、それらは並列に実行されるように見えます。このスイッチは、コンテキストスイッチと呼ばれるものです。現在、異なるコアで実行されているスレッドは並行して実行されます。最新のCPUには多くのコアがありますが、最新のOS(windows、linux、friends)の多くは通常、はるかに多くのスレッドを実行しますが、それでもコンテキストの切り替えが発生します。ユーザープログラムが実行されなくても、OS自体がメンテナンス作業のためにコンテキスト切り替えを実行します。
これは1〜3に答えるはずです。

約4:基本的に、すべてのプロセッサがスレッドを処理できます。これは、オペレーティングシステムの特徴です。スレッドは基本的には次のとおりです。メモリ(オプション)、スタック、レジスタ、これらが置き換えられると、別のスレッドになります。

5:スレッドの数はかなり多く、OSによって制限されます。通常、通常のプログラマが正常に処理できるよりも高くなります:)スレッドの数はプログラムによって決定されます。

IO bound?

  • タスクをいくつかの小さなタスクに分割できますか?
  • タスクはどれくらい小さいですか?タスクは小さすぎて、スレッドをまったく生成する価値がありません。
  • 同期:広範なシンクロナイゼーションが必要な場合、ペナルティが重すぎる可能性があるため、スレッド数を減らす必要があります。
12
Philip Derbeko

複数のスレッドは、1つのプロセス内のコマンドの別個の「チェーン」です。 CPUの観点から見ると、スレッドはだいたいプロセスに似ています。各スレッドには、独自のレジスタセットと独自のスタックがあります。

CPUよりも多くのスレッドを使用できる理由は、ほとんどのスレッドが常にCPUを必要としないためです。スレッドは、ユーザーの入力を待っている、Webから何かをダウンロードしている、またはディスクに書き込んでいる場合があります。それを行っている間、CPUは必要ないため、CPUは他のスレッドを自由に実行できます。

あなたの例では、Firefoxの各タブはおそらく複数のスレッドを持つことさえできます。または、いくつかのスレッドを共有できます。ダウンロードに1つ、レンダリングに1つ、メッセージループ(ユーザー入力)に1つ、そしておそらくJavaScriptを実行するために1つが必要です。ダウンロード中はユーザーの入力に反応する必要があるため、これらを簡単に結合することはできません。ただし、ダウンロードスレッドはほとんどの時間スリープ状態にあり、ダウンロード中であってもCPUを必要とするのはたまにしかなく、メッセージループスレッドはボタンを押したときにのみ起動します。

タスクマネージャにアクセスすると、これらのスレッドすべてにもかかわらず、CPUの使用率が非常に低いことがわかります。

もちろん、すべてのスレッドがいくつかの計算処理タスクを実行する場合、パフォーマンス上のメリットが得られないため、あまり多く作成しないでください(ただし、アーキテクチャ上のメリットがあるかもしれません!)。

ただし、それらが主にI/Oバウンドである場合は、アーキテクチャで指定されている数のスレッドを作成します。特定のタスクを知らずにアドバイスをするのは難しいです。

3
yu_sha
  1. 大まかに言って、ええ、しかし「並列」とは異なることを意味します。

  2. 並行して実行したいタスクに依存します。

  3. 必ずしも。一部の(実際には)スレッドは、何もしないで多くの時間を費やしています。それらから何かをしたいスレッドに切り替えることもできます。

  4. OSはスレッドの切り替えを処理します。必要に応じて、異なるコアに委任します。コアが1つしかない場合、異なるスレッドとプロセス間で時間を分割します。

  5. スレッドの数は、ソフトウェアとハ​​ードウェアによって制限されます。スレッドは、実行している内容に応じてさまざまな程度でプロセッサとメモリを消費します。スレッド管理ソフトウェアも独自の制限を課す場合があります。

1
Moishe Lettvin

覚えておくべき重要なことは、論理/仮想並列処理と実/ハードウェア並列処理の分離です。平均的なOSでは、システムコールが実行されて新しいスレッドが生成されます。実際に何が起こるか(別のコアにマッピングされるか、同じコア上の異なるハードウェアスレッドになるか、ソフトウェアスレッドのプールにキューイングされるか)はOSに任されています。

  1. 並列処理では、マルチスレッドだけでなく、すべての方法が使用されます。
  2. 一般的に、実際の並列処理が必要な場合は、ハードウェアで実行する必要があります。 Niagara を例にとると、ハードウェアで4スレッドを実行できる最大8コアがあります。
  3. コンテキストの切り替えは、ハードウェアで並列に実行できるよりも多くのスレッドがある場合に必要です。その場合でも、連続して実行すると(1つのスレッドから次のスレッドへの切り替え)、切り替えのorderが保証されないため、それらは並行と見なされます。したがって、T0、T1、T2、T1、T3、T0、T2などのようになります。すべての意図と目的のために、スレッドは並列です。
  4. タイムスライシング。
  5. それはOS次第です。
1
sybreon

マルチスレッドとは、一度に複数のスレッドを実行することです。シングルコアプロセッサとマルチコアプロセッサシステムの両方で発生する可能性があります。シングルプロセッサシステムの場合、コンテキストスイッチングが影響します。 Look!この計算環境でのコンテキストスイッチングは、オペレーティングシステムによるタイムスライシングを指します。したがって、混乱しないでください。オペレーティングシステムは、他のプログラムの実行を制御するシステムです。これにより、一度に1つのプログラムをCPUで実行できます。ただし、スレッドがCPUに出入りする頻度によって、システムが示す並列処理の透過性が決まります。

マルチコア環境では、各コアがスレッドを実行するとマルチスレッドが発生します。ただし、マルチコアでは、個々のコアでコンテキストの切り替えが発生する可能性があります。

1
Paul Davies

これまでの回答はほとんどポイントであり、基本的なコンテキストを説明していると思います。本質的に、クアッドコアプロセッサを持っているが、各コアが2つの同時スレッドを実行できるとしましょう。

1コアで2つの同時スレッドを実行している場合と、1番目のスレッドを実行してから2番目のスレッドを垂直に実行する場合、速度のわずかな(またはまったく)増加しかありません。ただし、各物理コアにより、一般的なワークフローの速度が向上します。

ここで、複数のスレッド(つまり、「並列」で複数のことを実行する必要がある)を持ち、キュー(または優先順位ルールを持つ他のシステム)にある種のタスクのスタックを持つプロセスがOS上で実行されているとします。その後、ソフトウェアはタスクをキューに送信し、プロセッサはできるだけ早くタスクを実行しようとします。現在、2つのケースがあります。

  1. ソフトウェアがマルチプロセッシングをサポートしている場合、タスクは使用可能なプロセッサーに送信されます(何も実行していないか、単に他のジョブの実行を終了し、ソフトウェアから送信されたジョブはキューの1番目です)。
  2. ソフトウェアがマルチプロセッシングをサポートしていない場合、すべてのジョブは同様の方法で実行されますが、コアの1つだけが実行されます。

Wikipediaページ スレッドで読むことをお勧めします。そこの非常に最初の写真はすでにあなたに素晴らしい洞察を与えています。 :)

0
Dom Grey