multithreading - SMT 和超线程 : threads vs process

标签 multithreading cpu-architecture

我大致了解 SMT 和硬件线程的概念(我认为)。我希望我的理解在这里得到验证或纠正。
基本上,硬件线程不同于软件线程。我们可以在一个 SMT 核心上同时运行不同的软件线程甚至不同的进程,对吗? SMT 核心不区分 process1 和 process2,对于 HW,它们只是两个线程。
那是对的吗?

最佳答案

是的,您的理解是正确的:硬件线程的概念与(操作系统级)线程和进程之间的区别并不真正相关。例如,它不会以某种方式将两个 SMT 线程限制为仅运行来自同一进程的软件线程1。

术语硬件线程的使用有点令人困惑,因为线程在软件世界中已经有了特定的含义。正如彼得在评论中指出的那样,您可能更喜欢逻辑核心。因此,单个超线程包可能有 2 个物理内核和 4 个逻辑内核。我们将其称为 2c4t(是的,t 再次代表线程)。

从抽象的角度考虑这一点可能最容易。硬件提供给软件的关键抽象是 CPU。 15 年前,您的台式机有 1 个 CPU,与打开机箱后在风扇下看到的 1 个 CPU 相同。今天,单个物理包(您看到插入风扇下方 socket 的那个东西)通常在操作系统中表现为多个 CPU。

特别是,一个 2c4t 的物理 CPU 将在操作系统中显示为 4 个 CPU。操作系统大多不关心它是 2 个物理内核和 4 个逻辑内核,而不是 1 个物理内核和 4 个逻辑内核(在 Intel 上不常见,但在其他地方很常见),或者 4 个物理内核,每个内核有 1 个逻辑线程,甚至是 4 个独立的物理 CPU在一个巨大的服务器主板上每个内核都有 1 个内核。硬件实现所呈现 CPU 的方式只是一个性能问题,而不是真正的功能问题。例如,在用户软件中,当您查询 CPU 数量时,您实际上得到的是硬件线程总数,无论它们在物理上如何实现2。

所以理解抽象有助于回答这个问题:

We could run different SW threads or even different processes on an SMT core simultaneously, right?



是的 - 无论您可以在 2 个物理 CPU 上做什么,您都可以在 2 个内核或同一物理内核上的 2 个逻辑内核上进行。硬件呈现的抽象是相同的。

然后是软件进程和线程的问题。这主要是操作系统呈现给用户空间软件的抽象。 CPU 根本没有这个概念:它只提供为每个 CPU 提供一个“执行上下文”来运行某些东西的设施,提供现代操作系统需要的一堆附加服务,例如各种特权级别(以实现用户/kernel split)、内存保护、中断、分页/内存管理单元服务等。

操作系统使用它来实现其进程和线程的概念:但 CPU 并不关心。例如,进程通常有单独的虚拟内存空间,而线程共享它们。 CPU 通过拥有一个 MMU 来支持这个概念——但它没有进程与线程的二进制概念:你很可能在中间有一些东西来共享部分内存空间等。很多非虚拟的- 进程和线程之间的内存差异完全在 CPU 的范围之外:例如单独的打开文件集、单独的权限和能力、工作目录、环境变量等。

了解进程/线程抽象有助于回答问题的另一部分:

SMT core does not differentiate between process1 and process2, to the HW, they are just two threads[?]



正确的。 SMT 不仅不关心进程与线程,CPU 通常也不关心。它们为操作系统提供了一些功能来在执行上下文之间设置各种共享安排(内存映射是最大的)——但他们并不关心它是如何使用的。在 CPU 的系统编程手册中,您甚至不会真正找到有关“进程”和“线程”之间二元区别的讨论。

1 这似乎是您的担忧之一,但并不完全清楚。

2 需要明确的是,现代操作系统不会完全不了解物理内核与其包含的 1 个或多个逻辑内核之间的映射——除其他外,它使用该信息来优化调度。例如,如果你有两个进程在你的 2c4t 机器上运行,如果它们都运行在同一个物理核心上,而让另一个空闲,通常会很愚蠢,因为那样性能通常会降低。这与 NUMA 之类的东西没有什么不同 - 其中有基本的高级抽象(单个同构共享内存空间)以及通过抽象泄漏的低级性能问题(并非所有内存访问都是统一的)。目标是软件堆栈的最低级别(操作系统、线程库、内存分配器等)主要处理这些东西,以便用户软件可以继续使用高级抽象。

关于multithreading - SMT 和超线程 : threads vs process,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46793813/

相关文章:

multithreading - UDP 服务器应该如何回复它的客户端?

python - CELERYD_CONCURRENCY, --并发和自动缩放

c - 当线程执行for循环迭代时如何继续与master一起工作?

performance - Cortex M4 LDR/STR 时序

java - 是否可以在 Java 中检测处理器架构?

cpu - 乱序指令执行: is commit order preserved?

java - Thread.join 不起作用

assembly - 如果内存组织为字,为什么程序计数器增加 1,而在字节的情况下增加 2?

c++ - C++ 中的 "sleep"会发生什么?

Java线程池大小(执行器)