マルチスレッド アプリケーションがマルチコア プロセッサで実行される場合、使用される 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 のスレッドはそれらで同時に実行されるようにスケジュールされる可能性が高くなります。