计算机组成原理:拆开黑箱后,六大考点这样串
一、先把黑箱拆开:三大部件与内存那张大表
一台计算机打开外壳看进去,最粗的视角就是三块:处理器(Processor)、内存(Memory)、输入输出设备(Devices = Input + Output)。处理器自己又分两层,Control(控制)负责决定「这一步该做什么」,Datapath(数据通路)负责真正动手把数据搬来搬去、做运算;输入输出那一侧拆成 Input 和 Output 两个子块。三者的关系,下图这张带箭头的版本比纯骨架版本更说明问题:

图注:中央大框里装着 Control Unit(控制单元)、ALU(算术逻辑单元)、Internal Memory 与 Main Memory、Secondary Storage,最底下的 Secondary Storage 对应后面要讲的磁盘;左右两侧的 Input Unit(鼠标/键盘/麦克风)和 Output Unit(显示器/打印机/音箱)独立在外。红色实线箭头是 Data Path,表示数据在部件之间真实搬运;蓝色虚线箭头是 Control Path,表示 Control Unit 向其他部件发「该动了」的信号。两条通路方向不同,这是后面 Control vs Datapath 协作的视觉前提。UFUG1601 计算机组成课件
把视线聚焦到内存那一格:内存就是一张大表,每行一字节(Byte = 8 bits),行号就是物理地址。CPU 想读 0x01 那一格,就发「地址 0x01」过去,内存把那一字节的内容送回来。这一查靠的是地址直接定位,RAM 这个名字(Random Access Memory,随机访问存储器)的由来就在这里。一字节是最小可寻址单元,不能用地址单独定位一个 bit。 ENIAC
这套地址换算在 Quiz 13 是必考题:64 KB 内存需要多少位地址?64 KB = 65,536 字节,$\lceil \log_2(65536) \rceil = 16$ 位。同样的套路,256 KB 直接 $\lceil \log_2(262144) \rceil = 18$ 位。唯一的算法就是「容量转成字节数,向上取 log₂」,考试时把这条算式默写出来再填数就是满分。
到这里黑箱已经拆成三块、内存的最小模型已经立住。下一个被磨利的问题是:为什么内存一定要分层?为什么不能把所有内存都做成最快的?
二、内存为什么要分层:四个数量级的速度差
内存设计要同时满足三个互相打架的目标:速度快、容量大、价格低。课件里那张两条反方向箭头的图把这个不可能三角画了出来:向左是「每 bit 成本升高」,向右是「容量与访问时间一起升高」,没人能同时占满两端。

图注:上面一条箭头指向左,标注「Increase in cost per bit」;下面一条箭头指向右,标注「Increase in Capacity & Access Time」。两条箭头方向相反,传达的是同一件事的另一面:越贵、越快、越小,越便宜、越慢、越大,三者不可能兼得。
定性的方向讲完之后,必须给硬数字才能把「必须分层」钉死。Wikipedia 的 Memory hierarchy 词条给了一份 AMD Zen 4 桌面系统的实测延迟表,从最快的寄存器一直排到最慢的 HDD,跨越四个数量级以上:寄存器 0.25 ns(1 个时钟周期)→ L1 数据缓存 1 ns(4 周期)→ L2 缓存 3.5 ns(14 周期)→ L3 缓存 11.75 ns(47 周期)→ DDR5 主存 82.5 ns → NVMe SSD 约 0.2 ms → 7200 rpm HDD 约 4.16 ms。Memory hierarchy 词条
从主存到 SSD 已经跨过千倍量级(82.5 ns 对 0.2 ms),从 SSD 到 HDD 再差一到两个数量级。课件给出的 6 层金字塔就是这条速度梯度在空间上的直观表达:寄存器在塔尖、本地磁盘在塔底、远程存储在最底层最宽。 HDD SSD

