我一般都了解SMT和硬件线程的概念(我认为)。我希望我的理解在这里得到验证或纠正。 基本上,HW线程与SW线程不同。我们可以同时在SMT核心上运行不同的SW线程甚至不同的进程,对吗? SMT核心没有将process1和process2区分为HW,它们只是两个线程。 那是对的吗?
答案 0 :(得分: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,每个1个核心位于一个巨大的服务器主板上。硬件实现所呈现的CPU的方式只是性能关注点,而不是真正的功能关注点。例如,在用户软件中,当您查询CPU数量时,无论物理实现方式如何 2 ,您实际上都会获得硬件线程总数。
因此理解抽象有助于回答这个问题:
我们可以运行不同的SW线程甚至不同的进程 同时SMT核心,对吧?
是 - 无论您在2个物理CPU上执行什么操作,都可以在同一物理核心上的2个核心或2个逻辑核心上执行此操作。硬件呈现的抽象是相同的。
然后是软件进程和线程的问题。这主要是操作系统向用户软件提供的抽象。 CPU根本没有这个概念:它只提供了提供执行环境的工具"每个CPU运行一些东西,提供了一系列现代操作系统所需的附加服务,例如各种特权级别(实现用户/内核拆分),内存保护,中断,分页/内存管理单元服务等。
操作系统使用它来实现其进程和线程的概念:但CPU并不关心。例如,进程通常具有单独的虚拟内存空间,而线程共享它们。 CPU通过使用MMU来支持这个概念 - 但是它没有进程与线程的二进制概念:你可以很好地在中间有一些共享内存空间的部分的东西进程和线程之间的大部分非虚拟内存差异完全在CPU的域之外:例如单独的打开文件集,单独的权限和功能,工作目录,环境变量等等。
理解进程/线程抽象有助于回答问题的其他部分:
SMT核心不区分process1和process2 HW,它们只是两个线程[?]
正确。 SMT不仅不关心进程与线程,而且一般都不关心CPU。它们为操作系统提供了一些功能,可以在执行上下文之间建立各种共享安排(内存映射是最重要的) - 但是他们并不关心它的使用方式。你甚至不会真正找到关于" process"之间的二进制区别的讨论。和"线程"在CPU的系统编程手册中。
1 这似乎是您关注的问题之一,但它并不完全清楚。
2 要明确的是,现代操作系统不会完全忽略物理核心与它们包含的1个或多个逻辑核心之间的映射 - 除此之外,它还使用该信息来优化调度。例如,如果你的2c4t盒子上运行了两个进程,那么如果它们都在同一个物理核心上运行通常会很愚蠢,而另一个处于空闲状态,因为性能通常会低一些。这与NUMA之类的东西没什么不同 - 其中有基本的高级抽象(单个同构共享内存空间)以及通过抽象泄漏的低级性能问题(并非所有内存访问都是统一的)。目标是软件堆栈的最低级别(操作系统,线程库,内存分配器等)主要处理这些内容,因此用户软件可以继续使用高级抽象。