SMT和超线程:线程与进程

nog*_*001 3 multithreading cpu-architecture

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

Bee*_*ope 6

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

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

从抽象的角度来考虑这个可能是最容易的.软件的关键抽象硬件是CPU.15年前,如果您打开机箱,您的桌面有1个CPU,并且与您在风扇下看到的1个CPU相同.今天,单个物理包(您看到插入风扇下插座的东西)通常显示为操作系统的多个CPU.

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

因此理解抽象有助于回答这个问题:

我们可以同时在SMT核心上运行不同的SW线程甚至不同的进程,对吗?

是的 - 无论您在2个物理CPU上执行什么操作,都可以在同一物理核心上的2个核心或2个逻辑核心上执行.硬件呈现的抽象是相同的.

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

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

理解进程/线程抽象有助于回答问题的其他部分:

SMT核心不区分process1和process2,对于HW,它们只是两个线程[?]

正确.SMT不仅不关心进程与线程,一般CPU也不关心.它们为操作系统提供了一些功能,可以在执行上下文之间建立各种共享安排(内存映射是最重要的) - 但它们并不关心如何使用它.您甚至不会在CPU的系统编程手册中找到关于"进程"和"线程"之间的二进制区别的讨论.


1这似乎是你关注的问题之一,但并不完全清楚.

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