图注:自上而下 6 层依次是 Register(寄存器)、Cache inside core: L1 cache (SRAM)、Cache outside core: L2 cache (SRAM)、DRAM、Local Disk、Remote Storage。金字塔形状本身就编码了「越往下容量越大、速度越慢、价格越便宜」的设计取舍。
Caching 的设计原则就一句话:把最可能用到的数据搬到更快的层。课程里没有展开具体的替换算法(LRU / FIFO 这些),但「必须分层」这件事本身已经从口号变成了四个数量级的硬差距,下一步该问的是:程序和数据都是一堆 0/1,那它们怎么能在同一块内存里共存?
三、代码与数据怎么住在同一块内存里:冯·诺依曼架构
1946 年 ENIAC 跑一次 10 位 × 10 位乘法只要 2.8 ms,听起来飞快;但换个程序要靠插线板(plugboard)和 1200 个十路开关重新接线,2 到 3 天才能完成。ENIAC 词条

图注:1940 年代机房照片,机柜正面的电缆、真空管、旋钮层层缠绕,中央操作员正在搬动开关。这就是「换程序要重接线路」的物质成本,每一根跳线都是一个程序语义的物理化身。
冯·诺依曼的破局思路藏在 1945 年的 First Draft of a Report on the EDVAC 里:把程序本身也编码成位模式放进内存,于是「换程序」变成「重写内存」,再也不用动线路。冯·诺依曼架构词条 这就是 stored-program 思想——指令和数据同等存于内存、用地址访问。

图注:CPU 框里包含 Control Unit 与 Arithmetic/Logic Unit 两个子模块,CPU 与 Memory 之间用两条带箭头的双向线相连。这是最小骨架,后面加入 I/O 与 system bus 才补成完整的冯·诺依曼五部件。
内存布局怎么摆?课件里那张「Address | Content」表给出了答案:低地址放指令、高地址放数据,两者共用同一个地址空间。

图注:左边蓝色区是 Instruction,右边绿色区是 Data;地址 0x00 / 0x01 / 0x02 是指令,0x03 / 0x04 是数据,共用同一套物理地址递增。CPU 不区分这两个区,区分它的只有「PC 当前指到哪一格」。
CPU 到底怎么知道这一坨 0/1 是代码还是数据?答案是「靠解释」。课件给了这个高频考点最直观的例子:同一个 32 位模式 0x007302B3,既可以被读作十进制数字 7,537,331,也可以被读作 RISC-V 汇编指令 add x5, x6, x7。硬件层面不存在「这是代码」的语义,区别完全来自你用什么方式解释这一位模式。Quiz 14 就是这个考点的化身——CPU 跳进图像数据区去「执行」,它不会发觉错误,因为它没有能力区分。 RISC-V
到这一步,最初的疑问(程序与数据怎么共存)已经被两层回答钉死:第一层是「stored-program 把它们都装进同一内存」,第二层是「区分方式靠解释而不是靠位置」。下一个该问的是:进了 CPU 之后,处理器自己内部是怎么把控制和数据这两件事分开的?
四、处理器内部:Control 决定做什么,Datapath 真正执行
处理器要做的事情可以拆成两类:决定「下一步做什么」的,以及真正把数据搬来搬去做运算的。前者归 Control,后者归 Datapath。课件借了一个工厂类比把这条边界画得很形象:Datapath 是 CNC 机床、机器人、传送带,真正在车、铣、搬零件;Control 是生产计划系统和质量控制系统,看订单、看工艺卡、发信号。

图注:Computer 外框里 Processor 在左(含 Control + Datapath 两个子模块,红字标出),Memory 在右(空白)。这一版没有 I/O,是配合工厂类比的精简骨架。
Check 题的标准答案就是 ALU 的归属:ALU 是「真正干活的硬件」,属于 Datapath。判断方法很简单:把一个部件放进 Control 还是 Datapath,问一句「它是发信号的,还是搬数据/做运算的?」,后者归 Datapath。
CPU 内部横向拆开看,是四个模块共用一条底层 Memory:PC(程序计数器,指向下一条指令地址)、Decoder(译码器,识别当前指令的操作和操作数)、Registers(一组超高速命名存储单元,通常 32 个)、Function Units(ALU、内存访问单元等真正执行的功能部件)。

