本文已参与「新人创作礼」活动,一起开启掘金创作之路。
今天这篇文章介绍CPU模型以及缓存一致性,然后对MESI协议进行介绍。可谓是非常的干货满满~
CPU内存模型
- 在多核⼼的 CPU ⾥,每个核⼼ 都有各⾃的 L1/L2 Cache,⽽ L3 Cache 是所有核⼼共享使⽤的
- 当数据发生改动(缓存与内存的数据不同时),这时候就需要数据同步。
由于CPU基本都是多核的,而L1、L2 Cache又是多核各自独有的,那就会带来缓存一致性问题。
缓存一致性
两个核⼼的 CPU同时运行两个线程,都有一个共同的变量i
假设线程a操作了变量i(递增操作),恰巧这时另一个线程b也在读
而这时线程a还没完成数据同步, 则意味着这时候的变量是脏数据,这就是缓存一致性问题。
如何解决呢?要保证以下两点:
- 写传播: 某个 CPU 核⼼⾥的 Cache 数据更新时,必须要传播到其他核⼼的 Cache
- 事务的串行化: 某个 CPU 核⼼⾥对数据的操作顺序,必须在其他核⼼看起来顺序是⼀样的
MESI 协议
MESI协议就做到了 CPU 缓存⼀致性。
- Modified,脏值: 代表该 Cache Block 上的数据已经被更新过, 但是还没有写到内存里。
- Exclusive,独占 : 独占状态的时候,意味着数据只存储在⼀个 CPU 核⼼的 Cache,cpu可以自由写⼊,而不需要通知其他 CPU 核⼼
- Shared,共享: 当我们要更新 Cache ⾥⾯的数据的时候,不能直接修改,⽽是要先向所有的其他 CPU 广播⼀个请求,要求先把其他核⼼的 Cache 中对应的 Cache Line 标记为「⽆效」状态,然后再更新当 前 Cache 里面的数据
- Invalidated,已失效 :数据已失效
这四个状态来标记 Cache Line 四个不同的状态。