计算机组成原理学习笔记——解决缓存一致性问题

133 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

MESI协议

缓存一致性问题

我们知道,CPU各个核心都有自己的高速缓存,同时也有共用的缓存。

image.jpeg

那么问题来了,当我们采用写回策略时,核心1更新了数据,由于写回策略,我们这个数据只在核心1自己的高速缓存更新,并标记为脏。而只有这个数据要被换出去的时候,数据才写入到主内存。

如果这个时候,核心2去访问这个数据,结果读到的就是一个错误的数据。因为这个更新的数据只在核心1自己的Cache中,而不在核心2的Cache或者主内存中。这个问题就是缓存一致性问题。

要解决这个问题,我们需要一种方法,而这种方法要满足两个条件。

写传播,这个就是说,在一个CPU核心里,Cache中的数据更新,能够传播>到其他核心对应的Cache中。

事务的串行化,这个就是说,如果一个数据被多个核心修改,那么其他核心看到这个数据被修改的顺序必须是一致的。

基于总线嗅探机制的MESI协议

总线嗅探,本质上就是把所有的读写请求都通过总线广播给所有的核心,然后让各个核心去嗅探这些请求,再根据本地的情况进行响应。

MESI协议,是一种写写失效协议,它只有一个CPU核心负责写入数据,其他CPU核心只同步读取这个写入。在这个CPU核心写入Cache之后,它会去广播一个“失效”请求告诉其他CPU核心。其他的CPU核心,只去判断自己的数据是否“失效”,来看是否需要也标记成失效。

M:代表已修改

E:代表独占

S:代表共享

I:代表已失效

  • 已修改就是说,缓存中的数据已经更新过了,但是还没有写回到主内存中。

  • 已失效就是说,这个缓存里的数据是失效的,不能用的。

  • 独占就是说,这个状态下,缓存中的数据和主内存中的数据是一致的。而对应的数据只加载到当前CPU核所拥有的Cache里。其他的CPU核,并没有加载对应的数据到自己的Cache里。这个时候,向独占的Cache中写数据,可以自由的写而不用通知其他CPU核。

  • 共享就是说,这个状态下,缓存中的数据和主内存中的数据也是一致的。相比于独占状态,在共享状态下,同样的数据在多个CPU核心的Cache都有。所以当其中一个核心要更新数据时,要广播一个请求,要求其他CPU核心Cache中的数据都变成无效的,然后再更新当前Cache中的数据。

相对于写失效协议,还有一种写广播协议。而写失效只是通知其他核心是否需要标记成失效,而这个写广播直接把对应的数据传输给其他核心了。