主题
写传播 是 cache 的基础特性 . 而 写传播是为了 维护 缓存一致性而新增的
写策略是考虑的是内层传播到外层。写传播考虑的是传播到同一层的其它缓存
写策略和写传播都属于传播,在一个多核架构中, 应该有三个特性(how,When_actual,When_visible)
但是 实际上 写策略和写传播只定义了 三元组中的 how,When_actual , 串行化定义了When_visible
🧠 写策略 / 写传播 都包含:
维度 | 含义 | 谁控制 / 定义 |
---|---|---|
How | 如何传播(通过什么路径/机制) | 策略本身:Write-Back / Invalidate 等 |
When₁(实际发生) | 行为何时在系统中物理执行 | Cache 控制器 / 一致性协议 |
When₂(可见顺序) | 系统中其他核心何时认为它发生了 | ✅ 串行化机制(如 memory model) |
📌 举例再强化这个模型(可用于写论文、讲课):
对于写策略(如 Write-Back):
- How:数据先写入 L1 Cache,不直接写主存
- When₁:只有在该 cache line 被替换或显式 flush 时才写主存
- When₂:其他核只能在系统保证“这次写已经生效”的顺序之后看到(串行化控制)
对于写传播(如 Invalidate-based MESI):
- How:通过 Invalidate 机制通知其他核放弃该行副本
- When₁:Invalidate 消息实际什么时候发出(可能延迟、可能打包发送)
- When₂:系统保证所有核都认为这个写已经生效之后(比如在 memory barrier 之后 load 必须看到这个值)
✅ 可以封装成一个“写传播/写策略三元语义模型”:
操作 = (How, When_actual, When_visible)
其中:
- How: 由协议/策略定义的传播机制
- When_actual: 实际执行时间,由控制器/硬件实现
- When_visible: 全局可见时间,由串行化机制统一控制
🌟 总结句式(推荐用于文档或教材):
无论是写策略还是写传播,其完整行为都可以建模为 (How, When_actual, When_visible) 三元组。
其中 How 决定了传播机制,When_actual 决定了物理传播时机,When_visible 则由串行化机制定义一致性可见性。
这三元模型统一了“行为层”和“一致性层”的语义接口。
🧠 写策略和写传播都没有定义 when_visible
,但它们都定义了 how
和 when_actual
。
✅ how
(怎么传播)
- 写策略:定义写的是 L1、L2、还是主存?通过什么路径?(Write-through / Write-back)
- 写传播:定义传播方式是 Invalidate / Update?
👉 ✅ 都有明确定义。
✅ when_actual
(物理行为什么时候发生)
写策略:
- Write-through:写入时立即写主存 ⇒ when_actual 明确。
- Write-back:只有在替换、flush 时写 ⇒ when_actual 延后,但由策略定义清楚。
写传播:
协议定义何时触发传播动作,例如:
- 写 miss 时触发 Invalidate
- 有 memory barrier 时触发
由协议状态机 + 控制器行为决定传播的真实发起时间点
👉 ✅ 两者都定义了具体行为什么时候触发,属于 when_actual。
❌ when_visible
(全系统认为“它发生了”的时间点)
这是一个逻辑顺序,由一致性模型 / 串行化机制决定,而不是写策略或传播机制单独能定义的。
比如一个写已经写到 L1(或者 invalidate 已经发出),但**系统是否允许其他核 load 看到它?**取决于串行化约束,比如:
- 是否需要 memory barrier?
- 是否 store-load 顺序要维护?
👉 所以:
写策略和写传播本身并不定义
when_visible
,它是由 串行化机制(consistency model)统一定义的全局行为语义。
✅ 所以你说得很对,可以总结为:
写策略和写传播分别定义了传播的
how
与when_actual
,但它们并不定义when_visible
;
when_visible
由串行化机制提供,是系统级一致性语义的核心控制点。
🧠 可视化三层职责图:
┌──────────────┐
│ 串行化机制 │ ← 定义 when_visible
└──────────────┘
▲
│
┌──────────────────────┴──────────────────────┐
│ │
┌──────────────┐ ┌────────────────┐
│ 写策略 │ ← 定义 how, when_actual │ 写传播 │ ← 定义 how, when_actual
└──────────────┘ └────────────────┘
✅ 总结句式(推荐记下来):
写策略和写传播负责定义传播机制与触发时机(how + when_actual),
而是否对其他核心“可见”,即when_visible
,由串行化机制统一调度控制。
这构成了缓存一致性语义的三层职责划分:机制层、行为层、观察层。