4. 缓存基本原理与航电适用性

缓存之所以能提升性能,本质是利用了程序访问的时间局部性与空间局部性:刚被访问的数据很可能再次被访问,相邻地址的数据很可能随后被用到。但缓存要真正落地,必须回答四个工程问题:主存块放到缓存的哪个位置(映射方式)、缓存满了淘汰谁(替换策略)、写操作如何同步到主存(写策略)、多核或多主设备访问同一数据时如何保证一致(一致性模型)。在航电计算平台中,这四个问题还要额外叠加一个约束——可预测性,即最坏执行时间(WCET)必须可分析、可界定。

映射方式:从直接映射到全相联

映射方式决定主存块与缓存行之间的对应关系。设缓存有 C 行、每行 L 字节、组相联度为 W,则组数 S = C / W。主存地址可拆为三部分:

| Tag | Set Index | Block Offset |
        log2(S)     log2(L)

直接映射(W=1)中,主存块只能放入唯一一行,索引位直接决定位置,硬件最简单、命中判断最快,但冲突缺失严重:两个频繁交替访问、索引相同的地址会反复互相驱逐。全相联(W=C)允许块放入任意行,冲突缺失最少,但需要并行比较所有 Tag,面积、功耗和比较延迟都高。组相联(如 2 路、4 路)是折中:块先由索引定位到某一组,再在组内若干路中任选一行,兼顾命中率与硬件成本。航电处理器中常见的 L1 多用 2~4 路组相联,L2 用 8~16 路。

替换策略:LRU 及其可预测性代价

组相联和全相联在组满时需要替换。经典策略是 LRU(最近最少使用),它贴合时间局部性,平均命中率高。但 LRU 需要为每路维护使用顺序,且其行为依赖历史访问序列,导致 WCET 分析必须枚举大量访问历史,可预测性差。因此实时与航电系统常改用:

  • 伪 LRU / 树形 PLRU:用每组的二叉树位近似记录最近使用侧,硬件开销小,但仍是动态策略。
  • FIFO / 轮转:按固定顺序淘汰,与访问历史无关,最坏情况容易界定。
  • 锁定(Locking / 分区):把关键代码或数据锁定在指定路,使其永不被驱逐,把不确定的缓存行为转化为确定的“类 SRAM”访问。

例如某航电任务的关键控制律代码约 6 KB,L1 指令缓存为 16 KB、4 路组相联、行 32 B。若将其中 2 路锁定给该代码,则剩余 2 路供其他代码使用,关键路径的取指命中行为可静态确定,代价是通用代码可用容量下降,需在集成阶段评估。

写策略:写直达与写回

写命中时有两种选择。写直达(Write-Through)每次写都同时更新缓存和主存,一致性好、实现简单,但写带宽压力大,通常配合写缓冲吸收延迟。写回(Write-Back)只更新缓存行并置脏位,行被替换时才写回主存,写带宽省,但主存中的数据可能暂时陈旧,且替换时的写回延迟会引入抖动。写缺失时还有写分配(先取块再写)与非写分配(直接写主存)之分。航电中若某段数据被 DMA 或另一核读取,写回带来的“主存副本滞后”必须由软件显式刷新或由硬件一致性协议处理,否则会读到旧值。

缓存一致性模型

多核共享主存时,各核私有缓存可能持有同一地址的不同副本。一致性协议要保证:任一时刻对同一地址的读都能看到最新写。常见模型包括:

  • 强一致 / 顺序一致:所有访问按程序顺序全局可见,最直观但限制并行与优化。
  • 弱一致 / 释放一致:允许读写重排,但通过 acquire/release 或屏障建立同步点,性能好,需软件正确配对屏障。
  • MESI 类监听协议:行处于 Modified / Exclusive / Shared / Invalid 状态,写前需取得独占权,其他副本被作废。

航电多核 SoC 中,若两核通过共享内存交换传感器数据,必须明确使用哪一级同步原语,并确认缓存维护操作(如 clean/invalidate by address 或 by set/way)覆盖了所有相关行,否则会出现“数据已写但对方读到旧值”的隐蔽故障。

航电场景下的缓存可预测性挑战

通用处理器追求平均性能,而航电关注最坏情况。缓存带来的不确定性主要来自三处:冲突缺失(不同任务争抢同一组)、替换决策(历史相关)、共享资源干扰(多核争用 L2/总线)。应对手段包括:对关键任务做缓存分区或路锁定;用静态分析工具计算缓存命中/缺失的最坏序列;在时间分区调度下,于任务切换点执行缓存刷新或分区切换;对 DMA 与缓存交互采用非缓存映射或显式维护。下图给出从地址到命中判断、再到一致性维护的整体关系。

缓存映射、替换、写策略与一致性关系图 主存地址拆分 Tag Set Index Offset 映射方式(组数 S=C/W) 直接映射 W=1:唯一行,冲突缺失高 组相联 W=2/4:组内任选,折中 全相联 W=C:任意行,比较开销大 替换策略 LRU:命中高,WCET 难分析 PLRU / FIFO:近似或固定顺序 路锁定:关键代码常驻 写策略 写直达:主存同步更新,带宽压力大 写回:脏位标记,替换时写回 写分配 / 非写分配 命中判断 Tag 与组内各路比较: 命中 → 读/写该行 缺失 → 取块 + 按策略替换 (缺失延迟是 WCET 主要抖动源) 缓存一致性模型(多核 / DMA 共享数据) 强一致 / 顺序一致 弱一致 + 屏障 MESI 监听协议 写前取得独占权,作废其他副本;DMA 需 clean/invalidate 维护 航电可预测性约束:冲突缺失 + 替换历史 + 多核干扰 → 用分区 / 路锁定 / 静态分析 / 时间分区刷新收敛 WCET

把上述关系落到工程实践,可形成如下检查要点:确认关键任务的代码与数据是否已锁定或分区;确认替换策略是否与 WCET 分析工具假设一致;确认写回数据在交给 DMA 或其他核之前是否已 clean;确认多核共享区的同步原语与缓存维护操作配对正确。只有这四点闭合,缓存带来的性能收益才不会以牺牲确定性为代价。