Cache 一致性

上一篇文章中讲到了 MESI,那么来让我们了解下,CPU 是怎么保证 Cache 一致性的。

其实 MESI 协议不止是包括这些状态,它还包括一些处理器之间的消息来完成的,如果多个 CPU 在一个共享总线上。那么

他们可以通过处理器间消息来发送信息。因为当一个 CPU 的 cache 被修改的时候,如果此时该 cache line 处于 shared 状态,

也就意味着,其它 CPU 的 cache 中有相同的 cache line ,那么,它就应该发一个消息告诉其它 CPU 来知道修改这件事情,最

简单的办法就是它其它 CPU 的这个 Cache line 失效,这就是这些消息的用下,一般这些消息为:

Read: 该消息会包含将在读的 Cache line 的物理地址,用于得到其它 cache 中 cache line 的内容;

Read response: 作为 read 消息的回应,会被其它 CPU 返回,并且包含想要读取的数据;

Invalidate: 发送该消息使其它 Cache 中指定的 Cache line 失效,它会包含相应 Cache line 的物理地址,其它 CPU 将

移除相应的 Cache line;

Invalidate Acknowledge: 作为 Invalidate 的回应,将会在移除相应的 cache line 之后发回;

Read Invalidate: 包含相关 cache line 的物理地址,是 Read 和 Invalidate 的合并功能,它要求一个 Read response 和

一组 Invalidate Acknowledge 作为回应;

Writeback: 它也会包含相应 cache line 的物理地址,它要求相应的 cache line 写回到内存,这样就可以为其它数据腾出

位置。

通过这些状态和这些消息,那么就可以在各个 CPU 核心之间保证了 cache 的一致性,举个例子。

当一个 CPU 准备对某一内存进行写入的时候,发现,该内存已经在 cache line 中了,并且状态为 shared ,那么此时,它

就可以给其它 CPU 发送一个 invalidate 消息,其它 CPU 收到该消息后,移除自己 cache 中的该 cache line ,然后回应一个

invalidate acknowledge 消息,该 CPU 接收到回应之后,就可以进入安全的写入了,示例图如下:

                    CPU0                     CPU1
                     |                        |
             (Write) |       Invalidate       |
                |    | ---------------------> |
                |    |                        |
                |    |                        |
                V    | Invalidate Acknowledeg |
               ---   | <--------------------- |
                     |                        |

写的过程,就是从发起 Invalidate 消息开始,到其它 CPU 回应后,然后再进行写入,这样就可以安全的维护缓存的一致了,

但是如果总线繁忙,CPU 核数比较多时,这个过程也将会耗费很多 CPU 周期,速度却降下来了,如果 cache 被多个 CPU 共享,

那么这样的情况将会频繁发生,如果能够先把写入这个操作缓存起来,转而让 CPU0 执行其它的操作就好了。

对了,搞硬件的这些家伙也想到了这一点,所以就有了 Store Buffers。有了 Store Buffers,不可以先把写入的值存起来,

先不更新到 cache 中,等到收到回应后再应用于 cache 中,这样就不用等回应,先执行其它操作了。

让我们来看个例子:

a = 1;

b = a + 1;

assert(a == 2);

有了 Store Buffers,假设 a 被初始化为 0,上面的代码就可能这样执行:

1. CPU0 执行 a = 1, 把 1 写入 地址 a 处,它会现 a 不在缓存中,所以它就发送一个 read invalidate 消息给其它 CPU。

2. CPU0 把 a 的值 1 存入 Store Buffer,然后执行 b = a + 1;

3. CPU0 接收到回应,并把新值存入自己的 cache line,然后读取 a 的值,此时从其它 CPU 传来的 a 的值依然为 0, 这时

执行 a + 1, 将得到 1;

4. CPU0 此时把 Store Buffer 中的 a 的值更新到 Cache 中,不过已经造成了不幸的后果。

分析这样的过程,不然得出,结果不正确是因为在读取时,CPU0 直接从 Cache 中读取了 a 的值,如果从 Store Buffer 中

读取,就不会有这样的情况了。

对,那些家伙们也想到了这样的缺点,所以就发明了 Store forwarding,像这种,上一个指令(存储)还没执行完成,下一个

加载指令就开始访问内存的情况,叫做 Memory ordering, 即内存乱序访问。它无疑加快了 CPU 的执行流程,但也带来了一些负面

影响,那么 CPU 是如何解决这些负面影响,并且让执行效率越来越快呢?

(待续)

时间: 2024-10-11 13:51:03

Cache 一致性的相关文章

【转】DMA和cache一致性

DMA和cache一致性问题 Cache原理 CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多.缓存的出现主要是为了解决CPU运算速度与内存 读写速度不匹配的矛盾,因为CPU运算速度要比内存读写速度快很多,这样会使CPU花费很长时间等待数据到来或把数据写入内存.在缓存中的数据是内存中的 一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可避开内存直接从缓存中调用,从而加快读取速度. 只要Cache

