web-dev-qa-db-ja.com

マルチスレッドとマルチコアの違い

いくつか質問があります。

まず、マルチスレッドとマルチコアには違いがありますか?それらは2つのまったく異なるものですか、それともマルチスレッドは必要に応じて複数のコアを使用しますか?

次に、ほとんどのコアには2つのスレッドがありますが、アプリをプロファイリングするときに、スレッド128からスレッド3460までのさまざまなスレッドがたくさんあることに気付きました。コンピューターのスレッド数は何によって決まりますか?

ありがとう

33
DavidColson

まず、マルチスレッドとマルチコアには違いがありますか?

はい

マルチスレッドとマルチコアは、コンピューティングのさまざまな領域に適用されるさまざまな用語です。

  • マルチコアとは、複数の論理CPUコアを備え、物理的に同時に複数の命令を実行できるコンピューターまたはプロセッサを指します。コンピュータの「コア数」は、コンピュータに搭載されているコアの総数です。コンピュータには複数のプロセッサが搭載されている場合があり、それぞれに複数のコアが搭載されている場合があります。コア数は、すべてのプロセッサのコアの総数です。

  • マルチスレッドとは、同時に複数のコアで実行することにより、マルチコアコンピューターを利用できるプログラムを指します。一般に、2倍のコアは2倍の計算能力(マルチスレッドをサポートするプログラムの場合)に等しくなりますが、一部の問題はCPU使用率以外の要因によって制限されます。これらの問題は、マルチスレッディングから劇的な効果が得られることはありません。

    プログラムが多くのスレッドを使用する理由はパフォーマンスだけではないことに注意することが重要です。詳細は後ほど。

2つはまったく異なるものですか、それともマルチスレッドは必要に応じて複数のコアを使用しますか?

これらは関連していますが、別々です。

マルチスレッドをサポートするプログラムは、複数のコアが使用可能な場合、複数のコアを使用できます。

ほとんどのコアには2つのスレッドがありますが、アプリをプロファイリングすると、スレッド128からスレッド3460までのさまざまなスレッドがたくさんあることに気付きました。

オペレーティングシステムはスレッド番号を割り当てて、それらを追跡できるようにします。

これまでに実行するほとんどのプログラムでは、一度に3400のスレッドを実行する必要はありません。また、実行中のスレッドはすべてのコアを消費します。 CPUが常に100%で実行されていない唯一の理由は、オペレーティングシステムがプロセッサを一時停止する方法を知っているためです。これにより、基本的にすべてが停止し、何かが発生するまで待機します(IOイベントまたはクロックティック。コア上で一度に実行できるスレッドは1つだけです。実行中の異なるスレッドは、実際にはCPUにジャンプして短時間実行されるスレッドであり、実行する必要のある他のスレッドに切り替えられます。

あなたのコンピュータが持っているスレッドの数を決定するものは何ですか?

すべてのプロセスのスレッドの総数。また、ほとんどのオペレーティングシステムではハードリミット、つまり超えることのできない既存のスレッドの最大数が課されます。

プロセスはプログラムです(おそらくこれを知っています)。マルチスレッドは、プロセスごとに複数のスレッドを持つプロセスです(多くのプロセスは、複数のスレッドを作成する必要がないため、複数のスレッドを作成することはありません)。 Windowsには、作成できるスレッド数に厳しい制限はありません(少なくとも、XP以降ではありません。w98以前については何も言わない)が、もちろん、作成できるスレッドの数は、メモリの量によって制限されますあなたが持っている。

一部のプログラムは、パフォーマンス以外の理由で複数のスレッドを使用すると述べました。

同時に実行しなくても、マルチタスクを実行できるのは良いことです

時々、プログラムは特定の時間に特定のことをする必要があります。一般的に引用される例は、ウィンドウが見えるプログラムです。そのプログラムは、バックグラウンドでの数値の計算を激しいものにしている可能性がありますが、ボタンのクリックやサイズの変更などのユーザーイベントに応答できる場合は、メリットがあります。これは非同期処理で実現できます。これは、1つのスレッドがGUIの作業を定期的に繰り返し確認し、実行中の処理を一時停止し、しばらくの間GUIを処理することを要求します。多くのことがこの方法で行われます。

それを処理する別の、おそらくより良い方法は、スレッドを使用することです。プログラムは、数値計算とGUI管理の切り替えを心配する必要はありません。オペレーティングシステムが管理します。コアが1つしかない場合でも、複数のスレッドを実行できます。OSは、実行中のすべてのプロセスで実行中のすべてのスレッドがCPU時間を公平に共有できるように最善を尽くします。

59
Wug

コアの数とスレッドの数は分離されています。 1つのコアで多くのスレッドを実行することができ、さらに多くのコアが存在するにもかかわらず、1つのスレッドのみが実行される状況が発生する可能性があります(ただし、これが発生する実際のシナリオは考えられません)。マルチコアはハードウェアの特性であり、スレッドの数はOSとその上で実行されているプロセスのドメインにあるとしましょう。

もちろん、単一のコアでは、複数のスレッドconcurrentlyを実行することはできません。 OSは、スレッド間で常に切り替えを行う必要があります。

7
juanchopanza

ほとんどのコアには2つのスレッドがあります

ここでは、「スレッド」という過負荷の用語を混乱させていると思います。他の回答で正しく指摘されているように、スレッドは通常「ソフトウェア」の概念を指します。ただし、「ハードウェア」の概念として使用されることもあります。 「コア」に2つの「スレッド」がある場合(多くの新しいIntelチップのように)、これは、2つのコアがあるかのように、コアが2つの並列スレッドを実行できることを意味します。ただし、これは通常ハイパースレッディングと呼ばれます。見る:

http://en.wikipedia.org/wiki/Hyper-threading

したがって、Nスレッド(ソフトウェアスレッド、アプリケーション内で作成されたスレッド、または同時に異なるアプリケーションを同時に実行することで作成されたスレッド)とMプロセッサ(コア、または上で説明したハードウェアスレッド)がある場合、次のことが起こります。

  • N <= M:オペレーティングシステムは、各スレッドに異なるプロセッサを割り当てる必要があります。その後、アプリケーションスレッドは完全に並列で実行されます。
  • N> M:一部のスレッドはプロセッサを共有する必要があります。
5
Mahdi

通常、単一コアでのスレッド化とは、x個のスレッドを作成できることを意味します。各スレッドには、一定の実行時間(スレッドクォンタム)が与えられます。スレッドが切り替えられると、これはコンテキスト切り替えと呼ばれます。これにはすべて時間がかかるため、コアごとに持つスレッドの理想的な数を見つけるためにいくつかのベンチマークを行う必要があります。

作業の大部分がCPUバウンドである場合、これはパフォーマンスを改善する可能性が低いため、数百のスレッドを生成するポイントはほとんどありません(実際には、コンテキストの切り替えが無料で行われないことに注意してください)。ただし、I/Oバウンドの作業でこれを行うと、システムがこの作業の実行中にビジー状態になっている間、別のスレッドにCPU時間を与えることができるため、役立つ場合があります。

物理的な追加コアがあるということは、2つのものがハードウェアレベルで本当に並行して実行できることを意味します。

4
Science_Fiction