SMT 和超线程:线程与进程
SMT and Hyperthreading : threads vs process
我大致了解 SMT 和硬件线程的概念(我认为)。我希望我的理解在这里得到验证或更正。
基本上,HW 线程与 SW 线程不同。我们可以 运行 不同的 SW 线程,甚至是 SMT 核心上的不同进程,对吧? SMT核心不区分process1和process2,对于HW来说,它们只是两个线程。
那是对的吗?
是的,你的理解是正确的:硬件线程的概念与(OS级)之间的区别并没有真正的关系线程 和 进程。例如,它不会以某种方式将两个 SMT 线程限制为来自同一进程的 运行ning 软件 threads1.
术语硬件线程的使用有点令人困惑,因为线程在软件世界中已经具有特定含义。正如 Peter 在评论中指出的那样,您可能更喜欢 logical core。因此,单个超线程包可能有 2 个 physical 核和 4 个 logical 核。我们将其称为 2c4t(是的,t 再次代表线程)。
从抽象的角度来考虑这个问题可能是最容易的。硬件提供给软件的关键抽象是 CPU。 15 年前,您的桌面有 1 CPU,与您打开机箱时在风扇下方看到的 1 CPU 相同。今天,单个物理包(您看到的插入风扇下方插座的东西)通常在操作系统中显示为多个 CPUs。
特别是,2c4t 物理 CPU 对 OS 大多显示为 4 CPUs。 OS 基本上不关心它是 2 个物理内核和 4 个逻辑内核,还是 1 个物理内核和 4 个逻辑内核(在 Intel 上不常见,但在其他地方很常见),或者 4 个物理内核,每个内核有 1 个逻辑线程,甚至4 个独立的物理 CPU,每个都有 1 个内核,位于一个巨大的服务器主板上。硬件实现所呈现的 CPU 的方式只是一个 性能 问题,而不是真正的功能问题。例如在用户软件中,当你查询CPU个数时,实际上得到的是硬件线程总数,无论它们是如何物理实现的[=50] =]2.
所以理解抽象有助于回答这个问题:
We could run different SW threads or even different processes on an
SMT core simultaneously, right?
是的——无论你能在 2 个物理 CPU 上做什么,你都可以在 2 个核心上做,或者在同一个物理核心上的 2 个逻辑核心上做。硬件呈现的抽象是相同的。
然后是软件进程和线程的问题。这主要是操作系统呈现给用户态软件的抽象。 CPU 根本没有这个概念:它只提供设施来提供 "execution context" 每个 CPU 到 运行 的东西,提供一堆现代的附加服务OSes 需要,例如各种特权级别(实现 user/kernel 拆分)、内存保护、中断、paging/memory-management 单元服务等
操作系统使用它来实现进程和线程的概念:但 CPU 并不关心。例如,进程通常有单独的虚拟内存 spaces,而线程共享它们。 CPU 通过拥有一个 MMU 来支持这个概念——但它没有进程与线程的二元概念:你很可能在中间有一些东西共享一些 部分 内存 space 等。进程和线程之间的许多非虚拟内存差异完全不在 CPU 的范围内:例如单独的打开文件集、单独的权限和功能、工作目录、环境变量等。
了解 process/thread 抽象有助于回答您问题的其他部分:
SMT core does not differentiate between process1 and process2, to the
HW, they are just two threads[?]
正确。 SMT 不仅不关心进程与线程,CPU 通常也不关心。他们为 OS 提供了一些功能来设置执行上下文之间的各种共享安排(内存映射是最大的)——但他们不关心它是如何使用的。在 CPU 的系统编程手册中,您甚至不会真正找到对 "process" 和 "thread" 之间二进制区别的讨论。
1 这似乎是您的担忧之一,但并不完全清楚。
2 需要明确的是,现代人 OS 不会完全不知道物理核心与它们包含的 1 个或多个逻辑核心之间的映射 - 除其他事项外,它使用该信息来优化调度。例如,如果您的 2c4t 机器上有两个 运行ning 进程,如果它们都 运行ning 在同一个物理内核上,让另一个空闲,通常会很愚蠢,因为性能通常会较低那样。这与 NUMA 之类的东西没有什么不同 - 那里有基本的高级抽象(单个同质共享内存 space)以及通过抽象泄漏的低级性能问题(并非所有内存访问都是统一的)。目标是软件堆栈的最低级别(OS、线程库、内存分配器等)主要处理这些东西,以便用户软件可以继续使用高级抽象。
我大致了解 SMT 和硬件线程的概念(我认为)。我希望我的理解在这里得到验证或更正。 基本上,HW 线程与 SW 线程不同。我们可以 运行 不同的 SW 线程,甚至是 SMT 核心上的不同进程,对吧? SMT核心不区分process1和process2,对于HW来说,它们只是两个线程。 那是对的吗?
是的,你的理解是正确的:硬件线程的概念与(OS级)之间的区别并没有真正的关系线程 和 进程。例如,它不会以某种方式将两个 SMT 线程限制为来自同一进程的 运行ning 软件 threads1.
术语硬件线程的使用有点令人困惑,因为线程在软件世界中已经具有特定含义。正如 Peter 在评论中指出的那样,您可能更喜欢 logical core。因此,单个超线程包可能有 2 个 physical 核和 4 个 logical 核。我们将其称为 2c4t(是的,t 再次代表线程)。
从抽象的角度来考虑这个问题可能是最容易的。硬件提供给软件的关键抽象是 CPU。 15 年前,您的桌面有 1 CPU,与您打开机箱时在风扇下方看到的 1 CPU 相同。今天,单个物理包(您看到的插入风扇下方插座的东西)通常在操作系统中显示为多个 CPUs。
特别是,2c4t 物理 CPU 对 OS 大多显示为 4 CPUs。 OS 基本上不关心它是 2 个物理内核和 4 个逻辑内核,还是 1 个物理内核和 4 个逻辑内核(在 Intel 上不常见,但在其他地方很常见),或者 4 个物理内核,每个内核有 1 个逻辑线程,甚至4 个独立的物理 CPU,每个都有 1 个内核,位于一个巨大的服务器主板上。硬件实现所呈现的 CPU 的方式只是一个 性能 问题,而不是真正的功能问题。例如在用户软件中,当你查询CPU个数时,实际上得到的是硬件线程总数,无论它们是如何物理实现的[=50] =]2.
所以理解抽象有助于回答这个问题:
We could run different SW threads or even different processes on an SMT core simultaneously, right?
是的——无论你能在 2 个物理 CPU 上做什么,你都可以在 2 个核心上做,或者在同一个物理核心上的 2 个逻辑核心上做。硬件呈现的抽象是相同的。
然后是软件进程和线程的问题。这主要是操作系统呈现给用户态软件的抽象。 CPU 根本没有这个概念:它只提供设施来提供 "execution context" 每个 CPU 到 运行 的东西,提供一堆现代的附加服务OSes 需要,例如各种特权级别(实现 user/kernel 拆分)、内存保护、中断、paging/memory-management 单元服务等
操作系统使用它来实现进程和线程的概念:但 CPU 并不关心。例如,进程通常有单独的虚拟内存 spaces,而线程共享它们。 CPU 通过拥有一个 MMU 来支持这个概念——但它没有进程与线程的二元概念:你很可能在中间有一些东西共享一些 部分 内存 space 等。进程和线程之间的许多非虚拟内存差异完全不在 CPU 的范围内:例如单独的打开文件集、单独的权限和功能、工作目录、环境变量等。
了解 process/thread 抽象有助于回答您问题的其他部分:
SMT core does not differentiate between process1 and process2, to the HW, they are just two threads[?]
正确。 SMT 不仅不关心进程与线程,CPU 通常也不关心。他们为 OS 提供了一些功能来设置执行上下文之间的各种共享安排(内存映射是最大的)——但他们不关心它是如何使用的。在 CPU 的系统编程手册中,您甚至不会真正找到对 "process" 和 "thread" 之间二进制区别的讨论。
1 这似乎是您的担忧之一,但并不完全清楚。
2 需要明确的是,现代人 OS 不会完全不知道物理核心与它们包含的 1 个或多个逻辑核心之间的映射 - 除其他事项外,它使用该信息来优化调度。例如,如果您的 2c4t 机器上有两个 运行ning 进程,如果它们都 运行ning 在同一个物理内核上,让另一个空闲,通常会很愚蠢,因为性能通常会较低那样。这与 NUMA 之类的东西没有什么不同 - 那里有基本的高级抽象(单个同质共享内存 space)以及通过抽象泄漏的低级性能问题(并非所有内存访问都是统一的)。目标是软件堆栈的最低级别(OS、线程库、内存分配器等)主要处理这些东西,以便用户软件可以继续使用高级抽象。