
第一次接触缓存是在上大学的时候,计算机组成与原理里面有专门的介绍. 在计算机中,CPU和主存(内存)的性能差异是非常大的,如果 CPU 直接从主存中读取数据,那主存的速度大大限制了 CPU 的速度。于是在 CPU 和 主存之间加上了一个容量相对小的高速缓存,由于缓存的速速比主存的速度高,只要将 CPU 近期要用的信息调入缓存,CPU 便可以直接从缓存中获取信息,从而提高速度。
为什么不将主存做的高速呢?因为成本问题,速度越高成本越大。
现在的计算的结构更加复杂,在多核 CPU 中,L1 和 L2 是独占的,L3 是共有的。

在多核系统中,缓存的引入也带来了两个问题:
- 缓存的命中率的问题。
- 缓存更新的一致性问题。
因为缓存比较小,如果 CPU 从缓存中都读取不到数据,就还需要去 主存中读,那这样就没有办法利用缓存,甚至还多读取了一次。
在并发的情况下,如果变量 a,原始值是 0, 同时被核 0 和 核 1, 读取到了 L1 缓存中,且同时对其进行自加 1 操作,然后再写会主存中,那么这时变量 a 应该是 1 呢还是应该是 2 呢?这也是缓存不一致出现的一个经典的问题,这个不仅仅在 CPU 中会出现问题,在我们日常的开发中也会遇到这种问题。
网友评论