🏠 返回首页 📝 前往题库

📘 第1章 计算机系统概述

理解计算机的基本结构、ISA、翻译程序和抽象层次。

1.1 冯·诺依曼结构计算机的特点与组成 必考重点

🎯 学习目标:掌握冯·诺依曼结构的五大部件和存储程序思想,这是计算机组成原理的基础。

冯·诺依曼结构的特点

1945年,美籍匈牙利数学家冯·诺依曼提出了存储程序的概念,奠定了现代计算机的结构基础。冯·诺依曼结构计算机具有以下特点:

存储程序思想

将程序指令和数据以二进制形式预先存储在存储器中,计算机运行时自动逐条取指并执行。

五大部件

运算器、控制器、存储器、输入设备、输出设备五大部分组成。

指令与数据同存

指令和数据在存储器中同等对待,都采用二进制编码表示,但用途不同。

串行执行

指令按顺序逐条执行,即von Neumann瓶颈。

存储器 (Memory) 存放指令和数据 输入设备 键盘、鼠标等 输出设备 显示器、打印机等 控制器 (CU) 取指·译码·控制 运算器 (ALU) 算术逻辑运算 数据 数据 指令 控制信号 ▸ ◂ 状态反馈
必考重点 冯·诺依曼结构的要点

① 存储程序:程序和数据事先存入存储器,机器自动逐条取指执行。

② 五大部件:运算器(ALU)、控制器(CU)、存储器(Memory)、输入设备(Input)、输出设备(Output)。

③ 以运算器为中心:数据流经运算器处理,控制器负责协调各部件的操作时序。

④ 指令由操作码和地址码组成:操作码指明操作类型,地址码指明操作数地址。

1.2 ISA指令系统概念 必考重点

ISA (Instruction Set Architecture)

ISA(指令系统体系结构)是计算机硬件和软件之间的交界面/接口。它规定了:

指令格式

操作码和操作数的编码方式。

数据类型

支持的数据格式(整数、浮点数等)。

寻址方式

如何确定操作数的地址。

寄存器定义

通用寄存器、专用寄存器的数量和用途。

💡 ISA的重要性:同一ISA的不同实现(微架构)可以运行相同的二进制程序。例如,x86架构的Intel和AMD处理器都能运行相同的Windows软件。

1.3 三类翻译程序 必考重点

将高级语言程序转换为机器语言程序,需要经过翻译程序的转换。共有三种翻译程序:

汇编程序 (Assembler)

汇编语言源程序翻译为机器语言目标程序。一条汇编指令对应一条机器指令。

解释程序 (Interpreter)

高级语言源程序逐条翻译并立即执行,不生成目标程序文件。如早期的BASIC语言。

编译程序 (Compiler)

高级语言源程序全部翻译为机器语言目标程序,然后统一执行。如C/C++编译器。

编译执行
源程序 → 编译程序 → 目标程序 → 执行
一次性翻译,执行速度快
如:C、C++、Go、Rust
解释执行
源程序 → 解释程序(逐条翻译执行)
跨平台性好,执行速度慢
如:Python、JavaScript

1.4 计算机系统的抽象层 基础了解

器件 (Devices) — 晶体管、门电路 微架构 (Microarchitecture) — 数据通路、控制逻辑 ISA (指令系统体系结构) — 硬件/软件交界面 操作系统 (Operating System) — 资源管理、系统调用 应用程序 (Application) — 用户可直接使用 计算机系统的分层抽象模型 — 下层为上层提供支持
💡 抽象层的作用:每一层都隐藏了底层的实现细节,上层只需关心本层的接口。例如,程序员编写C程序(应用层),不需要了解底层的ISA或微架构实现细节。

📘 第1章续 计算机性能评价

衡量计算机性能的定量指标和计算方法。

1.5 响应时间与吞吐率 必考重点

响应时间(Response Time)
从任务开始到完成的总时间
= CPU时间 + 等待I/O时间 + 系统开销时间
也称为执行时间或延迟
吞吐率(Throughput)
单位时间内完成的任务数量
= 任务总数 / 总时间
也称为带宽
🎯 性能定义:性能 = 1 / 执行时间。执行时间越短,性能越高。对于吞吐率,性能 = 吞吐率。

1.6 CPU执行时间公式 必考重点

$$\text{CPU时间} = \text{指令条数} \times \text{CPI} \times \text{时钟周期}$$

