408 · COMPUTER ORGANIZATION · 唐朔飞 / 白中英 完整版
28 节课,覆盖王道 8 章。从二进制编码、定点 / 浮点运算,到存储层次、Cache 算例、指令系统、CPU、流水线、总线、IO 完整链路。
// agenda
01 · 性能
T_程序 = 指令数 × CPI × T_时钟
= 指令数 × CPI / f
MIPS = f / (CPI × 10⁶)
加速比 S = T_old / T_new
S = 1 / [(1-f) + f/p]
// f: 可加速比例, p: 加速倍数
例:90% 可并行,10% 串行。无论多少处理器,最大加速 = 1/0.1 = 10。
02 · 数据表示
| +0 | -0 | 范围 | |
|---|---|---|---|
| 原码 | 0 0000000 | 1 0000000 | −127~+127 |
| 反码 | 0 0000000 | 1 1111111 | −127~+127 |
| 补码 | 唯一 0 0000000 | −128~+127 | |
| 移码 | 补码符号位取反 | 同补码 | |
x = -22 (8 位)
|x| = 22 = 00010110 原码 = 1 0010110 反码 = 1 1101001 (除符号位取反) 补码 = 1 1101010 (反码 +1) 移码 = 0 1101010 (补码符号位取反)
02 · 加减乘除
[A]补 + [B]补 = [A+B]补
[A-B]补 = [A]补 + [-B]补
符号位一起参加运算,进位丢弃。
| 方法 | 判别 |
|---|---|
| 双符号位 | 结果符号位为 01 → 上溢, 10 → 下溢 |
| 单符号位 + 进位 | 最高位进位 C_s ≠ 次高位进位 C_{s-1} → 溢出 |
| OF 标志 | 同号相加,结果异号 → 溢出 |
A = +120 = 01111000
B = +50 = 00110010
A+B = 10101010 (= -86?)
真值: 120+50 = 170 > 127 → 溢出!
双符: 0 0|1111000 + 0 0|0110010
= 0 1|0101010 → 01 上溢
定点表示:小数点位置约定,硬件不存。
定点纯整数:小数点在最低位之右
定点纯小数:小数点在符号位之右
| 左移 | 右移 | |
|---|---|---|
| 逻辑 | 末补 0 | 首补 0 |
| 算术 (原码) | 符号位不变,末补 0 | 符号位不变,首补 0 |
| 算术 (补码) | 符号位不变,末补 0 | 符号位不变,首补符号位 |
| 意义 | ×2 (溢出注意) | ÷2 |
03 · 浮点
单精度 32 bit:S(1) | E(8) | M(23),偏置 127
双精度 64 bit:S(1) | E(11) | M(52),偏置 1023
值 = (−1)^S × 1.M × 2^(E−bias)
尾数最高位"1"隐含不存 → 多 1 位精度。
| E | M | 意义 |
|---|---|---|
| 00…0 | 0 | ±0 |
| 00…0 | ≠0 | 非规格化数(接近 0) |
| 11…1 | 0 | ±∞ |
| 11…1 | ≠0 | NaN |
5.75 = 101.11(二)
= 1.0111 × 2²
S = 0
E = 2 + 127 = 129 = 10000001
M = 0111000_0000000_0000000 0 (23位)
结果: 0 10000001 01110000...0
HEX: 0x40B80000
反过来: 0xC2820000 是多少?
S=1, E=10000101=133, M=00000100...0
值 = -1.0000100... × 2^(133-127)
= -1.03125 × 64
= -66.0
单精度最大 ≈ 3.4×10³⁸
单精度最小(规格化)≈ 1.18×10⁻³⁸
精度 ≈ 7 位十进制
03 · 浮点
A = 0.1101 × 2^011
B = 0.1011 × 2^001
step1 对阶: B → 0.001011 × 2^011
step2 加: 0.1101 0
+ 0.001011 0
= 0.111111 0
step3 规格化: 已规格化
step4 舍入: 保持 0.1111 (4 位)
step5 溢出: 无
结果 = 0.1111 × 2^011
乘法:阶码相加,尾数相乘,结果规格化。
除法:阶码相减,尾数相除,结果规格化。
04 · ALU 内部
| 半加器 | 全加器 | |
|---|---|---|
| 输入 | A, B | A, B, Cin |
| Sum | A⊕B | A⊕B⊕Cin |
| Cout | AB | AB + (A⊕B)Cin |
n 个全加器首尾串接,C_i+1 = G_i + P_i · C_i。
延迟 O(n),每级 2 个门级延迟。
G_i = A_i · B_i // 生成
P_i = A_i ⊕ B_i // 传播
把 C_i+1 完全用 G_0..G_i、P_0..P_i、C_0 展开 → 不再依赖前一级。
C₁ = G₀ + P₀·C₀
C₂ = G₁ + P₁·G₀ + P₁·P₀·C₀
C₃ = G₂ + P₂·G₁ + P₂·P₁·G₀ + …
单级 CLA 不可能做得很大(指数级门数)。实际:4 位一组 CLA,组间再 CLA → O(log n) 延迟。
ALU = 加法器 + 控制信号选择运算(+ / − / AND / OR / XOR)。复杂运算(×/÷)由多个加减循环完成。
05 · 乘法
X = 0.1101, Y = 0.1011
部分积 乘数 00.0000 1011 + X=0.1101 00.1101 → 右移 00.01101 1101.1... Y末位1→+X + X 01.00111 → 右移 00.10011 11.01... Y末位1→+X + X 01.01111 → 右移 00.101111 1.110... Y末位0→不加 + 0 00.101111 → 右移 00.0101111 1.1110 Y末位1→+X + X 01.0010111 → 右移 00.10010111 完成 结果: +0.10001111 (5/8 × 11/16)
乘数末尾加附加位 Y_n+1 = 0。每次比较 (Y_n, Y_n+1):
| Y_n Y_n+1 | 操作 |
|---|---|
| 0 0 / 1 1 | +0, 右移 |
| 0 1 | +[X]补, 右移 |
| 1 0 | −[X]补 = +[-X]补, 右移 |
n 位补码乘 → n 次操作(自动处理符号)。结果即直接为乘积补码。
同时看 3 位 (Y_n−1, Y_n, Y_n+1),每次右移 2 位 → 减半操作次数。实际硬件常用。
05 · 除法
缺点:恢复操作浪费时间;步骤数不定。
优点:步骤数固定,硬件实现简洁。补码除法的标准算法。
商超出表示范围(如 0.X / 0.Y 商 ≥ 1)→ 触发溢出异常。
06 · 存储
| 按介质 | 半导体 / 磁表面 / 光 |
|---|---|
| 按存取方式 | RAM (随机) / 顺序 (磁带) / 直接 (磁盘) |
| 易失性 | RAM 易失 / ROM 不易失 |
| 可改写 | RAM 可改 / ROM 多次改 / 只读 |
CPU 访问主存的两个指标:带宽(每秒字节)+ 访存时间。
06 · 半导体存储器
| SRAM | DRAM | |
|---|---|---|
| 存储元 | 双稳态触发器(6T) | 电容(1T1C) |
| 每位元件 | 6 个晶体管 | 1 个晶体管 + 1 电容 |
| 速度 | 快(几 ns) | 慢(几十 ns) |
| 密度 | 低 | 高 (~4 倍) |
| 是否刷新 | 否 | 需要(电荷会泄漏) |
| 功耗 | 低(静态) | 较高(刷新) |
| 价格 | 贵 | 便宜 |
| 用途 | Cache、寄存器 | 主存(DDR) |
每隔 2 ms 必须刷一遍(电容电荷保持时间)。3 种方式:
若主存有 128 行 → 集中需 128 × 0.5μs = 64μs"死区";分散将访存周期从 0.5μs 增至 1μs。
为减少地址引脚,DRAM 把地址分行 / 列两次发送(RAS / CAS 选通信号)。
SDRAM → DDR → DDR2/3/4/5;带宽提升靠预取 + 并行 bank。
06 · ROM
| 类型 | 编程方式 | 擦写 |
|---|---|---|
| 掩膜 ROM | 出厂时光刻 | 不可改 |
| PROM | 一次性熔丝 | 仅写一次 |
| EPROM | 电写紫外擦 | 可重复 |
| EEPROM | 电写电擦 | 可按字节擦 |
| Flash | 电写电擦 | 按块擦 |
NOR Flash:按字节访问,可直接执行代码(XIP);常用于 BIOS。
NAND Flash:按页 / 块访问,密度高;用于 SSD、U 盘。
| HDD | SSD | |
|---|---|---|
| 介质 | 磁盘 | NAND Flash |
| 随机读 | ~10ms | ~50μs |
| 抗振 | 差 | 好 |
| 寿命 | 长(机械) | 有写次数限制(磨损) |
| FTL | 无 | 有(闪存翻译层 + 磨损均衡) |
06 · 容量扩展
每字位数不够 → 多片并行组合。共用地址线,各管自己的数据位。
字数不够 → 多片串接。共用数据线,地址多出的高位用来选片(片选信号)。
例:用 1K×4 芯片,组成 4K×8 主存。
需芯片数 = (4K/1K) × (8/4) = 4 × 2 = 8 片
每两片并联补位(8 位)
四组串联补字(4K)
A0~A9 给所有片;A10A11 译码片选
CPU 通过 MAR 给地址、MDR 给/收数据、读/写控制线发命令;主存通过 DRDY 应答。
07 · Cache
主存地址 = 块地址 + 块内偏移;块地址再分:
| 直接 | 全相联 | 组相联 | |
|---|---|---|---|
| 放置自由度 | 固定 | 任意 | 组内任意 |
| 查找 | 1 次 | n 次并行 | 组内并行 |
| 电路复杂 | 低 | 高 | 中 |
| 冲突 | 抖动严重 | 无 | 较少 |
实际系统多用 4 路 / 8 路组相联,在自由度和电路复杂度间折中。
T_avg = h·t_c + (1−h)·t_m
// h 命中率, t_c Cache 时间, t_m 主存时间
例:h=0.95, t_c=2ns, t_m=100ns → T = 0.95·2 + 0.05·100 = 6.9 ns
07 · 替换与一致
| 算法 | 策略 | 特点 |
|---|---|---|
| 随机 | 随机选一行替换 | 硬件最简单 |
| FIFO | 替换最早调入 | 有 Belady |
| LRU | 替换最近最久未用 | 性能好,硬件复杂 |
| LFU | 替换最少使用 | 需计数器 |
直接映射不需要替换算法(位置已固定);只有全 / 组相联需要。
| Write-through | Write-back | |
|---|---|---|
| 写时 | 同时写 Cache + 主存 | 只写 Cache,置 dirty |
| 替换 | 不写回 | dirty=1 才写回 |
| 多处理一致性 | 容易 | 需缓存一致性协议 |
| 性能 | 每写都慢 | 积攒成块写 |
MESI 协议:每行有 Modified / Exclusive / Shared / Invalid 状态;总线监听(snooping)。
08 · 虚拟存储
假设 TLB 命中率 h,未命中需两次访存:
EAT = h·(t_TLB + t_mem) + (1−h)·(t_TLB + 2·t_mem)
实测:x86 TLB 64-1024 项,命中率 > 99%。
| 目的 | 缓存什么 |
|---|---|
| TLB | 页表项(虚 → 物理) |
| Cache | 主存数据 / 指令 |
| 主存 | 磁盘上的页 / 段 |
09 · 指令
操作码 OP + 地址码。按地址数分:
定长操作码无法兼顾"指令数多"与"地址位长"。扩展法:
· 短地址指令用长 OP(少地址腾出位给 OP)
· 长地址指令用短 OP
例:4 位 OP + 12 位地址(三地址 4 位 × 3)。当 OP=1111 时表示扩展,剩下用次 4 位再做选择。
| 方式 | EA 计算 | 用途 |
|---|---|---|
| 立即 | A 本身就是数 | 常数 |
| 直接 | EA = A | 定位变量 |
| 间接 | EA = (A) | 跳转表 |
| 寄存器 | R 本身存数 | 最快 |
| 寄存器间接 | EA = (R) | 指针 |
| 相对 | EA = PC + A | 跳转、循环 |
| 基址 | EA = BR + A | 程序定位 |
| 变址 | EA = IX + A | 数组访问 |
| 堆栈 | SP 隐含 | 函数调用 |
基址 vs 变址:基址寄存器对用户透明(OS 改 BR);变址寄存器对用户开放(程序改 IX,遍历数组)。
10 · CPU
| 结构 | 特点 |
|---|---|
| 单总线 | 所有部件挂同一总线;逻辑简单但同时只能传一次 |
| 多总线 | 多条并行总线;提高并发 |
| 专用 | 固定线路连接;最快,电路复杂 |
// ADD R0, R1 // 假设 ALU 有两个输入锁存器 Y、Z T1: R1out, Yin // R1 → Y T2: R0out, ALUop=add, Zin // R0+Y → Z T3: Zout, R0in // Z → R0
10 · 数据通路
T1: PCout, MARin T2: MEMrd, PCout, ALUop=+1, Zin T3: MDRout(IR), Zout, PCin T4: IRout
指令送 IR、PC 自增。
控制器分析 OP 字段 → 决定接下来的微操作序列。读出寄存器送 ALU 输入端。
T5: R2out, MARin // R2 给地址 T6: MEMrd // 读主存 T7: MDRout, Yin // 数据 → Y T8: R1out, ALUop=add, Zin // R1 + Y → Z T9: Zout, R1in // 写回 R1 T10: PSW 更新 Z/C/V/S T11: End
11 · 控制器
由组合逻辑电路产生控制信号。一条信号 = OP × 节拍 × 标志位 → 与门。
把每条机器指令分解成微指令序列,存入控制存储器(CM,通常 ROM)。每个时钟读一条微指令 → 控制信号。
| 格式 | 说明 |
|---|---|
| 水平型 | 一字段一信号;并行多,存大 |
| 垂直型 | 类似机器指令;存少,需译码 |
| 混合型 | 折中 |
CISC(x86):指令多、变长、寻址复杂 → 微程序;RISC(ARM、RISC-V):指令少、定长、Load-Store → 硬布线 + 流水线。
12 · 流水线
k 段流水,n 条指令:
T = (k + n − 1) × Δt
加速比 S = nk / (k + n − 1)
n → ∞ 时 S → k (最大加速比)
吞吐率 TP = n / T
n → ∞ 时 TP → 1/Δt
12 · 冒险
| 类型 | 原因 | 对策 |
|---|---|---|
| 结构冒险 | 同时刻争抢一份资源(如取指 + 访存) | 独立 ICache/DCache;增端口 |
| 数据冒险 RAW | 后指令读上一指令未写回的值 | 转发 forwarding / 插气泡 / 编译重排 |
| 控制冒险 | 分支指令未定时仍取下一条 | 分支预测 / 延迟槽 / 提前判断 |
13 · 总线
带宽 = 频率 × 宽度 × 每周期数
单位:B/s 或 GT/s × byte
例:PCIe 4.0 ×16 = 16 GT/s × 2 B × 16 lanes
= 64 GB/s
前端总线 FSB(已淘汰)→ QPI/UPI → PCIe;存储总线:DDR;外设:USB / SATA / Thunderbolt。
13 · 仲裁 + 通信
| 方式 | 原理 | 优 / 缺点 |
|---|---|---|
| 链式查询 | 请求线广播,允许信号链式传递 | 简单;但近 CPU 优先 |
| 计数器定时 | 计数器递增问每个设备 | 起点可移动 → 均衡 |
| 独立请求 | 每设备一对请求 / 允许线 | 最快;线多 |
| 分布式 | 设备间协商 | 高可靠(无单点) |
| 模式 | 特点 |
|---|---|
| 不互锁 | 各自定时撤销;最快但易丢 |
| 半互锁 | 请求方等应答后撤请求 |
| 全互锁 | 双方都等对方撤销;最可靠最慢 |
主从在统一时钟下,按固定时序传输(如 T1 发地址,T2 发数据)。需要双方速度匹配。
连续传送多个数据,只用一次地址 → 大幅提高带宽(DRAM 默认开启 burst)。
14 · 中断
每个中断源有一组屏蔽位,决定它能屏蔽哪些其它中断源。同级或低级总被屏蔽,自屏要看实现。
// 例: 4 个中断源 A B C D // 优先级 A > B > C > D 源 A B C D A的屏蔽字: 1 1 1 1 // 全屏蔽自及更低 B: 0 1 1 1 C: 0 0 1 1 D: 0 0 0 1
每个中断源 → 一个向量号 → 中断向量表中的 ISR 入口地址。
查询式:CPU 轮询所有源;慢但灵活。
中断:异步(外部事件),随机发生;异常:同步(指令引起),必发于该条指令。
15 · IO
| 方式 | CPU 介入 | 每次单位 |
|---|---|---|
| 程序查询 | 持续轮询 | 1 字 |
| 程序中断 | 请求时响应 | 1 字 / 中断 |
| DMA | 启动 + 结束 | 1 块 / 中断 |
| 通道 | 仅启动通道程序 | 1 组数据 / 中断 |
是一种独立的 IO 处理器,能执行通道程序,CPU 只下达开始命令。常见于大型机。
| 方式 | 说明 |
|---|---|
| 独立编址 | 专用 IO 指令 IN/OUT;端口空间独立 |
| 统一编址(内存映射) | 把 IO 寄存器映射到内存地址空间,用普通 load/store 即可 |
// summary