计算机组成原理
全书精读
按考研 408 组成原理大纲编排:数据表示与运算、存储与 Cache、指令系统、CPU 与流水线、总线与 I/O。可以少讲,不写错;数值例题已手算。
概述与冯·诺依曼
LEVEL 1组成原理看的是「一台机器怎么把比特变成一次次指令执行」。先钉死存储程序、五部件和性能公式,后面各章都站在这张图上。
1.1层次与五部件
冯·诺依曼机的核心是存储程序:指令和数据以同样的二进制形式放在主存里,CPU 按 PC 指定地址取指;非转移时通常顺序递增,分支/跳转/异常可改变控制流。五个部件是:运算器、控制器、存储器、输入设备、输出设备。教材里的 CPU 通常指运算器加控制器(再加通用寄存器等)。
1.2性能公式
IC 是执行的指令条数,CPI 是平均每条指令的时钟数,时钟周期是时钟频率的倒数。吞吐看单位时间完成的指令或任务;延迟看一条指令或一次请求从发到完。二者不是同一个数。
1.3三层时间单位
唐朔飞体系里:时钟周期是节拍;若干时钟组成一个机器周期(如取指周期);若干机器周期组成一个指令周期。Patterson 教学用的单周期数据通路则让「一条指令 = 一个时钟」。两套词汇不要捏成一句。
数据的表示
LEVEL 2同一串比特在不同编码下表示不同的数。先分清原码、反码、补码、移码,再谈校验。
2.1原码 · 反码 · 补码 · 移码
| 编码 | n 位范围(整数) | 零 | 要点 |
|---|---|---|---|
| 原码 | −(2n−1−1) ~ 2n−1−1 | 两个(+0 / −0) | 符号位 + 真值的绝对值 |
| 反码 | 同原码 | 两个 | 正数同原码;负数数值位按位取反 |
| 补码 | −2n−1 ~ 2n−1−1 | 一个 | 负数 = 反码 + 1;加减可用同一套加法器 |
| 移码 | 与补码真值范围相同 | 常对应中间码 | 教材常见 [x]移 = 2n−1 + x |
8 位补码:−128 ~ 127。符号扩展:补码向高位复制符号位;无符号数则高位补 0。
2.2校验码
- 奇偶校验:在信息位外加 1 位,使 1 的个数为偶或奇。典型只能发现奇数个比特翻转,不能纠错。
- 海明码:m 位数据需要 k 个校验位,满足 2k ≥ m + k + 1。可纠 1 位错。再加一位总校验可做成 SECDED(纠 1 检 2)。
- CRC:用生成多项式做模 2 除,余数作校验位,用于检错;不要把它写成「和海明一样纠 1 位」。
定点数运算
LEVEL 2补码加减走加法器。溢出是「结果无法用当前位数表示」,不是「最高位进位」的同义词。
3.1加减与溢出
x − y 做成 x + (−y),−y 取补。判别溢出的常用说法:
- 两操作数符号相同,结果符号相反 → 溢出。
- 等价:最高位的进位入与进位出不同(Cin ⊕ Cout = 1)。
8 位例子:127 + 1 → 01111111 + 00000001 = 10000000,位型是 −128,两正数得负,溢出。不要把这个位型当成 +128。
3.2乘除与 ALU
ALU 做算术与逻辑:加、减、与、或、非、比较、移位。乘法可用移位加阵列或 Booth 编码减少部分积;除法有恢复余数 / 不恢复余数等。复习记分类即可,具体阵列延迟随实现变。
逻辑左移在低位补 0;算术右移在高位复制符号位。对补码,算术右移对应向 −∞ 的整数除 2(注意 −1 右移仍是 −1)。
浮点数
LEVEL 3IEEE 754 把一个有限比特场拆成符号、阶码、尾数。边界取值必须按字段定义读,不能「阶码全 0 就是 0」一句话带过。
4.1IEEE 754
| 符号 | 阶码 | 尾数 | 偏置 | |
|---|---|---|---|---|
| 单精度 | 1 | 8 | 23 | 127 |
| 双精度 | 1 | 11 | 52 | 1023 |
- 规格化(阶码非全 0 非全 1):(−1)s × 1.f × 2E−bias,前导 1 隐含。
- 阶码全 0 且尾数全 0:带符号的零。
- 阶码全 0 且尾数非 0:非规格化数,(−1)s × 0.f × 21−bias。
- 阶码全 1 且尾数全 0:±∞。
- 阶码全 1 且尾数非 0:NaN。
单精度规格化最小正数 = 2−126;非规格化最小正数 = 2−149。
4.2对阶 · 加减 · 舍入
对阶
把较小阶码的尾数右移,直到两阶码相等。移出的位进入舍入逻辑,不是直接丢掉就完。
尾数加减
对阶后的尾数相加或相减。
规格化
结果可能需要左移或右移以恢复 1.f 形式,并同步调整阶码。阶码上溢时,IEEE 754 的结果取决于符号与舍入方向,可能是 Inf,也可能舍入为最大有限数;下溢则可能进入非规格化数或零。
舍入
IEEE 默认向最近偶数(ties to even)。另有向 0、向 +∞、向 −∞。不要只写「四舍五入」。
存储系统
LEVEL 3层次靠局部性工作。SRAM 做 Cache,DRAM 做主存。虚存在这一章只看到 MMU 与 TLB,缺页之后交给操作系统。
5.1层次 · SRAM / DRAM
自上而下通常是:寄存器 → Cache → 主存 → 辅存。容量增大、延迟变长、每比特成本下降。程序的时间局部性与空间局部性让靠近 CPU 的小而快的层有效。
- SRAM:触发器保存,不必刷新,快、贵、密度低,用作 Cache。
- DRAM:电容保存,要刷新,密度高,用作主存。
按字节编址时,一个字可能占连续多个地址。字地址与字节地址的换算依赖字长和端序;端序说的是字节排列,不是 ALU 内部的比特编号。
5.2交叉编址
多体交叉把连续地址分到不同存储体。低位交叉用地址低位选体,连续访问可流水式启动多个体;高位交叉用高位选体,一个体内地址连续。题面要看是哪一种。
5.3虚存的硬件侧
MMU 用页表把虚页号译成物理页框号。TLB 缓存最近用过的页表项,命中则不必走多级页表。访问时:有效位为 0,或权限不匹配,触发异常。页不在内存是操作系统的事:本站只要求会描述「硬件陷入」这一步。
Cache
LEVEL 4Cache 按块与主存映射。命中看有效位和标记。直接映射没有「选哪一行替换」的自由。
6.1三种映射
| 映射 | 一个主存块能去哪 | 地址字段 | 替换 |
|---|---|---|---|
| 直接映射 | 唯一一行 | 标记 | 行号 | 块内 | 无选择,只能覆盖该行 |
| 组相联 | 某一组内任一路 | 标记 | 组号 | 块内 | 组满才替换(LRU / FIFO / 随机等) |
| 全相联 | 任一行 | 标记 | 块内 | Cache 满才替换 |
n 路组相联就是每组 n 行。直接映射是 1 路组相联。
6.2地址划分例题
条件:32 位物理地址,Cache 容量 16 KB,块大小 32 B,4 路组相联,按字节编址。
组数 = 512 / 4 = 128
块内偏移 = log232 = 5 位
组号 = log2128 = 7 位
标记 = 32 − 5 − 7 = 20 位
平均访问时间 AMAT = 命中时间 + 缺失率 × 缺失惩罚。缺失惩罚是到下一层的代价,不是「再跑一遍 Cache」。
6.3写策略与三类缺失
- 写直达:命中时同时写 Cache 与下一级;常配不按写分配。
- 写回:只写 Cache 并置脏位,替换时若脏才写回;常配按写分配。
「常配」不是定律:写直达也可以按写分配。映射方式与写策略是两轴,不要说「写回就是组相联」。
三类缺失:强制(首次)、容量(工作集大于 Cache)、冲突(相联度不够;全相联没有冲突缺失)。
指令系统
LEVEL 3指令格式和寻址方式决定操作数从哪来。CISC / RISC 写的是常见特征,不是比赛名次。
7.1格式与寻址
一条指令至少包含操作码;地址码可以是零个或多个。常见寻址:立即、寄存器、直接(绝对)、寄存器间接、基址/变址(寄存器 + 位移)、相对(PC + 位移)、间接。有效地址的计算发生在什么阶段,取决于数据通路,不在这一节发明新阶段名。
7.2CISC / RISC
| 常见特征 | 不要写成 | |
|---|---|---|
| CISC | 指令可变长、寻址方式多、可存储器-存储器运算 | 一定更慢、已被淘汰 |
| RISC | 指令定长、Load/Store、通用寄存器多、硬布线控制更常见 | 一定更快、没有复杂指令、访存指令不存在 |
7.3指令周期
一条指令至少经过取指、译码、执行;访存与写回视指令而定。时钟周期、机器周期、指令周期是三层,见 01.3。
CPU 结构
LEVEL 4CPU = 数据通路 + 控制器。控制器可以是硬布线,也可以是微程序。单周期和多周期是两种教学实现,不是两种 ISA。
8.1数据通路
数据通路是寄存器、ALU、存储器端口和它们之间的多路选择器。一次操作:控制信号打开通路,操作数从源寄存器或立即数进入 ALU 或存储器,结果写回。
8.2硬布线与微程序
- 硬布线:由操作码和时序状态经组合/时序逻辑直接产生控制信号,快,改指令集要改电路。
- 微程序:控制信号编成微指令存在控存,靠微 PC 顺序或分支取出。灵活。一条机器指令由一串微指令完成,需逐条访问控存取微指令,控制速度通常低于硬布线。
CISC 历史上多用微程序,RISC 教学实现多用硬布线。这是常见搭配,不是定义。
8.3单周期 / 多周期 · 异常硬件
单周期:一条指令一个时钟,CPI 常取 1,时钟必须罩住最慢那条指令。多周期:按步骤拆成若干时钟,不同指令时钟数可以不同。流水线见下一章。
异常/中断的硬件侧:保存返回地址(如 EPC)、记下原因、切到处理入口,进入体系结构规定的异常处理状态/特权上下文;若原已处于相应高特权级则未必再次提升。之后由软件读原因并分派。页不在内存时硬件只负责陷入,不在 CPU 章里做页面置换。
流水线
LEVEL 4经典五级是教学模型:IF ID EX MEM WB。流水线提高吞吐,不自动缩短单条指令的延迟。加速比不等于级数。
9.1五段划分
取指、译码/读寄存器、执行/有效地址、访存、写回。这是 MIPS 风格的五段,不是「所有 CPU 都是五段」。
理想情况下填满后接近每周期完成一条。实际 CPI = 1 + 因冒险插入的平均停顿。
9.2三类冒险
| 冒险 | 含义 | 常见处理 |
|---|---|---|
| 结构 | 同一拍争用同一部件(如统一存储器) | 复制资源、分时、停顿 |
| 数据 | RAW / WAR / WAW。流水线里最常考 RAW | 转发可解决部分 RAW;load-use 仍要停顿 |
| 控制 | 分支目标未定就已取了后续指令 | 停顿、冲刷、预测 |
9.3加速比与超标量
把一条指令拆成 k 段、每段一个时钟,与「不流水、一条指令 k 个同样长的时钟」比:
流水:5 + 99 = 104 拍
加速比 = 500 / 104 ≈ 4.81(不是 5)
N → ∞ 时上限趋近 k,有停顿时更低。
超标量:同一拍发射多于一条指令。发射宽度、结构冲突和相关性都会限制实际 IPC。这里只要求概念,不编造某代处理器的 IPC 数字。
总线与 I/O
LEVEL 3总线是共享互连,要仲裁。I/O 有程序查询、中断和 DMA;通道比 DMA 更「像一个小处理器」。
10.1总线与仲裁
典型分地址线、数据线、控制线。同步总线用公共时钟;异步总线靠握手(互锁)。多主设备同时申请时要仲裁:集中式(链式查询、计数器定时查询、独立请求)或分布式。链式查询实现简单、优先级靠电气位置、故障隔离差。
总线定时讲的是一次事务里信号谁先谁后,不是处理机调度算法。
10.2程序查询 · 中断 · DMA
| 方式 | 谁搬数据 | CPU 在传送中 |
|---|---|---|
| 程序查询 | CPU 指令 | 轮询状态,占用处理机 |
| 中断 | CPU 在中断服务里 | 设备就绪才打断,仍按字节/字由 CPU 搬 |
| DMA | DMA 控制器 | CPU 负责启动与收尾;传送中可周期窃取或成组占用总线 |
10.3通道
通道是更独立的 I/O 处理机,能执行通道程序、组织一批设备的传送。代价和复杂度高于基本 DMA。教材三者递进:查询 < 中断 < DMA < 通道,指的是 CPU 介入粒度,不是「通道一定最快」。
章末自测
LEVEL 3先自己答再展开。数值题按本章公式,不要心算口误。