0

那么,正如标题所说,处理器 0 的行 A 是否有可能处于共享 (S) 状态,而处理器 1 的行 B 是否有可能处于无效 (I) 状态?


想象以下情况:

  • P0:A线| 修改的
  • P1:A线| 无效的
  • P2:A线| 无效的

如果 P2 向 A 行发出读取请求,那么 P1 的最终状态是什么?共享还是保持无效?

4

1 回答 1

2

TL;博士

P1 的线路 A 仍将处于无效状态。其他处理器的操作不能更改无效状态。
P0 和 P2 的线路 A 都处于共享状态。


MSI 协议的维基百科页面上有算法的状态机描述。
除了英文描述,还有两张图片。

给定一组处理器及其相关的高速缓存行,处理器可以通过在“加载/读取”和“存储/写入”之间执行一个操作来“激活”,也可以通过监听总线上的事件来“被动”。

MSI(和类似)协议的输入是一个动作或一个总线事件。为简单起见,Wikipedia 将状态机分为两种:一种是输入是动作,另一种是输入是总线事件。这样,您可以使用一张图片来计算有源处理器(恰好是一个)线路的新状态,并使用另一张图片来计算无源处理器线路的状态。

假设处理器 X 是活动处理器,因此会进行加载或存储。

第一张图片描述了处理器 X(活动处理器)的缓存线状态如何变化:

在此处输入图像描述

每个标签的格式为x/y,其中x是输入操作(PrRd用于加载/读取或PrWr用于存储/写入),y是发出的总线事件(“-”表示在公共汽车)。

第二张图片类似地使用,但用于无源处理器(除处理器 X 之外的任何处理器):

在此处输入图像描述

这里的每个标签也是x/y对,但x是总线事件,y是总线动作。

巴士事件是:

  • BusRd -> 另一个处理器需要从内存(或上层缓存)读取一行。
  • BusRdX -> 另一个处理器需要从内存(或上层缓存)读取一行,但随后会立即修改它(即因为它正在执行写入)。
  • BugUpgr -> 另一个处理器刚刚写入了它的一个缓存行,该缓存行目前只被读取。

当然,Flush是将一行写入内存的行为。维基百科认为它是一个总线事务(我认为它是一个总线动作,因为它不被用作输入)。

我们现在准备回答您的问题。


P2 是活动处理器,需要读取 A 行,因此它执行PrRd。第一张图告诉我们,它的线路 A 将最终处于 S 状态,并且在总线上发出了BusRd(注意,这是一个心智模型,真正的硬件可能不会发送特殊事务,而是会检测读取本身)。

P2: LineA -> Shared

P0 和 P1 都是被动处理器,都可以看到BusRd
P0 的线路处于 Modified 状态,第二张图片告诉我们它将刷新线路(使最后一个值可用于 P2)并将线路 A 设置为状态 Shared。
P1 的线路处于 Invalid 状态,从第二张图片中我们看到,对于被动处理器来说,没有办法逃脱 Invalid 状态。具体来说,BusRd输入将再次将线路 A 的状态设置为无效(实际上它被忽略了)。

因此,在从 P2 读取之后,我们有:

P0: LineA -> Shared
P1: LineA -> Invalid
P2: LineA -> Shared
于 2021-05-19T15:02:44.577 回答