我注意到 JVM 线程由于某些原因在 Linux 下作为进程运行(如果我错了,请纠正我)。此外,事实上英特尔的超线程只为属于同一进程的两个线程提供了额外的并行化。
这是否意味着单个多线程 JVM 程序不会从 Linux 下的超线程中受益,因为它的线程从 CPU“角度”来看不是线程?
我注意到 JVM 线程由于某些原因在 Linux 下作为进程运行(如果我错了,请纠正我)。此外,事实上英特尔的超线程只为属于同一进程的两个线程提供了额外的并行化。
这是否意味着单个多线程 JVM 程序不会从 Linux 下的超线程中受益,因为它的线程从 CPU“角度”来看不是线程?
Linux 中的调度程序不会对进程和线程进行不同的处理。clone
根据系统调用的定义,进程可以共享一系列资源。通常使用的线程和进程只是常用配方的名称。
如果您将线程视为 JVM 中的进程,那么这只是命名法的混合。按照通常的定义,如果进程共享一个虚拟地址空间,那么它们就是进程中的“线程”。
无论使用什么术语,所有硬件调度都将受益于超线程。同样公平地说,超线程不允许您并行运行更多线程:它使上下文切换更快,为进程提供更多运行时间。
“JVM 线程在 Linux 下作为进程运行”——不,它们作为 LWP(轻量级进程)运行。
Java 线程在内部实现为本地线程,即 LWP(在 linux 中),您可以使用ps -eLf
. 虽然本地线程和 java 线程之间的映射很困难。唯一可以轻松映射的线程是主线程,因为它的 id 与进程 id 相同。
JVM 肯定会从 HT 中获利。
从一篇关于HT in java的文章:
SMT 承诺通过更充分地利用多线程应用程序中的现有处理器周期来显着提高 Java 的服务器端性能。