1、缓存一致性

当高速缓存存在以后,每个CPU获取/存储数据直接操作高速缓存,而不是内存,这样当多个线程运行在不同CPU中时。同一份内存数据就可能会缓存于多个CPU高速缓存中,如不进行限制,就会出现缓存一致性问题
CPU层面提出了两种解决办法:1. 总线锁,2. 缓存锁

2、总线锁和缓存锁

  • 总线锁:在多CPU下,当其中一个处理器要对共享内存进行操作的时候,在总线上发出一个LOCK信号,使得其他处理器无法访问共享数据,开销很大,如果我们能够控制锁的粒度就能减少开销,从而引入了缓存锁。
  • 缓存锁:只要保证多个CPU缓存的同一份数据是一致的就可以了,相比总线锁,缓存锁即降低了锁的力度。核心机制是基于缓存一致性协议来实现的。

2.1、缓存一致性协议

为了达到数据访问的一致,需要各个处理器在访问 高速缓存 时遵循一些协议,在读写时根据协议来操作,常见的协议有MSI、MESI、MOSI。最常见的是MESI协议。

2.1.1 MESI协议

在MESI协议中,每个高速缓存的 缓存控制器 不仅知道自己的读写操作,而且也监听其他告诉缓存的读写操作。共有四种状态,分别是:

  • M(Modify)表示共享数据只缓存在当前CPU缓存中,并且是被修改的状态。此时表示当前CPU缓存数据与主内存中不一致,其他CPU缓存中如果缓存了当前数据应是无效状态,因为该数据已被修改且并没更新到主内存
  • E(Exclusive)表示缓存的独占状态,数据只缓存在当前CPU缓存中,并且没有被修改
  • S(Shared)表示数据可能被多个CPU缓存,并且各个缓存中的数据和主内存中的数据一致
  • I(Invalid)表示当前缓存已经失效

参考文档

并发编程-(4)-JMM基础(总线锁、缓存锁、MESI缓存一致性协议、CPU 层面的内存屏障)

posted on 2022-03-13 19:32  哑吧  阅读(1342)  评论(0编辑  收藏  举报