一直很想说这个问题,垃圾培训机构已经把韭菜们带偏了,网上千篇一律的说volatile和MESI协议没有关系,那究竟有没有关系呢??坐好认真听!
1、缓存一致性问题
由于存储设备与处理器的运算速度差距很大,计算机系统在内存与处理器之间增加了一层高速缓存,将运算需要的数据复制到缓存中,让运算能快速进行。
有了高速缓存的存在以后,每个CPU的处理过程是, 先将计算需要用到的数据缓存在CPU高速缓存中,在CPU 进行计算时,直接从高速缓存中读取数据并且在计算完成 之后写入到缓存中。在整个运算过程完成后,再把缓存中 的数据同步到主内存。
通过高速缓存很好解决了处理器与内存处理速度的矛盾,但是也带来了缓存一致性问题:不同的线程可能运行在不同的CPU内,同一个数据也会被缓存到多个CPU中,在不同CPU中运行的不同线程看到的同一份内存数据的不同值,这就是缓存一致性问题。
2、缓存锁——缓存一致性协议
为了解决缓存一致性问题,引入了缓存锁,缓存锁的核心机制就是缓存一致性协议。常见的就是MESI协议,MESI表示缓存行的四种状态:
* M(modify)表示共享数据只缓存在当前 CPU 缓存中, 并且是被修改状态,也就是缓存的数据和主内存中的数据不一致。
* E(exclusive)表示缓存的独占状态,数据只缓存在当前 CPU缓存中,并且没有被修改 。
* S(shared)表示数据可能被多个CPU缓存,并且各个缓 存中的数据和主内存数据一致。
* I(invalid)表示缓存已失效。
在 MESI 协议中,每个缓存的缓存控制器不仅知道自己的读写操作,而且也监听(sno