2

マルチコア プロセッサは、プログラム命令を読み取って実行するユニットである、2 つ以上の独立した実際の中央処理装置 (「コア」と呼ばれる) を備えた単一のコンピューティング コンポーネントです。

マルチスレッド アプリケーションがマルチコア プロセッサで実行される場合、CPU はいくつ使用されますか? たとえば、マシンがデュアル コア実行に対応している場合、私の理解が正しければ、2 つの CPU が使用されます。これら 2 つの CPU 内で、複数のスレッドが実行され、コンテキストの切り替えが行われます。

4

5 に答える 5

9

マルチスレッド アプリケーションがマルチコア プロセッサで実行される場合、使用される CPU の数。たとえば、マシンがデュアルコアを実行できる場合、2 つの CPU が使用されるというのが私の理解であり、これら 2 つの CPU 内で複数のスレッドが使用されます。実行され、コンテキストの切り替えを行います。

JVM は実際にはプロセッサを直接処理しません。オペレーティング システムとハードウェアによって公開されているプロセッサを使用する、オペレーティング システムのネイティブ スレッド機能を使用します。Java にはRuntime.availableProcessors()メソッドがありますが、これは JVM コードによってほんの数か所にしかありません。

コンピュータ上で実行されている JVM やその他のアプリケーションにとって、複数のコアは通常、OS が複数のプロセッサを公開する方法であれば、複数のプロセッサと同じように見えます。これは、物理プロセッサとシングル プロセッサ内の複数のコアとの違いが、Java プログラマには完全に隠されていることを意味します。

シングル コア CPU があり、特定の内部コンポーネントを共有する複数のコアを備えた CPU がありますが、OS はそれらを認識し、複数のプロセッサとしてスケジュールします。複数のコアは、OS からは複数の CPU として認識される可能性が高く、区別はありません。次に、ハイパースレッディングと呼ばれることが多い仮想プロセッサがあり、同じプロセッサコア(および関連する処理回路)を共有しますが、複数の実行パイプラインがあります。これらも (通常) OS から複数のプロセッサとして認識されます。

具体的には、OP の例では、2 つのコアを備えた単一のプロセッサがあり、Linux の cat'ing では 2 つの/proc/cpuinfoプロセッサが表示され、Java では 2Runtime.availableProcessors()が返されます。また、2 つの物理プロセッサがある場合は 2 が返されます。 OS カーネルに応じて、デュアル ハイパースレッディング パイプラインを備えたシングル コアを備えています。

JVM が実際に使用するプロセッサの数に関しては、これもネイティブ スレッド コードに依存します。つまり、JVM が 2 つのコアを持つ単一の CPU で実行されていて、そのコアが他のアプリケーションや OS によって使用されていない場合、JVM のスレッドはそれらで同時に実行されるようにスケジュールされる可能性が高くなります。

于 2013-09-01T18:11:18.757 に答える
2

デフォルトでは、すべてのプロセッサを利用できます。1 つのプロセッサは、仮想的に同時に可能な限り多くのスレッドを実行できます (仮想的には、実行中のスレッドが常に 1 つだけ物理的に存在することを意味します) 可能な数は、オペレーティング システムのリソース制限と使用されるスレッド フレームワークによって異なります。

コアが 1 つのダイ上にあり、マルチコア CPU を備えた 1 つの CPU ソケットがあるか、それ以上の CPU ソケットがあるかは、ソフトウェアの観点からは問題ではありません。OS と JVM は、コアのコレクションを認識します。(ただし、これには興味深い側面があります。同じダイにあるコアと異なるソケットにあるコアとの間のデータ交換は均一ではありません)。

スレッド スケジューラ (OS と仮想マシンの両方について話します) は、多くの場合、スケジューラの時間中にスレッドを 1 つのコアから別のコアにシャッフルして移動する傾向があります。これはパフォーマンスを損なう可能性があります。スレッドを特定のコアに結び付ける手法 (スレッド アフィニティ) があります。

于 2013-09-01T18:13:57.627 に答える
1

アプリケーション (実行時間の長いタスクを想定) が実際に消費する CPU リソースの量は、CPU が必要なパーセンテージによって異なります。アプリケーションは、ネットワーク、メモリ、ハードディスク、または CPU にバインドされている可能性があります。

CPU がメモリやネットワークなどの他のリソースを待機する必要がある場合、CPU はアイドル状態のままになるか、他のスレッドに割り当てられます。

例:

アプリケーションが CPU バウンドのみ (多くのメモリを消費しない) で、コアと同じ数のスレッド (ハイパースレッディングを使用した物理または仮想) で長いタスクを実行する場合、使用されていない空きリソースをほぼ 100% 使用します。他の実行中のスレッド (OS、プログラム)。

プログラムに応じて、CPU/メモリ/ネットワークの消費からアプリケーションがどの状態にあるかを知ることができ、パフォーマンスを分析できます。

于 2013-09-01T18:17:51.563 に答える