指令条数 (Instruction Count)

程序执行的总指令数,由ISA和编译器决定。

CPI (Cycles Per Instruction)

每条指令平均所需的时钟周期数,由微架构和指令类型决定。

时钟周期 (Clock Cycle Time)

每个时钟周期的时间长度,由主频决定:$T_{\text{clk}} = \frac{1}{f_{\text{clk}}}$。

经典例题 CPU时间计算

题目:某程序执行了 $2\times 10^6$ 条指令,CPI=1.5,主频为2GHz,求CPU执行时间。

解:

时钟周期 $= 1 / (2 \times 10^9) = 0.5$ ns

CPU时间 $= 2 \times 10^6 \times 1.5 \times 0.5 \times 10^{-9} = 1.5 \times 10^{-3}$ s $= 1.5$ ms

1.7 CPI与综合CPI计算 必考重点

当程序中包含多种类型的指令时,需要计算综合CPI(加权平均CPI):

$$\text{CPI}_{\text{avg}} = \frac{\sum (N_i \times \text{CPI}_i)}{\sum N_i}$$

或:

$$\text{CPI} = \sum_{i=1}^{n} (\text{CPI}_i \times f_i)$$
必考重点 综合CPI计算

题目:某CPU指令系统中,ALU指令占40%(CPI=1)、Load指令占20%(CPI=5)、Store指令占15%(CPI=3)、Branch指令占25%(CPI=2)。求综合CPI。

解:

CPI $= 40\% \times 1 + 20\% \times 5 + 15\% \times 3 + 25\% \times 2$

$= 0.40 + 1.00 + 0.45 + 0.50 = 2.35$

所以综合CPI = 2.35

若主频为1GHz,则CPU执行时间 $= N \times 2.35 \times 1 \text{ns}$

1.8 MIPS 常考掌握

MIPS (Million Instructions Per Second) 是衡量CPU性能的常用指标:

$$\text{MIPS} = \frac{f_{\text{clk}}}{\text{CPI} \times 10^6}$$
⚠ MIPS的局限性:
  • 不同ISA的指令功能不同,MIPS不能跨架构比较
  • 同一台机器上不同程序的MIPS值可能不同
  • MIPS可能与实际性能反向变化(例如编译优化增加了指令条数但CPI降低)
MIPS计算示例

某CPU主频为2.5GHz,CPI=2.5,求MIPS。

MIPS $= 2.5 \times 10^9 / (2.5 \times 10^6) = 1000$

即该CPU每秒可执行1000百万条指令。

1.9 综合性能分析 必考重点

必考重点 机器频率与性能的关系(课件原题)

题目:程序P在机器A上运行需10s,A的时钟频率为400MHz。现设计机器B,希望在B上运行只需6s。B的时钟频率提高导CPI增加,使P在B上的时钟周期数是A上的1.2倍。B的频率需达到A的多少倍?

解:

CPU时间A = 时钟周期数A / 频率A

时钟周期数A = 10 × 400M = 4000M个

时钟周期数B = 1.2 × 4000M = 4800M个

频率B = 时钟周期数B / CPU时间B = 4800M / 6 = 800 MHz

频率B / 频率A = 800/400 = 2倍

结论:频率增加2倍但性能并未提升2倍(1.67倍),因为CPI也增加了。

1.10 基准程序Benchmark 基础了解

基准程序(Benchmark)是用于评估和比较计算机系统性能的标准测试程序集。

SPEC CPU

标准性能评估公司推出的CPU基准测试套件。SPECint测试整数性能,SPECfp测试浮点性能。

DaCapo

Java应用性能基准测试,包含多种真实应用负载。

TPC

事务处理性能委员会推出的数据库/OLTP基准测试。

Linpack

线性代数计算的基准测试,用于TOP500超级计算机排名。

💡 Amdahl定律:系统性能提升受制于可改进部分的比例。若可加速部分占比为$f$,加速比为$s$,则整体加速比不超过$1/(1-f+f/s)$。改进效果受木桶效应限制。

📗 第2章 数据的机器级表示

计算机如何用二进制表示和存储数据。

2.1 二进制与十六进制 基础了解

进制转换

二进制→十进制

按权展开:$1011_2 = 1\times 2^3 + 0\times 2^2 + 1\times 2^1 + 1\times 2^0 = 11_{10}$

