CPU学习笔记————cache(2)

1 哈佛架构

哈佛架构(Harvard Architecture)是一种计算机体系结构,其核心特点是:指令存储和数据存储彼此独立,拥有各自的存储空间和访问通道。这与把指令和数据放在同一存储空间中的冯·诺依曼架构形成鲜明对比。

哈佛架构最大的优势在于提高并行度。这种结构使得 CPU 可以在同一个时钟周期内,一边从指令存储器取下一条指令,一边从数据存储器读写操作数,从硬件层面避免了资源冲突。由于取指和访存不再竞争同一条总线,流水线中的取指阶段和执行阶段可以稳定并行工作,这对提升指令吞吐率非常有利。

当然哈佛架构并非没有成本,其主要问题在于系统复杂度增加:指令和数据分属不同存储体系,硬件更复杂;软件模型不再是完全统一的地址空间;某些行为(如自修改代码)实现困难或被限制

这使得纯哈佛架构在通用计算机中并不常见,更适合特定领域或嵌入式场景。

2 改进的哈佛架构

现代通用处理器大多采用的是改进的哈佛架构,即:

  • 在 Cache 层面:

    • 指令 Cache(I-Cache)和数据 Cache(D-Cache)分离

  • 在主存和编程模型层面:

    • 指令和数据仍共享统一的内存地址空间

这种做法在硬件上保留了并行访问的优势,在软件上又维持了统一的编程视角,是性能与易用性的折中方案。

3 多级cache

多级 Cache 指的是在处理器内部按照访问速度和容量大小,设置不止一层缓存结构,常见的形式是 L1、L2 以及 L3 Cache。这种设计并不是为了增加存储容量本身,而是为了在 CPU 极快的运算速度和内存较慢的访问速度之间,构建一个层次化的缓冲体系,从而降低平均访存延迟,提高整体执行效率。

3.1 为什么需要多级 Cache

单一 Cache 很难同时做到“又大又快”。靠近 CPU 的缓存如果做得太大,会严重影响时序和功耗;而如果做得太小,又无法有效缓解内存访问带来的性能瓶颈。多级 Cache 通过把最频繁访问的数据放在最靠近 CPU 的高速小 Cache 中,把访问频率较低的数据逐级下沉到更大但更慢的 Cache 层级,从工程上解决了速度与容量之间的矛盾。

3.2 各级 Cache 的角色分工

在典型处理器中,L1 Cache 直接服务于流水线,要求极低的访问延迟,通常被拆分为指令 Cache 和数据 Cache;L2 Cache 作为 L1 的后备缓存,容量更大,用来吸收大部分 L1 缺失;而 L3 Cache 往往被多个核心共享,用于减少多核系统对主存的访问压力。这种分工使得大多数访问都停留在高层 Cache,只有少量请求才会落到内存。

离 CPU 最近的 L1 Cache,几乎是流水线的一部分。它的访问延迟直接决定了取指和访存是否能做到“每拍一次”。如果 L1 Cache 慢,整个流水线就会插入气泡,性能立刻下降。因此 L1 Cache 的设计目标是:容量不是第一位,而是时序。

L2 和 L3 Cache 并不追求极限速度,它们存在的意义在于减少“灾难性慢访问”的发生概率。当 L1 Cache 缺失时,如果直接访问内存,流水线会被长时间阻塞;而如果中间还有一层或两层 Cache,大量访问可以在“次慢”的层级被解决。

3.3 多级 Cache 的访问过程

当 CPU 访问某个地址时,请求会从最近的 Cache 层级开始逐级向下查找,一旦在某一层命中就直接返回结果,只有在所有 Cache 层级都缺失时才会访问内存。虽然多级查询在最坏情况下会增加延迟,但由于高层 Cache 的命中率通常很高,平均访问时间反而显著低于直接访问内存。

多级 Cache 并不是一个孤立的硬件技巧,而是一种接受不完美、利用统计规律的系统设计哲学。它不试图消除内存延迟,而是通过层次化结构,让延迟在大多数情况下变得“无关紧要”。

3.3.1 VIPT 结构

VIPT(Virtual Index, Physical Tag)是一种 Cache 访问结构,意思是:用虚拟地址的一部分来定位 Cache 的位置,用物理地址来做最终的命中判断。这种设计的目的,是让 Cache 访问和地址翻译(TLB)并行进行,从而缩短访存的关键路径。

如果 Cache 等到虚拟地址完全转换成物理地址再访问,就会把 TLB 的延迟叠加到 Cache 访问上,L1 Cache 很难做到一个周期完成。VIPT 的核心价值就在于:把“慢的地址翻译”和“快的 Cache 查找”并行化。这样即使系统启用了虚拟内存,L1 Cache 依然可以维持极低延迟,这是现代处理器高性能流水线能够成立的关键前提之一。

在 VIPT Cache 中,虚拟地址的页内偏移部分在地址翻译前后是完全一致的,因此可以安全地用来做 Cache 的索引(Index)和块内偏移(Offset)。与此同时,TLB 在后台把虚拟页号翻译成物理页号,得到物理地址的高位。当 Cache 读出对应组的 Cache Line 后,再用物理地址的 Tag 与 Cache Line 中保存的物理 Tag 做比较,最终决定是否命中。

VIPT 并不是可以随意设计的,它对 Cache 的结构有硬性限制。由于索引只能使用页内偏移位,Cache 的 组数 × Cache Line 大小 不能超过页大小。换句话说,L1 Cache 的容量不能无限扩大,否则就会出现不同虚拟地址映射到同一物理地址却落在不同 Cache 组的问题。

3.3.2 VIVT结构

VIVT(Virtual Index, Virtual Tag)表示 Cache 的索引和 Tag 都来自虚拟地址。这种结构访问速度最快,不需要等待地址翻译,但问题非常严重:同一物理内存可能被多个虚拟地址映射,从而在 Cache 中产生多份副本。这会引发同义名(alias)问题,使得数据一致性难以保证。因此,VIVT 在现代通用 CPU 中基本已经被淘汰,只在早期或特定场景中出现过。

3.3.3 PIPT结构

PIPT(Physical Index, Physical Tag)表示 Cache 完全使用物理地址进行索引和匹配,结构最干净、语义最清晰,也不会产生别名问题。但代价是必须等 TLB 完成地址翻译之后,才能访问 Cache。这使得 PIPT 很难用于对时序极其敏感的 L1 Cache,但非常适合用于 L2、L3 等下层 Cache,因为这些层级本身就允许更高的访问延迟。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值