说明:本博客仅为个人学习笔记,无任何商业用途。
1、前言
MESI协议解决了缓存一致性问题,但是其自身也存在一个性能弱点,处理器执行写内存操作时,必须等待其他所有处理器将自身高速缓存中相应的副本数据删除之后所发出的Invalidate Acknowledge/Read Response消息之后才能将数据写入高速缓存。 为了避免和减少这种等待所造成的写操作延迟(latency),硬件设计者引入了写缓存器和无效化队列
2、CPU架构图
3、写缓冲器
写缓冲器是处理器内部的一个容量比高速缓存器还小的私有高速存储部件(写缓冲器的容量大小通常等于一级缓存的缓存行宽度,比如32字节、64字节)。每个处理器都有其写冲器,其内部可能包含若干条目(Entry)。处理器无法读取另外一个处理器上的写缓冲器中的内容。
带来了什么?
1、如果相应的缓存条目状态为E或者M,那么处理器可能会直接将数据写入相应的缓存行而无需发送任何消息(x86不管相应的缓存条目状态如何,直接先将每一个写操作的结果存入写缓冲器);
2、如果相应的缓存条目状态为S,那么处理器会先将写操作的相关数据(包括数据和待操作的内存地址)存入写缓存器的条目之中,并发送Invalidate消息;3、如果相应的缓存条目状态为I,我们就称相应的写操作遇到了未命中,那么此时处理器会先将写操作相关数据存入写缓冲器的条目之中,并发送Read Invalidate消息。若其他处理器都没有该消息的有效副本,则Read消息的应答者来之主内存,即可能导致内存读取操作。因此引入写缓冲器的目的是:内存写操作的处理器不需要要等待其他处理器返回的Invalidate Acknowledge/Read Response消息而是继续执行其他指令(比如执行读操作)。当该处理器接收其他所有处理器针对同一个缓存条目的所有Invalidate Acknowledge消息的时候,该处理器会将写缓冲器中针对相应地址的写操作结果写入相应的缓存行中(写入到主内存中),此时写操作对于其他处理器来说才算是完成的
优点
写缓冲器的引用使得处理器在执行写操作的时候可以不等待Invalidate Acknowledge消息,从而减少了写操作的延时,这使得写操作的执行处理器在其他处理器回复Invalidate Acknowledge/Read Response消息这段时间内能够执行其他指令,从而提高了处理器的执行效率
有什么问题
处理器在执行读操作的时候,会根据相应的内存地址查询写缓冲器。如果写缓冲器存在相应的条目,那么该条目所代表的写操作结果就会直接作为该读操作的结果返回;否则才从高速缓存中读取数据(高速缓存中读取数据和前面一致)。这就导致了存储转发。
4、无效化队列
引入无效化队列(Invalidate Queue)之后,处理器在接收到Inavalidate消息之后并不删除消息中指定地址相应的副本数据,而是将消息存入无效化队列之后就回复Invalidate Acknowedge消息,从而减少了写操作执行处理器所需要的等待时间。有些处理器(比如x86)可能没有使用无效化队列
5、思考
无效化队列的和写缓冲器的带来了什么问题?
可能出现内存重排序与可见性问题。