软件线程与硬件线程

Bha*_*dri 54 hardware multithreading

软件线程,硬件线程和Java线程有什么区别?

软件线程,Java线程和硬件线程是独立的还是相互依赖的?我问这个是因为,我知道Java线程是在jvm(java.exe)的进程内创建的.

这些不同的进程是否在不同的硬件线程上执行也是如此?

mdm*_*dma 60

"硬件线程"是物理CPU或核心.因此,4核CPU可以同时真正支持4个硬件线程 - CPU实际上同时做4件事.

一个硬件线程可以运行许多软件线程.在现代操作系统中,这通常通过时间切片来完成 - 每个线程在操作系统调度另一个线程以在该CPU上运行之前执行几毫秒.由于操作系统在线程之间快速切换,看起来好像一个CPU同时执行多个操作,但实际上,核心仍然只运行一个硬件线程,该线程在许多软件线程之间切换.

现代JVM将java线程直接映射到操作系统提供的本机线程,因此java线程与本机线程不会产生固有的开销.对于硬件线程,如果有足够的内核,操作系统会尝试将线程映射到内核.因此,如果您有一个启动4个线程且具有4个或更多内核的java程序,那么如果内核空闲,则4个线程很可能在4个独立的内核上并行运行.

  • 一些架构每个核心有多个线程 (17认同)
  • *大多数*新的昂贵芯片每个核心有多个硬件线程.超线程等等已经存在了几年,并且普遍存在. (9认同)
  • 当然,我正在努力使讨论变得简单,而不是详细了解特定的cpu架构,因为这是一个java问题.无论硬件线程是按照每个处理器(不是很久以前)实现的,每个核心或每个超线程,还是其他一些提供硬件并行性的架构机制,软件和硬件线程之间的主要区别是相同的. (3认同)

Wil*_*ill 55

软件线程是由操作系统管理的执行线程.

硬件线程是某些处理器的一项功能,可以在某些情况下更好地利用处理器.它们可能暴露于/由操作系统显示为额外的核心("超线程").

在Java中,您创建的线程维护软件线程抽象,其中JVM是"操作系统".JVM是否将Java线程映射到OS线程是JVM的业务(但几乎可以肯定).然后操作系统将使用硬件线程(如果可用).


Cir*_*四事件 9

硬件线程(例如英特尔超线程)是比多核更便宜、更慢的替代方案

软件线程是由 (Linux) 内核实现的软件抽象:

  • 内核为每个 CPU 运行一个软件线程(或超线程)
  • 或者它通过调度程序来伪造它,运行一个进程一段时间,然后定时器中断到来,然后切换到另一个进程,依此类推

它们实现的关键是提供的硬件和内核配置的用户态和内核之间的分离:在操作系统的上下文中,Ring 0 和 Ring 3 是什么?

我现在将重点讨论硬件线程,这是一个更晦涩的硬件问题,重点是英特尔的实现,它称为超线程。

英特尔手册第 3 卷系统编程指南 - 325384-056US 2015 年 9 月8.7“英特尔超线程技术架构”简要介绍了 HT。它包含以下图表:

在此输入图像描述

TODO 在实际应用中平均慢了多少百分比?

超线程是可能的,因为现代单 CPU 核心已经通过指令管道同时执行多个指令https://en.wikipedia.org/wiki/Instruction_pipelined

指令流水线是单个内核内部功能的分离,以确保电路的每个部分在任何给定时间都被使用:读取存储器、解码指令、执行指令等。

超线程通过使用以下方式进一步分离功能:

  • 单个后端,实际上通过其管道运行指令。

    双核有两个后端,这解释了更高的成本和性能。

  • 两个前端,它们接受两个指令流并以某种方式对它们进行排序,以通过避免危险来最大化单个后端的流水线使用。

    双核还有 2 个前端,每个后端一个。

    在某些边缘情况下,指令重新排序不会产生任何好处,从而使超线程毫无用处。但它在平均水平上产生了显着的提高。

单个核心中的两个超线程比两个不同的核心(仅共享 L3)共享更多缓存级别(TODO 有多少?L1?),请参阅:

每个超线程向操作系统公开的接口与实际内核的接口类似,并且两者都可以单独控制。因此,cat /proc/cpuinfo我看到了 4 个处理器,尽管我只有 2 个内核,每个内核有 2 个超线程。

然而,操作系统可以利用知道哪些超线程位于同一核心上的优势,在单个核心上运行给定程序的多个线程,这可能会提高缓存的使用率。

此 LinusTechTips 视频包含轻松的非技术解释:https://www.youtube.com/watch?v =wnS50lJicXc