以下文章来源于微信公众号白羊哈哈
多CPU
(multi-processor)指的是在计算机主板上有多个物理CPU
,每一个物理CPU
之间通过系统总线连接。
Architectual State
: 包括通用数据寄存器、段寄存器、控制寄存器等。
Execution Engine
: 执行引擎,用来执行CPU
指令,包括算数逻辑单元ALU
等。
Local APIC
: APIC
全称是Advanced Programmable Interrupt Controller
,翻译过来就是高级可编程中断控制器,用来处理CPU
中断。
多核(multi-core processor)指的是在一个物理CPU
内部,封装了多个物理核心。这些物理核心可能位于同一个Die
上,也可能位于多个Die
上。
Die
是从晶圆上切割下来的一个小晶片,CPU
的物理核就位于Die
上。
一个Die
上可以有多个CPU
物理核,物理核之间通过片内总线相连,相比主版上的系统总线,片内总线速度非常快。
一个Die
上物理核的个数,受Die
的大小影响。通常Die
越大,能容纳的物理核就越多。但是越大的Die
,良品率和制作成本就越高。
无论使用哪种方式,多核CPU
的架构可以表示为下图:
从上图可以看到,每一个物理核心都有自己的Architectual State
、Execution Engine
、Local APIC
。因此,每一个物理核心都可以看成是一个逻辑 CPU。
从并行性(Parallel)的角度看,多CPU
和多核CPU
都可以在同一时间,同时执行多条指令流。
那既然这样,为什么还要研究出多核CPU
呢?
如果单从性能角度看,多核CPU
内部物理核心之间通过片内总线通信,速度会快于系统总线。换句话说,多核 CPU 的性能要高于多 CPU。
有了多核CPU
,那么要构造处拥有4
个逻辑CPU
的系统,那么就有2
种方案:
第1
种就是使用2
个物理CPU
,每个物理CPU
内部包含2
个物理核心。
第2
中就是使用1
个物理CPU
,这个物理CPU
内部包含4
个物理核心。
超线程技术(Hyper-Threading Technology)简称HT
或者HTT
,它作用于物理CPU
内部的物理核心上。
为了实现超线程技术,一个物理核心内部,会同时包含2
份Architectual State
、Local APIC
,但是只有1
份Execution Engine
。
在运行的时候,会同时有2
条不同的CPU
指令流送入物理核心:
因此,一个物理核心内部,就好像有了2
个逻辑核心或者逻辑 CPU:
表面上看,超线程技术使得一个物理核心可以当成2
个使用,与不支持超线程技术的单核CPU
相比,并行性应该翻倍。
但是,从上图看到,逻辑核心是共享Execution Engine
的。
虽然同一时刻,有2
条不同的CPU
指令流送入了物理核,但同一时刻,Execution Engine
只能执行1
条指令流上的指令。
比如,当Execution Engine
在执行指令流1
的时候,需要等待指令需要的数据到达,那么,在这个等待的时间内,才可以切换到指令流2
执行,避免Execution Engine
处于空闲状态。
换句话说,超线程技术的并行性并不彻底,并行性并不能真正的翻倍。
上面Execution Engine
的运行方式,和在不支持超线程的单核CPU
上运行多线程非常相似,但是两者有本质的区别。
在不支持超线程的单核CPU
上运行多线程,是操作系统进行时间片调度造成的假象,任何同一时刻,其实都只有1
条指令流在物理核上执行。
在支持超线程的单核CPU
上运行多线程,硬件层面支持同一时刻送入2
条不同指令流到物理核心,只是在Execution Engine
内执行的时候需要轮转调度。
既然超线程技术本质上和多核CPU
一样,增加了核心数(逻辑核心),但是并行性却不及多核CPU
,那为什么还要设计出超线程技术呢?
答案是超线程技术可以提升CPU
核心的利用率。
在多核CPU
上,如果某个物理核心在执行指令流时需要等待指令数据,那么该核心就有一段时间处于空闲状态(虽然可能很短暂)。但是如果支持超线程技术,那么该核心可以用来处理另外的指令流。
综上所述,结合多核技术与超线程技术,逻辑CPU
的计算公式为:
SMP
全称是 Symmetric Multi-Processing,翻译过来是对称多处理器,是一种多处理器架构。
对称多处理器中的对称
,是指任何程序,不管运行在内核空间,还是用户空间,都可以运行在任意一个处理器上。
与之相反,ASMP
,Asymmetric Multi-Processing,非对称多处理器,指某些处理器用来运行特殊的程序,比如操作系统,而另外的处理器用来运行非特殊程序,比如用户程序。
现代计算机系统都使用的是SMP
架构,ASMP
架构已经几乎绝迹了。
早期的时候,SMP
专指多个物理CPU
的场景。后续由于多核与超线程技术的出现,SMP
在多个逻辑CPU
下也同样适用。