本章学习地图Learning Map
| 核心问题 | 对应小节 | 你将得到的关键结论 |
|---|---|---|
| 计算机内部由什么构成? | 2.1 | CPU = 运算器 + 控制器 + 寄存器组,经总线与主存交换数据 |
| 程序如何被表示? | 2.2 | 指令 = 操作码 + 操作数;机器语言是 CPU 的母语 |
| 程序如何被执行? | 2.3 | 机器周期:取指 → 译码 → 执行,周而复始 |
| 数据如何被加工? | 2.4 | 按位运算 + 移位,是位模式的“手术刀” |
| 数据如何进出主机? | 2.5 | 控制器、端口、DMA 与握手协议 |
| 如何动手实践? | 2.6 | 用 Python 的 0b 字面量与 & | ^ 直接操作位 |
| 还能更快吗? | 2.7 | 流水线与多核并行:吞吐率 ≠ 单任务速度 |
计算机体系结构Computer Architecture
操纵数据的设备是 中央处理器(CPU, Central Processing Unit),它由三部分组成:运算器、控制器和寄存器组。CPU 通过总线与主存储器相连,程序与数据都存放在主存中。
执行算术运算(加、减)与逻辑运算(AND、OR、XOR),并对数据进行移位的电路部件。
整机运行的“指挥”:从主存取指令、译码,再向其他部件发出控制信号,协调各部件步调一致。
CPU 内部的高速临时存储单元。分通用寄存器(general-purpose,暂存正在加工的数据)和专用寄存器(special-purpose,如 IR、PC)。
一次加法的完整旅程Example: Adding Two Values
“把主存中两个数相加、结果存回主存”,CPU 要走 5 步,恰好体现三大部件的分工:
| 步骤 | 动作 | 由谁完成 |
|---|---|---|
| ① | 从主存取一个数到寄存器(LOAD) | 控制器发令,总线搬运 |
| ② | 从主存取另一个数到另一个寄存器(LOAD) | 控制器发令,总线搬运 |
| ③ | 让 ALU 把两个寄存器的值相加,结果放寄存器 | ALU 运算器 |
| ④ | 把结果从寄存器存回主存(STORE) | 控制器发令,总线搬运 |
| ⑤ | 停止(HALT) | 控制器 |
存储程序概念Stored-program Concept
把程序像数据一样编码成位模式、存入主存储器;CPU 从主存中取出指令并执行。计算机因此只需改写主存内容就能改变功能,而不必重新布线。
缓存与存储层次Cache & Memory Hierarchy
CPU 速度远高于主存,因此设置高速缓存(cache):CPU 把即将用到的数据预先复制到 cache 中,读写优先命中 cache,大大减少等待。
| 层次 | 速度 | 容量 | 类比 |
|---|---|---|---|
| 寄存器 Registers | 最快 | 极小 | 手里的笔 |
| 高速缓存 Cache | 很快 | 小 | 办公桌抽屉 |
| 主存储器 Main memory | 较慢 | 较大(GB 级) | 书房书架 |
| 外存(磁盘/固态盘) | 慢 | 巨大(TB 级) | 图书馆仓库 |
补充阅读:维基百科 “Memory hierarchy(存储器层次结构)” 词条对本图有详尽展开。CPU 做在单块芯片上时称为微处理器(microprocessor),它插在主板(motherboard)上。
- CPU 三件套:运算器 ALU(算)+控制器(指挥)+寄存器组(暂存)。
- CPU 通过总线 bus 与主存交换位模式;通用寄存器存数据,专用寄存器(IR/PC)管执行。
- 存储程序概念:程序=数据,都以位模式存主存——计算机“通用性”的根源。
- Cache 缓解 CPU 与主存的速度差,形成“寄存器→cache→主存→外存”的存储层次。
机器语言Machine Language
机器语言(machine language)是 CPU 能直接识别和执行的指令集合。每条机器指令(machine instruction)由两部分组成:操作码(op-code,指明做什么操作)+操作数(operand,指明对“谁”操作)。
指令 0x35A7(十六进制)= 操作码 3 + 操作数 5A7,含义:把寄存器 5 中的位模式存(STORE)到主存地址 0xA7 的单元中。
两种设计哲学RISC vs CISC
| RISC 精简指令集 | CISC 复杂指令集 | |
|---|---|---|
| 全称 | Reduced Instruction Set Computer | Complex Instruction Set Computer |
| 指令特点 | 少而简单,长度固定,每条都很快 | 多而强大,一条指令可完成多步任务 |
| 代价 | 完成同一任务需要更多条指令 | 译码电路复杂、部分指令很慢 |
| 代表 | ARM(手机)、RISC-V、Apple M 系列 | Intel x86(PC) |
机器指令的三大类Three Classes of Instructions
LOAD(主存→寄存器)、STORE(寄存器→主存)、CPU 与外设之间的 I/O 传送。
加法(补码/浮点)、AND、OR、XOR、移位与循环移位。
JUMP(条件/无条件跳转)、HALT(停机)——决定“下一条执行谁”。
Vole:一台教学用模型机The Vole Machine
教材附录 C 定义了一台极简但五脏俱全的模型机 Vole:
| 部件 | 规格 |
|---|---|
| 通用寄存器 | 16 个,编号 0x0–0xF,每个存 8 位 |
| 主存单元 | 256 个,地址 0x00–0xFF,每个存 8 位 |
| 指令长度 | 16 位 = 4 位十六进制:第 1 位是操作码,后 3 位是操作数 |
| 操作码 | 指令 | 含义(R、S、T 为寄存器号;X、Y 为十六进制数字) |
|---|---|---|
| 0x1 | LOAD R, [XY] | R ← 主存单元 XY 中的位模式 |
| 0x2 | LOAD R, XY | R ← 位模式 XY 本身(立即数) |
| 0x3 | STORE R, [XY] | 主存单元 XY ← R 中的位模式 |
| 0x4 | MOVE R, S | S ← R(寄存器间复制,操作数形如 0x0RS) |
| 0x5 | ADD R, S, T | R ← S + T(二进制补码加法) |
| 0x6 | ADD R, S, T | R ← S + T(浮点加法,不同电路!) |
| 0x7 | OR R, S, T | R ← S OR T |
| 0x8 | AND R, S, T | R ← S AND T |
| 0x9 | XOR R, S, T | R ← S XOR T |
| 0xA | ROTATE R, X | R 中的位模式向右循环移位 X 次 |
| 0xB | JUMP R, [XY] | 若 R = 寄存器 0,则跳转到地址 XY;否则顺序执行 |
| 0xC | HALT | 停机(操作数 0x000) |
指令长度固定 → CPU 总能在存储单元边界整齐取指、译码电路简单快速;x86 这类 CISC 指令长短不一,取指前先要“猜”指令有多长。长度固定正是 RISC 跑得快的关键之一。
- 机器语言 = CPU 唯一直接执行的指令集;指令 = 操作码 op-code + 操作数 operand。
- 设计哲学两派:RISC(少而快、定长)与 CISC(多而强、复杂)。
- 指令三大类:数据传输、算术/逻辑、控制——任何程序都由它们组合而成。
- Vole 模型机:16 寄存器、256 存储单元、16 位定长指令、12 种操作码,是理解真机的最小样本。
程序执行Program Execution
专用寄存器,保存当前正在执行的那条指令,供控制器译码。
专用寄存器,保存下一条待取指令的地址。取指后立即自动加 2(Vole 指令长 2 字节)。
机器周期The Machine Cycle
CPU 执行程序,就是不停重复一个三步循环:取指(fetch)→ 译码(decode)→ 执行(execute),直到遇到 HALT。
逐周期追踪一段程序Tracing a Program
把这段 Vole 程序装入主存 0xA0 处,并把 PC 初始化为 0xA0:
| 地址 | 指令 | 含义 | 执行结果 |
|---|---|---|---|
| 0xA0 | 0x156C | LOAD R5 ← [0x6C] | 寄存器5 = 主存0x6C的值 |
| 0xA2 | 0x166D | LOAD R6 ← [0x6D] | 寄存器6 = 主存0x6D的值 |
| 0xA4 | 0x5056 | ADD R0 ← R5 + R6(补码) | 寄存器0 = 两数之和 |
| 0xA6 | 0x306E | STORE R0 → [0x6E] | 和写入主存0x6E |
| 0xA8 | 0xC000 | HALT | 停机 |
执行过程中 PC 的变化是 A0→A2→A4→A6→A8:每取出一条 2 字节指令,PC 就加 2,指向下一条。这就是“程序顺序执行”的机械本质。
0xB258:若寄存器 2 的内容等于寄存器 0,则把 PC 改为 0x58(条件跳转);
0xB0XY:寄存器 0 永远等于寄存器 0 → 一定跳转,即无条件跳转。
高级语言的 if / while / for,最终都被编译成这样的条件跳转。
多快才算快Clock & Benchmark
机器周期的节拍由时钟(clock)驱动,频率单位 Hz:1 GHz = 每秒 10⁹ 个节拍。但“主频高 ≠ 一定快”,因此用基准测试(benchmark):让不同机器跑同一组有代表性的程序,比较实际用时。
主存里的位模式本身不分“程序”或“数据”——同一位模式被取进 IR 就是指令,被 LOAD 进寄存器就是数据。身份由“谁来使用它”决定。
- 两个专用寄存器:IR 存当前指令,PC 存下一条指令地址。
- 机器周期 = 取指 → 译码 → 执行;Vole 每次取指后 PC+2。
- 顺序执行为常态,JUMP 打破常态;条件跳转是 if/循环的机器级实现。
- 时钟定节拍(GHz),benchmark 比真实性能;“程序还是数据”取决于被谁使用。
算术/逻辑指令Arithmetic/Logic Instructions
按位运算(bitwise operation)把两个位模式逐位套用布尔运算:AND(与)、OR(或)、XOR(异或,不同为 1)。它们是位模式的“手术刀”。
| 逐位演算 | ||||||||
|---|---|---|---|---|---|---|---|---|
| 操作数 A | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 |
| 操作数 B | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 1 |
| A AND B | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
| A OR B | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 |
| A XOR B | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 1 |
Vole 中对应指令:OR=0x7、AND=0x8、XOR=0x9。
掩码:位运算的三大用途Masks
精心设计的第二个操作数叫掩码(mask),三种运算各有绝活:
| 运算 | 掩码的作用 | 例子 |
|---|---|---|
| AND | 掩码为 0 的位被清零(屏蔽) | 10110101 AND 00001111 = 00000101,只保留低 4 位 |
| OR | 掩码为 1 的位被置 1 | 10110101 OR 11110000 = 11110101,高 4 位全置 1 |
| XOR | 掩码为 1 的位被取反 | 10110101 XOR 11111111 = 01001010,整字节取反 |
一张 RGB 图片的每个像素是 24 位(3 字节)位模式。把每个字节与 11111111 做 XOR,每一位都翻转——就得到了底片般的反色图。这就是 XOR 掩码的真实用途。
移位与循环移位Shift & Rotation
| 操作 | 规则 | 效果 / 用途 |
|---|---|---|
| 循环移位 rotation | 移出的位从另一端绕回来 | 位模式整体“转圈”,不丢位。Vole:0xA501 把寄存器5向右循环移 1 位 |
| 逻辑移位 logical shift | 移出丢弃,空位补 0 | 左移 1 位 ≈ ×2;右移 1 位 ≈ ÷2(无符号数) |
| 算术移位 arithmetic shift | 右移时空位复制符号位 | 保持补码数的正负号不变地 ÷2 |
算术运算的实现Arithmetic
加法由 ALU 中的加法电路完成;减法 = 加法 + 取负(补码世界里不需要专门的减法电路)。注意 Vole 有两条“加法”:0x5 用二进制补码解释操作数,0x6 用浮点记数法解释——同一位模式,不同电路、不同含义(呼应第 1 章!)。
- AND 清零、OR 置位、XOR 取反——掩码三绝技,图像反色就是 XOR 的应用。
- 循环移位不丢位;逻辑移位补 0(×2 / ÷2);算术移位保符号。
- 减法 = 加法 + 取负;补码加法(0x5)与浮点加法(0x6)是两套不同电路。
- 位运算是加密、压缩、图像处理、权限标志等无数技术的底层积木。
与其他设备的通信Communicating with Other Devices
插在主板插槽上的电路板(或 SoC 内的电路),代理 CPU 管理某类外围设备,负责主机与设备之间的数据交换与信号转换。
控制器引出的物理接口,设备经它接入系统。常见:USB(通用串行总线,可接多种设备)、HDMI / DisplayPort(音视频)。
CPU 怎样与控制器打交道Memory-mapped I/O & DMA
把控制器的寄存器“映射”到主存地址空间:CPU 用普通的 LOAD / STORE 指令读写这些“假内存”,就完成了与外设的通信。
大批量数据传输时,控制器绕过 CPU直接在主存与设备之间成块搬运,CPU 只下命令、收完成通知。
握手与状态字Handshaking & Status Word
设备速度千差万别,主机与控制器之间通过握手(handshaking)协调步调:双方交换“准备好了吗 / 完成了”等信号。状态字(status word)是控制器寄存器中的一组位,每位报告一件事(如“打印机缺纸”“数据已就绪”),CPU 读取它来决定下一步。
并行 vs 串行Parallel vs Serial Communication
| 速率单位 | 含义 | 常见场景 |
|---|---|---|
| Kbit/s | 10³ bit/s | 早期调制解调器 |
| Mbit/s | 10⁶ bit/s | 家庭宽带(如 100M、1000M) |
| Gbit/s | 10⁹ bit/s | 千兆以太网、USB 3.x |
小写 b = bit(位),大写 B = Byte(字节),1 B = 8 b。运营商说的“100M 宽带”是 100 Mbit/s,下载速度 ÷ 8 约为 12.5 MB/s。
带宽 bandwidth:通信路径的最大传输速率;宽带 broadband:高速率(常指 ≥25 Mbit/s)的互联网接入。
- 控制器代理 CPU 管理外设,设备经端口(USB/HDMI/DisplayPort)接入。
- 存储映射 I/O:读写“特殊内存地址”即读写设备;DMA 让成块传输绕过 CPU。
- 握手协调快慢双方,状态字汇报设备状态。
- 并行多线齐传、串行单线排队;速率单位 K/M/G bit/s,注意 8b = 1B。
用 Python 操作数据Programming Data Manipulation
高级语言把本章的底层操作“翻译”成人类友好的写法。Python 中用 0b 前缀直接书写二进制,用 & | ^ 做按位运算。
# 二进制字面量:0b 前缀 x = 0b00110011 # 等价于十进制 51 mask = 0b00001111 # 掩码:低 4 位 print(x & mask) # AND 清零高 4 位 → 0b00000011 → 3 # 十进制视角下的位运算(教材示例) print(5 ^ 4) # 1 (0101 XOR 0100 = 0001) print(5 | 4) # 5 (0101 OR 0100 = 0101) print(5 & 4) # 4 (0101 AND 0100 = 0100) print(bin(12)) # '0b1100' ← bin() 把整数显示为二进制
控制结构:if 与 whileControl Structures
if waterLevel > 50: drainWater() # 条件成立才执行(对应机器的“条件跳转”) while waterLevel > 50: drainWater() # 反复执行,直到条件不成立
注意:if 与 while 语法几乎一样,语义却不同——if 只做一次判断,while 是循环。它们最终都被翻译成 2.3 节的条件跳转 JUMP。
函数:给操作起个名字Functions
| 概念 | 说明 |
|---|---|
| def / 函数体 body | def 函数名(参数): 定义函数;缩进的代码块是函数体 |
| 实参 argument | 调用时传进去的具体值(如 max(20, 78) 中的 20 和 78) |
| 有返回值 fruitful | 用 return 交出结果,如 max(20, 78) → 78 |
| 无返回值 void / 过程 procedure | 只做事、不交结果,如 print() |
import math # 引入数学库(现成的“工具箱”) def hypotenuse(a, b): # 求直角三角形斜边:√(a²+b²) return math.sqrt(a**2 + b**2) print(hypotenuse(3, 4)) # 5.0
输入的类型陷阱The input() Trap
echo = input("Echo: ") # input() 永远返回字符串 str! # Echo: Hello print(echo * 3) # HelloHelloHello ← 字符串“乘法”是重复 age = input("Age: ") age + 1 # TypeError: can only concatenate str (not "int") to str age = int(age) # 用 int() 转换;int(3.9) → 3(直接截断小数)
读取配速与距离 → 计算总时间 → 输出训练建议。短短十几行,串起了本章全部技能:输入/输出、类型转换、算术运算、if 分支、函数封装——它们最终都化身为 CPU 的 LOAD/ADD/JUMP。
- Python 位操作:0b 前缀写字面量,& | ^ 按位运算,bin() 查看二进制。
- if 判断一次,while 循环执行——机器层都是条件跳转。
- 函数 = def 定义 + 实参传入 + return 返回;分 fruitful 与 void 两类。
- input() 永远返回 str,算术前必须 int()/float() 转换——新手第一大坑。
其他体系结构Other Architectures
单位时间内机器完成的工作总量。注意:提高吞吐率不等于让单个任务更快——两者经常不是一回事。
把指令执行拆成多个阶段(取指/译码/执行…),不同阶段同时处理不同指令,像工厂装配线一样重叠作业,大幅提高吞吐率。
多处理器与多核Parallel Processing
并行处理(parallel processing):多台/多个处理单元同时工作。今天的 CPU 多为多核(multi-core)芯片——一块芯片里集成多个完整处理单元;再把 CPU、GPU、控制器等都集成到一块芯片上,就是片上系统(SoC, System on a Chip,手机处理器的主流形态)。
| Flynn 分类 | 含义 | 例子 |
|---|---|---|
| SISD | 单指令流单数据流:传统单核 CPU | 经典冯·诺依曼机、Vole |
| MIMD | 多指令流多数据流:各核各干各的 | 多核 CPU、服务器集群 |
| SIMD | 单指令流多数据流:一条指令同时处理一批数据 | GPU 图形渲染、图像处理 |
- 评价机器别只看主频:吞吐率衡量单位时间完成的总工作量。
- 流水线:阶段重叠,提高吞吐率而非单条指令速度。
- 多核芯片 + SoC 集成是现代处理器的主流。
- Flynn 分类:SISD(传统单机)、MIMD(多核)、SIMD(GPU 式批量同操作)。
课堂练习参考答案Answer Key
答案与解析速查
| 题号 | 章节 | 答案 | 一句话解析 |
|---|---|---|---|
| Q1 | 2.1 | B | CPU = 运算器 + 控制器 + 寄存器组 |
| Q2 | 2.1 | B | 程序与数据同以位模式存于主存 |
| Q3 | 2.2 | C | 第 1 个十六进制位是操作码:0x3 |
| Q4 | 2.2 | B | LOAD = 数据传输类,装入寄存器 |
| Q5 | 2.3 | B | 取指 → 译码 → 执行 |
| Q6 | 2.3 | B | 指令占 2 个存储单元,PC+2 |
| Q7 | 2.4 | C | 取反用 XOR,掩码 00111100 |
| Q8 | 2.4 | B | 循环右移,末位的 1 绕回首位 → 0xB2 |
| Q9 | 2.5 | B | DMA 成块传输,解放 CPU |
| Q10 | 2.5 | C | 48 ÷ 8 = 6 MB/s(8b = 1B) |
| Q11 | 2.6 | A | 1010^0110=1100=12,print 输出十进制 |
| Q12 | 2.6 | C | input() 恒返回 str |
| Q13 | 2.7 | B | 流水线提高吞吐率,非单指令速度 |
| Q14 | 2.7 | C | 单指令多数据 = SIMD |
① 掩码“取反”选 XOR,不是 AND/OR(Q7);② 速率换算务必 ÷8(Q10);③ Python 的 print 默认输出十进制(Q11);④ Vole 指令长 2 字节,取指后 PC+2(Q6)。
本章术语表Glossary
| 中文 | English | 一句话释义 |
|---|---|---|
| 中央处理器 | CPU (Central Processing Unit) | 执行程序的电路:运算器+控制器+寄存器组 |
| 运算器 | ALU (Arithmetic/Logic Unit) | 执行算术与逻辑运算的部件 |
| 控制器 / 寄存器 | control unit / register | 指挥协调 / CPU 内高速暂存单元 |
| 主板 / 总线 | motherboard / bus | 承载芯片的电路板 / 连接 CPU 与主存的线路 |
| 存储程序概念 | stored-program concept | 程序像数据一样存入主存并被执行 |
| 高速缓存 | cache | CPU 与主存之间的高速小容量存储 |
| 机器语言 / 机器指令 | machine language / instruction | CPU 直接执行的指令集 / 一条二进制指令 |
| 精简/复杂指令集 | RISC / CISC | 少而快 vs 多而强两种设计哲学 |
| 操作码 / 操作数 | op-code / operand | 做什么 / 对谁做 |
| 指令寄存器 / 程序计数器 | instruction register (IR) / program counter (PC) | 当前指令 / 下一条指令地址 |
| 机器周期 / 基准测试 | machine cycle / benchmark | 取指-译码-执行 / 标准化性能测试 |
| 按位运算 / 掩码 | bitwise operation / mask | 逐位布尔运算 / 精心设计的第二个操作数 |
| 循环移位 / 逻辑移位 / 算术移位 | rotation / logical shift / arithmetic shift | 绕回 / 补 0 / 保符号 |
| 控制器 / 端口 | controller / port | 代理 CPU 管理外设 / 设备接入的接口 |
| 直接存储器存取 | DMA (Direct Memory Access) | 外设与主存直接成块传输,绕过 CPU |
| 握手 / 状态字 | handshaking / status word | 协调通信步调 / 报告设备状态的一组位 |
| 带宽 / 宽带 | bandwidth / broadband | 最大传输速率 / 高速互联网接入 |
| 吞吐率 / 流水线 | throughput / pipelining | 单位时间工作总量 / 阶段重叠执行 |
| 多核 / 片上系统 | multi-core / SoC | 一芯片多处理单元 / 整机集成于一芯片 |
| 弗林分类 | SISD / MIMD / SIMD | 按指令流×数据流对体系结构分类 |
📖 下一章预告:第 3 章 操作系统 Operating Systems——谁来管理这台会执行程序的机器?