1 存储系统
1.1 Cache(高速缓存)
Cache 就是CPU 与内存之间的超级高速小仓库 。
因为 CPU 极快、内存较慢,所以用 Cache 缓冲,让 CPU 不用每次都等内存。
1.1.1 Cache 原理、命中率、失效率
1)Cache 工作原理
计算机有局部性原理:
- 刚用过的数据,很可能马上再用(时间局部性)
- 用到一个数据,附近的数据也很可能马上用(空间局部性)
所以 Cache 做的事很简单:
把内存中最近常用的数据复制一份放到 Cache 里,CPU 优先找 Cache。
流程:
- CPU 要读数据
- 先看 Cache 里有没有
- 有 → 命中,直接用,极快
- 没有 → 失效,去内存读,同时把这块数据放进 Cache
2)命中率
在 Cache 中找到数据的概率。
公式:
命中率 = \\frac{命中次数}{总访问次数}
命中率越高,系统越快。
好的 Cache 命中率通常在 90%~99%。
3)失效率
失效率 = 1 - 命中率
失效时,CPU 必须等内存,速度会大幅下降。
1.1.2 Cache 映射机制
内存很大,Cache 很小。
映射机制 = 规定"内存块放到 Cache 哪个位置"的规则。
内存和 Cache 都被分成大小相同的小块,叫页 / 块(Block)。
(1)直接映射
一个内存块,只能固定放到 Cache 的一个位置。
公式:
Cache行号 = 内存块号 \\mod Cache总行数
比喻:
每个人只能坐自己固定编号的座位,不能乱坐。
优点:
- 最简单、硬件最便宜
- 查找快
缺点:
- 冲突严重:多个内存块抢同一个位置
- 命中率低
(2)全相联映射
内存块可以放到 Cache 任意一个位置。
比喻:
随便坐空位。
优点:
- 冲突最少
- 命中率最高
缺点:
- 要对比所有 Cache 行,电路复杂、成本高、慢
(3)组相联映射(最常用、考试最爱考)
结合前两者优点:
- 把 Cache 分成若干组
- 一个内存块,只能放到固定组
- 在组内,可以随便放任意行
结构:
- 直接映射 = 每组 1 行
- 全相联 = 只有 1 组
- 组相联 = 多组、每组多行(常见 2 路、4 路、8 路)
优点:
- 冲突少
- 速度快
- 成本适中
现代 CPU 几乎都用 组相联。
1.1.3 Cache 淘汰算法
当 Cache 满了,新数据要进来,必须踢掉一个旧的。
1)FIFO(先进先出)
最早进来的先被淘汰。
简单,但不实用,容易把常用数据踢走。
2)LRU(最近最少使用)
最久没被访问的淘汰。
最常用、效果最好,符合局部性原理。
3)LFU(最不经常使用)
访问次数最少的淘汰。
效果好,但硬件复杂。
4)随机淘汰
随便踢一个。
简单,但命中率不稳定。
1.1.4 Cache 的写操作
CPU 改数据时,Cache 和内存可能不一致,需要策略。
1)写直达(Write Through)
- 同时写 Cache + 内存
- 数据永远一致
- 缺点:慢,每次都要等内存
2)写回(Write Back)
- 只先写 Cache
- 只有这块要被替换时,才写回内存
- 速度快,现代 CPU 主流
3)写分配 / 不写分配
- 写失效时,把内存块调入 Cache → 写分配
- 不调入,直接写内存 → 不写分配
1.2 主存(内存)
主存就是我们常说的 RAM、内存条 。
特点:
- 速度快
- 断电数据丢失
- CPU 能直接访问
1.2.1 主存储器的种类
1)随机存取存储器 RAM
- DRAM(动态 RAM)
常用内存条,需要不断刷新,容量大、便宜。 - SRAM(静态 RAM)
不用刷新,速度极快,贵,用来做 Cache。
2)只读存储器 ROM
- 只能读,不能随便写
- 断电不丢失
- 存放 BIOS、启动程序
延伸:
- PROM:一次性写入
- EPROM:可擦除
- EEPROM:电可擦除
- Flash:U盘、SSD 用的闪存
1.2.2 主存储器的组成
内存由三部分构成:
-
存储体
真正存 0/1 的单元矩阵。
-
地址译码器
接收地址信号,选中某一个存储单元。
-
读写控制电路
控制:读、写、片选、刷新等。
简单理解:
- 地址线:找哪个单元
- 数据线:传 0/1
- 控制线:命令读还是写
1.2.3 主存储器的地址编码
用地址线数量,计算内存最大容量。
核心公式
若有 n 根地址线 :
总单元数 = (2^n)
若每个单元是 1 字节(8位) :
容量 = (2^n) 字节
例子:
- 10 根地址线 → (2^{10}) = 1K
- 20 根地址线 → (2^{20}) = 1M
- 32 根地址线 → (2^{32}) = 4G
片选与扩展
当一个芯片容量不够时:
- 位扩展:多个芯片并联,增加位数(如 4位 → 8位)
- 字扩展:增加地址线,增加总容量
- 字位同时扩展:既加位数又加容量