缓存一致性协议的出现和性能弱点

三级缓存

由于现代处理器处理能力远高于主内存的处理能力,引入了高速缓存来弥补这两者之间的鸿沟。高速缓存存储效率远比内存高,容量远比内存小。缓存上存储了内存中的数据副本。

如下图所示高速缓存相当于一个拉链散列表。
图一、高速缓存结构示意图
在这里插入图片描述
每个缓存条目又可被划分为Tag、Data Block、Flag三个部分。
Tag包含了内存地址的高位比特
Data Block也被称为缓存行,容量通常是2的倍数
Flag表示缓存行的状态信息

图二、缓存条目
在这里插入图片描述
处理器处理内存访问操作时将内存地址解码,得到index桶编号、tag缓存条目的相对编号、offset缓存行内的位置偏移,如果根据此解码结果能找到相应的缓存行并且缓存行的flag表示缓存行有效,则是缓存命中(Cache Hit),否则是缓存未命中(Cache Miss)。
未命中时,处理器需要的数据会从主内存中加载并同步到缓存中,这个行为需要消耗不小的性能,因此要尽量减少缓存未命中。

缓存提升了处理器取数的效率,但是光只有一级缓存,这效率提升并不够明显,此时考虑增加缓存层级。在处理器访问的这级缓存中间每加入一层缓存,能进一步提高处理器取数速度,但是却也增加了缓存间数据同步的开销,利弊权衡下的交叉点就选择了使用三级缓存,一般综合效益上是最佳的。

三级缓存的分布,比如有款多核CPU,其每一个CPU单元内就有多个核,每个核中有各自的L1cache、L2cache,在这个CPU中多个核共享L3cache。越靠近主内存的缓存空间越大,访问速度越慢,造价越便宜。

缓存间同步问题

多处理器环境下,一个处理器改变了其数据副本,其他处理器不能保证及时察觉并对此做出反应,会造成读脏数据、丢失更新等问题。为了解决这个问题,处理器需要一种通信机制:MESI缓存一致性协议
缓存条目的falg状态被分为了以下四种:
modified 修改了(计为M)表示该缓存行有对应内存地址更新后的数据副本,多处理器下的同样tag的缓存行中只有最多一个是此状态
exclusive 独占的(计为E)表示只有该缓存行保留有内存中最新数据副本
shared 共享的(计为S)表示该缓存行的副本是内存中最新的,且如果其他处理器中存在tag值i相同的缓存行,那么这个缓存行必定也是shared状态
invalid (计为1)初始状态,表示该缓存行不包含任何内存上的有效数据副本

处理器执行内存读写操作时会往总线发送请求,其他处理器会嗅探总线中的请求并做出响应
根据MESI状态制定了一些请求响应的MESI消息体
(1)read 通知其他处理器和主内存,当前处理器准备读取某一内存地址下的数据
(2)read response 返回请求读取的数据,可能是主内存或其他处理器提供的
(3)invalidate 通知其他处理器将缓存中对应内存地址的缓存条目状态置为I,即删除副本
(4)invalidate acknowledge 接收到此消息必须回复此消息表示已经删除了副本
(5)read invalidate 是read和invalidate的复合消息,通知其他处理器当前处理器准备读后更新数据,其他处理器要删除副本。接收到该消息的处理器必须回复read response和invalidate acknowledge
(6)write back 此消息表示将某数据写回某个内存地址

处理器A读数据的时候:处理器B发现自己缓存条目状态不是I,则会组装read response,若是M则先将数据写入内存,再发送响应,更新状态为S
处理器A写数据的时候:若缓存条目已经是E或M状态,则表示A具有此数据的所有权,可以直接存入缓存行中并更新状态为M;若是S,往总线发送invalidate 以获取所有权,变更状态E,收到其他所有处理器的invalidate acknowledge后将数据更新到此缓存行,变更状态M;若是I,往总线发read invalidate ,收到read response及其他所有其他处理器回复的invalidate acknowledge之后,变更状态为E,再更新数据,变更状态M
其他处理器在收到invalidate 或invalidate acknowledge 之后必须将对应地址缓存条目状态变为I,保证了同一地址下最多只有一个处理器在更新数据,避免不一致问题。

MESI缓存一致性的性能弱点

处理器执行写内存操作时,必须等其他处理器进行一系列删除或者读响应操作之后才能将数据写入告诉缓存,这会造成写操作的延迟。因此硬件中引入了写缓冲器无效化队列
PS 有一个write buffer,大小4字节,造价极高,速度极快,用来增速用,和这个写缓冲器不是一个概念。
写缓冲器容量一般等于一级缓存的缓存行宽度。
引入写缓冲器后,写操作时若条目状态为E或M,则直接先写入缓存行,而不需要发任何消息;若是S,则先将数据存入写缓冲器的条目中,并发送invalidate 消息;若是I,则称遇到了写未命中,此时处理器将数据先写入写缓冲器的条目中,并发送read invalidate,此时若其他处理器都没有有效副本,则要去内存中读,因此写未命中造成的开销很大。上述处理器写入写缓冲器的条目之后就认为已经完成,不用等待响应,在收到其他处理器对同一地址的invalidate acknowledge 之后,该处理器将写缓冲器中的对应条目写入相应缓存行,此时写操作对于其他处理器才算真正完成。
引入无效化队列之后,处理器接收到invalidate 之后不用立即响应去删除副本,而是先存入无效化队列之后就直接回复invalidate acknowledge ,减少写处理器的等待时间。但是写缓冲器和无效化队列会带来内存重排序和可见性问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值