1 SMP (Symmetric Multi-Processor)

对称式多处理器 (SMP) 是一种计算机系统结构。
多处理器结构有两种:

(l) 对称 —— 多个处理器都是等价的,线程每次受调度运行时都可以动态选择在任何一个处理器上运行。
(2) 非对称 —— 处理器的结构、能力、所处的部位、和作用都各不相同,不同的线程只能在特定的处理器上运行。

通用 CPU 一般都是对称多处理器,生活中常见的CPU有 Intel Core 和 AMD 的CPU。
现代CPU朝着多核,多线程的方向发展。因为内存的存取速度远远跟不上CPU的执行速度, 所以引入了L1, L2,L3 级cache,L1 cache最小,分为指令cache和数据cache两种,两者都有32 Kbytes,他的存取速度是最接近于寄存器的。L2 cache一般有 256 Kbytes, L3 Cache 有 8 Mbytes。

如下图:(其中 x6 表示有6个硬件core)

cpuz-cache

随着物理core的集成工艺不断提升,市场上的服务器CPU 能够看到有32 core,甚至 64 core。 这时候 SMP 架构的劣势就显现出来了,当发生cache miss时,多个 core 会同时向一个 RAM 请求数据。 这样主存就有大量的竞争压力,为了提高RAM 的访问效率,NUMA架构就出现了。

2 NUMA (Non Uniform Memory Access Architecture)

非统一内存访问(NUMA), NUMA 把一台计算机分成多个节点(node), 每个节点内部拥有多个CPU, 节点内部使用共有的内存控制器,节点之间是通过互联模块进行连接和信息交互。 如下图所示:

NUMA

当发生 cache-miss, 优先访问本地的记忆体(RAM),然后才通过NUMA内部的互联互通模块访问远端的NUMA节点。 当然访问远端的NUMA 延迟相对会大一些。

3 SMP vs. NUMA

SMP-vs-NUMA

4 CPU 缓存一致性

因为在多核CPU时代,CPU有“缓存一致性”原则,也就是说每个处理器(核)都会通过嗅探在总线上传播的数据来检查自己的缓存值是不是过期了。如果过期了,则失效。比如声明 volatile,当变量被修改,则会立即要求写入系统内存。

5 总结

NUMA将 Core 和 Memory 细分为多个Node, 每个Node可以简单看成一个 SMP 架构。 Intel-Core-i7-cache

参考

wiki cpu-cache wiki NUMA

扩展阅读

1) Intel Core cache

看一个典型的 Intel-Core-i7-cache 的架构图: Intel-Core-i7-cache

在 SMP 的3层cache 结构中:
(1) L1 cache 分为2类(指令和数据),只为一个core提供cache;
(2) 每个核心都有自己的 L1缓存 和 L2缓存, 但三级缓存却是一颗 CPU 上所有核心共享的。
(3) 访问缓存要比内存快很多:

  • 一级缓存只需要 4~5 个时钟周期;
  • 二级缓存大约 12 个时钟周期;
  • 三级缓存大约 30 个时钟周期;
  • CPU 访问一次内存通常需要 100 个时钟周期以上。

对于 2GHZ 主频的 CPU 来说,一个时钟周期是 0.5 纳秒

2) 超线程技术

超线程技术(Intel Hyper-Threading),就是使用特殊的硬件指令,把一个Core当成两个逻辑core 来使用, 在OS看来,逻辑处理器和实体处理器没有区别,因此OS会把工作线程分派给"2颗" 处理器去并行处理。

虽然采用超线程技术能够同时执行两个线程,但它并不像两个真正的CPU那样(每个CPU拥有独立的资源)。 当两个线程都需要某一临界资源时,其中一个线程需要暂时停止,直到这些资源闲置,因此超线程并不等于两颗CPU。

超线程技术只需要增加很少的晶体管数量, 就可以在多任务的情况下提供显著的性能提升, 比再添加一个物理核心划算的多,所以再新一代主流的CPU上多采用HT技术。