第 1 章 · 计算机系统概述

计算机的骨架(冯·诺依曼 vs 哈佛)、层次结构、性能指标(CPI/MIPS/Amdahl 定律)。

1.1 冯·诺依曼结构 vs 哈佛结构

冯·诺依曼结构(存储程序式):指令与数据不加区分地存同一存储器,CPU 取指还是取数只取决于所处周期与地址。收益:程序可当数据处理、硬件极简(一条总线、一个存储器、一套译码)。

代价:取指与取数争抢同一条总线,一次只能干一件——即「冯·诺依曼瓶颈」,也是第 6 章结构冒险与 Cache 的根源。

哈佛结构:指令存储器与数据存储器物理分开,两条总线可同时取指取数;代价是硬件翻倍、不能自修改、程序分装两块存储器。

对比:现代 CPU 的 L1 Cache 普遍指令/数据分离(I-Cache/D-Cache),即在 Cache 层用哈佛;主存仍是统一冯·诺依曼。DSP、AVR、部分 Cortex-M 整体即哈佛——DSP 每周期要同时读两条操作数+一条指令。

维度冯·诺依曼哈佛
存储指令数据同一存储器指令/数据物理分开
总线一条,取指取数争抢两条,可并行
硬件简单翻倍
程序自修改支持不支持
典型x86、ARM 主存层DSP、MCU、L1 Cache

1.2 计算机层次结构:从晶体管到应用

计算机是严格分层的抽象栈,每层屏蔽下层细节:

第 6 层  应用/算法(用户程序)
第 5 层  高级语言(C / Java / Python)
第 4 层  汇编语言(助记符)
第 3 层  操作系统(进程、内存、文件、I/O)
第 2 层  ISA(指令集架构)——软硬件的分界线
第 1 层  微体系结构(数据通路、流水线、Cache)
第 0 层  数字逻辑(门、触发器)

ISA(指令集架构)是软硬件的「合同」:之上(编译器/OS)只认指令和寄存器,之下(微架构)随便改——同一 x86 ISA,8086 到 Zen 天翻地覆,40 年前的机器码仍能跑。(ISA 见第 4 章,微架构见第 5、6 章)

1.3 性能指标:主频、CPI、执行时间

主频高 ≠ 快,唯一度量是 CPU 执行时间

CPU 执行时间 = 指令数 × CPI × 时钟周期
             = (指令数 × CPI) / 主频
  • 指令数:由编译器、ISA 决定(RISC 指令少而简单,同任务指令数常更多)。
  • CPI(每条指令平均周期数):由微架构决定,流水线好、Cache 命中率高则低。
  • 主频:由工艺、电路决定,周期 = 1/主频。

MIPS = 主频/(CPI×10⁶),同时受 CPI 与主频影响,跨 ISA 比 MIPS 无意义(RISC 单条指令做得少、MIPS 天然偏高)。吞吐指标用 IPC(每周期指令数 = 1/CPI),只反映微架构。

注意:主频被**关键路径(critical path)**锁死——每级逻辑延迟有下限,时钟周期不能无限缩短。故 2000 年后主频停在 ~5GHz,转靠多核、流水线、IPC。

指令数        ← 编译器、ISA(第 4 章)
   ×
CPI          ← 微架构:流水线(第 6 章)、Cache(第 7 章)
   ×
时钟周期      ← 工艺、关键路径(第 3 章 ALU 的加法器延迟)

1.4 Amdahl 定律:加速的极限

优化一部分能带来多大整体收益:

加速比 S = 1 / ( (1 - f) + f / p )
  • f:可优化部分占原总时间的比例。
  • p:该部分被加速的倍数。
  1. 整体加速比上限是 1/(1-f):p→∞ 时总时间仍剩 (1-f)。
  2. 收益高度非线性:f=0.5 时 p=10,S 仅 1.82;p=1000,S 也才 1.996,逼近极限 2。

对比:50% 代码加速 10 倍,整体只快 1.82 倍;5% 代码加速 100 倍只快 1.05 倍。故先找占比最大的瓶颈——profiler 先找热点。

1.5 与后续各章对照

  • 各章落点:ISA(第 4 章)、数据通路与控制器(第 5 章)、流水线降 CPI(第 6 章)、存储层次(第 7、8 章)、I/O(第 9 章)、汇编(第 10 章)。
  • C/Java/Python:C 直接映射 ISA(一行代码≈几条指令);Java/Python 隔虚拟机/解释器,指令数由 JIT/字节码解释器决定——性能差距藏在 1.3 三因子里。
  • Amdahl 与并行:多核 = 把可并行部分复制 p 份,串行瓶颈(锁、共享状态)决定多线程加速天花板。