CPU 一致性缓存协议MESI

CPU 一致性缓存协议MESI

计算机在执行指令的时候都是通过cpu进行逐条执行而在执行指令的过程中势必涉及对数据的读写,而数据基本从磁盘加载到内存中cpu直接使用内存中的数据
由于cpu计算速度远大于对内存的读写速度如果任何数据的读写都通过内存cpu的效率将会大打折扣,因此在cpu中引入寄存器作为高速缓存提高系统效率例如

i = i + 1

当cpu执行该语句时首先将i从内存复制到cpu寄存器中(高速缓存)然后将i加一最后将数据更新到主存中,如果此语句在单线程下执行没有任何问题但是在多线程下会出现问题
因为多线程执行该语句每个线程运行在不同的cpu核心中此时每个核心都有i的副本,假设两个线程执行该语句期待所有线程运行完i的值为2,如果没有互斥机制保护i的情况下,两个线程运行完
i的值还会出现为1的场景

为何解决这种问题在硬件层面上有两种方式

  • 通过在总线加LOCK#锁的方式

  • 通过缓存一致性协议

在早期的CPU当中,是通过在总线上加LOCK#锁的形式来解决缓存不一致的问题。因为CPU和其他部件进行通信都是通过总线来进行的,如果对总线加LOCK#锁的话,也就是说阻塞了其他CPU对其他部件访问(如内存),从而使得只能有一个CPU能使用这个变量的内存。比如上面例子中 如果一个线程在执行 i = i +1,如果在执行这段代码的过程中,在总线上发出了LCOK#锁的信号,那么只有等待这段代码完全执行完毕之后,其他CPU才能从变量i所在的内存读取变量,然后进行相应的操作。这样就解决了缓存不一致的问题。

显然通过总线锁的方式之后只有一个cpu核心可以访问总线其他cpu核心都是处于等待状态,因此cpu无法发挥多核心的优势

所以就出现了缓存一致性协议。最出名的就是Intel 的MESI协议,MESI协议保证了每个缓存中使用的共享变量的副本是一致的。它核心的思想是:当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存行置为无效状态,因此当其他CPU需要读取这个变量时,发现自己缓存中缓存该变量的缓存行是无效的,那么它就会从内存重新读取。

多核cpu模型

MESI 协议中的状态

CPU中每个缓存行使用的4种状态进行标记(使用两位bit表示)

状态 描述

  • M(Modified) 该缓存行只被缓存在该CPU的缓存中,并且是被修改过的(dirty),即与主存中的数据不一致,该缓存行中的内存需要在未来的某个时间点(允许其它CPU读取主存中相应内存之前)写回(write back)主存。当被写回主存之后,该缓存行的状态会变成独享(exclusive)状态。
  • E(Exclusive) 这行数据有效,数据和内存中的数据一致,数据只存下于本Cache中
  • S(Shared) 这行数据有效,数据和内存中的数据一致,数据存在于很多cache中
  • I(Invalid) 这行数据无效
    M和E的数据都是本core独有的,不同之处是M状态的数据是dirty(和内存中的不一致),E状态的数据是clean(和内存中的一致)

S状态是所有Core的数据都是共享的,只有clean的数据才能被多个core共享

I表示这个Cache line无效

在MESI协议中,每个Cache的Cache控制器不仅知道自己的读写操作,而且也监听(snoop)其它Cache的读写操作。每个Cache line所处的状态根据本核和其它核的读写操作在4个状态间进行迁移

在这里插入图片描述

状态触发本地读取触发本地写入触发远端读取触发远端写入
M本地cache:M 触发cache:M 其他cache:I本地cache:M 触发cache:M 其他cache:I本地cache:M→E→S 触发cache:I→S 其他cache:I→S 同步主内存后修改为E独享,同步触发、其他cache后本地、触发、其他cache修改为S共享本地cache:M→E→S→I 触发cache:I→S→E→M 其他cache:I→S→I 同步和读取一样,同步完成后触发cache改为M,本地、其他cache改为I
E本地cache:E 触发cache:E 其他cache:I本地cache:E→M 触发cache:E→M 其他cache:I 本地cache变更为M,其他cache状态应当是I(无效)本地cache:E→S 触发cache:I→S 其他cache:I→S 当其他cache要读取该数据时,其他、触发、本地cache都被设置为S(共享)本地cache:E→S→I 触发cache:I→S→E→M 其他cache:I→S→I 当触发cache修改本地cache独享数据时时,将本地、触发、其他cache修改为S共享.然后触发cache修改为独享,其他、本地cache修改为I(无效),触发cache再修改为M
S本地cache:S 触发cache:S 其他cache:S本地cache:S→E→M 触发cache:S→E→M 其他cache:S→I 当本地cache修改时,将本地cache修改为E,其他cache修改为I,然后再将本地cache为M状态本地cache:S 触发cache:S 其他cache:S本地cache:S→I 触发cache:S→E→M 其他cache:S→I 当触发cache要修改本地共享数据时,触发cache修改为E(独享),本地、其他cache修改为I(无效),触发cache再次修改为M(修改)
I本地cache:I→S或者I→E 触发cache:I→S或者I →E 其他cache:E、M、I→S、I 本地、触发cache将从I无效修改为S共享或者E独享,其他cache将从E、M、I 变为S或者I本地cache:I→S→E→M 触发cache:I→S→E→M 其他cache:M、E、S→S→I既然是本cache是I,其他cache操作与它无关既然是本cache是I,其他cache操作与它无关
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值