本文主要来学习内存屏障和 CPU 缓存知识,以便于我们去了解 CPU 对程序性能优化做了哪些努力。
首先来看下 CPU 缓存:
CPU 缓存
CPU 缓存是为了提高程序运行的性能,CPU 在很多处理上内部架构做了很多调整,比如 CPU 高速缓存,大家都知道因为硬盘很慢,可以通过缓存把数据加载到内存里面,提高访问速度,而 CPU 处理也有这个机制,尽可能把处理器访问主内存时间开销放在 CPU 高速缓存上面,CPU 访问速度相比内存访问速度又要快好多倍,这就是目前大多数处理器都会去利用的机制,利用处理器的缓存以提高性能。
多级缓存
CPU 的缓存分为三级缓存,所以说多核 CPU 会有多个缓存,我们首先来看下一级缓存(L1 Cache):
L1 Cache
是 CPU 第一层高速缓存,分为数据缓存和指令缓存,一般服务器 CPU 的 L1
缓存的容量通常在 32-4096 KB。
由于 L1
级高速缓存容量的限制,为了再次提高 CPU 的运算速度,在 CPU 外部放置-高速存储器,即二级缓存(L2 Cache)。
因为 L1
和 L2
的容量还是有限,因此提出了三级缓存,L3
现在的都是内置的,它的实际作用即是,L3
缓存的应用可以进一步降低内存延迟,同时提升大数据量计算时处理器的性能,具有较大 L3
缓存的处理器提供更有效的文件系统缓存行为及较短消息和处理器队列长度,一般是多核共享一个 L3
缓存。
CPU 在读取数据时,先在 L1 Cache 中寻找,再从 L2 Cache 寻找,再从 L3 Cache 寻找,然后是内存,再后是外存储器硬盘寻找。
如下图所示,CPU 缓存架构中,缓存层级越接近 CPU core,容量越小,速度越快。CPU Cache 由若干缓存行组成,缓存行是 CPU Cache 中的最小单位,一个缓存行的大小通常是 64 字节,是 2 的倍数,不同的机器上为 32 到 64 字节不等,并且它有效地引用主内存中的一块地址。
多 CPU 读取同样的数据进行缓存,进行不同运算之后,最终写入主内存以哪个 CPU 为准?这就需要缓存同步协议了:
缓存同步协议
在这种高速缓存回写的场景下,有很多 CPU 厂商提出了一些公共的协议-