十进制→二进制

整除取余法:$13 \div 2 = 6\cdots 1$,$6\div 2=3\cdots 0$,$3\div 2=1\cdots 1$,$1\div 2=0\cdots 1$ → $1101_2$

二进制←→十六进制

每4位二进制对应1位十六进制:$1010\;1111_2 = \text{AF}_{16}$

十六进制0123456789ABCDEF
二进制0000000100100011010001010110011110001001101010111100110111101111

2.2 整数补码表示与范围 必考重点

补码的定义

在计算机中,有符号整数通常采用补码表示。补码的定义如下:

$$[x]_{\text{2c}} = \begin{cases} 0x, & 0 \leq x < 2^{n-1} \\ 2^n + x, & -2^{n-1} \leq x < 0 \end{cases}$$

补码的特点

唯一零表示

补码中 $0$ 只有一种表示:$000\cdots 000$,消除了原码和反码中的 $\pm 0$ 问题。

符号位扩展

符号位(最高位)为0表示正数,为1表示负数。

范围不对称

n位补码表示范围:$-2^{n-1} \sim +2^{n-1}-1$

减法可统一为加法

$[x-y]_{\text{2c}} = [x]_{\text{2c}} + [-y]_{\text{2c}}$,硬件实现简单。

补码的运算规则

1
求补码:正数的补码等于其二进制原码;负数的补码 = 对应正数的二进制取反 + 1。
2
补码运算:$[x+y]_{\text{2c}} = [x]_{\text{2c}} + [y]_{\text{2c}}$(模 $2^n$),符号位产生的进位自然丢弃。
3
溢出判断:两个同号数相加结果符号改变,或两个异号数相减结果符号与减数相同,则溢出。
必考重点 补码计算示例

例:用8位补码计算 $(-5) + (-3)$。

$-5$ 的补码:$5 = 00000101_2$,取反 $11111010_2$,$+1 \to 11111011_2$

$-3$ 的补码:$3 = 00000011_2$,取反 $11111100_2$,$+1 \to 11111101_2$

相加:$11111011 + 11111101 = 111111000$,丢弃进位,得 $11111000_2$

$11111000_2$ 补码→真值:先 $-1 = 11110111_2$,取反 $00001000_2 = -8$ ✓

2.3 无符号整数 基础了解

无符号整数的所有二进制位都用于表示数值,没有符号位。n位无符号整数的表示范围:$0 \sim 2^n-1$。

💡 注意:同样位数的无符号整数范围 (0 ~ 255) 比有符号整数范围 (-128 ~ 127) 大,但无法表示负数。

2.4 IEEE754单精度浮点数 必考重点

IEEE754单精度格式

32位单精度浮点数分为三个部分:

S 阶码 E(8位) 尾数 M(23位) 31 30 ~ 23 22 ~ 0
$$V = (-1)^S \times 2^{E-127} \times (1.M)$$

S(符号位)

1位:0为正,1为负。

E(阶码)

8位,偏移127,实际指数 = E - 127。

M(尾数)

23位,隐含前导1,实际尾数 = 1.M。

必考重点 -2.75的IEEE754单精度表示

① 确定符号:负数,S = 1

② 转换为二进制:$2.75 = 2 + 0.75 = 10.11_2$

③ 规格化:$10.11_2 = 1.011_2 \times 2^{1}$

④ 计算阶码:$E = 1 + 127 = 128 = 10000000_2$

⑤ 尾数(隐含前导1):$M = 01100000000000000000000_2$(23位)

⑥ 合并:S|E|M = 1 10000000 01100000000000000000000

→ 十六进制:0xC0300000

类型SEM
+0000000000000...00
-0100000000000...0-0
非规格化数0/100000000非0$(-1)^S \times 2^{-126} \times 0.M$
规格化数0/11~254任意$(-1)^S \times 2^{E-127} \times 1.M$
0/111111111000...0$\pm \infty$
NaN0/111111111非0非数

2.5 算术左移与算术右移 常考掌握

算术左移
各位左移,低位补0,高位舍弃。
低位填0 → 相当于乘以2。
若舍弃的高位与符号位不同则溢出。
例:$0110_{2} \xrightarrow{\ll 1} 1100_{2}$
算术右移
各位右移,高位补符号位,低位舍弃。
正数补0,负数补1 → 相当于除以2(向负无穷取整)。
例:$1010_{2} \xrightarrow{\gg 1} 1101_{2}$
算术移位示例(8位补码)

