Ayr*_*rat 7 cpu-architecture cpu-cache
在Jim Handy的高速缓冲存储器书中(摘录如下),作者有MESI协议的表格描述.该表对我来说看起来很不清楚,不幸的是文本没有帮助.
第一个问题(图中绿色):
Is this right? -- a data block is in the cache of a CPU,
and it is in the shared state, but when the CPU reads it,
the CPU gets read miss.
How is this possible?
Run Code Online (Sandbox Code Playgroud)
第二个问题(紫色):
Who and when create all these messages "Read miss", etc.?
(afaik, the system bus just translates messages of others)
Run Code Online (Sandbox Code Playgroud)
最后,第三个问题(不在图片上):
Do all these cache coherency protocols
(MSI,MESI,MOESI,Firefly,Dragon...)
maintain sequential consistency memory model?
Are there protocols that maintain other consistency models?
Run Code Online (Sandbox Code Playgroud)

对于第一个问题,虽然缓存中存在数据块(处于共享状态),但它是错误的块(即,标记不匹配),因此存在缓存未命中.在高速缓存未命中时,如果高速缓存处于修改状态,则仍需要将数据写回到存储器.
对于第二个问题,每条总线都向缓存提供地址和请求信息(读或写); 系统总线从远程处理器提供此功能.命中或未命中是提供的地址是否是缓存中的命中.系统总线上的请求由远程处理器的缓存过滤.
在处理器1(P1)读取时,如果P1的高速缓存命中,则不需要将信号发送到系统总线.在P1写入时,如果P1的缓存有命中并且状态是独占的或修改的,则不需要将信号发送到系统总线,但如果P1的缓存中的状态是共享的,那么另一个(P0)缓存必须告诉(通过系统总线)P1正在执行写操作,并且该地址的P0缓存中的任何条目必须无效.
(注意,"共享"状态并不一定意味着内存块存在于某些其他缓存中.大多数基于snoop的协议允许在共享状态下静默[无系统总线通信]丢弃缓存块.)
(顺便说一句,该书给出的MESI协议有点不寻常.通过读取未命中输入独占状态更常见,发现没有其他缓存与块[这允许在稍后的写入时修改静默更新并且写入不要在共享状态的命中时使用写入内存.)
对于第三个问题,缓存一致性协议仅解决一致性而非一致性.硬件提供的一致性模型决定了哪些类型的活动可以无序缓存和完成(以软件可见的方式).例如,如果写入未命中不强制任何后续读取命中等待所有远程高速缓存都看到写入通知,则有助于性能,但这样会违反顺序一致性.
以下是顺序一致性如何防止写入缓冲的示例:
P0在位置B读取"B_old"(缓存命中),将"A_new"写入位置A(缓存未命中),然后读取位置B.
P1在位置A(缓存命中)读取"A_old",将"B_new"写入位置B(缓存未命中),然后读取位置A.
如果写入被缓冲并且允许读取继续而不等待前一个写入被另一个高速缓存识别,则P0的第二次读取B可以读取"B_old"(因为它仍然是高速缓存命中)和 P1的第二次读取A可以读为"A_old"(因为还没有看到P0的写入).没有办法构造这些内存访问的顺序排序,因此会违反顺序一致性.
然而,如果P0的第二次读取B等待,直到P0对A的写入被P1识别(并且P1的第二次读取等待直到P1的写入被P0识别为P1),则可以进行顺序排序.
如果P1在写入B之前看到P0写入A,则可以进行顺序排序,包括:
请注意,硬件可以推测不违反排序要求并重新排序内存访问的完成; 但是,它需要能够处理不正确的推测(例如,通过恢复到检查点).(一篇关于此的经典早期论文是"SC + ILP = RC?"[ PDF ].)