SICI · 天机门 · 第九章

速度与容量的博弈 · 筑基三层

没有局部性,就没有层次;没有层次,就没有速度。代价不是惩罚,是这架天梯存在的物理前提。

门楣刻字:「每一级之间,隔着十倍、百倍、千倍」
序章

天梯悬空

CPU 与主存之间,差多少倍?

天梯从黑暗中生长出来。不是横着的路,是一架直插云霄的梯。每一级台阶都发着不同颜色的光——顶端白得刺眼,越往下越暗,到底部只剩一团铁锈色的闷红。

缓存之窟,多级缓存层次

诺依曼老祖站在梯脚下,手边悬着七块铭牌:寄存器、L1、L2、L3、主存、SSD、磁盘。

诺依曼老祖 诺依曼老祖

「你脚下的这片梯,每一级之间隔着十倍、百倍、千倍的速度差。你以为从顶到底不过是一步路。」

未命中之罚 未命中之罚

「梯的深处有什么东西在呼吸。很慢。很沉。猜猜,CPU 和主存之间差多少倍?」

存储层次倍率预测挑战器

先下注猜倍率 → 拖拽铭牌排梯 → 拨动局部性拨杆验证。👆 猜对 1000 倍才能排梯

深渊:「CPU 寄存器和主存之间差多少倍?」
第一幕 · 自信

器灵殿 · SRAM 与 DRAM

快的技术贵,便宜的技术慢——六比一的交易

器灵殿里没有梯,只有两座台。左台上悬着一枚六边形的晶体阵列——六个晶体管咬合成环。右台上躺着一枚孤零零的单管——旁边附着一个微不可见的电容。

诺依曼老祖 诺依曼老祖

「半导体册教过你观其形——六管阵、单管阵。但你可知它们为何一座快、一座慢?为何快的那座做不大、慢的那座必须刷新?」

SRAM 六管阵 / DRAM 单管阵 拆解 + 电子天平

点击点亮晶体管 → 拨字线读出 → 拖上天平对比面积/密度

SRAM 六管阵(点击点亮 M1-M6)
DRAM 单管+电容(点击拨字线)

电子天平 · 面积/密度/速度三维对比

第一幕 · 以为懂了

命中台 · AMAT 公式

5% 的缺失,换来六倍于理想值的访问时间

命中台是一面巨大的石壁,上面刻着三个词:命中率、缺失代价、命中时间。老祖递给你一支笔:「把这三个数填进去。命中时间 L1 约 1 纳秒,缺失代价主存约 100 纳秒,命中率……你自己定。」你写下 95%。

未命中之罚 未命中之罚

「95%?挺好。记下了。延迟账本第二页。该清账的时候,我会叫你。」

AMAT 公式拼装器

拖数值进槽 → 拼运算符 → 看石壁翻转对比

第一幕 · 崩塌

AMAT 之罚 · 悬崖曲线

你以为直线下坠,实际是悬崖

石壁翻转后露出一面更大的算盘——上面挂着一排可拖动的命中率刻度,从 99.9% 到 50%。你拖到 99%——AMAT=2ns。拖到 95%——6ns。拖到 90%——11ns。曲线画出来,不是一条直线,是一条越掉越快的悬崖。

未命中之罚 未命中之罚

「你以为直线下坠,实际是悬崖。第二笔。95%。六倍。记下了。」

AMAT 悬崖曲线追踪器

拖动命中率 99%→50%,AMAT 实时计算描点画曲线。必须拖到 90% 以下

AMAT = T_hit + (1-H) × T_miss = 2.00 ns

三大性能指标(随 H 同步变化)

第二幕 · 挣扎

映射阵 · 一位之困

直接映射最简单——但两个地址撞同一 Index 就驱逐

映射阵是一面巨大的地址墙,墙上刻着 32 个格子。老祖指着墙下三座阵盘:「直接映射——一个地址只去一个位置。全相联——哪都能去。组相联——去一组里的任意位置。你先试直接映射。最简单。」

诺依曼老祖 诺依曼老祖

「你先试直接映射。最简单。但简单是有代价的——你省下的硬件,全部变成了 miss。」

地址拆解 + 三阵盘切换 + 冲突演示

拖地址位进 Tag/Index/Offset 三槽 → 切换三阵盘 → 喂冲突地址

32 位地址拆解(cache 4KB / 块 32B / 直接映射 128 行)
第二幕 · 再崩塌

冲突之祸 · 3C 缺失分类

100% 缺失率——你设计的 cache 比没有 cache 还慢

阵盘上跑起了一段程序:for (i=0; i<256; i++) sum += A[i] + B[i]; A 从地址 0 开始,B 从 4096 开始。直接映射,128 行,32 字节一块。A[0] 和 B[0] 的 Index 都是 0——同一个位置。A[0] 进来,B[0] 把 A[0] 踢走。每一次访问都是缺失。命中率:0%。

未命中之罚 未命中之罚

「延迟账本第二页。你选了最省硬件的方案。省下的比较器,全变成了 miss。」

3C 缺失分类相图探索器

跑程序看 hit/miss → 切组相联看冲突归零 → 拖容量/路数看相图

缺失分类统计

第二幕 · 喘息

替换殿 · LRU 的代价

LRU 是理论最优——但它的代价随路数阶乘爆炸

替换殿里悬着四把钥匙:LRU、FIFO、随机、伪 LRU。老祖说:「组满了,踢谁?你选。」你选 LRU。系统喂入 A B C D A B E——E 进来时组满了。LRU 踢掉 C。但面板弹出一行数字:「4 路 LRU 需记录 4!=24 种顺序,至少 5 位。8 路?8!=40320,15 位。128 路全相联呢?」老祖笑了。

诺依曼老祖 诺依曼老祖

「LRU 是理论最优。但它的代价随路数阶乘爆炸。伪 LRU 用一棵树、n−1 个位,近似了 LRU 95% 的效果。」

四种替换策略对比 + 硬件代价曲线

同一序列 A B C D A B E 在 4 路组上跑四种策略 → 看代价曲线

访问序列:A B C D A B E(4 路组相联)

硬件代价 · 位宽 vs 路数

四种策略命中率对比

第二幕 · 收束

写阵与多级塔 · 脏位的代价

写回换来了吞吐量,代价是脏块驱逐时的翻倍缺失

写阵的墙上挂着四块牌:写直达、写回、写分配、非写分配。老祖指着一块悬空的塔模型:「L1、L2、L3——三级塔。L1 私有最快,L3 共享最慢。每一级都是一座更慢但更大的桥。」你挂了写回——写只动 cache,标记脏位,驱逐时才写回。但塔模型底部亮起一行字:「脏块被驱逐时:先写回 L2 → 再从 L2 读入新块。缺失代价翻倍。」

未命中之罚 未命中之罚

「你以为延迟没有代价?延迟的账,迟早要还。」

写策略挂牌 + 多级塔模型 + 多级 AMAT

挂写策略组合 → 拖程序跑多级塔 → 算多级 AMAT

写策略组合(写直达/写回 × 写分配/非写分配)

多级塔 · L1/L2/L3/主存

第三幕 · 顿悟

虚境 · 地址翻译

虚拟内存是存储层次的终极延伸——主存是磁盘的 cache

虚境里没有梯,只有一面镜墙。左边是虚拟地址——48 位,你的程序以为它拥有一整片 256 TB 的连续空间。右边是物理地址——52 位,实际主存只有几十 GB。老祖说:「左边的地址是假的。右边的才是真的。中间这面镜子,叫页表。但你不能每次访问都查镜子——太慢。所以你在镜子旁边放了一个小本子,记最近查过的翻译。那个小本子,叫 TLB。」

诺依曼老祖 诺依曼老祖

「没有 TLB,每次翻译等于四次访存。400 纳秒——比 cache miss 还慢 4 倍。」

虚拟地址翻译流水线动画器

拆 48 位虚拟地址 → 单步走四级页表 → 看 TLB 加速 → 看层次对照镜

48 位虚拟地址 → 4 级 VPN(9+9+9+9)+ 12 位 Offset(4KB 页)
第三幕 · 见深渊

缺页深渊 · 万倍之罚

缺页是存储层次的终极代价——十万倍于 cache miss

你走到页表的最后一级。PTE 的有效位 = 0。老祖说:「这页不在主存里。它在磁盘上。」镜墙碎了。你看见一条裂缝——从主存直通磁盘,深不见底。裂缝壁上刻着延迟数字:cache miss ~100ns,缺页 ~10,000,000ns。十万倍。深渊里的声音变成了一声叹息:「你终于走到这里了。缺页——这是我收的最大一笔税。」

未命中之罚 未命中之罚

「缺页需要 OS 介入 + 磁盘 I/O,硬件无法独立处理。延迟账本最后一页。」

渊账累计 0 笔 · 三问全对后清零

第三幕 · 最高潮

Boss 战 · 未命中之罚

三问对决 · 排除刻痕收网 · 侧信道意外之刃

天梯在你脚下裂开。裂缝中升起一个身影——没有面孔,只有一道裂缝形状的裂缝。它手中悬着一本账簿,封面刻着四个字:延迟账本。「你在天梯上走了十级台阶。每一级,你都在低估我。」翻开第一页:「S2。你说 5% 缺失不算什么。」翻开第二页:「S5。你选了最省硬件的直接映射。」翻开第三页:「S7。你以为写回没有代价。」

未命中之罚 未命中之罚

「现在,回答我三个问题。答错,从 S3 重走。但你的刻痕不会消失——它们是你的弹药。」

未命中之罚排除法收网器

排除刻痕 · 四道收网