$00001010_2 = +10$,左移1位 → $00010100_2 = +20$ ✓(乘以2)

$11110110_2 = -10$,右移1位 → $11111011_2 = -5$ ✓(除以2向负无穷取整)

$01000000_2 = +64$,左移1位 → $10000000_2 = -128$,符号位翻转 → 溢出

2.6 大端法与小端法 必考重点

大端法(Big-Endian)和小端法(Little-Endian)是两种字节存储顺序:

大端法 (Big-Endian)
最高有效字节存储在最低地址。
类似于人类书写习惯——高位在前。
如:PowerPC、网络传输
小端法 (Little-Endian)
最低有效字节存储在最低地址。
数值的低位在前——更符合计算机处理逻辑。
如:x86、x86-64
例: 存储 0x01234567 大端法 0x01 0x23 0x45 0x67 addr+0 addr+1 addr+2 addr+3 小端法 0x67 0x45 0x23 0x01 addr+0 addr+1 addr+2 addr+3
💡 判断方法:小端法最低地址存的是数值的最低位字节(小端=小尾巴在前)。网络字节序规定使用大端法。

2.7 边界对齐 常考掌握

边界对齐要求数据的起始地址必须是其大小的整数倍。如int(4字节)的地址必须是4的倍数。

常考掌握 C语言struct对齐
struct Example {
    char a;     // 1字节,偏移0
    int b;      // 4字节,需对齐到4 → 偏移4
    short c;    // 2字节,对齐到2 → 偏移8
}; // 总大小 = 10,对齐到4 → 12字节
数据类型大小对齐要求
char1字节1字节对齐
short2字节2字节对齐
int / float4字节4字节对齐
double8字节8字节对齐

📙 第3章 存储系统

存储器的层次结构、Cache映射与虚拟存储。

3.1 SRAM与DRAM的区别 常考掌握

SRAM(静态随机存取存储器)
用触发器(6个晶体管)存储1位。
速度快、功耗较高、集成度低、价格高。
用于Cache和寄存器。
不需要刷新,读写速度快。
DRAM(动态随机存取存储器)
用电容和晶体管(1T1C)存储1位。
速度较慢、功耗较低、集成度高、价格低。
用于主存。
需要定期刷新(约64ms)。
特性SRAMDRAM
存储元件触发器(6T)电容+晶体管(1T1C)
是否需刷新不需要需要(电容放电)
存取速度快(约1~10ns)较慢(约50~100ns)
集成度高(容量大)
功耗较高较低
价格
主要用途Cache、寄存器主存(内存条)

3.2 时间局部性与空间局部性 必考重点

时间局部性 (Temporal Locality)

如果某个数据被访问,那么不久的将来很可能再次被访问

例如:循环中的循环变量、频繁使用的全局变量。

空间局部性 (Spatial Locality)

如果某个数据被访问,那么附近的地址很可能很快被访问

例如:数组的顺序访问、指令的顺序执行。

🎯 局部性原理是Cache能有效工作的理论基础。程序倾向于访问一小部分地址空间,将这部分数据放入高速Cache中可以大幅提高性能。

3.3 Cache的基本功能与工作原理 常考掌握

Cache的工作原理

Cache是位于CPU和主存之间的高速小容量存储器,用于缓解CPU与主存之间的速度差异。

1
CPU读请求:CPU发出内存地址,首先检查Cache中是否有对应数据。
2
Cache命中:若Cache中有此数据,直接从Cache读取(速度快)。
3
Cache缺失:若Cache中无此数据,从主存读取数据块,同时写入Cache(利用局部性)。
4
替换策略:若Cache已满,需按照替换算法(LRU、FIFO等)淘汰一个旧数据块。

3.4 直接映射Cache 必考重点

直接映射:主存中的每个块只能映射到Cache中的唯一一个位置。

