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 状态迁移图
完整实现(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("全部迁移路径验证通过")
运行与验证
- 保存为
mesi_single.py,执行python mesi_single.py。 - 观察输出:每条迁移打印
[PASS],最后打印“全部迁移路径验证通过”。 - 通过条件:所有断言不抛异常,且覆盖 I→E、E→M、M→I、I→M 四条关键路径。
若需扩展:把 snoop() 拆成 snoop_read/snoop_write,可分别验证 M→S(共享降级)与 M→I(失效)两条路径,本案例保持单核最小闭环不展开。