Skip to content
约 0 字 · 预计阅读 0 分钟

计算机组成原理

什么是计算机组成原理?

计算机组成原理是研究计算机 硬件系统的结构、工作原理和设计方法 的学科。它揭示了计算机如何通过电子元件实现信息的存储、处理和传输。

计算机系统层次结构

┌─────────────────────────────────────────────────────────────┐
│                    计算机系统层次结构                        │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │              应用程序层                              │   │
│  │         用户软件、应用程序                           │   │
│  └─────────────────────────────────────────────────────┘   │
│                          ▲                                  │
│  ┌─────────────────────────────────────────────────────┐   │
│  │              系统软件层                              │   │
│  │         操作系统、编译器、数据库                     │   │
│  └─────────────────────────────────────────────────────┘   │
│                          ▲                                  │
│  ┌─────────────────────────────────────────────────────┐   │
│  │              汇编语言层                              │   │
│  │         汇编指令、系统调用                           │   │
│  └─────────────────────────────────────────────────────┘   │
│                          ▲                                  │
│  ┌─────────────────────────────────────────────────────┐   │
│  │              机器语言层                              │   │
│  │         二进制指令、机器码                           │   │
│  └─────────────────────────────────────────────────────┘   │
│                          ▲                                  │
│  ┌─────────────────────────────────────────────────────┐   │
│  │              硬件层                                  │   │
│  │         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

相关主题

基于 VitePress 构建