CPU
→ 返回计算机基础
基本结构
CPU
├── 运算器(ALU) — 执行算术/逻辑运算
├── 控制器(CU) — 读取并解释指令,协调各部件
├── 寄存器组 — CPU 内部最快的存储单元
│ ├── 程序计数器 PC — 下一条指令地址
│ ├── 指令寄存器 IR — 当前正在执行的指令
│ ├── 累加器 ACC — 运算结果暂存
│ └── 通用寄存器 — 临时数据
└── 高速缓存(Cache) — L1/L2/L3
指令执行周期
取指(Fetch)→ 译码(Decode)→ 执行(Execute)→ 写回(Write Back)
| 阶段 | 动作 |
|---|---|
| 取指 | PC → MAR → 内存读指令 → IR,PC+1 |
| 译码 | CU 解析操作码和操作数 |
| 执行 | ALU 运算 / 访存 / 跳转 |
| 写回 | 结果写回寄存器或内存 |
流水线
将指令执行拆成多个阶段并行处理,理想情况下 N 级流水线吞吐量提升 N 倍。
流水线冒险:
| 类型 | 原因 | 解决 |
|---|---|---|
| 结构冒险 | 多条指令争用同一硬件资源 | 资源复制(如分离 I-Cache/D-Cache) |
| 数据冒险 | 后一条指令依赖前一条未写回的结果 | 数据转发(Forwarding)/ 插入气泡(Stall) |
| 控制冒险 | 分支指令使后续取指地址不确定 | 分支预测(静态/动态) |
Cache(高速缓存)
CPU 与内存速度差异巨大,Cache 弥补这一鸿沟。
| 级别 | 容量 | 速度 | 说明 |
|---|---|---|---|
| L1 | 32~64 KB | ~4 cycle | 每个核独有,分 I-Cache / D-Cache |
| L2 | 256 KB~1 MB | ~12 cycle | 每个核独有 |
| L3 | 4~64 MB | ~40 cycle | 多核共享 |
| 内存 | GB 级 | ~200 cycle | DRAM |
Cache 映射方式:
- 直接映射:内存块固定映射到某 Cache 行,冲突多
- 全相联:可映射到任意 Cache 行,硬件复杂
- 组相联:折中,N 路组相联(常用 4/8 路)
替换策略:LRU(最近最少使用)/ LFU / 随机
写策略:
| 策略 | 说明 |
|---|---|
| 写直达(Write Through) | 同时写 Cache 和内存,一致性好,带宽压力大 |
| 写回(Write Back) | 只写 Cache,脏位标记,替换时才写回内存 |
多核与超线程
- 多核:一块芯片上有多个独立 CPU 核心,真正并行执行
- 超线程(HT / SMT):一个物理核模拟两个逻辑核,共享执行单元,提高利用率约 20%~30%
时钟频率与 IPC
性能 ≈ 频率(GHz)× IPC(每时钟周期执行指令数)× 核心数
提升频率受功耗和散热限制(功耗 ∝ 频率³),现代 CPU 更多靠提升 IPC 和核心数。
乱序执行与分支预测
- 乱序执行(OoO):CPU 不按程序顺序执行,只要数据依赖允许就提前执行,最后按序提交结果
- 分支预测:预测 if/循环走哪条路,预测失败则清空流水线(约 10~20 cycle 惩罚)
- 静态预测:总是预测不跳转
- 动态预测:用历史记录(BTB、BHT)做预测,现代 CPU 准确率 >95%
CISC vs RISC
| CISC(x86) | RISC(ARM、RISC-V) | |
|---|---|---|
| 指令 | 复杂、变长 | 简单、定长 |
| 寄存器 | 少 | 多(32 个通用寄存器) |
| 功耗 | 较高 | 低 |
| 典型场景 | PC、服务器 | 移动设备、嵌入式、Apple Silicon |