CPU 组成
CPU(Central Processing Unit,中央处理器)是计算机的运算和控制核心,负责解释指令和处理数据。其内部结构经过数十年演进,从简单的运算控制器发展为包含复杂流水线、多级缓存和多核的精密系统。
发展历史
第一阶段:分离元件时代(1940s-1950s)
ENIAC (1946) → 占地 170㎡,18,000 个真空管
EDVAC (1949) → 首次采用"存储程序"概念
IBM 704 (1954) → 首次使用磁芯内存- CPU 由大量分离的晶体管和电子管组成
- 体积巨大,功耗极高,可靠性差
- 冯·诺依曼体系结构确立:运算器、控制器、存储器、输入、输出
第二阶段:微处理器诞生(1970s)
Intel 4004 (1971) → 第一款商用微处理器,2300 个晶体管,4 位
Intel 8080 (1974) → 8 位,4500 个晶体管,用于 Altair 8800
MOS 6502 (1975) → 8 位,3510 个晶体管,用于 Apple II
Intel 8086 (1978) → 16 位,29000 个晶体管,x86 架构起点- 摩尔定律开始发挥作用:每 18-24 个月晶体管数量翻倍
- CPU 从多芯片方案集成为单芯片
- 冯·诺依曼体系结构成为主流
第三阶段:流水线与超标量(1980s-1990s)
Intel 80386 (1985) → 32 位,流水线
Intel 80486 (1989) → 集成 FPU + L1 缓存
Intel Pentium (1993) → 双流水线(超标量)
AMD K5 (1996) → 内部 RISC 翻译
Intel Pentium Pro (1995) → 乱序执行 + L2 缓存- 流水线技术使 CPU 可以并行处理多条指令
- 超标量架构实现单周期发射多条指令
- 缓存从片外移入片内
第四阶段:多核时代(2000s-至今)
Intel Core 2 Duo (2006) → 双核
Intel Core i7 (2008) → 四核 + 超线程
AMD Ryzen (2017) → 八核起步, CCX 架构
Apple M1 (2020) → ARM 架构, 统一内存- 频率提升遇到功耗墙(Power Wall),转向多核
- 摩尔定律放缓,但通过架构创新持续提升性能
- 专用加速单元(AI、视频编解码)集成进 CPU
CPU 核心组成
从逻辑功能上,CPU 内部由以下核心部件组成:
┌─────────────────────────────────────┐
│ CPU │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ 控制器 CU │ │ 运算器 ALU │ │
│ │ PC IR ID │ │ 加法器 │ │
│ │ 控制电路 │ │ 逻辑运算 │ │
│ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │
│ ┌──────┴────────────────┴──────┐ │
│ │ 寄存器组 │ │
│ │ 通用寄存器 专用寄存器 │ │
│ └───────────────────────────────┘ │
│ ┌──────────┐ ┌──────────┐ │
│ │ L1 Cache│ │ L2 Cache│ │
│ └──────────┘ └──────────┘ │
│ ┌──────────────────────────┐ │
│ │ 总线接口 (Bus I/F) │ │
│ └──────────────────────────┘ │
└─────────────────────────────────────┘
│
┌────────────────────┼────────────────────┐
│ │ │
地址总线 数据总线 控制总线控制器(CU,Control Unit)
控制器是 CPU 的指挥中心,协调各部件有序工作。
主要功能:
- 取指令:从指令 Cache 或内存中取出指令
- 译码:对指令进行解析,确定操作类型
- 产生控制信号:驱动 ALU、寄存器、内存等部件执行操作
- 控制数据流向:管理数据在 CPU 内部和外部总线之间的传输
内部组成:
| 部件 | 英文 | 作用 |
|---|---|---|
| 程序计数器 | PC(Program Counter) | 存放下一条指令的地址,取指后自动递增 |
| 指令寄存器 | IR(Instruction Register) | 存放当前正在执行的指令 |
| 指令译码器 | ID(Instruction Decoder) | 对指令进行"翻译",确定操作性质 |
| 控制电路 | Control Circuit | 根据译码结果发出具体控制信号 |
| 时序发生器 | Timing Generator | 产生时钟时序信号,协调各部件节奏 |
取指流程:
text
PC → MAR → 地址总线 → 存储器 (1) 发出指令地址
CU → 控制总线 → 存储器读命令 (2) 发送读命令
存储器 → 数据总线 → MDR → IR (3) 读取指令
PC = PC + 指令长度 (4) PC 自动递增运算器(ALU,Arithmetic Logic Unit)
运算器是 CPU 的执行核心,负责所有算术和逻辑运算。
主要功能:
- 算术运算:加、减、乘、除、递增、递减
- 逻辑运算:与(AND)、或(OR)、非(NOT)、异或(XOR)
- 移位运算:左移、右移、循环移位
- 比较运算:大小比较、零值测试
核心部件:
- 加法器(Adder):所有算术运算的基础
- 累加器(ACC):暂存运算中间结果
- 状态标志寄存器:记录运算结果的特征(进位、溢出、零值等)
现代 CPU 中 ALU 已发展为多个并行执行单元(整数 ALU、FPU、SIMD 单元等)。
寄存器(Registers)
寄存器是 CPU 内部的高速暂存单元,访问速度远快于内存(1 个时钟周期 vs 几十~几百个时钟周期)。
用户可见寄存器:
| 类型 | 作用 |
|---|---|
| 通用寄存器 | 存放操作数、运算结果,为 ALU 提供工作区 |
| 数据寄存器 | 暂存从内存读取或将要写入内存的数据 |
| 地址寄存器 | 保存当前 CPU 访问的内存单元地址 |
| 条件码寄存器(标志寄存器) | 存放运算结果的状态(CF、OF、SF、ZF、PF 等) |
x86-64 通用寄存器示例:
text
RAX (累加器) — 运算操作数、函数返回值
RBX (基址) — 基址寻址
RCX (计数) — 循环、字符串操作计数
RDX (数据) — I/O 操作、乘法扩展
RSI/RDI — 源/目标索引(字符串操作)
RSP — 栈指针
RBP — 基址指针(栈帧)
R8~R15 — 新增通用寄存器控制和状态寄存器:
| 寄存器 | 作用 |
|---|---|
| CR0~CR4(控制寄存器) | 控制处理器操作模式(保护模式、分页等) |
| EFLAGS/RFLAGS(状态寄存器) | 记录 CPU 状态和运算标志 |
| MSR(模型专用寄存器) | 厂商自定义的特殊功能寄存器 |
指令执行周期
一条指令在 CPU 中的执行过程分为五个阶段:
取指(IF) → 译码(ID) → 执行(EX) → 访存(MEM) → 写回(WB)传统串行执行
早期 CPU 执行指令是串行的:一条指令完成所有 5 个阶段后,才取下一条。
text
指令1: [IF][ID][EX][MEM][WB]
指令2: [IF][ID][EX][MEM][WB]
指令3: [IF][ID][EX][MEM][WB]利用率低:每个时刻只有 1/5 的部件在工作。
流水线执行
流水线让不同指令的不同阶段重叠执行:
text
指令1: [IF][ID][EX][MEM][WB]
指令2: [IF][ID][EX][MEM][WB]
指令3: [IF][ID][EX][MEM][WB]
指令4: [IF][ID][EX][MEM][WB]- 理想情况下,每时钟周期完成一条指令
- 现代 CPU 流水线深度通常为 14~20 级(如 Intel Core 为 14 级)
- 流水线越长,频率越高,但分支预测失败的惩罚也越大
现代 CPU 的增强技术
超标量(Superscalar)
- 每周期发射多条指令到多个执行单元
- AMD Zen 4:每周期发射 8 条指令
- 需要多个并行的 ALU、FPU、访存单元
乱序执行(Out-of-Order Execution)
- 指令不按程序顺序执行,只要操作数就绪即可执行
- 解决流水线中的数据依赖导致的停顿
- 需要**重排序缓冲(ROB)**记录指令的原始顺序
分支预测(Branch Prediction)
- CPU 提前预测分支方向(if-else、循环)
- 预测正确 → 流水线持续填满
- 预测错误 → 清空流水线,性能惩罚(约 10~20 个周期)
- 现代 CPU 预测准确率 > 95%
缓存层次(Cache Hierarchy)
缓存解决了 CPU 速度与内存速度之间的巨大差距(存储墙):
| 层级 | 大小 | 速度 | 位置 |
|---|---|---|---|
| 寄存器 | ~数百字节 | < 1 ns | CPU 内部 |
| L1 Cache | 32~64 KB | ~1 ns | 每个核心独享 |
| L2 Cache | 256~512 KB | ~3 ns | 每个核心独享 |
| L3 Cache | 8~32 MB | ~10 ns | 所有核心共享 |
| 主存(RAM) | 8~64 GB | ~100 ns | 片外 |
从单核到多核
为什么需要多核
2000 年代中期,CPU 发展遇到三大瓶颈:
- 功耗墙(Power Wall):频率越高,功耗呈立方增长
- 指令级并行瓶颈:程序中可供并行执行的指令有限
- 内存墙(Memory Wall):内存速度增长远慢于 CPU 速度
多核架构
单核: [Core 0] → 只能同时执行一个线程
┌──────────────┐
双核: [Core 0] ──→ │ │ → 两个线程同时执行
[Core 1] ──→ │ L3 Cache │
└──────────────┘| 概念 | 说明 |
|---|---|
| 物理核 | 独立的处理单元,包含完整的 CU + ALU + L1/L2 |
| 逻辑核 | 超线程技术将一个物理核虚拟为两个逻辑核 |
| 超线程(HT) | 共享执行资源,利用流水线闲置时间 |
| SMT(同步多线程) | 超线程的通用叫法,AMD 称为 SMT |
多核 vs 多线程
在 CPU 组成层面,多核与多线程是不同的概念:
text
单核单线程:1 个 Core → 1 个线程(每次只能执行一个任务)
单核多线程:1 个 Core + HT → 2 个逻辑核(共享执行单元)
双核单线程:2 个 Core → 2 个线程(完全独立执行)
双核双线程:2 个 Core + HT → 4 个逻辑核多核是真并行,多线程(超线程)是伪并行——它利用的是单个核心内的闲置资源。
组成总结
| 部件 | 功能 | 发展演变 |
|---|---|---|
| 控制器 CU | 取指令、译码、发控制信号 | 硬布线 → 微程序 → 混合控制 |
| 运算器 ALU | 算术/逻辑运算 | 单 ALU → 多 ALU → SIMD/FPU 分离 |
| 寄存器 | 高速暂存 | 几十个 → 数百个(寄存器重命名) |
| Cache | 缓解内存速度差距 | 无 → L1 → L2 → L3 三级缓存 |
| 总线接口 | CPU 与外部通信 | 单总线 → 前端总线 → 直连架构 |
| 流水线 | 指令级并行 | 无 → 5 级 → 14-20 级超流水线 |
| 多核 | 线程级并行 | 单核 → 双核 → 数十核 |