基于写更新/写回策略的缓存一致性协议
基于写无效策略的一个弊端在于会造成大量的一致性缺失,每一次读取被无效的块都会遇到缓存缺失,从而导致处理缺失的延迟会很高。
基于写更新的dragon协议,处理器端的请求包括:
PrRd:处理器请求从缓存块中读出;
PrRdMiss:处理器请求读的块不在缓存中;
PrWr:处理器请求向缓存块中写入;
PrWrMiss:处理器请求写的块不在缓存中。
总线请求包括:
BusRd:总线侦听到一个来自另一个处理器的读出缓存请求;
Flush:总线侦听到整个缓存块被另一个处理器放上总线的请求;
BusUpd:总线侦听到一个写入字操作导致的写入值在总线上传播的请求,这里只有一个字的数据被放上总线,而不是整个缓存块;
每一个缓存块的状态包含:
Modified:缓存块唯一有效,可能与主存的原始数据不一致,该状态意味着对该块的唯一所有权;
Exclusive:缓存块有效,干净且唯一;
Shared Modified:缓存块有效,可能是dirty的,也可能有多份拷贝。但是,当存在多份拷贝时,只有一份拷贝处于Sm状态,其它拷贝必须是Sc状态;
Shared Clean:缓存块有效,可能不干净,也可能有多份拷贝。
Dragon协议允许“脏”共享,此时所有者的状态为Sm,其他拷贝的状态为Sc。假设缓存使用写分配的策略,状态转换如下图。因为dragon协议中没有I状态,图中没有出处的箭头指向一个状态代表新加载的缓存块。先看处理器端的请求,首先是读缺失,总线上产生一个BusRd,如果其它缓存没有相应的拷贝,那么该块应该标记成E状态。相反,如果其它的缓存中有拷贝,则该块置为Sc状态。如果是写缺失情况,由于是写分配策略,因此总线上产生一个BusRd,如果不存在其它拷贝,则该块置为M。相反如果存在其它拷贝,该块置为Sm,并且总线上还需要产生一个BusUpd通知其它缓存更新。
如果一个块处于E状态,PrRd和PrWr请求都不会产生总线事务,不同的是PrWr请求会改变块状态为M。
如果一个块处于M状态,PrRd和PrWr请求也都不会产生总线事务,因为没有其它的拷贝存在。
如果一个块处于Sc状态,处理器写请求会检查是否存在其它拷贝,如果存在,需要把状态置为Sm,成为该块的所有者。相反如果不存在其它拷贝,状态置为M。
如果缓存块处于Sm,处理器读请求不会改变其状态,也不会触发总线事务。处理器写请求可能不改变Sm状态,因为它还是该块的所有者;也可能会改变状态为M,如果这是它已经是唯一的拷贝。
图1 dragon更新一致性协议状态转换
对于侦听端,如果缓存块处于E状态,当侦听到BusRd时,块状态需要变成Sc。
如果是M状态,说明自己拥有的块是整个系统中唯一有效的,当侦听到BusRd,块必须被清空来保证写传播。
如果是Sc状态,BusRd意味着另外的处理器遇到了读缺失,由于不是所有者,所以不需要触发总线事务。侦听到BusUpd,则该字的更新被获取并用于更新当前的缓存块。
如果是处于Sm状态,说明本地缓存是所有者,侦听到BusRd需要清空该块;侦听到BusUpd,即一个请求者试图写入该块,因此请求者会成为新的所有者,本地的状态需要变为Sc。
领取专属 10元无门槛券
私享最新 技术干货