CHI事务分类——Read、Dataless

CHI事务分类——Read、Dataless CHI Read 类事务深度解析这张表是ARM CHI 协议中所有读事务的完整分类核心差异体现在是否监听其他节点、是否分配缓存、是否附带缓存管理操作CMO、权限级别。下面我们逐个拆解含义、设计原因和典型场景。一、基础分类逻辑所有 Read 事务都可以按三个维度划分是否触发 Snoop监听其他缓存节点NoSnp完全不监听直接读内存Once轻量级监听不长期维护一致性其他完整监听维护缓存一致性是否在 Requester 分配缓存行NoSnp/Once不分配缓存Non-allocating读完即丢Clean/Shared/Unique分配缓存Allocating保留副本复用是否附带缓存管理操作CMOCleanInvalid/MakeInvalid读 清理 / 失效其他纯读操作二、逐事务详细解析1. ReadNoSnp / ReadNoSnpSep全称Read No Snoop无监听读Sep Separate分离响应核心含义完全不向其他 RN 发送 Snoop 请求不分配缓存读完数据后 Requester 不保留副本Sep表示控制响应和数据传输分离RespSepDataDataSepResp为什么需要访问Non-snoopable 地址空间设备寄存器、片上 SRAM、非一致性内存避免不必要的 Snoop 广播节省带宽和延迟应用场景设备寄存器读如 GPIO、UART 控制寄存器一次性数据读取DMA 源数据、日志读取非一致性内存访问不参与缓存一致性的内存区域2. ReadOnce全称Read Once一次性读核心含义轻量级监听仅检查是否有其他 RN 持有脏数据若有则先写回不分配缓存读完即丢不参与后续一致性维护不会被其他节点 Snoop因为 Requester 无缓存副本为什么需要平衡性能与一致性比ReadNoSnp更安全能读到最新数据比ReadShared更轻量不占缓存适合一次性访问避免缓存污染应用场景一次性数据读取如函数参数、临时变量日志 / 调试信息读取读完即丢无需复用避免缓存污染的一次性 I/O 访问3. ReadOnceCleanInvalid全称Read Once Clean Invalidate一次性读 清理失效核心含义基础行为同ReadOnce额外执行Clean Invalidate将其他 RN 的脏数据写回内存然后失效所有缓存副本为什么需要读操作后需要确保内存数据最新同时清理所有缓存副本为后续写操作或设备访问做准备避免 stale 数据应用场景设备 DMA 读前确保内存数据最新同时失效 CPU 缓存让 DMA 读到干净数据安全敏感数据读取后销毁读完后清理所有缓存副本防止数据泄露4. ReadOnceMakeInvalid全称Read Once Make Invalid一次性读 强制失效核心含义基础行为同ReadOnce额外执行Make Invalid强制失效所有缓存副本无论是否脏为什么需要比CleanInvalid更激进直接失效所有副本不写回脏数据适合明确知道脏数据不需要保留的场景应用场景只读不写的一次性数据读完后直接失效释放缓存资源调试 / 测试场景强制让后续访问重新从内存读取5. ReadClean全称Read Clean读干净数据核心含义分配缓存行Requester 保留Clean干净副本确保读到的是最新干净数据脏数据已被写回其他 RN 仍可保留共享副本为什么需要保证读操作后内存数据与缓存一致为后续读操作复用缓存同时避免脏数据残留应用场景只读数据读取如代码段、常量数据读多写少场景频繁读极少写6. ReadNotSharedDirty全称Read Not Shared Dirty读非共享脏数据核心含义分配缓存行请求独占脏数据确保其他 RN 无共享副本Requester 拿到唯一脏副本为什么需要为后续写操作做准备直接拿到脏副本无需再发起ReadUnique避免写操作时的 Snoop 开销应用场景写前预读即将修改的数据提前拿到独占脏副本无锁数据结构读取确保读取期间数据不被其他节点修改7. ReadShared全称Read Shared读共享核心含义分配缓存行Requester 保留Shared共享副本多个 RN 可同时持有共享副本只能读不能写写操作时需先升级为 Unique 权限为什么需要优化读性能多个 RN 共享同一份缓存副本减少内存访问保证读一致性所有 RN 读到相同数据应用场景多线程读共享数据如全局配置、只读表读多写少场景多个核心频繁读偶尔写8. ReadUnique全称Read Unique读独占核心含义分配缓存行Requester 保留Unique独占副本其他 RN 的缓存副本全部失效Requester 可直接读写无需额外 Snoop为什么需要为写操作做准备拿到独占权限确保修改时无其他节点干扰保证写操作的原子性和一致性应用场景写前预读即将修改的数据提前拿到独占权限临界区数据读取确保独占访问避免竞争9. ReadPreferUnique全称Read Prefer Unique优先读独占核心含义优先尝试获取Unique 权限若无法获取如其他 RN 持有共享副本则降级为 Shared 权限为什么需要自适应性能优化尽量拿到独占权限避免后续写操作的 Snoop 开销若无法独占则退而求其次保证读性能应用场景可能修改的数据大概率会写小概率只读自适应同步场景根据系统负载动态选择权限10. MakeReadUnique全称Make Read Unique升级为独占读权限核心含义纯权限升级事务Requester 已持有 Shared 副本将其升级为 Unique 权限不传输数据仅更新目录和缓存状态为什么需要避免重复读数据已持有有效副本仅需升级权限减少带宽消耗无需重新从内存 / 其他节点读取数据应用场景写前权限升级已读共享数据即将修改先升级为独占细粒度同步先读后写的典型场景三、核心设计意图总结1. 性能与一致性的权衡无监听 / 一次性读NoSnp/Once最低延迟最小带宽适合一次性访问共享读Shared最优读性能多节点复用适合读多写少独占读Unique最强一致性适合写前预读权限升级MakeReadUnique最小开销的权限变更2. 缓存管理与资源优化Non-allocatingNoSnp/Once不占缓存避免缓存污染AllocatingClean/Shared/Unique保留副本复用提升性能CMO 附加CleanInvalid/MakeInvalid读 缓存清理为后续操作做准备3. 场景覆盖从设备寄存器一次性读到多线程共享数据读再到写前独占预读完整覆盖了从底层 I/O 到上层应用的所有读场景是 CHI 协议高可扩展性和高性能的关键体现。四、一句话速记NoSnp/Once一次性读不缓存适合设备 / 临时数据Clean/Shared共享读多节点复用适合读多写少Unique/PreferUnique独占读为写做准备适合临界区MakeReadUnique权限升级不读数据只改权限CleanInvalid/MakeInvalid读 清理失效为后续设备 / 写操作做准备 CHI Read 类事务对比表我把所有 Read 事务按核心维度整理成了一张对比表方便你快速区分和记忆表格事务名称是否 Snoop是否分配缓存权限 / 状态核心行为典型场景ReadNoSnp / ReadNoSnpSep❌ 完全不监听❌ 不分配Non-allocating无直接读内存不维护一致性设备寄存器、非一致性内存、一次性 I/O 读ReadOnce⚠️ 轻量级监听仅查脏❌ 不分配无读最新数据读完即丢临时变量、日志读取、避免缓存污染的一次性访问ReadOnceCleanInvalid⚠️ 轻量级监听❌ 不分配无读 Clean写回脏数据Invalid失效所有副本DMA 读前准备、安全数据销毁ReadOnceMakeInvalid⚠️ 轻量级监听❌ 不分配无读 Invalid强制失效所有副本不写回脏数据只读不写的一次性数据、调试场景ReadClean✅ 完整监听✅ 分配Clean干净共享读最新干净数据保留可复用副本代码段、常量、读多写少的只读数据ReadNotSharedDirty✅ 完整监听✅ 分配Unique Dirty独占脏读独占脏副本其他节点无共享写前预读、无锁数据结构读取ReadShared✅ 完整监听✅ 分配Shared共享可读多节点共享副本只能读不能写多线程读共享配置、全局只读表ReadUnique✅ 完整监听✅ 分配Unique独占可写独占副本失效其他节点所有副本写前预读、临界区数据访问ReadPreferUnique✅ 完整监听✅ 分配优先 Unique降级 Shared尝试拿独占失败则共享大概率会修改的数据、自适应同步场景MakeReadUnique✅ 完整监听✅ 已分配仅升级权限Shared → Unique纯权限升级不传输数据已读共享数据即将修改前的权限升级 关键差异解读是否分配缓存不分配Non-allocatingNoSnp/Once系列读完不保留副本适合一次性访问避免缓存污染。分配AllocatingClean/Shared/Unique系列保留缓存副本后续访问可直接命中提升性能。Snoop 行为无 SnoopNoSnp系列完全不监听其他节点直接读内存适合非一致性地址空间。轻量级 SnoopOnce系列仅检查是否有脏数据读完即丢不参与后续一致性维护。完整 Snoop其余事务完整维护缓存一致性确保多节点数据同步。权限与场景读多写少ReadShared/ReadClean多节点共享副本读性能最优。写前准备ReadUnique/ReadNotSharedDirty/MakeReadUnique获取独占权限避免写时 Snoop 开销。一次性 / 设备访问NoSnp/Once系列低延迟、低带宽不污染缓存。 一句话记忆口诀一次性读用 NoSnp/Once设备临时不占缓存多读共享用 Shared代码常量最适合要写先拿 Unique 权临界数据更安全已读要改 MakeUnique省带宽又高效 CHI Dataless无数据事务深度解析这张表列出的是CHI 协议中「无数据 payload」的纯控制类事务它们不携带任何数据只用于缓存状态管理、权限变更、驱逐、Stash 推送和持久化是保证缓存一致性、优化资源利用和实现高级特性的核心控制面操作。一、核心概念什么是 Dataless 事务Dataless 无数据载荷事务消息中只有控制信息地址、权限、状态等没有数据 payload。核心作用只修改缓存 / 目录状态不传输数据大幅节省带宽避免无效数据传输。本质属于CMOCache Maintenance Operation或纯权限 / 状态变更事务。二、逐事务详细解析1. CleanUnique核心含义将目标缓存行写回脏数据Clean并置为Unique独占状态。行为若缓存行是脏的将数据写回内存 / Home。将缓存行状态从Dirty→Clean Unique。保证 Requester 持有独占干净副本其他节点无副本。为什么需要既保证内存数据一致性脏数据回写又为后续写操作保留独占权限。避免写操作时再次发起 Snoop 抢占权限。应用场景写前准备即将修改数据先将脏行回写并保持独占。锁释放后保留独占访问释放锁但仍需独占修改权限。2. MakeUnique核心含义将共享缓存行升级为 Unique独占状态不写回脏数据。行为向其他持有共享副本的节点发送 Snoop失效它们的副本。将 Requester 的缓存行从Shared→Unique。若行是脏的脏数据仍保留在 Requester 缓存中不回写。为什么需要纯权限升级不传输数据带宽效率极高。为后续写操作做准备无需重新读取数据。应用场景已读共享数据即将修改先升级为独占权限避免写时 Snoop 开销。细粒度同步先读后写的典型场景。3. Evict核心含义驱逐缓存行将其从 Requester 缓存中移除。行为若缓存行是脏的先将数据写回内存 / Home。通知 Home 更新目录状态标记该地址无 Requester 副本。释放缓存资源。为什么需要缓存容量管理缓存满时按替换算法如 LRU驱逐冷数据。地址空间释放进程退出、内存解绑时清理对应缓存行。应用场景缓存替换如 LRU 驱逐。进程 / 虚拟机销毁释放物理内存。动态内存分区调整清理指定地址范围缓存。4. StashOnceUnique / StashOnceSepUnique核心含义将数据Stash推送到目标节点Stashee并置为Unique独占状态Sep表示需要StashDone完成确认。行为Home 向 Stashee 发送SnpStashUnique推送数据。Stashee 分配缓存行置为Unique状态。Sep版本Stashee 回复StashDone确认 Stash 成功。为什么需要主动推送数据让目标节点后续访问直接命中缓存降低延迟。置为 Unique 状态方便目标节点直接修改数据。应用场景线程 / 进程迁移将线程即将修改的数据提前推送到目标 CPU 簇。异构计算加速器计算完成后将结果推送给 CPU 簇方便 CPU 直接修改。5. StashOnceShared / StashOnceSepShared核心含义将数据Stash推送到目标节点置为Shared共享状态Sep表示需要StashDone确认。行为Home 向 Stashee 发送SnpStashShared推送数据。Stashee 分配缓存行置为Shared状态。Sep版本Stashee 回复StashDone。为什么需要主动推送只读数据让多个节点共享缓存副本优化读性能。避免目标节点从内存读取降低延迟。应用场景数据预热将只读共享数据如配置、常量提前推送到多个 CPU 簇。多线程读场景线程即将读取共享数据提前 Stash 到目标节点。6. CleanShared核心含义将脏缓存行写回Clean并置为Shared共享状态。行为将脏数据写回内存 / Home。将缓存行状态从Dirty→Clean Shared。允许其他节点持有共享副本。为什么需要保证内存数据一致性同时释放独占权限允许多节点读共享。避免脏数据残留为读共享场景做准备。应用场景写操作完成后释放独占权限允许其他节点读共享。脏行回写并共享如数据库事务提交后数据变为只读共享。7. CleanSharedPersist / CleanSharedPersistSep核心含义CleanShared持久化Persist将脏数据写回、置为共享状态并保证数据落盘到非易失性存储Sep表示分离完成响应。行为执行CleanShared流程。触发持久化操作确保数据写入 NVDIMM/SSD 等非易失性存储。Sep版本分离CompCMO和Persist响应。为什么需要满足持久内存 / 存储级内存SCM场景保证数据掉电不丢失。兼顾缓存一致性和持久化语义。应用场景持久内存操作将脏数据回写并持久化同时保持共享状态。数据库事务提交保证数据落盘同时允许多节点读共享。8. CleanInvalid核心含义将脏缓存行写回Clean并失效Invalid。行为将脏数据写回内存 / Home。失效所有缓存副本包括 Requester 自身。目录状态标记为Invalid。为什么需要保证内存数据最新同时清理所有缓存副本避免 stale 数据。为后续设备 DMA 读或写操作做准备。应用场景DMA 读前准备确保内存数据最新同时失效 CPU 缓存让 DMA 读到干净数据。安全数据销毁写完敏感数据后清理所有缓存副本。9. MakeInvalid核心含义强制失效Invalid所有缓存副本不写回脏数据。行为向所有持有副本的节点发送 Snoop失效它们的缓存行。目录状态标记为Invalid。脏数据被丢弃不回写内存。为什么需要快速释放缓存资源无需写回脏数据适合脏数据无用场景。强制让后续访问重新从内存读取保证数据一致性。应用场景只读不写数据读完后直接失效释放缓存。调试 / 测试场景强制让后续访问重新从内存读取验证内存数据。丢弃无用脏数据如事务回滚脏数据无需保留。三、核心设计意图总结1. 带宽优化所有 Dataless 事务不携带数据 payload仅传输控制信息带宽占用极低。相比带数据的事务如 WriteBack节省 90% 以上带宽特别适合缓存状态频繁变更的场景。2. 缓存一致性与状态管理覆盖从权限变更MakeUnique、脏数据回写CleanShared、缓存驱逐Evict到失效MakeInvalid的全生命周期状态管理。保证多节点缓存状态与目录状态同步避免数据不一致和 stale 数据。3. 高级特性支持Stash 事务主动推送数据优化数据访问延迟支持线程迁移、异构计算。Persist 事务支持持久内存场景保证数据落盘满足掉电不丢数据的需求。CMO 事务为设备 DMA、安全场景提供缓存清理 / 失效能力。4. 资源管理Evict释放缓存资源避免缓存污染保证缓存容量高效利用。Invalid快速清理缓存副本释放资源。四、一句话速记权限变更CleanUnique/MakeUnique→ 为写操作准备独占权限缓存驱逐Evict→ 释放缓存资源脏数据回写数据推送StashOnce*→ 主动推送数据到目标节点优化访问延迟脏数据处理CleanShared/CleanInvalid→ 写回脏数据保持共享或失效持久化CleanSharedPersist*→ 写回 共享 持久化保证数据落盘强制失效MakeInvalid→ 丢弃脏数据强制失效所有副本 关键场景速查表表格事务核心行为典型场景CleanUnique脏回写 独占写前准备保留独占权限MakeUnique共享 → 独占无数据已读共享即将修改Evict脏回写 驱逐缓存替换、进程销毁StashOnceUnique推送 独占线程迁移、异构计算待修改StashOnceShared推送 共享数据预热、多线程读CleanShared脏回写 共享写后释放独占允许多读CleanSharedPersist脏回写 共享 持久化持久内存、数据库提交CleanInvalid脏回写 失效DMA 读前、安全数据销毁MakeInvalid强制失效不写回只读数据、事务回滚、调试 CHI Dataless 事务核心对比表我将所有无数据事务按核心行为、状态变化、是否写回脏数据等维度整理成了对比表方便你快速区分和记忆表格事务名称是否写回脏数据缓存状态变化核心行为典型场景CleanUnique✅ 是Dirty → Clean Unique脏数据回写内存保留独占干净副本写前准备、锁释放后仍需独占修改MakeUnique❌ 否Shared → Unique纯权限升级失效其他共享副本不回写脏数据已读共享数据即将修改前的权限升级Evict✅ 是若脏Any → Invalid驱逐脏数据回写后将缓存行从本地移除并更新目录缓存替换LRU、进程 / VM 销毁StashOnceUniqueStashOnceSepUnique✅ 是若脏- → Unique目标节点主动将数据推送到目标节点置为独占状态Sep 版需 StashDone 确认线程 / 进程迁移、异构计算待修改数据StashOnceSharedStashOnceSepShared✅ 是若脏- → Shared目标节点主动将数据推送到目标节点置为共享状态Sep 版需 StashDone 确认数据预热、多线程只读共享数据CleanShared✅ 是Dirty → Clean Shared脏数据回写内存将独占 / 脏状态转为共享干净状态写操作完成后释放独占允许多节点读共享CleanSharedPersistCleanSharedPersistSep✅ 是Dirty → Clean Shared Persist脏数据回写 共享状态额外保证数据落盘到非易失性存储Sep 版分离响应持久内存操作、数据库事务提交CleanInvalid✅ 是Any → Invalid脏数据回写内存后失效所有缓存副本包括自身DMA 读前准备、安全敏感数据销毁MakeInvalid❌ 否Any → Invalid直接失效所有缓存副本丢弃脏数据不回写只读不写数据、事务回滚、调试场景 关键差异解读是否写回脏数据✅写回CleanUnique/Evict/CleanShared/CleanInvalid/CleanSharedPersist/StashOnce*—— 保证内存数据一致性避免数据丢失。❌不写回MakeUnique/MakeInvalid—— 适合脏数据无用场景如事务回滚、只读数据节省带宽和延迟。缓存状态与资源管理权限升级CleanUnique/MakeUnique—— 为后续写操作准备独占权限避免写时 Snoop 开销。资源释放Evict/MakeInvalid/CleanInvalid—— 驱逐或失效缓存行释放缓存资源。状态共享CleanShared—— 释放独占权限允许多节点读共享优化读性能。高级特性Stash 推送StashOnce*—— 主动将数据推送到目标节点缓存避免后续内存访问优化延迟。持久化CleanSharedPersist*—— 额外保证数据落盘到非易失性存储满足持久内存 / 数据库场景的掉电不丢需求。 一句话记忆口诀要写先拿 Unique 权脏行回写用 CleanUnique已读要改 MakeUnique纯升权限省带宽缓存满了用 Evict脏数据回写再驱逐数据预热 StashShared待改数据 StashUnique写后共享 CleanShared持久落盘加 PersistDMA 前用 CleanInvalid脏回失效保安全无用脏数 MakeInvalid直接丢弃不回写