$$\text{Line} = (\text{BlockAddr}) \bmod (\#\text{Lines})$$
必考重点 直接映射Cache地址结构

假设:主存容量64KB,Cache容量4KB,块大小16B。

① 块内偏移 = $\log_2 16 = 4$ 位

② Cache行数 = $4\text{KB} / 16\text{B} = 256$ 行,索引 = $\log_2 256 = 8$ 位

③ 主存块数 = $64\text{KB} / 16\text{B} = 4096$ 块

④ Tag位数 = $\log_2(4096/256) = 4$ 位

⑤ 地址划分:Tag(4位) | 索引(8位) | 块内偏移(4位)

⚠ 缺点:块冲突率高。当多个需要频繁访问的块映射到同一Cache行时,会发生频繁的替换,导致Cache抖动。

3.5 全相联映射 常考掌握

全相联映射:主存中的任何块可以映射到Cache中的任何位置

优点

块冲突率最低。

缺点

硬件实现复杂,需对所有Cache行并行比较Tag,成本高、速度慢。

3.6 组相联映射 必考重点

组相联映射是直接映射和全相联映射的折中方案:将Cache分成若干组,每组包含若干行。

$$\text{Set} = (\text{BlockAddr}) \bmod (\#\text{Sets})$$

主存块可以映射到指定组内的任意一行。n路组相联 = 每组有n行。

三种映射方式的对比

直接映射 行0 行1 行2 Cache行固定对应主存块 全相联 行0 行1 行2 任意主存块 可放入任意行 2路组相联 行0 行1 Group 0 行0 行1 Group 1 固定到组,组内可选 折中方案:兼顾效率与灵活性 地址划分示例: 标记(Tag) 索引 偏移 直接映射:Tag + 行号 + 块内偏移 组相联: Tag + 组号 + 块内偏移(组内全相联)

3.7 块冲突率分析 常考掌握

块冲突是指需要访问的块无法放入Cache(对应位置已被占用)。

映射方式冲突率硬件成本速度
直接映射
全相联最低高(全比较)
组相联中等中等中等

3.8 虚拟存储系统 基础了解

虚拟存储系统将主存和磁盘统一编址,使程序可以运行在比实际物理内存更大的地址空间上。

页式管理

固定大小的页(通常4KB),通过页表将虚拟地址映射到物理地址。

段式管理

按逻辑段分配,段长可变,通过段表映射。

TLB (快表)

页表的Cache,缓存近期使用的页表项,加速地址转换。

3.9 写策略 常考掌握

直写法 (Write-through)
写入Cache的同时也写入主存。
✅ 一致性维护简单
❌ 写操作速度慢(需等待主存写入)
通常配合写缓冲使用
回写法 (Write-back)
只写入Cache,标记为脏(dirty),
当该Cache行被替换时再写回主存。
✅ 写操作速度快
❌ 一致性维护复杂
现代CPU多用Write-back

📕 第4章 指令系统

CPU执行指令的流程、操作码优化与寻址方式。

4.1 指令执行顺序 必考重点

一条指令从开始到结束需要经过以下六个步骤:

取指 Fetch 译码 Decode 取操作数 Read Op 计算/执行 Execute 写结果 Write 中断 Interrupt
1
取指(Fetch):从PC(程序计数器)指向的内存地址取出指令,然后PC自增指向下一条指令。
2
译码(Decode):对取出的指令进行译码,确定操作类型和操作数来源。
3
取操作数(Read Operand):根据寻址方式从寄存器或内存中读取操作数。
4
计算/执行(Execute):ALU执行指定的算术或逻辑运算。
5
写结果(Write Back):将运算结果写回到寄存器或内存。
6
中断查询(Interrupt Check):检查是否有中断请求,如有则转入中断处理程序。

4.2 操作码优化 必考重点

哈夫曼编码(Huffman Coding)

根据指令的使用频率分配不同的操作码长度:高频指令用短编码,低频指令用长编码,使平均操作码长度最小。

必考重点 哈夫曼编码示例

假设有4条指令,频率分别为:A(50%)、B(25%)、C(15%)、D(10%)

等长编码:每条指令2位,平均长度 = 2位

哈夫曼编码:A→0(1位)、B→10(2位)、C→110(3位)、D→111(3位)

平均长度 = $50\%\times1 + 25\%\times2 + 15\%\times3 + 10\%\times3 = 1.75$位

压缩率 = $1 - 1.75/2 = 12.5\%$

必考重点 课件原题:7条指令的哈夫曼编码

题目:7条指令 I1~I7,频度分别为 0.4, 0.3, 0.15, 0.05, 0.04, 0.03, 0.03。用哈夫曼编码求平均码长。

解:

① 构造哈夫曼树:合并最小的两个频度(0.03+0.03=0.06),依次向上合并。

② 得到的编码(示例):

I1(0.4)→0 | I2(0.3)→10 | I3(0.15)→110 | I4(0.05)→11100

I5(0.04)→11101 | I6(0.03)→11110 | I7(0.03)→11111

③ 平均码长 = 0.4×1 + 0.3×2 + 0.15×3 + 0.05×5 + 0.04×5 + 0.03×5 + 0.03×5

= 0.4 + 0.6 + 0.45 + 0.25 + 0.20 + 0.15 + 0.15 = 2.20位

④ 对比定长编码(3位):压缩率 = 1 - 2.20/3 ≈ 26.7%

扩展编码法

在固定长度操作码的基础上,使用特定前缀码表示指令长度的扩展。常见的有3-4扩展、4-8扩展等。

常考掌握 课件原题:15/15/15扩展编码(42条指令)

题目:指令系统共42种指令。前15种频率共0.5,中间13种频率共0.15,最后14种频率共0.35。如何用扩展编码?

解:

采用15/15/15扩展法

第一段(4位):0000~1110 映射前15种指令(1111留作扩展标志)

第二段(8位):1111 0000~1111 1110 映射中间15种(最后一组1111 1111留作再扩展)

第三段(12位):1111 1111 0000~1111 1111 1110 映射最后15种

总指令数 = 15 + 15 + 15 = 45种,实际需42种,足够。

常考掌握 课件原题:3-6-9位扩展编码(74条指令)

题目:指令系统共74种指令。前4种频率0.42,中间15种频率0.34,最后55种频率0.24。求平均码长。

解:

采用4/16/64扩展法(3-6-9位):

第一段(3位):0xx → 4种指令

第二段(6位):1xx 0xx → 8×2=16种指令

第三段(9位):1xx 1xx 0xx → 8×8×1=64种指令

平均码长 = 0.42×3 + 0.34×6 + 0.24×9 = 1.26 + 2.04 + 2.16 = 5.46位

4.3 寻址方式 必考重点

寻址方式规定了指令中如何确定操作数的地址。共7种常见寻址方式:

寻址方式操作数来源说明示例
立即寻址指令本身操作数直接在指令中,速度最快MOV R1, #100
直接寻址内存指令中给出操作数的内存地址LOAD R1, [addr]
间接寻址内存指令给出地址的地址LOAD R1, [[addr]]
寄存器寻址寄存器操作数在寄存器中,速度快ADD R1, R2, R3
寄存器间接内存操作数地址在寄存器中LOAD R1, [R2]
变址寻址内存基址+变址寄存器,适合数组LOAD R1, [R2+R3]
相对寻址内存PC+偏移量,用于分支转移BEQZ R1, offset
寻址方式速记对比

立即 vs 寄存器:操作数位置不同。立即数在指令中,寄存器操作数在寄存器中。

直接 vs 寄存器间接:地址来源不同。直接寻址的地址在指令中,寄存器间接的地址在寄存器中。

变址 vs 相对:基址来源不同。变址的基址来自寄存器,相对的基址来自PC。

4.4 CISC特点 常考掌握

CISC (Complex Instruction Set Computer) — 复杂指令集计算机,如x86架构。

指令数量多

指令种类丰富,可支持复杂的操作。

指令长度可变

指令长度不固定,译码逻辑复杂。

寻址方式丰富

支持多种寻址方式,灵活性高。

微程序控制

多采用微程序控制器实现复杂指令。

4.5 RISC特点 常考掌握

RISC (Reduced Instruction Set Computer) — 精简指令集计算机,如ARM、MIPS、RISC-V。

指令数量少

仅包含最常用的简单指令。

指令长度固定

所有指令长度相同,便于流水线处理。

Load-Store结构

只有Load/Store指令可以访问内存,运算指令只操作寄存器。

硬连线控制

多采用硬连线控制器,控制逻辑简单、速度快。

比较项目CISCRISC
指令数量多(数百条)少(几十~一百余条)
指令长度可变固定
寻址方式多(十几种)少(几种)
内存访问多数指令可直接访存仅Load/Store访存
寄存器数量较少较多(通用寄存器多)
控制器实现微程序(复杂)硬连线(简单)
编译优化较困难较容易
代表架构x86、VAXARM、MIPS、RISC-V

📘 第5章 流水线技术

通过指令级并行提高CPU吞吐率的核心技术。

5.1 流水线基本概念与五段流水线 必考重点

五段流水线(MIPS经典5级流水线)

IF (取指)

从指令Cache中取出指令,PC自增。

ID (译码)

指令译码,读取寄存器堆,生成控制信号。

EX (执行)

ALU执行运算或计算地址。

MEM (访存)

访问数据Cache(仅Load/Store指令)。

WB (写回)

将结果写回寄存器堆。

IF 取指 ID 译码 EX 执行 MEM 访存 WB 写回 理想情况:每个时钟周期完成一条指令,流水线填满后CPI=1
💡 五段流水线在不冲突的理想情况下,每个时钟周期可以完成一条指令(CPI=1),吞吐率比单周期CPU提高近5倍。

5.2 流水线时空图 必考重点

1 2 3 4 5 时间 → IF I1 I2 I3 I4 I5 ID I1 I2 I3 I4 EX I1 I2 I3 MEM I1 I2 WB I1
🎯 时空图解读:横轴为时钟周期,纵轴为流水线级数。第1个周期I1取指,第2个周期I2取指同时I1译码...填充完成后每个周期完成一条指令。

5.3 吞吐率与加速比 必考重点

对于k段流水线,执行n条指令:

$$TP = \frac{n}{k \cdot \Delta t + (n-1)\Delta t} = \frac{n}{(k+n-1)\Delta t}$$

当 $n \to \infty$ 时,$TP_{\max} = \frac{1}{\Delta t}$。

$$S = \frac{n \cdot k \cdot \Delta t}{(k+n-1)\Delta t} = \frac{k \cdot n}{k+n-1}$$

当 $n \to \infty$ 时,$S_{\max} = k$,即流水线级数就是理论最大加速比。

必考重点 吞吐率计算

某5段流水线,每段耗时1ns,执行200条指令。若无冲突:

$TP = 200 / (5+200-1) \div 1 = 200/204 \approx 0.98$ 条/ns

加速比 $S = 5 \times 200 / (5+200-1) = 1000/204 \approx 4.9$

接近理论最大加速比5。

5.4 结构冲突(资源相关) 必考重点

结构冲突发生在多条指令同时竞争同一硬件资源时。例如,冯·诺依曼结构中指令和数据共用同一存储器,IF和MEM阶段可能同时访问存储器。

结构冲突
IF和MEM同时访存 → 冲突
解决方法:
  • 分离指令Cache和数据Cache(哈佛结构)
  • 插入暂停气泡(Stall)
无结构冲突(理想)
哈佛结构:I-Cache和D-Cache分离
IF使用I-Cache,MEM使用D-Cache
→ 不会冲突

5.5 数据冲突RAW与转发技术 必考重点

RAW (Read After Write) 数据冲突

当下一条指令需要读取上一条指令的计算结果,而上一条指令尚未将结果写回时,发生数据冲突。

必考重点 RAW冲突与转发
// 典型的RAW数据冲突
ADD R1, R2, R3   ; R1 = R2 + R3  (WB在周期5完成)
SUB R4, R1, R5   ; 需要R1的值 (ID在周期3需要R1) → 冲突!

解决方法:Bypassing(转发/旁路)

转发技术将ALU的输出直接通过旁路转发给下一指令的ALU输入,无需等待写回寄存器。

ADD的EX阶段计算出R1后,直接转发给SUB的EX阶段——硬件透明处理,无需软件干预

5.6 Load-use冒险与阻塞 必考重点

Load-use冒险是一类特殊的数据冲突:Load指令后的指令立即使用Load的结果。

必考重点 Load-use冒险
LW  R1, 0(R2)    ; R1 = Mem[R2] (MEM阶段在周期4)
ADD R3, R1, R4   ; EX阶段需要R1 (周期3) → 转发也来不及!

Load指令在周期4的MEM阶段才能拿到数据,而ADD在周期3的EX阶段就需要数据。

即使有转发也无法解决,因为数据直到MEM阶段才可用。

解决方案:

① 插入1个气泡(Stall)—— 硬件阻塞

② 编译器在Load后插入无关指令 —— 指令调度

⚠ 区别:普通RAW冲突可通过转发(EX→EX)解决;Load-use冲突必须至少插入一个阻塞周期,因为数据来自MEM而非EX。

5.7 控制冲突与分支预测 必考重点

控制冲突发生在分支指令(BEQ、BNE等)时,流水线需要等待分支结果才能确定下一条指令的地址。

静态分支预测

编译器或硬件固定预测分支方向。如:总是预测"不跳转"。

预测正确则无惩罚,预测错误需清空流水线。

动态分支预测

根据历史执行记录预测。如2位饱和计数器(00→01→10→11,高位为1预测跳转)。

BTB(分支目标缓冲器)缓存分支地址和目标地址。

分支预测示例
BEQ R1, R0, Target  ; 若R1=R0,跳转到Target
ADD R2, R2, R3      ; 预测不跳转,预取此指令
; ... 若实际跳转,清空流水线中后续指令

5.8 指令调度(编译器优化) 常考掌握

编译器可以通过重新排列指令顺序来减少流水线停滞:

指令调度示例

优化前(有Load-use冒�的):

LW  R1, 0(R2)
ADD R3, R1, R4  ; 需要stall 1周期
SUB R5, R6, R7  ; 与R1无关

优化后(无Load-use冒险):

LW  R1, 0(R2)
SUB R5, R6, R7  ; 与Load无关,移到此处执行
ADD R3, R1, R4  ; 此时R1已可用,无需stall

5.9 超流水线与多发射技术 基础了解

超流水线 (Superpipeline)
将流水线级数进一步细分
减小每级延迟 → 提高主频
如:从5级增加到8/10/14级
代价:控制冲突惩罚更大
多发射 (Superscalar)
每个周期发射多条指令
需要多个功能单元(ALU等)
如:Intel Core系列可发射4~6条
VLIW:编译器决定并行指令

📗 第6章 输入输出组织

CPU与外部设备之间的数据交换方式。

6.1 基本I/O方式 基础了解

基本的I/O方式包括:

程序查询方式

CPU不断查询I/O设备状态,直到设备准备就绪。CPU效率低(等待浪费)。

程序中断方式

设备准备就绪后主动向CPU发出中断请求,CPU响应后执行中断处理程序。

DMA方式

DMA控制器直接在内存和外设之间传输数据,无需CPU逐字干预。

通道方式

使用专门的I/O处理器(通道)管理I/O操作,大型机中使用。

6.2 程序中断方式 常考掌握

中断处理流程

1
中断请求:I/O设备发送中断请求信号。
2
中断判别:CPU在执行完当前指令后检查中断请求。
3
中断响应:CPU发出中断响应信号,保存断点(PC)和现场(寄存器状态)。
4
中断服务:执行中断服务程序,完成I/O数据传输。
5
中断返回:恢复现场和断点,CPU继续执行原程序。

中断优先级

多个设备同时发出中断请求时,CPU按优先级高低依次响应。优先级高的中断可以打断优先级低的中断服务程序(中断嵌套)。

特性程序查询程序中断
CPU利用率低(CPU等待)高(CPU可做其他事)
实时性
硬件成本中等
适合场景简单低速设备中速设备

6.3 DMA方式 常考掌握

DMA的工作原理

1
初始化:CPU设置DMA控制器(数据传送方向、地址、长度等参数)。
2
总线请求:DMA控制器向CPU申请总线控制权(HOLD/BREQ信号)。
3
总线授权:CPU让出总线控制权(HLDA/BGRANT信号),DMA接管总线。
4
数据传输:DMA控制器控制内存与I/O设备之间直接传输数据。
5
传送完成:DMA控制器发中断通知CPU传输结束。

DMA传送方式

周期挪用 (Cycle Stealing)

DMA在每个传送周期中占用一个总线周期,其余时间CPU继续运行。

突发传送 (Burst Mode)

DMA一次性占用总线,连续传送一批数据,传送期间CPU被阻塞。

特性程序中断DMA
CPU参与程度需要CPU执行中断服务程序初始化后无需CPU干预
响应速度较慢(数百~数千个时钟周期)快(几个时钟周期)
适合场景中低速设备(键盘、鼠标)高速设备(磁盘、GPU、网卡、SSD)
数据传输单位字节/字数据块
🎯 总结:三种I/O方式的CPU开销从大到小:程序查询 > 程序中断 > DMA。选择哪种方式取决于设备的传输速度和实时性要求。

📚 基于计算机组成原理课程资料整理 · 配合题库练习效果更佳
📝 去做练习题 →