图注:四个模块 PC、Decoder、Registers、Function Units 排成一行,下面横贯一条 Lower-Level Memory。Function Units 用三个堆叠方块表示「多个」。这一图没有画箭头,重点是给读者建立 Control 不是单独一个方块、而是跨 PC + Decoder + 一组控制信号协作的概念。
Control 跨多个模块、Datapath 集中在 ALU / Function Units 这条流水线上。这条边界一旦清楚,下面五步执行就是这两套角色在时间轴上的接力。
五、一条 RISC-V 指令的五步一生:取指到 PC++
把抽象的五步落到 RISC-V 的 add x5, x6, x7 这条具体指令上——把 x6 和 x7 的内容相加,结果写回 x5。它在 RISC-V 的 32 位字段里长这样:

图注:上方四个绿框是汇编
add、x5、x6、x7;下方 32 位字段条从左到右按位编号 31 → 0 分为 funct7(7) / rs2(5) / rs1(5) / funct3(3) / rd(5) / opcode(7),对应值分别是 0x0 / 0x7 / 0x6 / 0x0 / 0x5 / 0x33。R-type 是 RISC-V RV32I 六种基本格式(R / I / S / B / U / J)之一,opcode / rd / rs1 / rs2 四个字段在六种格式里位位置固定不变。RISC-V 词条
把这条指令的生命周期拆成五步:

图注:CPU 内 PC / Decoder / Registers / Function Units 与下方共享 Memory 通过垂直箭头连接,对应五步执行的完整路径。图中标注的「next instruction」是把 PC 推进后的目标。
第 1 步 Fetch(取指):PC 把当前指令的地址送到 Memory,Memory 把那一格的 32 位模式返回,送到 Decoder。这一步里有个极隐蔽但常考的细节:PC 在 MDR 装载的同一拍自增 1。这意味着「无跳转程序的取指次数 = 指令条数」这条性质直接来自硬件时序,而不是软件约定。Instruction cycle 词条
第 2 步 Decode(译码):Decoder 看到这 32 位,按字段宽度切片——funct7 看 7 位、rs2 / rs1 各看 5 位、funct3 看 3 位、rd 看 5 位、opcode 看 7 位。译出三条信息:这是什么操作(opcode + funct7 + funct3 共同决定),两个源操作数分别在 rs1 和 rs2,结果写回 rd。add x5, x6, x7 译出来就是:操作 = 加法,操作数 1 = x6,操作数 2 = x7,目的 = x5。
第 3 步 Execute(执行):Function Units 里的 ALU 从 Registers 取出 x6 和 x7 的内容,做加法,得到结果。
第 4 步 Write Back(写回):ALU 的结果送回 Registers,写入 rd 字段指向的 x5。这一步是教材从 Wikipedia 的 3 阶段里独立出来的关键一步,没有它,加法的结果就丢失在 ALU 内部。
第 5 步 Update PC(更新 PC):如果当前指令是普通算术指令,PC 就按第 1 步里自增的结果指向下一条;如果当前指令是跳转或分支,PC 由 ALU 在 Execute 阶段给出的目标地址覆盖。
Wikipedia 习惯把这五步压缩成 3 阶段(Fetch / Decode / Execute),把 Write Back 算进 Execute、把 Update PC 算进 PC 自增。两种讲法都对,区别只是分到哪一层;考试按教材的 5 步答不会错。Wikipedia 视角下还可以用 PC / MAR / MDR / CIR / CU / ALU 六个组件把五步再细化一层:

图注:Wikipedia Fetch-Decode-Execute 示意图,标注 PC(Program counter)、MAR(Memory address register)、MDR(Memory data register)、CIR(Current instruction register)、CU(Control unit)、ALU(Arithmetic logic unit)六个组件。配合教材五步,PC→MAR→Memory→MDR→CIR→CU→ALU→Registers 就是一次完整执行。
落到 Quiz 15 的标准答案:100 条无跳转指令,因为每条指令 PC++ 一次,所以 Fetch 执行 100 次;Decode、Execute、Write Back 各 100 次。Fetch 次数 = 指令条数这个性质,是这一章最重要的高频考点。
CPU 内部已经把「一条指令怎么被自动跑完」这件事说清楚了:PC 推、Decoder 切、ALU 算、写回寄存器、PC 再推。下一个该问的是:CPU 跟外设(键盘、显示器、磁盘)怎么连?磁盘到底算内存还是 I/O?
六、磁盘是 I/O 不是内存:HDD vs SSD 七行表 + 易错点清单
先把一个最容易被绕进去的概念钉死:磁盘属于 Devices,是 I/O 设备,不是内存。只要程序已经装进 RAM,CPU 完全可以拔掉磁盘继续运行。因为内存能直接按地址查,磁盘只能按 I/O 协议去读写,二者根本不在同一层抽象上。
磁盘分两大类,HDD(机械硬盘)和 SSD(固态硬盘)。看一眼实物,区别立现:

