MSI cache一致性协议

文章转自:MSI cache一致性协议



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

  1. 写直达高速缓存:一旦高速缓存中的一个字被修改,则在主存中要立即修改
  2. 写回高速缓存: 并不是立即写回,而是当被修改的字从高速缓存中被替换或清除时,才真正修改主存

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


MSI协议


三态写回无效MSI(modified,shared,invalid)

状态:

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


事件:

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

  1. 处理器发出的请求:处理器读PrRd处理器写PrWr
  2. 总线上侦听到的事务:总线读BusRd总线互斥读BusRdx总线写回BusWB
    • 总线读BusRd:高速缓存控制器将地址放到总线上,请求一个数据块,由主存或者Cache提供数据。
    • 总线互斥读:请求数据块,该目的是要修改该数据块,并且自己独占,其他cache都无效。
    • 总线写回BusWB:cache将数据块写入内存

为了支持上面的事件,高速缓存控制器又提供了一种新事件: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状态让你当老大。


以胡伟武老师著的《计算机体系结构(第二版)》第12章习题第6题为例,题目如下:

假设在一个双CPU多处理器系统中,两个CPU用单总线连接,并且采用监听一致性协议(MSI),cache的初始状态均为无效,然后两个CPU对内存中统一数据块进行如下操作:CPU A读、CPU A写、CPU B写、CPU A读,写出每次访问后两个CPU各自的cache的状态变化。

事件 A状态 B状态
初始状态 I I
CPU A读 S I
CPU A写 M I
CPU B写 I M
CPU A读 S S


接下来分析CPU A/B中各自cache的状态变化:

  1. 初始状态时,cache均为无效,即为I;
  2. CPU A读:
    • 当CPU A的cache处于无效状态时,有处理器读PrRd事件发生,就会发生cache miss这样就会装入新数据,但此时其他的cache可能有也可能没有,所以进入S状态,当然需要总线读事件的支持,所以触发总线读事件BusRd。此时CPU A的cache状态为S状态。
    • 此时CPU B的cache依旧处于无效状态。
  3. CPU A写:
    • 当CPU A的cache处于共享状态(S)时,有处理器写PrWr事件发生,调用总线互斥读BusRdX事件(目的是告诉其他cache我要修改这个cache,你们先都无效掉),当更新数据后,需要进入M状态,告知这是最新的数据,主存中的数据也是过时的。此时CPU A的cache状态为M状态。
    • 此时CPU B的cache依旧处于无效状态。
  4. CPU B写:
    • 当CPU B的cache处于无效状态(I)时,有处理器写PrWr事件发生,会导致cache miss,调用总线互斥读BusRdX事件(目的是告诉其他cache我要修改这个cache,你们先都无效掉),把要写入的数据装入cache(这是由于采用写直达且不分配策略),然后再修改,这时就会进入M状态。
    • 此时处于M状态的CPU A cache,通过总线侦听到有总线互斥读BusRdX事件发生,则把自己的cache状态给无效掉了,此时,CPU A的cache状态为I状态。
  5. CPU A读:
    • 当CPU A的cache处于无效状态时,有处理器读PrRd事件发生,就会发生cache miss这样就会装入新数据,但此时其他的cache可能有也可能没有,所以进入S状态,当然需要总线读事件的支持,所以触发总线读事件BusRd。此时CPU A的cache状态为S状态。
    • 此时处于M状态的CPU B cache,通过总线侦听到有读BusRd的事件时,因为现在我在M状态,我的数据是最新的,所以当然由我提供数据,所以产生FLUSH事件,最后进入S状态。

猜你喜欢

转载自blog.csdn.net/violet_echo_0908/article/details/78839692
今日推荐