首页 > 代码库 > MSI cache一致性协议

MSI cache一致性协议

按照高速缓存的写策略的不同,有写直达和写回WB两种高速缓存:

1.  写直达高速缓存:一旦高速缓存中的一个字被修改,则在主存中要立即修改

2.  写回高速缓存: 并不是立即写回,而是当被修改的字从高速缓存中被替换或清除时,才真正修改主存

在侦听协议的设计中,主要有两种设计选择:一是写直达高速缓存还是写回高速缓存,二是写无效WI,还是写更新WU协议

 

MSI协议

三态写回无效MSImodifiedsharedinvalid

状态

1.  无效I状态:

2.  共享S状态:它意味着该块在高速缓存中未被修改过,主存中是最新的,在其他高速缓存中可能有也可能没有该块的拷贝

3.  修改M状态:它意味着只有该高速缓存中有该块的最新拷贝,主存中的拷贝是过时的,在其他高速缓存中没有该块的有效拷贝。

 

事件:

高速缓存一致性协议中,每个高速缓存控制器接收两方面的输入:

1.  处理器发出的请求: 处理器读PrRd 处理器写PrWr

2.  总线上侦听到的事务:总线读BusRd、总线互斥读BusRdx、总线写回BusWB

总线读BusRd:高速缓存控制器将地址放到总线上,请求一个数据块,由主存或者Cache提供数据。

总线互斥读:请求数据块,该目的是要修改该数据块,并且自己独占,其他cache都无效。

总线写回BusWBcache将数据块写入内存

 

为了支持上面的事件,高速缓存控制器又提供了一种新事件:FLUSH,目的是为了响应出现在总线上的事务,并能把该事务所请求的块从缓存中cache直接放到总线上,而不是通过内存再传进数据。

 

  

 

  

 

上图中A/B表示高速缓存控制器观察到事件A发生了,或者说由于事件A导致了该转换的发生,除了发生状态转换外,还要产生一个动作B;“-”表示空动作,Flush动作表示由高速缓存来请求块到总线上。

 

无效状态:

1.  当有处理器读PrRd事件时,就会发生cache miss这样就会装入新数据,但此时其他的cache可能有也可能没有,所以进入S状态,当然需要总线读事件的支持,所以触发总线读事件BusRd

2.  当有处理器写PrWr事件时,会导致cache miss,调用总线互斥读BusRdX事件(目的是告诉其他cache我要修改这个cache,你们先都无效掉),把要写入的数据装入cache(这是由于采用写直达且不分配策略),然后再修改,这时就会进入M状态

 

共享状态:

1.  当有处理器读PrRd事件时,因为数据就在本cache内且是最新的所以直接命中,还是S状态。

2.  当有处理器写PrWr事件时,调用总线互斥读BusRdX事件(目的是告诉其他cache我要修改这个cache,你们先都无效掉),当更新数据后,需要进入M状态,告知这是最新的数据,主存中的数据也是过时的。

3.  当接收到总线上有读BusRd的事件时,当在共享态接受到别人的总线读信息时,与我无关,所以还是S状态。

4.  当接收到总线上有互斥读BusRdX的事件时,我知道你要当老大了,所以我也只能听从你的安排,把自己无效掉。进入I状态

 

修改过状态

1.  当有处理器读PrRd事件时,因为为读事件,且M代表当前cache的数据是要比其他的新,所以直接命中,不影响其他cache。所以进入M状态

2.  当有处理器写PrWr事件时,同样也是因为当前cache是最新的,所以直接更新写,对其他cache不产生影响,所以还是进入M状态。

3.  当接收到总线上有读BusRd的事件时,因为现在我在M状态,我的数据是最新的,所以当然由我提供数据,所以产生FLUSH事件,最后进入S状态。

4.  当接收到总线上有互斥读BusRdX的事件时,因为你告诉我只能你当老大,没办法我只能让出,但是让出前我需要把玉玺交出来,所以先FLUSH,然后进入了无效I状态让你当老大。

MSI cache一致性协议