MSI
(缓存一致性协议)
目录
在多处理器系统中,MSI(Modified-Shared-Invalid)是一个最基本的缓存一致性协议。缓存中的每一个块(block)包括3中状态:Modified(M,已修改)、Shared(S,共享)、Invalid(I,无效)。
Modified
表示缓存中的块(block)已被修改。这时,缓存中的数据和后端存储(如,内存)不一致。当缓存被收回(内存被收回,块“block”数据将丢失)时,缓存负责将“M”状态(Modified)的块(block)写回到后端存储。
Shared
表示缓存中的块(block)没有被修改,并且至少在一个缓存中存在一个只读状态(缓存中的块“block”数据有被读取拷贝)。缓存中的块(block)数据可以被收回(内存被收回,块“block”数据将丢失)而不需要写回到后端存储。
Invalid
表示块(block)在当前缓存中不存在,这时,如果该块(block)需要存储在这个缓存中,必须从内存或其他缓存中读进来。
通过在缓存和后端存储之间保持通信来维护这些一致性状态。缓存在读取块(block)或写入块(block),或从其他缓存读取或写入一个块(block)时充当的角色不同。
在一个缓存上,如果请求读取一个“M”或“S”状态的块(block),缓存直接提供数据。如果读取的块不在缓存中(处于“I”状态),缓存必须检查确认在其他缓存中不存在“M”状态的块(拷贝)。不同的缓存架构有不同的处理。例如总线架构,如果读请求被广播给所有的缓存,这种架构一般通过侦听窥探的方式知道最近有哪些缓存存在这个缓存块(block)的拷贝。其他的架构,包括缓存目录,这种缓存目录通过代理目录(一种代理,也是一种目录)知道最近有哪些缓存存在这个缓存块(block)的拷贝。如果其他缓存存在“M”状态的块(拷贝),混存必须将这个块(block, 拷贝)数据写回到后端存储,并将该块(block)设置为“S”或“I”状态。一旦其他所有缓存的处于“M”状态的块(拷贝)数据全部写回到后端存储中,缓存就可以从后端存储读取,或者从其他缓存读取对应的“S”状态的块(block, 拷贝)。这样,缓存就可以(为读请求)提供数据。之后,缓存的块(block)被设置为“S”状态。
如果请求写入一个“M”状态的块(block),缓存直接修改本地数据。如果写入的块(block)处于“S”状态,缓存必须通知其他所有存在“S”状态的块(拷贝)的缓存,其他缓存必须收回(内存被收回,块“block”数据将丢失)对应的块(拷贝)。这个通知可以通过如上总线侦听窥探的方式(总线架构),或者通过代理目录(一种代理,也是一种目录)的方式(缓存目录架构)。之后才能修改本地数据。如果写入的块(block)处于“I”状态,缓存必须通知其他所有存在“S”或者“M”状态的块(拷贝)的缓存,其他缓存必须收回(内存被收回,块“block”数据将丢失)对应的块(block,拷贝)。如果对应的块(拷贝)处于“M”状态,缓存必须将对应的块(block,拷贝)写回后端存储,或者将对应的块(block,拷贝)提供给请求的缓存。如果这个时候正好在本地还没有写入的块,在修改之前,将先从后端存储中读进来。块(block)修改之后,设置缓存块为“M”状态。
对于任何两个给定的缓存,某个块(block,包括拷贝)允许的状态如下:
M S I
M n n y
S n y y
I y y y
<!--[if !supportLists]-->1、 <!--[endif]-->https://en.wikipedia.org/wiki/MSI_protocol
<!--[if !supportLists]-->2、 <!--[endif]-->https://en.wikipedia.org/wiki/Cache_coherence
<!--[if !supportLists]-->3、 <!--[endif]-->Cache Coherence,https://www.cs.auckland.ac.nz/~jmor159/363/html/cache_coh.html
<!--[if !supportLists]-->4、 <!--[endif]-->