缓存一致性的理解
缓存一致性问题是在多线程情况下发生的。现在的中央处理器大多是有多个CPU,从内存模型来说,CPU想要从内存读取数据进行运算,需要经过这么一个路径:
- 先从内存中把数据复制到CPU高速缓存(现在CPU都有多级缓存)
- CPU从高速缓存中读取数据到寄存器,执行运算
题外话:高速缓存比内存的IO速度快很多,高速缓存的大小可以算是CPU的一个指标
回归正题,当多个CPU同时对内存中的数据进行缓存,就会引发缓存一致性问题
如图,假设有一个变量a=0在内存中,此时CPU1和CPU2同时要对变量a进行+1计算。我们想要的结果是CPU1进行+1运算,a=2,CPU2进行+1运算,a=3,实则不然
两个CPU的运算结果是要写回内存的,CPU1写回的结果是2,CPU2写回的结果同样是2,这便是缓存一致性问题。
解决方案:
- 总线加锁
- 缓存一致性协议
总线加锁
总线加锁是基于计算机物理模型实现的,一个CPU想要与其他硬件进行交互,需要一个渠道,就是总线。总线可以理解为输送数据的管道,在这个管道上加上一把锁,只能一个CPU访问内存,那么就保证数据运算结果是唯一的,也就解决的缓存一致性问题。
但是缺点也很显而易见,那就是效率低下。有且只有一个CPU访问内存,其他CPU被阻塞,性能大大的浪费掉了。
缓存一致性协议
有空再补充