MESI cpu

  • 前言 :
  • 1,cpu: 就是处理器
  • 2,主存: 就是ram (随机存取存储器)
  • 3,高速缓冲存储器(Cache),主要是解决cpu 和主存速度不匹配(通俗点:cpu 相当于在口述文章,而主存在用手写记录,Cache 相当于录音机)

        

MESI(Modified Exclusive Shared Or Invalid)(也称为伊利诺斯协议,是因为该协议由伊利诺斯州立大学提出)是一种广泛使用的支持写回策略的缓存一致性协议。

MESI
Modified(修改)Exclusive(独享)Shared(共享)Invalid(无效)

M(Modified【修改】):

该缓存行只缓存在该cpu的缓存中(谁的cpu 修改了这条数据,这条数据就缓存在谁的cpu中),和主存中的数据不一致,这条缓存的数据呢,需要在其他cpu读取主存对应的这条数据之前,将修改的数据写入到主存中,被写入到主存之后,这条数据就变成E(独享)状态了。

E(Exclusive【独享】):

该缓存行只缓存在该cpu的缓存中,但状态是独享的,因为在与主存的数据是一致的(因为在M状态之后,已经把这条修改的内存数据写入到主存中了),当有其他cpu核来读取这条数据时,它的状态就会变为S(共享状态),当该cpu修改这条数据时,它的状态又会变为 M(修改状态)

S(Shared【共享】):

该状态表示该条数据已经被多个cpu缓存,并且各个cpu的缓存与主存数据一致,但当有一个cpu修改这条缓存的数据时,其他的cpu中这条缓存数据则会变成I(无效)

I(Invalid【无效】):

该缓存是无效的,因为有其他的cpu修改了这条数据。

当前状态事件行为next_status
ILocal Read

1,如果其他Cache没有这份数据,本Cache从该内存中读取数据,Cache line 的状态变E

2,如果其他Cache有这份数据,且状态为M,则将数据更新到内存中,本Cache再从内从中读取,则所有的Cache line 的状态都变成S

3,如果其他Cache有这份数据,且状态为E/S,本Cache从内存中读取数据,则所有的Cache line 状态都变成 S

E/S
ILocal Write

1,从内存中读取数据,在Cache 中修改,状态改为M;但是如果其他Cache 中有这条数据,且状态为M,则先读取内存中的数据

2,如果其他Cache 有这条数据,则其他的Cache的Cache line 的状态变为I

M
I

Remote

Read

别核操作,与本核无关,状态不变I
I

Remote

Write

别核操作,与本核无关,状态不变I
ELoacal Read从cache中取数据,则状态不变E
ELocal Write修改Cache中的数据,状态变为MM
ERemote Read数据被其他核读取,状态变为SS
ERemote Write数据被其他核修改,状态变为II

 

SLocal Read从Cache 中取数据,状态不变S
SLocal Write数据修改,状态变为M,则其他共享这条数据的Cache line 状态则变为IM
SRemote Read状态不变

S

SRemote Write数据被修改,此数据状态变为 II
MLocal Read从Cache 中读取数据,状态不变

M

MLocal Write修改本数据,状态不变M
MRemote Read这时数据已经被写到主存中,有其他核读取,状态变为SS
MRemote Write这时数据已经被写到主存中,有其他核使用最新数据,其他核对数据进行了修改,则数据状态变为II

过程:

在一个典型系统中,可能会有几个缓存(在多核系统中,每个核心都会有自己的缓存)共享主存总线,每个相应的CPU会发出读写请求,而缓存的目的是为了减少CPU读写共享主存的次数。

一个缓存除在Invalid状态外都可以满足cpu的读请求,一个Invalid的缓存行必须从主存中读取(变成S或者 E状态)来满足该CPU的读请求。

一个写请求只有在该缓存行是M或者E状态时才能被执行,如果缓存行处于S状态,必须先将其它缓存中该缓存行变成Invalid状态(也既是不允许不同CPU同时修改同一缓存行,即使修改该缓存行中不同位置的数据也不允许)。该操作经常作用广播的方式来完成,例如:RequestFor Ownership (RFO)。

缓存可以随时将一个非M状态的缓存行作废,或者变成Invalid状态,而一个M状态的缓存行必须先被写回主存。

一个处于M状态的缓存行必须时刻监听所有试图读该缓存行相对就主存的操作,这种操作必须在缓存将该缓存行写回主存并将状态变成S状态之前被延迟执行。

一个处于S状态的缓存行也必须监听其它缓存使该缓存行无效或者独享该缓存行的请求,并将该缓存行变成无效(Invalid)。

一个处于E状态的缓存行也必须监听其它缓存读主存中该缓存行的操作,一旦有这种操作,该缓存行需要变成S状态。

对于ME状态而言总是精确的,他们在和该缓存行的真正状态是一致的。而S状态可能是非一致的,如果一个缓存将处于S状态的缓存行作废了,而另一个缓存实际上可能已经

独享了该缓存行,但是该缓存却不会将该缓存行升迁为E状态,这是因为其它缓存不会广播他们作废掉该缓存行的通知,同样由于缓存并没有保存该缓存行的copy的数量,因此(即使有这种通知)也没有办法确定自己是否已经独享了该缓存行。

从上面的意义看来E状态是一种投机性的优化:如果一个CPU想修改一个处于S状态的缓存行,总线事务需要将所有该缓存行的copy变成Invalid状态,而修改E状态的缓存不需要使用总线事务。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值