图注:3.5 寸 HDD 拆解图:银灰色盘片(platter)、金属读写臂(actuator arm)、橙色柔性排线、绿色 PCB。机械寻道和盘片旋转这两件事,是 HDD 的全部物理基础。Hard disk drive 词条

图注:M.2 NVMe SSD 拆解图:只剩 NAND 闪存颗粒和控制器,没有任何机械部件。Solid-state drive 词条
对照两张实物图,HDD 与 SSD 在七个维度上的差异可以用一张表收齐:
| 维度 | HDD | SSD |
|---|---|---|
| 耐久与噪音 | 怕震动、易磁头撞盘(head crash)、响 | 无机械部件、静音、抗震 |
| 访问时间 | ~12 ms ≈ 30M 个 2.5 GHz 时钟周期 | ~0.1 ms ≈ 250K 个时钟周期 |
| 相对功耗 | 1 | ~1/3 |
| 单位成本 | ~$0.017 / GB(旧数据;2025 年 ~$0.01-0.03 / GB) | ~$0.099 / GB(旧数据;2025 年 ~$0.05-0.10 / GB) |
| 容量 | 500 GB – 4 TB(旧表);2025 年最大 36 TB | 128 GB – 500 GB(旧表);2026 年最大 512 TB |
| 其他问题 | 碎片化、读写头老化 | 写入寿命有限(TBW)、价格仍高 4-9 倍 |
| 寿命 | 5-10 年 | 3-5 年 |
这一行访问时间差出约 120 倍:12 ms 对 0.1 ms。从内存层次那一章的角度看,SSD 已经是「副存里的上层」、HDD 是「副存里的底层」;这也是为什么现代操作系统默认把 SSD 当 swap、HDD 当冷存储的根本原因。
最后给一张考前易错点清单,把整章串起来:
- ALU 属于 Datapath,不属于 Control——Check 题标准答案。
- 64 KB 内存需要 16 位地址——唯一套路是「容量转字节数,向上取 log₂」。
- 100 条无跳转指令,Fetch 执行 100 次——因为每条 PC++ 一次;Decode / Execute / Write Back 各 100 次。
- CPU 不区分 code 和 data——同一个 32 位模式既可作数据也可作指令,区别在解释方式。
- Disk ≠ Memory——磁盘是 I/O 设备,拆掉磁盘只要程序在 RAM 里 CPU 照样能跑。
- 网络卡既算输入又算输出——网卡能从网络收数据(输入)、也能向网络发数据(输出)。
- 冯·诺依曼的核心是 stored-program——程序与数据同等存于内存,换程序变成「重写内存」而不是「重接线路」。
这七条覆盖了 Quiz 13 / 14 / 15 和 Check / Practice 全部考点的对应边。下一次再翻这门课的复习笔记时,从这张清单倒着查回五步执行、再查回内存层次、再查回三大部件,整章就串成一条线。
参考文献
- HKUST-GZ UFUG1601 Computer Organization Slides(主讲:Beiyan Cao,更新于 2025-09-08;据课程规划页) — HKUST-GZ UFUG1601 课件
- Von Neumann architecture — Wikipedia — Wikipedia: Von Neumann architecture
- ENIAC — Wikipedia — Wikipedia: ENIAC
- Memory hierarchy — Wikipedia — Wikipedia: Memory hierarchy
- Hard disk drive — Wikipedia — Wikipedia: Hard disk drive
- Solid-state drive — Wikipedia — Wikipedia: Solid-state drive
- Instruction cycle — Wikipedia — Wikipedia: Instruction cycle
- RISC-V — Wikipedia — Wikipedia: RISC-V