计算机组成原理¶
一、计算机系统概述¶
1.1 冯·诺依曼结构¶
存储程序思想:将程序指令和数据预先存入内存,计算机自动逐条执行指令。
┌─────────────────────────────────────┐
│ 运算器(ALU) │
│ ↑↓ │
│ 控制器(CU)←→ 内存(主存)←→ 外存 │
│ ↑↓ │
│ 输入设备 → 主机 ← 输出设备 │
└─────────────────────────────────────┘
1.2 计算机性能指标¶
| 指标 | 含义 |
|---|---|
| CPU 主频 | CPU 内部工作的时钟频率(如 3.0GHz) |
| CPI(Cycles Per Instruction) | 执行每条指令所需的时钟周期数 |
| IPS(Instructions Per Second) | 每秒执行的指令数 |
| 吞吐量 | 单位时间内完成的工作量 |
| 响应时间 | 从任务开始到结束的总时间 |
Amdahl 定律:系统性能提升受限于可改进部分的比例。
二、数据表示与运算¶
2.1 数制转换¶
- 二进制 → 十进制:按权展开求和
- 十进制 → 二进制:整数除 2 取余,小数乘 2 取整
- 二进制 ↔ 八进制/十六进制:三位/四位一组转换
2.2 原码、反码、补码¶
| 编码方式 | 正数 | 负数 | 特点 |
|---|---|---|---|
| 原码 | 符号位 0 + 数值位 | 符号位 1 + 数值位 | 加减法复杂 |
| 反码 | 同原码 | 原码数值位按位取反 | 0 有两种表示 |
| 补码 | 同原码 | 反码加 1 | 统一加减法,0 唯一 |
补码运算:$[x+y]\text{补} = [x]\text{补} + [y]_\text{补}$
2.3 浮点数表示(IEEE 754)¶
32 位单精度浮点数:
值 = $(-1)^S \times 1.M \times 2^{E-127}$
2.4 ALU 运算¶
- 加法:补码加法器实现
- 减法:加补码($A - B = A + (-B)$)
- 乘法:Booth 算法、Wallace 树
- 除法:恢复余数法、不恢复余数法
三、CPU 结构¶
3.1 CPU 基本组成¶
┌─────────────────────────────────────┐
│ CPU │
│ ┌─────────────┐ ┌──────────────┐ │
│ │ 运算器 │ │ 控制器 │ │
│ │ ┌───┐ │ │ ┌────┐ │ │
│ │ │ALU│ │ │ │ PC │ │ │
│ │ │ACC│ │ │ │ IR │ │ │
│ │ │PSW│ │ │ │ CU │ │ │
│ │ └───┘ │ │ └────┘ │ │
│ └─────────────┘ └──────────────┘ │
│ ↓ │
│ 寄存器组 │
└─────────────────────────────────────┘
3.2 寄存器¶
| 寄存器 | 全称 | 功能 |
|---|---|---|
| PC | 程序计数器 | 存放下一条指令的地址 |
| IR | 指令寄存器 | 存放当前执行的指令 |
| ACC | 累加器 | 存放 ALU 运算结果 |
| PSW | 程序状态字 | 标志位(CF、OF、ZF、SF) |
| MAR | 存储器地址寄存器 | 内存地址 |
| MDR | 存储器数据寄存器 | 内存读写数据 |
3.3 指令执行过程¶
取指(Fetch)→ 译码(Decode)→ 执行(Execute)→ 访存(Memory)→ 写回(Writeback)
↑ ↓
└────────────────────────── 下一指令 ────────────────────────────────┘
3.4 指令流水线¶
将指令执行过程分为多个阶段,各阶段并行处理不同指令。
流水线冒险: | 类型 | 描述 | 解决方案 | |------|------|---------| | 结构冒险 | 硬件资源冲突 | 增加硬件资源 | | 数据冒险 | 后一条指令依赖前一条的结果 | 转发(Forwarding)、插入空泡 | | 控制冒险 | 分支指令导致流水线断流 | 分支预测、延迟槽 |
四、指令系统¶
4.1 指令格式¶
一条指令通常包含: - 操作码:指明操作类型 - 地址码:指明操作数地址
4.2 寻址方式¶
| 方式 | 含义 | 示例 |
|---|---|---|
| 立即寻址 | 操作数直接在指令中 | MOV R1, #5 |
| 直接寻址 | 地址码即操作数地址 | MOV R1, [1000] |
| 间接寻址 | 地址码指向存放地址的地址 | MOV R1, [[1000]] |
| 寄存器寻址 | 操作数在寄存器中 | MOV R1, R2 |
| 变址寻址 | 基址 + 偏移量 | MOV R1, [R2+4] |
4.3 CISC vs RISC¶
| 特性 | CISC | RISC |
|---|---|---|
| 指令数量 | 多(几百条) | 少(几十条) |
| 指令长度 | 可变 | 固定 |
| 寻址方式 | 多 | 少 |
| 寄存器 | 较少 | 较多 |
| 执行周期 | 多周期 | 单周期(大部分) |
| 微程序控制 | 是 | 否(硬布线) |
| 编译优化 | 困难 | 容易 |
| 典型代表 | x86 | ARM、RISC-V、MIPS |
五、存储系统¶
5.1 存储层次¶
CPU 寄存器(速度最快、容量最小、价格最高)
↓ 访问时间:~1ns
Cache(L1/L2/L3)
↓ 访问时间:~10ns
主存(RAM)
↓ 访问时间:~100ns
外存(SSD/HDD)(速度最慢、容量最大、价格最低)
访问时间:~10ms
局部性原理: - 时间局部性:刚访问的数据可能很快再次被访问 - 空间局部性:刚访问数据附近的数据可能很快被访问
5.2 Cache 映射方式¶
| 方式 | 描述 | 特点 |
|---|---|---|
| 直接映射 | 主存块只能映射到Cache的特定行 | 简单但冲突率高 |
| 全相联映射 | 主存块可映射到Cache任意行 | 灵活但比较慢 |
| 组相联映射 | 分组,组内全相联 | 折中方案 |
Cache 替换算法:LRU(最近最少使用)、FIFO、LFU
写策略: - 写直达(Write-Through):同时写Cache和主存 - 写回(Write-Back):仅写Cache,被替换时才写回主存
5.3 主存¶
- RAM:随机存取存储器
- SRAM:静态,速度快,用于Cache
- DRAM:动态,需刷新,用于主存
- ROM:只读存储器,用于固件存储
5.4 外存¶
- SSD(固态硬盘):基于闪存,速度快,无机械结构
- HDD(机械硬盘):基于磁盘,容量大,速度较慢
磁盘性能指标:寻道时间 + 旋转延迟 + 传输时间
六、总线与 I/O¶
6.1 总线结构¶
总线分类: - 数据总线:传输数据(双向,宽度决定一次传输的数据量) - 地址总线:传输内存地址(单向,宽度决定寻址范围) - 控制总线:传输控制信号(读/写、中断等)
总线仲裁:解决多个设备同时请求总线的问题 - 集中式仲裁:链式查询、计数器查询、独立请求 - 分布式仲裁:各设备自行仲裁
6.2 I/O 接口¶
I/O 端口编址方式: - 统一编址:I/O 端口与内存共用地址空间(如 ARM) - 独立编址:I/O 端口有独立的地址空间(如 x86)
I/O 传输方式: | 方式 | CPU 参与度 | 传输单位 | 适用场景 | |------|-----------|---------|---------| | 程序查询 | 全程参与 | 字 | 简单低速设备 | | 中断驱动 | 开始和结束 | 字 | 中速设备 | | DMA | 不参与 | 块 | 高速批量传输 |
常见面试题¶
高频考点
- 原码、反码、补码的区别及应用? 补码统一加减法,是计算机中整数的实际存储方式。
- Cache 的作用及映射方式? 解决 CPU 和主存速度不匹配,常用组相联映射。
- 指令流水线中的冒险及解决? 结构冒险(加硬件)、数据冒险(转发)、控制冒险(分支预测)。
- CISC 和 RISC 的区别? CISC 指令多、变长;RISC 指令少、定长、高效流水。
- DMA 方式与中断方式的区别? DMA 批量传输不占 CPU,中断方式每次传输都需 CPU 介入。
- 浮点数的 IEEE 754 表示? 符号位 S + 阶码 E + 尾数 M,值 = (-1)^S × 1.M × 2^(E-127)。