计算机组成原理
什么是计算机组成原理?
计算机组成原理是研究计算机 硬件系统的结构、工作原理和设计方法 的学科。它揭示了计算机如何通过电子元件实现信息的存储、处理和传输。
计算机系统层次结构
┌─────────────────────────────────────────────────────────────┐
│ 计算机系统层次结构 │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 应用程序层 │ │
│ │ 用户软件、应用程序 │ │
│ └─────────────────────────────────────────────────────┘ │
│ ▲ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 系统软件层 │ │
│ │ 操作系统、编译器、数据库 │ │
│ └─────────────────────────────────────────────────────┘ │
│ ▲ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 汇编语言层 │ │
│ │ 汇编指令、系统调用 │ │
│ └─────────────────────────────────────────────────────┘ │
│ ▲ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 机器语言层 │ │
│ │ 二进制指令、机器码 │ │
│ └─────────────────────────────────────────────────────┘ │
│ ▲ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 硬件层 │ │
│ │ CPU、内存、I/O 设备 │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘冯·诺依曼体系结构
c
冯·诺依曼计算机的五大部件:
┌─────────────────────────────────────────────────────────────┐
│ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ 输入设备 │ │ 输出设备 │ │
│ │ 键盘、鼠标 │ │ 显示器、打印机│ │
│ └──────┬──────┘ └──────▲──────┘ │
│ │ │ │
│ ▼ │ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 存储器 │ │
│ │ 内存 (RAM) │ │
│ │ 存储程序和数据 │ │
│ └───────────────────────┬─────────────────────────────┘ │
│ │ │
│ ┌────────────────┴────────────────┐ │
│ ▼ ▲ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ 运算器 │◄─────────────────►│ 控制器 │ │
│ │ ALU │ 数据通路 │ CU │ │
│ │ 算术逻辑 │ │ 指令控制 │ │
│ └─────────────┘ └─────────────┘ │
│ │ ▲ │
│ └─────────────────────────────────┘ │
│ CPU │
│ │
│ 核心思想: 存储程序 │
│ - 程序和数据存储在同一内存中 │
│ - 指令和数据通过同一总线传输 │
│ - 指令顺序执行 │
└─────────────────────────────────────────────────────────────┘CPU 中央处理器
CPU 的基本结构
┌─────────────────────────────────────────────────────────────┐
│ CPU 内部结构 │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 控制器 (CU) │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ 程序计数器│ │ 指令寄存器│ │ 指令译码器│ │ │
│ │ │ PC │ │ IR │ │ ID │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ 时序控制 │ │ 微操作 │ │ 中断控制 │ │ │
│ │ │ │ │ 控制器 │ │ │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 运算器 (ALU) │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ 算术单元 │ │ 逻辑单元 │ │ 累加器 │ │ │
│ │ │ 加减乘除 │ │ 与或非异或│ │ ACC │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ 状态寄存器│ │ 通用寄存器│ │ 暂存寄存器│ │ │
│ │ │ PSR │ │ R0-R15 │ │ │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 寄存器组 │ │
│ │ 通用寄存器 | 专用寄存器 | 控制寄存器 │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘指令执行过程
c
指令执行周期:
1. 取指 (Fetch)
- PC → MAR (地址寄存器)
- M[MAR] → MDR (数据寄存器)
- MDR → IR (指令寄存器)
- PC + 1 → PC
2. 译码 (Decode)
- IR[操作码] → 指令译码器
- 分析指令类型和操作数
3. 执行 (Execute)
- 根据指令类型执行相应操作
- ALU 运算 / 数据传输 / 跳转
4. 访存 (Memory) - 可选
- 读取或写入内存数据
5. 写回 (Write Back)
- 将结果写回寄存器或内存
6. 中断检查
- 检查是否有中断请求流水线技术
┌─────────────────────────────────────────────────────────────┐
│ 指令流水线 │
│ │
│ 无流水线 (串行执行): │
│ 指令1: [取指][译码][执行][访存][写回] │
│ 指令2: [取指][译码][执行][访存][写回] │
│ 指令3: [取指]... │
│ │
│ 5级流水线 (并行执行): │
│ 时钟周期: 1 2 3 4 5 6 7 8 │
│ 指令1: [取指][译码][执行][访存][写回] │
│ 指令2: [取指][译码][执行][访存][写回] │
│ 指令3: [取指][译码][执行][访存][写回] │
│ 指令4: [取指][译码][执行][访存][写回] │
│ 指令5: [取指][译码][执行][访存][写回] │
│ │
│ 流水线冒险: │
│ 1. 结构冒险: 硬件资源冲突 │
│ 2. 数据冒险: 数据依赖 │
│ 3. 控制冒险: 分支跳转 │
└─────────────────────────────────────────────────────────────┘CPU 性能指标
| 指标 | 说明 | 公式 |
|---|---|---|
| 主频 | 时钟频率 | Hz |
| CPI | 每条指令周期数 | 周期数/指令 |
| MIPS | 每秒百万指令数 | 主频 / (CPI × 10^6) |
| FLOPS | 每秒浮点运算数 | 主频 × 每周期浮点运算数 |
存储系统
存储器层次结构
┌─────────────────────────────────────────────────────────────┐
│ 存储器层次结构 │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 寄存器 │ │
│ │ 容量: <1KB 速度: <1ns │ │
│ └─────────────────────────────────────────────────────┘ │
│ ▲ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ L1 缓存 │ │
│ │ 容量: 32-64KB 速度: 1-2ns │ │
│ └─────────────────────────────────────────────────────┘ │
│ ▲ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ L2 缓存 │ │
│ │ 容量: 256KB-1MB 速度: 3-10ns │ │
│ └─────────────────────────────────────────────────────┘ │
│ ▲ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ L3 缓存 │ │
│ │ 容量: 2-32MB 速度: 10-20ns │ │
│ └─────────────────────────────────────────────────────┘ │
│ ▲ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 主内存 (Main Memory) │ │
│ │ 容量: 4-128GB 速度: 50-100ns │ │
│ └─────────────────────────────────────────────────────┘ │
│ ▲ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 固态硬盘 (SSD) │ │
│ │ 容量: 128GB-4TB 速度: 25-100μs │ │
│ └─────────────────────────────────────────────────────┘ │
│ ▲ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 机械硬盘 (HDD) │ │
│ │ 容量: 500GB-20TB 速度: 5-10ms │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 越往上: 速度越快、容量越小、价格越高 │
│ 越往下: 速度越慢、容量越大、价格越低 │
└─────────────────────────────────────────────────────────────┘Cache 工作原理
c
Cache 映射方式:
1. 直接映射
每个内存块只能映射到固定的 Cache 行
Cache 行号 = 内存块号 % Cache 行数
2. 全相联映射
每个内存块可以映射到任意 Cache 行
灵活但比较电路复杂
3. 组相联映射
每个内存块映射到固定组内的任意行
兼顾灵活性和效率┌─────────────────────────────────────────────────────────────┐
│ Cache 结构示意 │
│ │
│ 内存地址: [ 标记 Tag ][ 组索引 Index ][ 块内偏移 Offset ] │
│ │
│ Cache 结构 (4路组相联): │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 组0 │ Tag │ Data │ Tag │ Data │ Tag │ Data │ Tag │ Data │ │
│ ├─────────────────────────────────────────────────────┤ │
│ │ 组1 │ Tag │ Data │ Tag │ Data │ Tag │ Data │ Tag │ Data │ │
│ ├─────────────────────────────────────────────────────┤ │
│ │ 组2 │ Tag │ Data │ Tag │ Data │ Tag │ Data │ Tag │ Data │ │
│ ├─────────────────────────────────────────────────────┤ │
│ │ 组3 │ Tag │ Data │ Tag │ Data │ Tag │ Data │ Tag │ Data │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 访问过程: │
│ 1. 用 Index 选择组 │
│ 2. 用 Tag 与组内所有行的 Tag 比较 │
│ 3. 命中: 用 Offset 读取数据 │
│ 4. 未命中: 从内存加载数据到 Cache │
└─────────────────────────────────────────────────────────────┘虚拟内存
c
虚拟内存的作用:
1. 为进程提供独立的地址空间
2. 实现内存保护
3. 支持大于物理内存的程序
4. 实现内存共享
地址转换过程:
虚拟地址 → 页表 → 物理地址
┌─────────────────────────────────────────────────────────────┐
│ 页式存储管理 │
│ │
│ 虚拟地址: [ 页号 Page Number ][ 页内偏移 Page Offset ] │
│ │
│ 页表项: │
│ ┌────────┬────────┬────────┬────────┬────────┐ │
│ │ 页框号 │ 有效位 │ 读写位 │ 用户位 │ 脏位 │ │
│ │ Frame │ Valid │ R/W │ User │ Dirty │ │
│ └────────┴────────┴────────┴────────┴────────┘ │
│ │
│ TLB (Translation Lookaside Buffer): │
│ - 页表的硬件缓存 │
│ - 加速地址转换 │
│ - 典型命中率 > 99% │
└─────────────────────────────────────────────────────────────┘总线系统
总线的分类
┌─────────────────────────────────────────────────────────────┐
│ 总线分类 │
│ │
│ 1. 片内总线 │
│ - CPU 内部各部件之间的连接 │
│ - 数据总线、地址总线、控制总线 │
│ │
│ 2. 系统总线 │
│ - CPU、内存、I/O 接口之间的连接 │
│ - PCI、PCIe、ISA 等 │
│ │
│ 3. 通信总线 │
│ - 计算机与外部设备之间的连接 │
│ - USB、SATA、Ethernet 等 │
│ │
│ 总线组成: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 数据总线 │ 传输数据信息 │ 宽度: 8/16/32/64 位 │ │
│ ├─────────────────────────────────────────────────────┤ │
│ │ 地址总线 │ 传输地址信息 │ 宽度决定寻址空间 │ │
│ ├─────────────────────────────────────────────────────┤ │
│ │ 控制总线 │ 传输控制信号 │ 读/写、中断、时钟等 │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘总线时序
c
同步总线:
- 所有操作由统一时钟控制
- 简单但受限于最慢设备
异步总线:
- 使用握手信号协调
- 灵活但控制复杂
半同步总线:
- 同步基础上增加等待信号
- 兼顾简单和灵活输入输出系统
I/O 控制方式
┌─────────────────────────────────────────────────────────────┐
│ I/O 控制方式对比 │
│ │
│ 1. 程序查询方式 │
│ ┌──────┐ ┌──────┐ │
│ │ CPU │────►│ I/O │ │
│ └──────┘ └──────┘ │
│ CPU 不断查询 I/O 状态 │
│ 优点: 简单 缺点: 效率低 │
│ │
│ 2. 中断方式 │
│ ┌──────┐ ┌──────┐ │
│ │ CPU │◄───►│ I/O │ │
│ └──────┘ └──────┘ │
│ I/O 完成后通知 CPU │
│ 优点: 效率高 缺点: 上下文切换开销 │
│ │
│ 3. DMA 方式 │
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ CPU │ │ DMA │◄───►│ I/O │ │
│ └──────┘ └──────┘ └──────┘ │
│ DMA 控制器直接管理数据传输 │
│ 优点: CPU 开销小 缺点: 硬件复杂 │
│ │
│ 4. 通道方式 │
│ 独立的 I/O 处理器 │
│ 优点: CPU 完全解放 缺点: 成本高 │
└─────────────────────────────────────────────────────────────┘中断系统
c
中断处理过程:
1. 中断请求
- 外设发出中断信号
2. 中断判优
- 多个中断时选择优先级最高的
3. 中断响应
- CPU 完成当前指令
- 保存 PC 和状态寄存器
- 关闭中断
4. 中断服务
- 跳转到中断服务程序
- 执行中断处理
5. 中断返回
- 恢复现场
- 开中断
- 返回断点┌─────────────────────────────────────────────────────────────┐
│ 中断向量表 │
│ │
│ 向量地址 中断类型 │
│ ┌────────┬────────────────────┐ │
│ │ 0x00 │ 复位 │ │
│ ├────────┼────────────────────┤ │
│ │ 0x04 │ 未定义指令 │ │
│ ├────────┼────────────────────┤ │
│ │ 0x08 │ 软中断 │ │
│ ├────────┼────────────────────┤ │
│ │ 0x0C │ 指令预取中止 │ │
│ ├────────┼────────────────────┤ │
│ │ 0x10 │ 数据访问中止 │ │
│ ├────────┼────────────────────┤ │
│ │ 0x14 │ 保留 │ │
│ ├────────┼────────────────────┤ │
│ │ 0x18 │ IRQ (普通中断) │ │
│ ├────────┼────────────────────┤ │
│ │ 0x1C │ FIQ (快速中断) │ │
│ └────────┴────────────────────┘ │
└─────────────────────────────────────────────────────────────┘总结
| 组件 | 核心功能 | 关键技术 |
|---|---|---|
| CPU | 执行指令 | 流水线、超标量、乱序执行 |
| 存储器 | 存储数据 | 层次结构、Cache、虚拟内存 |
| 总线 | 连接部件 | 同步/异步、带宽、协议 |
| I/O | 输入输出 | 中断、DMA、通道 |
参考资料
[1] 计算机组成与设计. David A. Patterson, John L. Hennessy
[2] 计算机组成原理. 唐朔飞
[3] Computer Organization and Architecture. William Stallings