【发布时间】:2011-08-01 09:19:41
【问题描述】:
软件线程、硬件线程和java线程有什么区别?
软件线程、java线程和硬件线程是独立的还是相互依赖的? 我问这个是因为,我知道 Java 线程是在 jvm (java.exe) 中的进程内创建的。
难道这些不同的进程是在不同的硬件线程上执行的吗?
【问题讨论】:
软件线程、硬件线程和java线程有什么区别?
软件线程、java线程和硬件线程是独立的还是相互依赖的? 我问这个是因为,我知道 Java 线程是在 jvm (java.exe) 中的进程内创建的。
难道这些不同的进程是在不同的硬件线程上执行的吗?
【问题讨论】:
“硬件线程”是物理 CPU 或内核。因此,一个 4 核 CPU 可以真正同时支持 4 个硬件线程 - CPU 确实同时在做 4 个事情。
一个硬件线程可以运行多个软件线程。在现代操作系统中,这通常是通过时间片来完成的——在操作系统调度另一个线程在该 CPU 上运行之前,每个线程都有几毫秒的时间来执行。由于操作系统在线程之间快速来回切换,它看起来好像一个 CPU 一次在做不止一件事情,但实际上,一个内核仍在运行只有一个硬件线程,在多个软件线程之间切换。
现代 JVM 将 java 线程直接映射到 OS 提供的本机线程,因此 java 线程与本机线程相比没有引入固有的开销。至于硬件线程,如果有足够的内核,操作系统会尝试将线程映射到内核。因此,如果您有一个启动 4 个线程并拥有 4 个或更多内核的 java 程序,那么如果内核空闲,那么您的 4 个线程很有可能真正在 4 个独立内核上并行运行。
【讨论】:
软件线程是由操作系统管理的执行线程。
硬件线程是某些处理器的一项功能,可以在某些情况下更好地利用处理器。它们可能会暴露给操作系统/被操作系统暴露为似乎是额外的内核(“超线程”)。
在 Java 中,您创建的线程维护软件线程抽象,其中 JVM 是“操作系统”。然后 JVM 是否将 Java 线程映射到 OS 线程是 JVM 的事情(但几乎可以肯定)。然后操作系统将使用可用的硬件线程。
【讨论】:
硬件线程可以被认为是 CPU 内核,尽管每个内核可以运行多个线程。大多数 CPU 都提到每个内核上可以运行多少个线程(在 linux 上,lscpu 命令给出了这个细节)。这些是可以并行使用的内核数。
软件线程是对硬件的抽象,使多处理成为可能。如果您有多个软件线程但没有多个资源,那么这些软件线程是一种通过在有限的时间内分配资源(或使用其他策略)来并行运行所有任务的方法,这样看起来所有线程都在并行运行。这些由操作系统管理。 Java 线程是 JVM 级别的抽象。
【讨论】:
我认为你错了。我从未听说过硬件线程(除非您指的是某些英特尔机器上的超线程)。每个进程都是程序的运行表示。线程是进程中的同时执行流。 Java 线程定义由 JVM 映射到系统线程。 Java曾经有GreenThreads的概念,现在已经没有了。
【讨论】: