Appearance
存储系统
计算机存储结构层次图
分级存储
目的:解决存储容量、成本和速度之间的矛盾。按 CPU 物理距离分 4 层(由近→远):片上缓存 → 片外缓存 → 主存(内存)→ 外存。速度依次降低,容量依次提高。
两级存储:Cache-主存、主存-辅存(虚拟存储体系)。
局部性原理:
- 时间局部性:刚被访问的数据近期可能再次被访问
- 空间局部性:相邻地址的数据可能被连续访问
🎯 一句话结论:局部性原理不仅适用于循环程序,数组访问(空间局部性)、子程序调用等也体现局部性。Cache 设计的理论依据正是程序的局部性原理。
局部性原理
高速缓存 Cache
Cache 地址映射
在 CPU 工作时,送出的是主存地址,需转换为 Cache 地址,称为地址映像,由硬件自动完成。
| 映射方式 | 特点 | 块冲突概率 |
|---|---|---|
| 直接映像 | 主存块与 Cache 块号相同才能命中,变换简单但不灵活 | 最高 |
| 全相联映像 | 主存任意块可调入 Cache 任意块,变换复杂速度慢 | 最低 |
| 组相联映像 | 组间直接映像 + 组内全相联映像,前两者折中 | 中 |
块冲突概率:直接映像 > 组相联映像 > 全相联映像。
相联存取(按内容寻址)
🎯 一句话结论:相联存取根据访问内容(而非地址)决定存储单元,常用于 Cache 中。
| 存取方式 | 机制 | 应用 |
|---|---|---|
| 顺序存取 | 按顺序定位数据 | 磁带 |
| 直接存取 | 直接定位到块,再顺序查找 | 磁盘 |
| 随机存取 | 按地址直接访问任意单元 | 主存(DRAM) |
| 相联存取 | 按内容而非地址查找 | Cache(TLB也用到) |
相联存取能在一个存储周期内将关键字与所有单元同时比较,硬件复杂度高但速度快。
虚拟存储器
存储介质易失性分类
🎯 一句话结论:SRAM/DRAM/寄存器 掉电丢失数据(易失性),Flash/SSD/HDD/ROM 掉电保持数据(非易失性)。
| 类型 | 介质 | 易失性 | 速度 | 典型用途 |
|---|---|---|---|---|
| 寄存器 | 触发器 | 易失 | 最快 | CPU 内部 |
| SRAM | 晶体管 | 易失 | 很快 | Cache(L1/L2/L3) |
| DRAM | 电容 | 易失(需刷新) | 中 | 主存(内存条) |
| Flash | 浮栅晶体管 | 非易失 | 慢于DRAM | SSD、U盘 |
| HDD | 磁介质 | 非易失 | 最慢 | 机械硬盘 |
⚠️ DRAM 访问速度远高于 SSD/HDD,常见干扰项说"DRAM 速度远低于 SSD"是错误的。
DRAM 与 DDR SDRAM 特性
🎯 一句话结论:DDR SDRAM 在时钟上升沿和下降沿各传输一次数据,同等时钟频率下带宽是普通 SDRAM 的 2 倍。
- DRAM 用电容存储,需定时刷新以保持数据
- DDR(Double Data Rate):时钟上下沿都传输,实现加倍速率
- 速度链:CPU 寄存器 > Cache(SRAM) > 主存(DRAM) > SSD(Flash) > HDD(磁盘)
磁盘
磁盘结构与调度算法
磁盘三大要素:磁头(Head)、柱面(Cylinder,所有盘面同位置磁道集合)、扇区(Sector,最小存储单元)。
| 算法 | 说明 | 特点 |
|---|---|---|
| FCFS(先来先服务) | 按请求顺序调度 | 公平但效率低 |
| SSTF(最短寻道时间优先) | 离当前磁道最近的请求优先 | 可能产生"饥饿" |
| SCAN(扫描/电梯算法) | 磁头双向移动到底才掉头 | 与电梯类似 |
| CSCAN(单向扫描) | 只做单向移动 | 更均匀的等待时间 |
命中率计算
平均访问时间 = 命中率 × Cache 访问时间 +(1 - 命中率)× 主存访问时间。
替换算法
| 算法 | 说明 |
|---|---|
| 随机替换 | 随机选择被替换块 |
| 先进先出(FIFO) | 替换最先进入 Cache 的块 |
| 近期最少使用(LRU) | 替换近期最少使用的块 |
| 优化替换 | 先执行一次程序统计替换情况,第二次用最优方式 |
硬盘格式化容量
🎯 一句话结论:格式化容量 = 记录面数 × 每面磁道数 × 每道扇区数 × 每扇区字节数。
格式化容量 = 记录面数 × 磁道数/面 × 扇区数/道 × 字节数/扇区计算示例:
4 个记录面,每面 1000 磁道,每道 200 扇区,每扇区 512 字节
容量 = 4 × 1000 × 200 × 512 = 409,600,000 字节 ≈ 400MB⚠️ 非格式化容量 ≠ 格式化容量:
- 非格式化容量 = 记录面数 × 磁道数 × 内圈周长 × 最大位密度(一般不考)
- 格式化后每个扇区会有间隙、同步字段等开销,实际可用容量更小
硬盘存取时间
🎯 一句话结论:存取时间 = 寻道时间 + 等待时间 + 读/写时间,其中寻道时间最长,是性能瓶颈。
| 组成部分 | 含义 | 量级 |
|---|---|---|
| 寻道时间 | 磁头移动到目标磁道(柱面)的时间 | 最长(ms 级) |
| 等待时间(旋转延迟) | 目标扇区旋转到磁头下方的时间 | 平均为旋转半圈时间 |
| 读/写时间(传输时间) | 实际数据读写的时间 | 相对最短 |
平均存取时间 = 平均寻道时间 + 平均等待时间 + 传输时间平均等待时间 ≈ 1 / (2 × 转速),如 7200rpm → 平均等待 ≈ 4.17ms
⚠️ 常见坑
| 易错点 | 正解 |
|---|---|
| 忘了乘记录面数 | 硬盘有多个盘面,格式化容量公式第一项就是记录面数 |
| 存取时间 = 寻道 + 等待 | 漏了读/写(传输)时间,虽然它最小但不能省略 |
| MB 换算 | 1MB = 10^6 还是 2^20?硬盘厂商用 10^6,考题一般用 1024 进制;注意题干上下文 |
RAID 级别速查
🎯 一句话结论:RAID0 无冗余性能最高,RAID1 全镜像最安全,RAID5 分布式奇偶校验(允许坏1块),RAID6 双奇偶校验(允许坏2块),RAID10 先镜像再条带。
| 级别 | 冗余 | 最少盘数 | 有效容量 | 允许坏盘 | 读性能 | 写性能 |
|---|---|---|---|---|---|---|
| RAID0 | 无 | 2 | n×min | 0 | 高 | 高 |
| RAID1 | 镜像 | 2 | 1×min | n-1 | 中 | 中 |
| RAID5 | 1块校验 | 3 | (n-1)×min | 1 | 高 | 中 |
| RAID6 | 2块校验 | 4 | (n-2)×min | 2 | 高 | 低 |
| RAID10 | 镜像+条带 | 4 | (n/2)×min | 每组最多1 | 高 | 中 |
容量计算公式
🎯 一句话结论:RAID 有效容量 = (盘数 - 校验盘数) × 最小盘容量,校验盘数 RAID5=1, RAID6=2, RAID0=0。
有效容量 = (N - P) × min(所有盘容量)- N = 磁盘总数
- P = 校验盘数量(RAID0=0, RAID5=1, RAID6=2)
- 若各盘容量不同,取最小值
示例:4 块 80T 硬盘组 RAID6,有效容量 = (4-2)×80 = 160T。
RAID 目标
🎯 一句话结论:RAID 的核心目的是兼顾数据安全性与磁盘 I/O 性能,而非单纯扩大容量或降低成本。
- RAID 通过冗余提升数据安全性(镜像/奇偶校验)
- RAID 通过**条带化(striping)**将数据分散到多盘,并行读写提升 I/O 性能
⚠️ 常见坑
| 易错点 | 正解 |
|---|---|
| RAID0 性能高是因为条带化 I/O 并行,但无任何冗余保护 | 不要误以为 RAID0 有数据保护 |
| RAID5 只允许坏 1 块盘,RAID6 允许坏 2 块 | 不要记反 |
| 容量计算取最小盘容量,各盘不同时不能用平均值 | 实际场景中各盘容量通常相同 |