MESI协议

MESI协议是一个基于失效的缓存一致性协议，是支持写回（write-back）缓存的最常用协议。也称作伊利诺伊协议 (Illinois protocol，因为是在伊利诺伊大学厄巴纳-香槟分校被发明的)。与写直达（write through）缓存相比，回写缓冲能节约大量带宽。总是有“脏”（dirty）状态表示缓存中的数据与主存中不同。MESI协议要求在缓存不命中（miss）且数据块在另一个缓存时，允许缓存到缓存的数据复制。与MSI协议相比，MESI协议减少了主存的事务数量。这极大改善了性能。

状态 
缓存行有4种不同的状态:

已修改Modified (M)缓存行是脏的（dirty），与主存的值不同。如果别的CPU内核要读主存这块数据，该缓存行必须回写到主存，状态变为共享(S).
独占Exclusive (E) 缓存行只在当前缓存中，但是干净的（clean）--缓存数据同于主存数据。当别的缓存读取它时，状态变为共享；当前写数据时，变为已修改状态。 
共享Shared (S) 缓存行也存在于其它缓存中且是干净的。缓存行可以在任意时刻抛弃。
无效Invalid (I) 缓存行是无效的

任意一对缓存，对应缓存行的相容关系:

当块标记为 M (已修改), 在其他缓存中的数据副本被标记为I(无效).

操作 

有限状态自动机的状态转换结束两种场景：缓存所在处理器的读写；其他处理器的读写。总线请求被监视。

处理器对缓存的请求:
 PrRd: 处理器请求读一个缓存块
 PrWr: 处理器请求写一个缓存块
总线对缓存的请求:
 BusRd: 窥探器请求指出其他处理器请求读一个缓存块
 BusRdX: 窥探器请求指出其他处理器请求写一个该处理器不拥有的缓存块
 BusUpgr: 窥探器请求指出其他处理器请求写一个该处理器拥有的缓存块
 Flush: 窥探器请求指出请求回写整个缓存到主存
 FlushOpt: 窥探器请求指出整个缓存块被发到总线以发送给另外一个处理器（缓存到缓存的复制） 

解释

图1.1是MESI协议四种状态的转换图。

写操作仅在缓存行是已修改或独占状态时可自由执行。如果在共享状态，其他缓存都要先把该缓存行置为无效，这种广播操作称作Request For Ownership (RFO).

缓存对已修改状态的缓存行，要监听各处理器对其的读请求并插入其数据到总线。

缓存对共享状态的缓存行，要监听使其无效或请求拥有的广播，当匹配时把该缓存行置为无效。

已修改状态、独占状态是精确的，匹配于该缓存行在系统中的实际情况。共享状态可以是不精确的: 如果别的缓存抛弃了该行，只有当前缓存拥有该行，但其状态没有变为独占。其他缓存不需要广播通知其抛弃操作。 

独占状态是一个优化机会：处理器修改共享状态的缓存行必须要先发出一个总线事务使得其他缓存中的该行失效；而独占状态下修改一行不需要总线事务。 

MESI协议操作图解

假定下述读/写操作访问同一主存位置的数据。操作流是 : R1, W1, R3, W3, R1, R3, R2. 最初所有缓存为空。

参见 

Dragon协议

参考文献

外部链接
 An interactive MESI simulation 
 An open source MESI controller (Verilog) 

快取一致性