在 ACE(AXI Coherency Extensions)协议中,Clean 和 Make 是两类核心的缓存一致性操作,用于管理缓存行的状态和权限,确保多核系统中数据的一致性。
一、Clean 操作(清理操作)
核心目的
将本地缓存中处于 Dirty 状态(数据与主存不一致)的缓存行,写回到下一级存储(如 L2 或主存),并将其状态更新为 Clean (数据一致,无修改权限)或 Invalid(无效)。
典型场景
- 当一个缓存行需要被替换(Eviction)时,若其为 Dirty 状态,必须先执行 Clean 操作写回数据,以避免数据丢失。
- 当其他 Master 发起对同一地址的读操作时,本地 Master 需执行 Clean 操作,确保其他 Master 能读到最新数据。
常见 ACE 事务
- CleanShared:将 Dirty 缓存行写回,状态变为 Shared(共享可读)。
- CleanInvalid:将 Dirty 缓存行写回,状态变为 Invalid(无效)。
- CleanUnique:将 Dirty 缓存行写回,状态变为 Unique(独占)。
二、Make 操作(置位操作)
核心目的
主动将本地缓存中的某一缓存行的状态设置为 Unique(独占),从而获得对该数据的修改权限。这是执行写操作前的关键步骤。
典型场景
- 当 CPU 需要对一个缓存行进行写操作,但该缓存行当前处于 Shared 或 Invalid 状态时,必须先执行 MakeUnique 操作,获取独占修改权。
- 这会触发总线事务,通知其他所有 Master 使它们对应的缓存行副本变为 Invalid,确保本地 Master 是唯一拥有者。
常见 ACE 事务
- MakeUnique:将缓存行状态置为 Unique,获得独占修改权限。
- MakeInvalid:将缓存行状态置为 Invalid,放弃所有权。
三、Clean vs. Make:核心区别
| 特性 | Clean 操作 | Make 操作 |
|---|---|---|
| 核心目标 | 确保数据一致性,将 Dirty 数据写回 | 获取修改权限,将状态置为 Unique |
| 状态转换 | Dirty → Clean / Invalid / Shared / Unique | Shared / Invalid → Unique |
| 总线事务 | CleanShared, CleanInvalid, CleanUnique | MakeUnique, MakeInvalid |
| 触发时机 | 缓存替换、响应其他 Master 的读请求 | 执行写操作前,需要独占权限时 |
四、结合状态机的理解
- Dirty → CleanShared :执行
CleanShared操作,数据写回,状态变为 Shared,允许其他 Master 读取。 - Dirty → CleanInvalid :执行
CleanInvalid操作,数据写回,状态变为 Invalid,放弃所有权。 - Shared → Unique :执行
MakeUnique操作,获得独占权限,准备修改数据。 - Unique → Dirty:本地修改数据后,状态自动变为 Dirty,等待后续 Clean 操作。
下面是 ACE 协议中 Clean / Make 操作与缓存行状态转换对照表,覆盖常见场景和典型事务类型:
五、Clean 操作(写回 + 状态更新)
| 操作 / 事务 | 前状态 | 后状态 | 核心行为 | 典型触发场景 |
|---|---|---|---|---|
| CleanShared | Dirty | Shared | 将 Dirty 行写回下一级存储,变为 Shared(共享可读) | 响应其他 Master 的读请求,保证数据一致 |
| CleanInvalid | Dirty | Invalid | 将 Dirty 行写回,然后置为 Invalid(放弃该缓存行) | 缓存行替换(Eviction),或主动放弃数据所有权 |
| CleanUnique | Dirty | Unique | 将 Dirty 行写回,保持 Unique 独占权限 | 写操作完成后,仍需独占该缓存行,避免频繁重新获取权限 |
| CleanShared | Clean | Shared | 无写回,直接转为 Shared(数据已一致) | 响应其他 Master 的读请求,共享数据 |
| CleanInvalid | Clean | Invalid | 无写回,直接置为 Invalid | 主动放弃缓存行,或响应 snoop 使无效 |
注:Clean 操作的核心是 "写回 Dirty 数据",如果缓存行本来就是 Clean(与主存一致),则只做状态转换,不写回。
六、Make 操作(获取 / 放弃权限)
| 操作 / 事务 | 前状态 | 后状态 | 核心行为 | 典型触发场景 |
|---|---|---|---|---|
| MakeUnique | Shared / Clean / Invalid | Unique | 发起总线事务,通知其他 Master 使对应缓存行无效,本地获得独占权限 | 执行写操作前,必须先获取 Unique 权限 |
| MakeUnique | Unique | Unique | 无变化,保持独占权限 | 再次确认独占,或处理 snoop 后重新获取 |
| MakeInvalid | Shared / Unique / Clean | Invalid | 主动放弃缓存行,置为无效 | 响应 snoop 使无效,或主动释放数据所有权 |
七、常见完整流程示例
-
写前准备:Shared → Unique
- 触发:
MakeUnique - 行为:通知其他 Master 使对应缓存行无效 → 本地变为 Unique → 可安全写入
- 写入后:Unique → Dirty
- 触发:
-
缓存替换:Dirty → CleanInvalid
- 触发:
CleanInvalid - 行为:写回 Dirty 数据 → 置为 Invalid → 腾出缓存空间
- 触发:
-
响应读请求:Dirty → CleanShared
- 触发:
CleanShared - 行为:写回 Dirty 数据 → 变为 Shared → 其他 Master 可安全读取
- 触发: