06 篇的"取指 → 译码 → 执行"只是骨架。这一篇钻进"执行"内部:控制器用控制信号(高低电压)开关一扇扇"门",数据沿着通路自己流动;再靠流水线让四步重叠,一条指令接一条不停歇——CPU 快的秘诀不是单步更快,而是不让任何电路闲着。
1. 承上:从"谁执行"到"怎么执行"
前三篇各占一角:05 讲指令怎么写(下指令),06 讲谁接收(CPU 四角色),这篇回答最后一个问题——"执行"这两个字,在电的世界里到底发生了什么?
2. 指挥官的喊话方式:控制信号
06 篇说控制器是"唯一懂指令的部门"。它发号施令的方式很朴素:不是说话,是拉高或拉低一根根导线的电压。
每一根控制线背后都接着一扇"门"(03 篇的逻辑门):
- 电压拉高 = 门开,数据通过
- 电压拉低 = 门关,数据被挡住
译码完成后,控制器把本条指令对应的那组控制线一次性拉对——该开的开、该关的关。之后不用再管:门开了,电自己会流。这就是"执行"的全部真相。
加法器是门搭的,控制信号的"开关"也是门。整个 CPU 里没有魔法,只有几十亿个门在不同时刻开开关关。时钟每滴答一拍,全芯片的门统一动作一次。
3. 一条 ADD A, B 的完整旅程
任务:把寄存器 A(存着 5)和寄存器 B(存着 3)相加,结果写回 A。逐拍看:
| 拍 | 阶段 | 发生了什么 | 谁在干活 |
|---|---|---|---|
| 1 | 取指 | 控制器按书签从内存搬回指令 ADD A, B |
控制器 + 内存 |
| 2 | 译码 | 拆开指令:"做加法,A 和 B,写回 A" | 控制器 |
| 3 | 取数 | 拉开 A、B 的门,5 和 3 流向 ALU | 寄存器 → ALU |
| 4 | 运算 | ALU 里的加法器(03 篇)通电,输出 8 | ALU |
| 5 | 写回 | 拉开"写回 A"的门,8 流回寄存器 A | ALU → 寄存器 |
| 6 | 移书签 | 程序计数器 +1,指向下一条 | 程序计数器 |
六拍走完,A 从 5 变成了 8。程序的一行、电路的一次齐奏——所有软件都是这样一拍一拍跑出来的。
4. 流水线:不让任何电路闲着
上表有个大浪费:ALU 算的时候(第 4 拍),取指电路、译码电路全在干等。CPU 的解法是流水线(Pipeline)——洗车房模型:
冲水 → 打泡沫 → 擦干 → 抛光,四个工位。第一辆车进抛光时,第二辆正在擦干,第三辆正在打泡沫……每辆车仍要 4 道工序,但稳态下每个周期都能交出一辆成品车。
指令同理。取、译、执、写四个工位重叠开工:
- 串行:8 拍做完 2 条
- 流水线:7 拍做完 4 条,稳态后每拍出 1 条——速度约等于翻了 4 倍,而一块新电路都没加,只是让它们同时干活
现代 CPU 的流水线有 14~20 级(工位更多、每工位更细),同样的道理推到极致。
CPU 提速的历史就是"消灭等待"的历史:流水线消灭工位间的等待,缓存消灭访内存的等待,多核消灭任务排队的等待。电信号本身的速度几乎没变过——变的是"别闲着"的组织艺术。
5. 流水线的天敌:跳转(和它的对策)
流水线最怕的是 06 篇讲过的跳转指令。流水线要求"下一拍取哪条指令"提前知道,可跳转让下一拍取哪条取决于本条的计算结果——工位排满了,车却可能要掉头。
CPU 的对策叫分支预测(Branch Prediction):
- 赌跳转跳不跳(依据历史规律,比如循环总是跳回去——预测准确率能到 95%+)
- 猜对了:流水线满速前进,白赚
- 猜错了:把排错的工位全倒掉重排(这叫"流水线冲刷"),白干十几拍
这就是为什么 if 分支特别多、走向毫无规律的代码跑得慢——CPU 老赌错。也是为什么"把最可能的分支放前面"是老程序员的优化习惯。
乱序执行:硬件自动把不相关的指令调换顺序,谁的数据齐了先干谁,填流水线的空隙。 超线程:一个物理核伪装成两个"逻辑核",A 线程卡在等内存时让 B 线程插进来用闲置工位——"8 核 16 线程"的 16 就是这么来的。
6. 回到生活:买 CPU 看什么参数
现在你能看懂 CPU 广告词了:
实际速度 ≈ 主频 × IPC × 核数 × 软件配合度
| 参数 | 是什么 | 本篇对应 |
|---|---|---|
| 主频 3.6GHz | 节拍器每秒滴答 36 亿次 | 时钟(06 篇) |
| IPC(每周期指令数) | 一拍能同时推进几条指令 | 流水线 + 分支预测 + 乱序执行(本篇) |
| 8 核 | 几套独立班底并行 | 多核(06 篇) |
| 软件配合度 | 程序会不会用满多核、分支是否规律 | 程序员 + 编译器的活 |
这解释了为什么同样主频的新 CPU 快得多:主频受功耗和散热限制涨不动了(04 篇摩尔定律放缓的延续),厂商全靠加宽流水线、加聪明预测、加核来涨性能——"执行的艺术"成了主战场。
7. 常见误区
现代核里同时有十几条指令在不同工位上跑。你看到的"顺序执行"是结果上的顺序,物理上早就重叠了。
[!warning] 误区二:主频 × 4 核 = 4 倍主频的速度
多核要任务拆得开才吃得到;流水线要分支猜得准才满速。参数是上限,配合度决定实际值。
[!warning] 误区三:执行就是"算"
绝大多数指令不算数,而是搬数据(05 篇的 MOV)和控制流向(跳转)。ALU 只是流水线里的一个工位。
[!warning] 误区四:分支预测错了会算错结果
不会。预测只影响排班,猜错就推倒重排,结果永远正确——牺牲时间,不牺牲对错。
[!warning] 误区五:流水线级数越多越好
级数越深,猜错分支时冲刷的代价越大、电路越复杂。14~20 级是"并行度"和"翻车成本"的平衡点,不是越多越强。
8. 可折叠自测题
不会说话。它靠控制信号——把一根根导线的电压拉高/拉低,相当于开/关一扇扇门(逻辑门)。门开了,数据沿通路自己流动。
[!question]- Q2. ADD A, B 从取指到完成要经过哪几步?
取指 → 译码 → 取数(A、B 送 ALU)→ 运算(加法器出 8)→ 写回(8 进寄存器 A)→ 书签后移。约 6 拍。
[!question]- Q3. 流水线为什么能提速?它加快速的单步了吗?
没有。它让取、译、执、写四个工位重叠工作——单条指令耗时不变,稳态下每拍交出一条,吞吐量成倍涨。洗车房模型。
[!question]- Q4. 分支预测赌错了会怎样?结果会算错吗?
流水线里排错的指令全部作废重排(冲刷),浪费十几拍——结果永远正确,代价只是时间。
[!question]- Q5. 为什么 CPU 主频涨不动了,性能却还在涨?
主频受功耗/散热物理限制(04 篇摩尔定律放缓)。性能靠加宽流水线、更聪明的分支预测、乱序执行、多核——即提高每拍干的活(IPC)和并行度。
9. 下一步学什么
- [x] 计算机的诞生 —— 已写成 第 08 篇:这套机器是怎么出世、谁定的规矩
- [ ] 十六进制与负数表示 —— 颜色代码
#FF8800、内存地址,原码/反码/补码为什么会演变出补码(03 已讲用法,此篇讲由来) - [ ] 数据压缩原理 —— 哈夫曼、RLE,ZIP 到底做了什么
- [ ] 计算机五大部件 —— CPU 之外,一台完整的电脑还需要什么
- [ ] 操作系统做什么 —— 几十个程序怎么排队用同一个 CPU(本篇的流水线知识正好接上)
- [ ] 写第一行真代码 —— 想动手的话,Python 是最好的第一门语言,说一声我带你装环境
10. 相关笔记
- 06 接收指令的装置-CPU ← 上一篇:CPU 的结构与三步循环(本篇钻进"执行"内部)
- 05 编程是什么-给计算机下指令 ← 指令怎么写、怎么翻译
- 03 用电表示计算-计算机加法运算 ← ALU 工位里的加法器、门的开关
- 04 实现电路计算之路 ← 这块芯片的来路
- 📇 计算机基础 · 索引
- 🏠 返回主页