ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
### 缓存行状态 CPU的缓存是以缓存行(cache line)为单位的,MESI协议描述了多核处理器中一个缓存行的状态。在MESI协议中,每个缓存行有4个状态,分别是: * M(修改,Modified):本地处理器已经修改缓存行,即是脏行,它的内容与内存中的内容不一样,并且此 cache 只有本地一个拷贝(专有); * E(专有,Exclusive):缓存行内容和内存中的一样,而且其它处理器都没有这行数据; * S(共享,Shared):缓存行内容和内存中的一样, 有可能其它处理器也存在此缓存行的拷贝; * I(无效,Invalid):缓存行失效, 不能使用 缓存行的E状态如下图: ![](https://img.kancloud.cn/5b/bb/5bbb97822358150c4bd58392f03a5253_600x419.png) 此时只有core1访问缓存行,它的缓存行的状态为E,表示core1独占。 缓存行的S状态如下图: ![](https://img.kancloud.cn/88/0b/880b71d6667b84a9cf6c7272da921bd4_614x421.png) 此时core1和core2都会访问缓存行,他们的缓存行状态为S,表示缓存行处于共享状态 缓存行的M和I状态如下图: ![](https://img.kancloud.cn/35/ec/35ec0d4b5ff80e5e60349d59135c133b_606x412.png) 此时core1修改了缓存行,因此core1的缓存行状态为M,代表已经修改,而core2的缓存行状态为I,代表已经失效,需要从主存中读取 ### 缓存行状态转换 在MESI协议中,每个Cache的Cache控制器不仅知道自己的读写操作,而且也监听(snoop)其它Cache的读写操作。每个Cache line所处的状态根据本核和其它核的读写操作在4个状态间进行迁移。MESI协议状态迁移图如下: ![](https://img.kancloud.cn/c0/4e/c04e761e36c94ccba002c12c0c38d54d_375x256.png) * 初始:一开始时,缓存行没有加载任何数据,所以它处于 I 状态。 * 本地写(Local Write):如果本地处理器写数据至处于 I 状态的缓存行,则缓存行的状态变成 M。 * 本地读(Local Read):如果本地处理器读取处于 I 状态的缓存行,很明显此缓存没有数据给它。此时分两种情况:(1)其它处理器的缓存里也没有此行数据,则从内存加载数据到此缓存行后,再将它设成 E 状态,表示只有我一家有这条数据,其它处理器都没有;(2)其它处理器的缓存有此行数据,则将此缓存行的状态设为 S 状态。(备注:如果处于M状态的缓存行,再由本地处理器写入/读出,状态是不会改变的) * 远程读(Remote Read):假设我们有两个处理器 c1 和 c2,如果 c2 需要读另外一个处理器 c1 的缓存行内容,c1 需要把它缓存行的内容通过内存控制器 (Memory Controller) 发送给 c2,c2 接到后将相应的缓存行状态设为 S。在设置之前,内存也得从总线上得到这份数据并保存。 * 远程写(Remote Write):其实确切地说不是远程写,而是 c2 得到 c1 的数据后,不是为了读,而是为了写。也算是本地写,只是 c1 也拥有这份数据的拷贝,这该怎么办呢?c2 将发出一个 RFO (Request For Owner) 请求,它需要拥有这行数据的权限,其它处理器的相应缓存行设为 I,除了它自已,谁不能动这行数据。这保证了数据的安全,同时处理 RFO 请求以及设置I的过程将给写操作带来很大的性能消耗