Skip to content

存储系统

计算机存储结构层次图

分级存储

目的:解决存储容量、成本和速度之间的矛盾。按 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浮栅晶体管非易失慢于DRAMSSD、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 先镜像再条带

级别冗余最少盘数有效容量允许坏盘读性能写性能
RAID02n×min0
RAID1镜像21×minn-1
RAID51块校验3(n-1)×min1
RAID62块校验4(n-2)×min2
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 块不要记反
容量计算取最小盘容量,各盘不同时不能用平均值实际场景中各盘容量通常相同