计算机组成原理
冯·诺依曼体系结构 - 五大组成部分
计算机由运算器、控制器、存储器、输入设备、输出设备五大部件组成,各部件之间通过总线连接,协同完成计算任务。
1. 运算器 (ALU - Arithmetic Logic Unit)
作用:执行所有的算术运算和逻辑运算,是计算机的"计算中心"。
具体功能:
- 算术运算:加、减、乘、除等数学运算
- 逻辑运算:与(AND)、或(OR)、非(NOT)、异或(XOR)等位运算
- 移位操作:左移、右移(算术移位、逻辑移位、循环移位)
- 比较运算:大小比较,产生条件标志位(零标志 ZF、符号标志 SF、进位标志 CF、溢出标志 OF)
- 数据加工:对二进制数据进行加工处理
组成部件:
- 算术逻辑单元(ALU)
- 累加器(ACC)
- 暂存寄存器
- 通用寄存器组
- 状态寄存器(PSW - Program Status Word)
2. 控制器 (CU - Control Unit)
作用:指挥和协调计算机各部件工作,是计算机的"指挥中心"和"大脑"。
具体功能:
- 指令控制:取指、译码、执行指令
- 顺序控制:保证指令按顺序(或指定顺序)执行
- 操作控制:产生各种控制信号,控制各部件完成指定操作
- 时间控制:严格控制各操作的时间顺序(时钟同步)
- 中断处理:响应和处理各种中断请求
- 程序计数:通过 PC(Program Counter)寄存器跟踪下一条指令地址
组成部件:
- 程序计数器(PC)
- 指令寄存器(IR)
- 指令译码器(ID)
- 时序发生器
- 操作控制器
- 中断系统
CPU = 运算器 + 控制器
3. 存储器 (Memory)
作用:存储程序和数据,是计算机的"记忆中心"。
具体功能:
- 存储程序:存放要执行的指令序列
- 存储数据:存放原始数据、中间结果、最终结果
- 读写访问:支持随机读写,按地址访问
- 数据保护:保证数据不丢失、不被破坏
分类:
| 类别 | 特点 | 示例 |
|---|---|---|
| 主存(内存) | 速度快、容量小、易失 | RAM、ROM、Cache |
| 辅存(外存) | 速度慢、容量大、永久 | 硬盘、SSD、U 盘 |
分层结构(由上至下速度递增、容量递减、成本递增):
- 寄存器 → Cache(L1/L2/L3) → 主存(内存) → 辅存(硬盘)
关键指标:
- 存储容量
- 存取时间(速度)
- 存储单元(位/字节/字)
- 地址(每个存储单元的唯一编号)
4. 输入设备 (Input Device)
作用:将外部信息(数据、命令、程序)转换为计算机能识别的二进制形式送入计算机,是计算机与外界沟通的"入口"。
具体功能:
- 数据采集:获取外部信息(数字、文本、图像、声音、动作等)
- 格式转换:将人类可识别的信息转换为机器可识别的二进制代码
- 传输数据:通过接口将数据送入主机
常见设备:
- 键盘:输入字符、命令
- 鼠标:输入位置、点击指令
- 扫描仪:输入图像
- 麦克风:输入声音
- 摄像头:输入视频/图像
- 触摸屏:输入位置和操作
- 条形码扫描器:输入商品信息
- 传感器:输入物理信号(温度、压力等)
5. 输出设备 (Output Device)
作用:将计算机处理后的二进制结果转换为人或其他设备能识别的形式,是计算机与外界沟通的"出口"。
具体功能:
- 结果展示:把计算结果以可见、可听、可触的形式呈现
- 格式转换:将二进制数据转换为人可识别的信息(文字、图像、声音等)
- 信息记录:把结果永久保存在外部介质上
常见设备:
- 显示器:输出图像、视频
- 打印机:输出纸质文档
- 音箱/耳机:输出声音
- 绘图仪:输出图纸
- 投影仪:输出大屏幕影像
- LED 指示灯:输出状态信号
- 执行机构:输出控制信号(机器人、自动化设备)
五大部件协同工作流程
输入设备 → 存储器 ← 输出设备
↓ ↑
控制器 → 运算器
典型工作过程:
- 通过输入设备将程序和数据送入存储器
- 控制器从存储器中读取指令,进行译码
- 控制器向运算器发出控制信号,运算器从存储器取数据
- 运算器进行运算,将结果送回存储器
- 控制器将结果通过输出设备呈现给用户
- 返回第 2 步,继续执行下一条指令
核心要点总结
| 部件 | 别称 | 核心功能 |
|---|---|---|
| 运算器 | 计算中心 | 算术/逻辑运算 |
| 控制器 | 指挥中心 | 协调控制各部件 |
| 存储器 | 记忆中心 | 存储程序和数据 |
| 输入设备 | 入口 | 数据输入计算机 |
| 输出设备 | 出口 | 展示计算结果 |
现代计算机中:CPU = 运算器 + 控制器,统称为"中央处理器",通过总线(数据总线、地址总线、控制总线)与存储器和 I/O 设备相连。
第二章 CPU
一、CPU 指令集 (Instruction Set Architecture, ISA)
指令集是 CPU 能识别和执行的全部指令的集合,是软件与硬件之间的接口规范,定义了 CPU 能做什么、怎么做。
1. 指令的格式
一条指令由两部分组成:
- 操作码 (Opcode):指明指令的操作类型(加、减、传送、跳转等)
- 地址码 (Operand):指明操作数或其地址(操作数可以是 0、1、2、3 个)
常见指令格式(按地址码数量):
| 类型 | 地址码数 | 特点 | 示例 |
|---|---|---|---|
| 零地址 | 0 | 栈结构,操作数在栈顶 | ADD(栈顶两元素相加) |
| 一地址 | 1 | 单操作数 + 累加器 | INC A |
| 二地址 | 2 | 两个操作数 | ADD A, B |
| 三地址 | 3 | 两个源 + 一个目的 | ADD A, B, C |
2. 指令的分类
按功能划分:
- 数据传送类:MOV、LOAD、STORE、PUSH、POP
- 算术运算类:ADD、SUB、MUL、DIV、INC、DEC
- 逻辑运算类:AND、OR、NOT、XOR、SHL、SHR
- 移位操作类:逻辑移位、算术移位、循环移位
- 转移控制类:JMP(无条件跳转)、JZ/JNZ(条件跳转)、CALL(调用)、RET(返回)
- 输入输出类:IN、OUT
- 串操作类:MOVS、CMPS、SCAS
- 特权类:系统调用、软中断
按操作数存放位置划分:
- 寄存器-寄存器型 (RR):操作数全在寄存器中,速度快
- 寄存器-存储器型 (RM):一个操作数在寄存器,一个在内存
- 存储器-存储器型 (MM):两个操作数都在内存,速度慢
3. 两种主要指令集体系
CISC (Complex Instruction Set Computer) - 复杂指令集
- 特点:指令数量多(100+ 条)、指令长度不固定、寻址方式多、可直接访问内存、复杂指令由硬件完成
- 代表:Intel x86、x86-64(AMD64)
- 优点:编程方便、代码密度高、内存占用小
- 缺点:硬件复杂、指令执行周期长、不利于流水线
- 应用:桌面 PC、服务器
RISC (Reduced Instruction Set Computer) - 精简指令集
- 特点:指令数量少、指令长度固定(通常 32 位)、大多数指令单周期完成、只允许 LOAD/STORE 访问内存、大量使用寄存器
- 代表:ARM、MIPS、RISC-V、PowerPC
- 优点:硬件简单、流水线效率高、功耗低、易于设计
- 缺点:代码密度低、复杂操作需多条指令组合
- 应用:移动设备、嵌入式、IoT、苹果 M 系列芯片
CISC vs RISC 对比
| 维度 | CISC | RISC |
|---|---|---|
| 指令数量 | 多(200+) | 少(通常 < 100) |
| 指令长度 | 不定长 | 定长 |
| 执行周期 | 多周期 | 大多单周期 |
| 寻址方式 | 多 | 少 |
| 内存访问 | 任意指令可访问 | 仅 LOAD/STORE |
| 寄存器数量 | 少 | 多(32+) |
| 硬件复杂度 | 高 | 低 |
| 流水线 | 难实现 | 天然友好 |
| 功耗 | 高 | 低 |
| 代表架构 | x86 | ARM、RISC-V |
趋势:现代 x86 CPU 内部已把 CISC 指令译码成 RISC 微操作 (μops) 再执行,本质上是 RISC。RISC-V 因开源、免费、模块化,正在快速发展。
4. 指令的执行过程
CPU 执行一条指令需要经过以下阶段(经典 5 阶段):
- 取指 (IF - Instruction Fetch):从内存读取下一条指令到 IR
- 译码 (ID - Instruction Decode):解析操作码和操作数,生成控制信号
- 执行 (EX - Execute):ALU 进行运算,或计算有效地址
- 访存 (MEM - Memory Access):从内存读取/写入数据(仅 LOAD/STORE 需要)
- 写回 (WB - Write Back):将结果写回寄存器
取指-执行周期:CPU 不断重复"取指→执行"的过程,直到遇到停机指令或外部中断。
二、CPU 相关核心知识
1. CPU 的主要性能指标
| 指标 | 说明 |
|---|---|
| 主频 | 时钟频率(GHz),频率越高速度越快 |
| 核心数 | 物理核心数,多核可并行执行多任务 |
| 线程数 | 逻辑核心数,超线程可让 1 核跑 2 线程 |
| 位宽 | 一次处理的数据位数(32/64 位) |
| 缓存 | L1/L2/L3,容量越大命中率越高 |
| 工艺制程 | 晶体管线宽(nm),越小越先进(7nm、5nm) |
| TDP 功耗 | 热设计功耗(W),越低越省电 |
| IPC | 每时钟周期指令数,频率相同时 IPC 越高性能越强 |
CPU 性能公式(理论):
性能 ≈ 主频 × IPC × 核心数
2. CPU 的内部结构
核心组成:
- 运算单元:ALU(算术逻辑单元)、FPU(浮点运算单元)
- 控制单元:指令译码器、微程序控制器
- 寄存器组:
- 通用寄存器(GPR):用于存放操作数和中间结果
- 专用寄存器:PC(程序计数器)、IR(指令寄存器)、MAR(地址寄存器)、MDR(数据寄存器)、PSW(状态字寄存器)、SP(栈指针)
- 缓存 (Cache):L1(分指令/数据)、L2、L3,缓解 CPU 与内存的速度差
- 总线接口单元 (BIU):负责与外部总线交互
3. 多核 CPU
- 同构多核:所有核心结构相同,适合通用并行
- 异构多核 (大小核):高性能核 + 高效能核(如 ARM big.LITTLE、Intel P 核 + E 核)
- 核心通信:通过共享缓存、总线或片上互连网络(如 Ring、Mesh)
- 并行模型:SISD、SIMD、MISD、MIMD(Flynn 分类法)
3.5 核心数 vs 线程数
基本概念
| 术语 | 别称 | 含义 |
|---|---|---|
| 物理核心 (Core) | 物理核 | 硬件上真正独立的运算单元,每个有自己的 ALU、寄存器、Cache 等 |
| 逻辑核心 (Thread) | 逻辑核/线程 | 操作系统看到的"CPU 核心",由物理核心映射而来 |
| 进程 (Process) | - | 程序的一次执行,拥有独立内存空间(虚拟地址空间) |
| 线程 (Thread) | 轻量级进程 | 进程内的执行流,共享进程的内存,但有自己的栈和寄存器 |
核心与线程的关系
- 1 个物理核心 = 1 个逻辑线程(无超线程时)
- 1 个物理核心 = 2 个逻辑线程(开启超线程后,典型是 2 路 SMT)
- 总逻辑线程数 = 物理核心数 × 每核线程数
常见标识:4 核 8 线程 表示 4 个物理核心,通过超线程模拟出 8 个逻辑核心。
超线程技术 (SMT)
全称:Simultaneous Multi-Threading(同步多线程),Intel 称为 Hyper-Threading (HT)。
原理:一个物理核心内部的执行资源(ALU、FPU、Cache 等)通常无法被一条指令流充分利用。超线程让两个线程的指令同时进入流水线,当一个线程因等待内存/数据而阻塞时,另一个线程可以继续使用空闲的执行单元,提升整体利用率。
优点:
- 提高 CPU 利用率:充分利用空闲的执行单元
- 提升多任务性能:前台/后台任务同时跑得更流畅
- 几乎不增加功耗:复用现有硬件,功耗增加约 5%
缺点:
- 不是性能翻倍:实际提升通常 15%~30%,远不到 2 倍
- 同线程互相干扰:两条指令流争抢资源,可能单线程性能略降
- 依赖场景:计算密集型收益小,IO 密集型/多任务收益大
典型应用:服务器(大量并发请求)、桌面(边打游戏边录屏)、浏览器(多标签页)。
核心/线程相关的 CPU 调度
操作系统视角:OS 把"逻辑核心"作为调度的基本单位,通过时间片轮转把就绪线程分配到不同的逻辑核心上。
线程调度策略:
- 先来先服务 (FCFS):简单但平均等待时间长
- 短作业优先 (SJF):平均等待时间最短,但长任务可能饥饿
- 时间片轮转 (RR):每个线程跑一个时间片,公平但频繁切换有开销
- 优先级调度:区分前台/后台,高优先级先跑,可能低优先级饥饿
- 多级反馈队列:结合时间片和优先级,现代 OS 主流方案
进程/线程同步(多核环境下多个线程访问共享资源):
- 互斥锁 (Mutex):同一时刻只有一个线程能进入临界区
- 读写锁 (RWLock):读多写少场景,读可并发
- 信号量 (Semaphore):控制同时访问资源的线程数
- 自旋锁 (Spinlock):不睡眠,忙等,适合短临界区
- 原子操作 (CAS):硬件支持的不可中断操作,无锁编程
- 内存屏障 (Memory Barrier):保证指令/数据的可见性与顺序性
进程 vs 线程 对比
| 维度 | 进程 | 线程 |
|---|---|---|
| 资源占用 | 大(独立内存空间) | 小(共享进程内存) |
| 切换开销 | 大(需切换页表等) | 小(只需切换寄存器/栈) |
| 通信方式 | 管道、消息队列、Socket、共享内存 | 直接共享内存(需同步) |
| 安全性 | 高(天然隔离) | 低(共享数据,需加锁) |
| 创建/销毁成本 | 高 | 低 |
| 适合场景 | 需要强隔离的任务 | 频繁创建、密集计算的任务 |
多核编程注意点
- 并行不一定更快:线程创建/同步有开销,任务太小时并行反而更慢(阿姆达尔定律)
- 避免伪共享 (False Sharing):不同线程的变量不要落在同一个 Cache 行(64 字节)内
- 数据竞争:多线程改同一变量必须同步,否则结果不可预期
- 亲和性 (Affinity):把线程绑到特定核心,减少跨核迁移带来的 Cache 失效
- NUMA 架构:多插槽服务器要注意内存访问的"远近",尽量本地访问
- 阿姆达尔定律 (Amdahl's Law):理论加速比上限 = 1 / (串行比例 + 并行比例 / 核心数)
4. 流水线 (Pipeline)
把一条指令的执行拆成多步,让多条指令重叠执行,提高吞吐率。
经典 5 级流水线:IF → ID → EX → MEM → WB
理想情况:n 条指令、k 级流水线,执行时间 ≈ (n + k - 1) × 单级时间
流水线冒险 (Hazards):
- 结构冒险:硬件资源冲突(如同时访问内存),解决:加哈弗结构(指令/数据 Cache 分开)
- 数据冒险:后一条指令用到前一条结果时数据未就绪,解决:数据转发 (Forwarding)、流水线停顿 (Bubble)
- 控制冒险:分支跳转导致预取指令作废,解决:分支预测、延迟槽
流水线性能指标:
- 吞吐率 (Throughput):单位时间完成的指令数
- 加速比 (Speedup):流水线执行时间 / 非流水线执行时间
- 效率 (Efficiency):加速比 / 流水线级数
5. 高级优化技术
- 超标量 (Superscalar):一个周期发射多条指令(CPU 内部有多条流水线)
- 超线程 (Hyper-Threading/SMT):1 个物理核心模拟 2 个逻辑核心,共享执行单元
- 乱序执行 (Out-of-Order Execution):不按程序顺序执行,提高资源利用率
- 分支预测 (Branch Prediction):预测分支走向,减少流水线清空
- SIMD (单指令多数据):一条指令处理多个数据(AVX、SSE、NEON)
- 多核互连:片上网络 (NoC)、Ring 总线、Mesh 网格
6. CPU 工作流程总览
程序 → 编译器 → 机器指令 → 内存
↓
┌───────── CPU ─────────┐
│ PC → 取指 → IR → ID │
│ ↓ 控制信号 │
│ ALU 计算 ← 寄存器 │
│ ↓ 访存(L/S) │
│ 写回寄存器 → 更新 PC │
└──────────────────────┘
↓
内存 / I/O
7. 常见 CPU 架构速览
| 架构 | 类型 | 厂商 | 典型应用 |
|---|---|---|---|
| x86 | CISC | Intel、AMD | PC、服务器 |
| ARM | RISC | ARM(英国) | 手机、嵌入式、苹果 M1/M2/M3 |
| RISC-V | RISC | 开源(基金会) | IoT、教育、国产芯片、平头哥 |
| MIPS | RISC | MIPS(已开源) | 路由器、龙芯(早期) |
| Power | RISC | IBM | 服务器、大型机 |
| LoongArch | RISC | 龙芯中科 | 国产 PC、服务器 |
8. CPU 性能影响因素总结
- 频率:主频越高,单核越快(受功耗墙限制)
- IPC:微架构越先进,每周期能干的事越多
- 缓存:命中率高,等待内存的时间就少
- 内存:带宽、延迟、频率(内存墙)
- 指令集:不同 ISA 性能与生态不同
- 编译器:好的编译能榨干硬件性能
- 程序本身:算法复杂度、并行度
第三章 存储器 (Memory)
存储器是计算机的"记忆中心",按速度由快到慢、容量由小到大、成本由高到低,通常分为多层金字塔结构。
一、存储层次结构 (Memory Hierarchy)
←── 容量小、速度快、成本高
寄存器 (Registers) ~ 1 ns, 几百字节, 在 CPU 内
↓
L1 Cache ~ 1-2 ns, 几十 KB
L2 Cache ~ 3-10 ns, 几百 KB ~ 几 MB
L3 Cache ~ 10-20 ns, 几 MB ~ 几十 MB
↓
主存 (Main Memory / RAM) ~ 50-100 ns, 几 GB ~ 几十 GB
↓
辅存 (SSD/HDD) ~ 50 μs (SSD) / 5 ms (HDD), 几百 GB ~ 几 TB
↓
远程存储 (云/磁带) 秒级, 几乎无限
←── 容量大、速度慢、成本低
核心思想:用"局部性原理"——把最常用的数据放最上层,大概率能命中,平均访问时间接近上层。
- 时间局部性:刚被访问的数据,短期内很可能再被访问 → 用 Cache 留住
- 空间局部性:访问某个地址,周围地址很可能也被访问 → 用 Cache 行/块预取
二、高速缓存 (Cache)
1. Cache 基本概念
- Cache 行 (Cache Line / Block):Cache 与主存之间数据传输的最小单位,通常 64 字节
- 命中率 (Hit Rate):访问在 Cache 中找到的比例
- 缺失率 (Miss Rate):1 - 命中率
- 平均访问时间:T = H × T_cache + (1 - H) × T_cache + T_memory
三类缺失 (3 C's):
- 强制缺失 (Compulsory):第一次访问某个数据,无法避免
- 容量缺失 (Capacity):Cache 太小,装不下所有工作集
- 冲突缺失 (Conflict):映射算法导致某些行反复被踢出
2. Cache 与主存的映射方式
主存地址结构: 标记(Tag) + 组号(Index) + 块内偏移(Offset)
| 映射方式 | 特点 | 优点 | 缺点 |
|---|---|---|---|
| 直接映射 | 每个主存块只能映射到固定一个 Cache 行 | 硬件简单、速度快 | 冲突率高,容易抖动 |
| 全相联映射 | 每个主存块可放到任意 Cache 行 | 命中率高、冲突少 | 硬件复杂、查找慢 |
| 组相联映射 (N 路) | 先定位组,组内任意放,主流方式 | 折中,现代 CPU 普遍采用 | 折中 |
组相联示例 (8 路组相联):
主存块号 % 组数 = 组号
组内:同时比较 8 个 Tag,任一命中即访问
3. Cache 替换算法
当 Cache 已满,要加载新块时,踢掉哪一个?
- LRU (Least Recently Used):淘汰最久未使用,效果最好,实现复杂
- FIFO (First In First Out):淘汰最早进入的,实现简单
- LFU (Least Frequently Used):淘汰访问次数最少的
- 随机 (Random):实现最简单,实际效果不错
- 近似 LRU:用几位二进制近似 LRU,硬件友好(现代 CPU 常用)
4. Cache 写策略
| 策略 | 写命中时 | 写缺失时 | 特点 |
|---|---|---|---|
| 写直达 (Write Through) | 同时写 Cache 和主存 | 直接写主存 | 数据一致性好,但慢 |
| 写回 (Write Back) | 只写 Cache,标记脏位 | 淘汰脏块时再写回主存 | 速度快,但要处理一致性 |
| 写分配 (Write Allocate) | - | 先把块加载到 Cache 再写 | 与写回配合使用 |
| 写不分配 (No Write Allocate) | - | 直接写主存,不加载 | 与写直达配合使用 |
现代 CPU 一般采用 写回 + 写分配。
5. 多级 Cache 与一致性
多级 Cache 结构:
- L1:分指令 Cache (I-Cache) 和数据 Cache (D-Cache),最快,几十 KB
- L2:统一 Cache,容量更大,几百 KB ~ 几 MB
- L3:多个核心共享,几 MB ~ 几十 MB
- 包含性 (Inclusion):L3 包含 L2,L2 包含 L1
- 独占性 (Exclusion):L1/L2/L3 数据不重复(如 AMD 早期)
多核 Cache 一致性协议 (MESI):
| 状态 | 含义 |
|---|---|
| M (Modified) | 该 Cache 行已被修改,主存已过期,独占 |
| E (Exclusive) | 与主存一致,独占 |
| S (Shared) | 与主存一致,可能在其他核也有副本 |
| I (Invalid) | 无效,需要重新加载 |
变体:MOESI、MSI、MESI-FO 等,核心思路是监听 (Snooping) 或目录 (Directory) 维护一致性。
6. 伪共享 (False Sharing)
不同线程修改同一 Cache 行的不同变量时,虽然逻辑无关,但因 Cache 一致性协议会导致该行在多个核间反复失效,性能急剧下降。
解决:
- 变量间加 padding 凑够 64 字节
- 关键数据结构按 64 字节对齐
- 使用
__attribute__((aligned(64)))(GCC) /[StructLayout](C#) /@Contended(Java)
三、主存 (Main Memory)
1. RAM vs ROM
| 类别 | 全称 | 特点 | 用途 |
|---|---|---|---|
| RAM | Random Access Memory | 可读可写,易失 | 运行时内存 |
| ROM | Read Only Memory | 只读,非易失 | 固件、BIOS |
2. RAM 分类
按存储原理:
| 类型 | 原理 | 速度 | 成本 | 用途 |
|---|---|---|---|---|
| SRAM | 6 个晶体管构成一个存储单元,无需刷新 | 极快, ns 级 | 高 | CPU 缓存 |
| DRAM | 1 个电容 + 1 个晶体管,需周期性刷新 | 较慢, 几十 ns | 低 | 内存条 |
| SDRAM | 同步 DRAM, 与 CPU 时钟同步 | 较快 | 中 | 早期内存 |
| DDR SDRAM | 双倍数据率 SDRAM,每个时钟传 2 次 | 快 | 中 | 现代内存主流 |
| DDR2/DDR3/DDR4/DDR5 | 每代更高频率、更低电压 | 越来越快 | 越来越低 | 当前主流 DDR4/DDR5 |
DDR 代际对比:
| 代次 | 预取位数 | 电压 | 典型频率 | 速率 (MT/s) |
|---|---|---|---|---|
| DDR | 2n | 2.5V | 100-200 MHz | 200-400 |
| DDR2 | 4n | 1.8V | 200-533 MHz | 400-1066 |
| DDR3 | 8n | 1.5V | 400-1066 MHz | 800-2133 |
| DDR4 | 8n | 1.2V | 800-1600 MHz | 1600-3200 |
| DDR5 | 16n | 1.1V | 1600-3200 MHz | 3200-6400 |
3. ROM 分类
- ROM (Mask ROM):出厂烧死,无法修改
- PROM:可编程一次
- EPROM:可擦除(紫外线)
- EEPROM:可电擦除
- Flash (闪存):EEPROM 的一种,按块擦写 → SSD、U 盘、嵌入式
- NOR Flash:支持 XIP(片上执行),读快写慢,用于 BIOS/固件
- NAND Flash:顺序读快、密度高,用于 SSD/U 盘
- SLC:1 bit/cell,寿命长、贵
- MLC:2 bit/cell,均衡
- TLC:3 bit/cell,便宜,主流消费级
- QLC:4 bit/cell,最便宜,寿命短
4. 内存相关技术
- 多通道内存:双通道/四通道,提升带宽(CPU 同时读多个内存条)
- ECC 内存:带错误检查和纠正,服务器/工作站必备
- 内存时序 (Timing):CL-tRCD-tRP-tRAS,如 16-18-18-38,数字越小越快
- XMP / EXPO:内存超频配置文件,Intel / AMD 平台
四、虚拟存储器 (Virtual Memory)
1. 虚拟地址 vs 物理地址
- 虚拟地址 (VA):程序看到的地址,每个进程独立
- 物理地址 (PA):内存硬件上的真实地址
- MMU (Memory Management Unit):负责 VA → PA 转换
- 好处:
- 进程间地址空间隔离,互不干扰
- 物理内存不够时,部分数据放磁盘(交换区)
- 每个进程可以使用连续的虚拟地址空间
2. 三种管理方式
| 方式 | 特点 | 优点 | 缺点 |
|---|---|---|---|
| 连续分配 | 整块连续内存给一个进程 | 简单 | 碎片严重,利用率低 |
| 分页 (Paging) | 固定大小页(4KB/2MB),逻辑地址 = 页号+页内偏移 | 简单、无外部碎片 | 页表可能很大 |
| 分段 (Segmentation) | 按逻辑单位分(代码段、数据段、栈段) | 符合程序员视角 | 外部碎片 |
| 段页式 | 先分段,段内再分页 | 二者结合 | 实现复杂 |
现代 OS 主要用分页(或段页式)。
3. 页表 (Page Table)
- 页表项 (PTE):包含物理页号、有效位、访问位、修改位、保护位等
- 单级页表问题:64 位系统每个进程页表巨大
- 多级页表:把页号再分段,如 32 位用 2 级,64 位用 4 级
- 倒排页表:按物理页组织,适用于 64 位系统
4. TLB (Translation Lookaside Buffer)
- 本质:页表的 Cache,缓存最近用过的 VA→PA 映射
- 命中:直接拿到物理页号,极快(~1 ns)
- 缺失:要走硬件页表(快表)或软件页表(慢)
- TLB 刷新:进程切换时,需 flush TLB(用 ASID 区分进程可避免)
5. 页面置换算法
当物理页不够,要把不常用的页换出到磁盘:
| 算法 | 思路 | 优点 | 缺点 |
|---|---|---|---|
| OPT (Belady) | 淘汰未来最久不用的,理论最优 | - | 无法实现 |
| FIFO | 淘汰最早进入的 | 简单 | 性能差(可能有 Belady 异常) |
| LRU | 淘汰最久未使用 | 接近 OPT | 实现成本高 |
| Clock (二次机会) | LRU 近似,环形链表 + use 位 | 折中 | 近似 LRU |
| LFU | 淘汰访问次数最少 | 适合稳定热点 | 偶发访问污染 |
| 工作集模型 | 保留最近 Δ 时间内的页 | 适合真实负载 | 需硬件支持 |
Belady 异常:FIFO 算法在增加页框数时,缺页率反而上升的反常现象。
五、辅助存储器 (Secondary Storage)
1. 机械硬盘 (HDD)
- 结构:盘片、磁头、主轴电机、寻道电机、控制电路
- 关键概念:
- 盘片 (Platter):存储数据的圆形盘
- 磁道 (Track):盘片上的同心圆
- 扇区 (Sector):磁道上的弧段,通常 512 字节 / 4KB
- 柱面 (Cylinder):多个盘片相同半径的磁道集合
- 簇 (Cluster):文件系统分配的最小单位,由若干扇区组成
- 性能指标:
- 容量:几 TB
- 转速:5400 / 7200 / 10000 RPM
- 平均寻道时间:几 ms
- 传输速率:100-200 MB/s
- 接口:SATA III(6 Gbps)、SAS(服务器)
- 优点:容量大、便宜、数据保存时间长
- 缺点:有机械部件,怕震动,慢,功耗高
2. 固态硬盘 (SSD)
- 原理:用 NAND Flash 芯片存储,无机械部件
- 性能:
- 顺序读:可达 7000 MB/s(NVMe)
- 随机读 IOPS:几十万到百万级
- 延迟:几十 μs(比 HDD 速度快 100 倍)
- 接口:
- SATA III SSD:走 AHCI 协议,上限 600 MB/s
- NVMe SSD:走 PCIe 总线,上限可达数 GB/s(M.2、U.2)
- 优点:极快、防震、低功耗、无噪音
- 缺点:寿命有限(写入次数)、贵、断电可能丢数据
- 寿命指标:TBW (Total Bytes Written),越大越耐用
- 关键技术:
- FTL (Flash Translation Layer):逻辑地址到物理地址的映射
- 磨损均衡 (Wear Leveling):让所有块均匀写入,延长寿命
- GC (垃圾回收):回收无效块,提升写入性能
- Trim:告诉 SSD 哪些块已无效,辅助 GC
3. 接口对比
| 接口 | 协议 | 理论带宽 | 形态 | 适用 |
|---|---|---|---|---|
| SATA III | AHCI | 6 Gbps | 2.5 寸/M.2 | 消费级主流 |
| PCIe 3.0 x4 | NVMe | 32 Gbps | M.2 | 主流 NVMe |
| PCIe 4.0 x4 | NVMe | 64 Gbps | M.2 | 高端消费级 |
| PCIe 5.0 x4 | NVMe | 128 Gbps | M.2 | 新一代旗舰 |
| SAS | SCSI | 12 Gbps | 企业级 | 服务器 |
六、新型存储器
| 类型 | 原理 | 特点 | 现状 |
|---|---|---|---|
| 3D XPoint (Optane) | 相变存储 | 介于 DRAM 和 SSD 之间,字节寻址 | 已停产 |
| HBM (High Bandwidth Memory) | 3D 堆叠 DRAM + TSV | 超高带宽、低功耗 | GPU / AI 加速卡 |
| HBM2e / HBM3 | HBM 升级 | 带宽进一步翻倍 | 旗舰 GPU / AI 芯片 |
| MRAM / STT-MRAM | 自旋转移力矩 | 速度接近 SRAM,非易失 | 嵌入式 / 缓存替代 |
| ReRAM / PCM | 电阻变化/相变 | 高密度、可堆叠 | 存算一体研究 |
| LPDDR / LPDDR5X | 低功耗 DDR | 移动端专用,低电压 | 手机/平板/笔记本 |
七、存储器性能对比总览
| 层级 | 典型容量 | 访问延迟 | 带宽 | 成本/GB | 易失性 |
|---|---|---|---|---|---|
| 寄存器 | ~1 KB | < 1 ns | - | - | 易失 |
| L1 Cache | 32-128 KB | 1-2 ns | ~1 TB/s | - | 易失 |
| L2 Cache | 256KB-1MB | 3-10 ns | ~500 GB/s | - | 易失 |
| L3 Cache | 4-64 MB | 10-20 ns | ~200 GB/s | - | 易失 |
| DRAM | 8-128 GB | 50-100 ns | 50-100 GB/s | $3-5 | 易失 |
| NVMe SSD | 512GB-8TB | 50-200 μs | 3-7 GB/s | $0.05-0.1 | 非易失 |
| SATA SSD | 256GB-4TB | 50-200 μs | ~500 MB/s | $0.05-0.1 | 非易失 |
| HDD | 1-20 TB | 5-15 ms | 100-200 MB/s | $0.02 | 非易失 |