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)表示当前缓存已经失效