ARM Linux 内核 panic 之cache 一致性 ——cci-400 cache一致互联

ARM Linux 内核 panic 之cache 一致性 ——cci-400 cache一致互联 CCI-400 集合了互联和一致性功能,有 2 个 ACE slave 接口和 3 个 ACE-Lite slave 接口,有 3 个 AXI master 接口.2 个 ACE slave 接口可以相互 snoop 对方,ACE-Lite slave 接口可以 snoop 这 2 个 ACE slave 接口.本文首先介绍cci-400相关结构,然后以内核的panic为引子,最后给出导致内核pa

多功能PCIE交换机之三:数据迁移及其cache一致性

关于PCIE非透明桥 cache一致性PCIE非透明桥提供了两种机制来从local node往remote node迁移数据,分别是基于地址映射和内嵌的 DMA.对remote节点而言,当它接受数据的时候,CPU可能是不知情的,因此需要保证cache一致性: 对local节点,当通过DMA往它自己的内存传输数据时,本地的CPU也不会被通知,因此需要考虑cache 一致性. 不同的平台实现Cache一致性的机制不一样,ARM平台需要软件参与,而IntelX86平台硬件能够自动维 护cache一致性

Cache一致性与DMA

cache一致性与DMA 第一个问题 对于进行DMA操作的设备, 并不是所有系统都保持它们的cache一致性.在这种情况下, 准备进行DMA的设备可能从RAM得到陈旧的数据, 因为脏的cache行可能还驻留在各个CPU的cache中, 而尚未写回到RAM. 解决方法:内核的相应部分必须将cache中重叠的数据冲刷掉(或者使它们失效)(译注: 冲刷掉cache中的相应内容, 以保持cache与RAM的一致). 第二个问题 当设备已经通过DMA将数据写入RAM之后, 这些数据可能被cache写回RA

Cache一致性

Cache 的一致性特性 即使内存区域满足了cache的使用条件,要正确的使用cache,仍然可能会碰到cache一致性的问题,由于cache会使得某一确定的时刻,cpu看到的储存内容和内存中的实际内容不一致,如果仅仅只是CPU来操作这片区域,这不会产生任何问题,担当有其他外设也参与读写的时候,就会产生以下两种情况的cache一致性问题. 1.储存位置被其它外设修改 以网卡为例,网卡会将接收到的数据包写入到指定的内存中(A处地址),而如果此内存带cache,且cache中刚刚存A处地址内存的缓存

《大话处理器》Cache一致性协议之MESI【转】

转自:https://blog.csdn.net/muxiqingyang/article/details/6615199 Cache一致性协议之MESI          处理器上有一套完整的协议,来保证Cache一致性.比较经典的Cache一致性协议当属MESI协议,奔腾处理器有使用它,很多其他的处理器都是使用它的变种. 单核Cache中每个Cache line有2个标志:dirty和valid标志,它们很好的描述了Cache和Memory(内存)之间的数据关系(数据是否有效,数据是否被修改

MSI cache一致性协议

按照高速缓存的写策略的不同,有写直达和写回WB两种高速缓存: 1.  写直达高速缓存:一旦高速缓存中的一个字被修改,则在主存中要立即修改 2.  写回高速缓存: 并不是立即写回,而是当被修改的字从高速缓存中被替换或清除时,才真正修改主存 在侦听协议的设计中,主要有两种设计选择:一是写直达高速缓存还是写回高速缓存,二是写无效WI,还是写更新WU协议 MSI协议 三态写回无效MSI(modified,shared,invalid) 状态 1.  无效I状态: 2.  共享S状态:它意味着该块在高速缓

主从DB与cache一致性

本文主要讨论这么几个问题: (1)数据库主从延时为何会导致缓存数据不一致 (2)优化思路与方案 一.需求缘起 上一篇<缓存架构设计细节二三事>中有一个小优化点,在只有主库时,通过"串行化"的思路可以解决缓存与数据库中数据不一致.引发大家热烈讨论的点是"在主从同步,读写分离的数据库架构下,有可能出现脏数据入缓存的情况,此时串行化方案不再适用了",这就是本文要讨论的主题. 二.为什么数据会不一致 为什么会读到脏数据,有这么几种情况: (1)单库情况下,服务层

SyilxOS块设备CACHE管理

1.块设备CACHE简介 前文介绍了SylixOS中的块设备驱动模型和I/O控制,本篇主要介绍SylixOS中的块设备CACHE管理.由于磁盘属于低速设备,磁盘的读写速度远远低于CPU,所以为了解决这种速度不匹配,SylixOS提供了对应块设备的缓冲器.它是一个特殊的块设备,与物理设备一一对应(多个逻辑分区共享一个CACHE),介于文件系统和磁盘之间,可以极大地减少磁盘I/O的访问率,同时提高系统性能.当然引入磁盘缓冲器的最大问题在于磁盘数据与缓冲数据的不同步性,这个问题可以通过sync等函数调