1. MESI 状态机基础验证

任务目标

在单核环境下实现一个最小 MESI 状态机,通过读、写、外部窥探(snoop)三类事件驱动状态迁移,并用断言验证 I/S/E/M 四态的基本迁移路径。

状态迁移规则(单核)

  • I + PrRd → E(无其他缓存副本,独占干净)
  • I + PrWr → M(写命中即独占修改)
  • E + PrRd → E;E + PrWr → M
  • S + PrRd → S;S + PrWr → M(升级为修改)
  • M + PrRd → M;M + PrWr → M
  • 任意态 + Snoop(其他核请求) → I(本核失效)

SVG:单核 MESI 状态迁移图

I E S M PrRd PrWr PrWr PrWr Snoop Snoop → I

完整实现(Python,可直接运行)

from enum import Enum

class M(Enum):
    I = "I"; S = "S"; E = "E"; M = "M"

class MESI:
    def __init__(self):
        self.state = M.I

    def pr_read(self):
        # 单核:I→E(无其他副本),其余保持
        if self.state == M.I:
            self.state = M.E
        return self.state

    def pr_write(self):
        # 任意态写命中 → M
        self.state = M.M
        return self.state

    def snoop(self):
        # 其他核请求本核数据 → 本核失效
        self.state = M.I
        return self.state

def check(desc, got, want):
    ok = got == want
    print(f"[{'PASS' if ok else 'FAIL'}] {desc}: got={got.value} want={want.value}")
    assert ok, desc

if __name__ == "__main__":
    c = MESI()
    check("初始态", c.state, M.I)
    check("I+PrRd→E", c.pr_read(), M.E)
    check("E+PrRd→E", c.pr_read(), M.E)
    check("E+PrWr→M", c.pr_write(), M.M)
    check("M+PrRd→M", c.pr_read(), M.M)
    check("M+PrWr→M", c.pr_write(), M.M)
    check("M+Snoop→I", c.snoop(), M.I)
    check("I+PrWr→M", c.pr_write(), M.M)
    check("M+Snoop→I", c.snoop(), M.I)
    check("I+PrRd→E", c.pr_read(), M.E)
    print("全部迁移路径验证通过")

运行与验证

  1. 保存为 mesi_single.py,执行 python mesi_single.py。
  2. 观察输出:每条迁移打印 [PASS],最后打印“全部迁移路径验证通过”。
  3. 通过条件:所有断言不抛异常,且覆盖 I→E、E→M、M→I、I→M 四条关键路径。

若需扩展:把 snoop() 拆成 snoop_read/snoop_write,可分别验证 M→S(共享降级)与 M→I(失效)两条路径,本案例保持单核最小闭环不展开。