いくつか小さな質問があります。
まず、マルチスレッドとマルチコアの間に違いはありますか?それらは2つ完全に異なるものですか、それともマルチスレッドは必要に応じて複数のコアを使用しますか?
次に、ほとんどのコアには2つのスレッドがありますが、アプリをプロファイリングすると、スレッド128からスレッド3460までのさまざまなスレッドに気づきました。コンピューターのスレッド数は何によって決まりますか?
ありがとう
いくつか小さな質問があります。
まず、マルチスレッドとマルチコアの間に違いはありますか?それらは2つ完全に異なるものですか、それともマルチスレッドは必要に応じて複数のコアを使用しますか?
次に、ほとんどのコアには2つのスレッドがありますが、アプリをプロファイリングすると、スレッド128からスレッド3460までのさまざまなスレッドに気づきました。コンピューターのスレッド数は何によって決まりますか?
ありがとう
まず、マルチスレッドとマルチコアに違いはありますか?
はい。
マルチスレッドとマルチコアは、コンピューティングのさまざまな分野に適用されるさまざまな用語です。
マルチコアとは、複数の論理 CPU コアを持ち、同時に複数の命令を物理的に実行できるコンピューターまたはプロセッサを指します。コンピューターの「コア数」は、コンピューターが持つコアの総数です。コンピューターには複数のプロセッサがあり、それぞれに複数のコアがある場合があります。コア数は、すべてのプロセッサのコアの合計数です。
マルチスレッドとは、同時に複数のコアで実行することにより、マルチコア コンピューターを利用できるプログラムを指します。一般に、2 倍のコア数は 2 倍の計算能力 (マルチスレッドをサポートするプログラムの場合) に等しくなりますが、一部の問題は CPU 使用率以外の要因によって制限されます。これらの問題は、マルチスレッドによる劇的な改善を経験することはありません。
プログラムが多くのスレッドを使用する理由は、パフォーマンスだけではないことに注意してください。それについては後で詳しく説明します。
それらは2つの完全に異なるものですか、それとも必要に応じてマルチスレッドは複数のコアを使用しますか?
それらは関連していますが、別々です。
マルチスレッドをサポートするプログラムは、複数のコアが利用可能な場合、複数のコアを使用できます。
ほとんどのコアには 2 つのスレッドがありますが、アプリをプロファイリングすると、スレッド 128 からスレッド 3460 までの範囲のさまざまなスレッドが多数あることに気付きました。
オペレーティング システムは、スレッドを追跡できるようにスレッド番号を割り当てます。
実行するほとんどのプログラムでは、一度に 3400 のスレッドを実行する必要はありません。また、実行中のスレッドはすべてのコアを消費します。CPU が常に 100% で動作していない唯一の理由は、オペレーティング システムがプロセッサを一時停止する方法を知っているためです。これにより、基本的にすべてが停止し、何かが発生するまで待機します (IO イベントやクロック ティックなど)。1 つのコアで一度に実行できるスレッドは 1 つだけです。実行中のさまざまなスレッドは、実際には、CPU にジャンプして短時間実行され、実行する必要がある他のスレッドに切り替えられるだけのスレッドです。
コンピューターのスレッド数を決定するものは何ですか?
すべてのプロセスのスレッドの総数。また、ほとんどのオペレーティング システムでは、既存のスレッドの最大数を超えることのできないハード リミットが課されています。
プロセスはプログラムです (おそらくご存知でしょう)。マルチスレッド化は、プロセスごとに複数のスレッドを持つプロセスです (多くのプロセスは、複数のスレッドを作成する必要がないため、複数のスレッドを作成しません)。Windows では、作成できるスレッドの数に厳密な制限はありません (少なくとも、XP 以降ではありません。w98 以前については何も言いません)。もちろん、作成できるスレッドの数はメモリの量によって制限されます。あなたが持っている。
一部のプログラムは、パフォーマンス以外の理由で複数のスレッドを使用するとおっしゃいました。
同時並行でなくても、マルチタスクができると便利な場合があります。
プログラムは、特定の時間に特定のことを行う必要がある場合があります。よく引用される例は、可視ウィンドウを持つプログラムです。そのプログラムは、バックグラウンドで数値処理を行っている可能性がありますが、ボタンのクリックやサイズ変更などのユーザー イベントに引き続き応答できれば、プログラムにとってメリットがあります。これは非同期処理で実現できます。非同期処理では、1 つのスレッドが間隔を置いて実行する GUI 作業を繰り返しチェックし、実行中の作業を一時停止し、GUI をしばらく処理する必要があります。多くのことがこのようにしています。
それを処理する別の、おそらくより良い方法は、スレッドを使用することです。あなたのプログラムは、数の処理と GUI 管理の間を行き来することを心配する必要はありません。オペレーティング システムがそれを管理します。コアが 1 つしかない場合でも、複数のスレッドを実行できます。OS は、実行中のすべてのプロセスで実行中のすべてのスレッドが CPU 時間を公平に配分できるように最善を尽くします。
コア数とスレッド数は切り離されています。1 つのコアで多くのスレッドを実行することができ、より多くのコアが存在するにもかかわらず 1 つのスレッドしか実行されない状況が発生する可能性があります (ただし、これが発生する実際のシナリオは考えられません)。マルチコアはハードウェアの特性であり、スレッドの数は OS とその上で実行されているプロセスの領域にあるとしましょう。
もちろん、単一のコアでは、複数のスレッドを同時に実行することはできません。OS は常にスレッド間を行ったり来たりする必要があります。
ほとんどのコアには 2 つのスレッドがあります
ここで、オーバーロードされた「スレッド」という用語を混同していると思います。他の回答で正しく指摘されているように、スレッドは通常「ソフトウェア」の概念を指します。ただし、「ハードウェア」の概念として使用されることもあります。「コア」に 2 つの「スレッド」がある場合 (多くの新しい Intel チップのように)、コアが 2 つのコアがあるかのように、2 つの並列スレッドを実行できることを意味します。ただし、これは通常、ハイパースレッディングと呼ばれます。見る:
http://en.wikipedia.org/wiki/ハイパースレッディング
したがって、N 個のスレッド (ソフトウェア スレッド、アプリケーション内で作成されたもの、または異なるアプリケーションを同時に実行することによって生成されたもの) と M 個のプロセッサ (コア、または上記で説明したハードウェア スレッド) がある場合、次のことが起こります。
単一のコアでのスレッド化は、通常、x 個のスレッドを作成できることを意味し、それぞれに設定された実行時間 (スレッド クォンタム) が与えられます。スレッドが切り替えられるとき、これはコンテキスト切り替えとして知られています。これには時間がかかるため、コアごとに理想的なスレッド数を見つけるためにベンチマークを行う必要があります。
作業の大部分が CPU バウンドである場合、何百ものスレッドを生成してもパフォーマンスが向上する可能性はほとんどないため、ほとんど意味がありません (実際にはさらに悪化する可能性があります。コンテキストの切り替えは無料ではないことに注意してください)。ただし、システムがこの作業でビジーである間、別のスレッドに CPU 時間を与えることができるため、I/O バウンドの作業に対してこれを行うと役立つ場合があります。
物理的な追加コアがあるということは、ハードウェア レベルで 2 つのことを真に並行して実行できることを意味します。