何らかの理由で JVM スレッドが Linux でプロセスとして実行されることに気付きました (間違っていたら訂正してください)。さらに、インテルのハイパースレッディングは、同じプロセスに属する 2 つのスレッドに対してのみ追加の並列化を提供するという事実があります。
そのスレッドは CPU の「観点」からはスレッドではないため、単一のマルチスレッド JVM プログラムはLinux でのハイパースレッディングの恩恵を受けないということですか?
何らかの理由で JVM スレッドが Linux でプロセスとして実行されることに気付きました (間違っていたら訂正してください)。さらに、インテルのハイパースレッディングは、同じプロセスに属する 2 つのスレッドに対してのみ追加の並列化を提供するという事実があります。
そのスレッドは CPU の「観点」からはスレッドではないため、単一のマルチスレッド JVM プログラムはLinux でのハイパースレッディングの恩恵を受けないということですか?
プロセスとスレッドは、Linux のスケジューラーによって異なる方法で処理されません。clone
システムコールで定義されているように、プロセスが共有できるリソースの範囲があります。通常使用されるスレッドとプロセスは、一般的に使用されるレシピの名前にすぎません。
スレッドを JVM のプロセスとして観察している場合、これは単なる用語の混合です。通常の定義では、プロセスが仮想アドレス空間を共有している場合、それらはプロセス内の「スレッド」です。
使用される用語に関係なく、すべてのハードウェア スケジューリングはハイパースレッディングの恩恵を受けます。また、公平を期すために言うと、ハイパー スレッディングでは、より多くのスレッドを並行して実行することはできません。コンテキストの切り替えが高速になり、プロセスの実行時間が長くなります。
「JVMスレッドはLinuxの下でプロセスとして実行されます」-いいえ、LWP(軽量プロセス)として実行されます。
Java スレッドはネイティブ スレッド、つまり LWP (Linux の場合) として内部的に実装されており、ps -eLf
. ただし、ネイティブ スレッドと Java スレッド間のマッピングは困難です。簡単にマップできる唯一のスレッドは、プロセス ID と同じ ID を持つメインスレッドです。
JVM は間違いなく HT から利益を得るでしょう。java の HT
に関する記事から:
SMT は、マルチスレッド アプリケーションで既存のプロセッサ サイクルをより完全に活用することにより、Java のサーバー側のパフォーマンスを大幅に向上させる可能性を秘めています。