23.存储设备原理 - Katyusha's blog
mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6mobile wallpaper 7
4456 字
12 分钟
23.存储设备原理
2026-07-18

存储介质与块设备抽象#

持久化要求数据在进程退出、系统重启乃至断电后仍然存在。它的物理基础并不神秘:找到一种能够长期保持、可以区分且能够被读出的物理状态,并用这种状态编码 bit。石刻依靠“有坑/无坑”,磁介质依靠磁化方向,闪存依靠浮栅中的电荷量;操作系统最终把这些差异巨大的介质统一抽象为可随机访问的块数组。

本篇关注存储介质的物理机制、由介质约束产生的性能特征,以及操作系统为什么选择块设备抽象。通用设备寄存器、DMA、中断和文件操作接口见 IO.md;文件系统如何组织块、保证崩溃一致性,则属于后续主题。

持久化的基本问题#

从物理状态到可读写的 bit#

一个物理状态要成为实用的持久存储,至少要满足三项条件:

  • 可区分:不同状态能够稳定编码 0 和 1,或编码更多电平;
  • 可读取:读取过程能把物理差异转换为电信号,并且不会轻易破坏原状态;
  • 可写入:能够主动改变状态,或者至少能以追加方式写入新的状态。

存储技术之间的核心差异,是状态保存方式和寻址方式:

磁化方向:磁带、磁鼓、磁盘
表面形态:光盘、玻璃介质
电荷数量:NAND Flash
定位介质上的状态
→ 读取或改变该状态
→ 将物理信号恢复为 bit

容量、顺序带宽、随机访问延迟、可靠性和成本,都是这两个机制共同决定的结果。

寻址成本与空间组织#

单个 bit 可以做得很小,但为每个 bit 配置独立地址线和读写电路并不现实。存储设备必须共享定位机构:磁带通过卷动定位,磁盘通过磁头移动和盘片旋转定位,NAND Flash 通过 Die、Plane、Block、Page 的层级选通定位。

因此,存储密度和寻址粒度之间存在基本权衡:

更细粒度的独立寻址
→ 更多定位和选通电路
→ 面积、功耗和成本上升
更粗粒度的成组访问
→ 硬件更简单、吞吐更高
→ 小读写也可能触发整块操作

这正是操作系统使用“块”而不是“bit”作为持久存储基本访问单位的物理原因。

磁介质:用运动换取寻址#

磁带:一维顺序存储#

磁带在带状介质上连续排列磁性单元,可以把它理解为一条被卷起来的 bit 序列。读写头固定,通过磁带运动把目标位置送到读写头下方:

  • 读取时,磁通量变化产生电信号;
  • 写入时,写磁头产生强磁场,改变介质的磁化方向;
  • 定位只需要卷动这一种机械运动,结构简单且易于提高密度。

磁带的容量、成本和适当封装后的可靠性都很好,但访问模型具有强烈的顺序性。若目标数据离当前位置很远,必须等待大量介质经过读写头,因此随机访问延迟极高。

维度磁带特征
成本与容量单位容量成本低,容量高
顺序访问适合长数据流,但开始访问前仍需定位
随机访问几乎不可用,机械定位距离过长
典型用途冷数据归档、备份、音视频等顺序流

这里的关键不只是“磁带慢”,而是其带宽和延迟呈现完全不同的性质:定位完成后可以持续传输大量数据,但到达第一个目标字节可能要等待很久。

磁鼓:并列磁道缩短等待#

磁鼓把多条一维磁道并列到旋转圆柱表面,相当于从 1D 扩展到 1D × n。每条磁道有固定读写头,定位主要依靠旋转:最坏等待时间不超过一个旋转周期。

它用更多读写头和较低的空间利用率换取更好的随机访问,体现了存储设备反复出现的工程权衡:增加硬件并行度与定位机构,可以降低寻址延迟。

磁盘:二维盘面与机械随机访问#

硬盘把大量同心磁道排列在盘片表面,并叠放多个盘面,可近似理解为 2D × n 的“2.5D”结构。磁头先移动到目标磁道,盘片再旋转到目标扇区,随后才进行数据传输。

一次磁盘访问的时间可以分解为:

TIO=Tseek+Trotation+Ttransfer+TcontrollerT_{IO}=T_{seek}+T_{rotation}+T_{transfer}+T_{controller}
  • T_seek:磁臂把磁头移动到目标磁道的寻道时间;
  • T_rotation:等待目标扇区转到磁头下方的旋转延迟;
  • T_transfer:扇区经过磁头时的实际传输时间;
  • T_controller:控制器排队、协议处理等额外开销。

以 7200 rpm 为例:

7200 rpm=120 rps,Trev=1120s8.33ms7200\ \text{rpm}=120\ \text{rps},\qquad T_{rev}=\frac{1}{120}\text{s}\approx 8.33\text{ms}

8.33 ms 是完整旋转一周的时间;若目标扇区位置均匀分布,平均旋转等待约为 4.17 ms。它与磁头移动造成的寻道时间是两个不同的机械延迟,不能混为一谈。

硬盘的连续扇区可以在一次定位后持续传输,因此顺序访问具有较高吞吐;随机访问则不断支付寻道和旋转成本,性能会下降几个数量级。操作系统和控制器会通过请求合并、缓存与调度减少机械运动,AHCI 的 NCQ 也允许设备重排队列中的命令。

维度硬盘特征
成本与容量高密度、低单位容量成本、大容量
顺序访问定位后可连续传输,吞吐较高
随机访问受寻道和旋转延迟限制
可靠性介质成熟,但高速机械部件是故障来源
典型用途大容量在线数据和通用计算机存储

软盘:将介质与驱动器分离#

软盘把读写头留在驱动器中,把盘片做成可移动介质,从而实现数据和软件的物理传递。它先后经历 8 英寸、5.25 英寸和 3.5 英寸规格;3.5 英寸软盘虽然名称仍是“软盘”,外壳已经变硬以提高可靠性。

这种设计牺牲了容量、速度和可靠性,却获得了低成本和可携带性。它说明应用场景同样会决定存储形态:历史上几十 KB 已足以容纳复杂程序,软盘因此能够承担操作系统和软件发行介质的角色。

光存储:用表面形态编码数据#

光盘的坑与反射#

CD 在反射平面上用不同表面形态编码数据,激光根据反射信号的变化恢复 bit。数字音频 CD 的经典规格是 44.1 kHz、16 bit、双声道,约 74 分钟、700 MB;Eight-to-Fourteen Modulation 将 8 bit 数据编码为 14 bit,以满足光学读出对连续状态和同步的要求。

光盘最突出的特征不是单次写入速度,而是复制速度。数据形态位于透明塑料结构中,工业生产可以通过母盘压制塑料,再镀反射层,快速复制大量相同内容。

维度光盘特征
成本与容量大规模压制时成本极低,容量曾经很高
读取性能顺序读取一般,随机读取受机械旋转和寻道限制
写入性能预制光盘难以改写,CD-R/CD-RW 需要特殊介质
可靠性正确保存时较高,数据层不在通常被触摸的表面
典型用途音乐、电影、软件等数字内容的大规模分发

互联网以更低的分发延迟和复制成本逐渐取代了光盘,但“易于读取、批量复制”的设计目标仍然值得保留。

只追加写入也能构造数据结构#

Project Silica 把数据写入玻璃,重新回到类似石刻的长期保存思路。它提供随机读取和追加写入,而不要求原地修改。

“不能原地覆盖”并不等于“不能更新逻辑数据”。只要保留从逻辑对象到最新物理版本的索引,就可以把更新写到新位置:

写入新版本
→ 更新索引,使逻辑地址指向新版本
→ 旧版本留在原处,之后再回收或永久保留

因此,Random Read + Append-only Write 足以构造一般数据结构。这个思想随后也会出现在闪存的 FTL、日志结构存储和 Zoned Storage 中。

闪存:用浮栅电荷保存状态#

从单 bit 到多电平单元#

NAND Flash 使用浮栅中的电荷状态影响晶体管阈值电压。写入相当于把电子注入浮栅,擦除相当于释放电子,读取则通过阈值电压判断当前状态。

若只区分两个电压范围,一个单元保存 1 bit;若更精细地区分多个电压窗口,同一单元可以保存多个 bit:

类型每单元 bit 数需要区分的状态数
SLC12
MLC24
TLC38
QLC416

每个单元保存更多 bit 能提高密度、降低单位容量成本,但状态窗口更窄,对电荷漂移和误差更敏感,编程通常也更慢、可承受的擦写次数更少。

电路并行性与容量扩展#

闪存没有磁头和转轴,不需要等待机械部件定位。Die、Plane 和通道可以并行工作,因此扩充容量时通常也能增加并行度;只要控制器和通道没有成为瓶颈,更大容量可能同时带来更高吞吐。

这不意味着单次小访问没有成本。NAND 内部仍按层级寻址,Page 是读取和编程的基本单位,Block 是擦除的基本单位。电路的速度消除了毫秒级机械等待,却没有消除访问粒度和介质管理问题。

擦除寿命与原地改写限制#

Flash 的致命缺陷是擦除不能无限重复。电荷经过数千或数万次编程/擦除后,单元会逐渐难以恢复到干净状态,最终形成坏块;讲义以 QLC 约千次写入寿命说明这一问题。

更重要的是,NAND 的读、写、擦除粒度并不对称:

读:按 Page
编程:按 Page,只能把状态朝允许方向改变
擦除:按包含许多 Page 的 Block

所以,对同一逻辑文件反复写入 1000 次,并不意味着同一个物理单元被原地写入 1000 次。设备必须把逻辑写入重新映射到其他空闲 Page,并在后台回收旧版本所在的 Block。

FTL:软件定义的闪存磁盘#

逻辑地址与物理位置分离#

SSD、优盘和 SD/TF 卡内部通常包含控制器;典型 SSD 甚至拥有 CPU、RAM、缓存、写缓冲和固件。它们运行 Flash Translation Layer(FTL),在主机看到的逻辑块地址和 NAND 的物理位置之间建立映射:

主机写逻辑块 L
→ FTL 为 L 选择新的空闲物理 Page P'
→ 把数据追加写入 P'
→ 更新 L2P[L] = P'
→ 原物理 Page P 失效,等待垃圾回收

Logical-to-Physical Table(L2P Table)使设备可以对外伪装成可原地覆盖的磁盘,对内却执行追加写入。

磨损均衡与垃圾回收#

FTL 的两个核心任务由 NAND 的物理约束直接产生:

  • Wear Leveling:把写入分散到不同物理块,避免少数块提前耗尽擦写寿命;
  • Garbage Collection:搬走仍有效的 Page,擦除包含大量无效 Page 的 Block,重新获得空闲空间。

这层映射保护了应用程序,但也产生新的代价。一次很小的主机写入可能触发 Page 搬运、映射更新和整个 Block 擦除,使介质内部实际写入量大于主机请求量,即写放大。

同为 NAND,设备质量仍可相差很大#

优盘、SD 卡和 SSD 可以使用相同类型的 NAND,但控制器并行度、缓存容量、FTL 算法、预留空间和掉电保护不同,性能与寿命也会显著不同。

设备接口只暴露寄存器和逻辑地址,控制器甚至可以报告伪造的容量。超过真实物理容量后的写入可能覆盖旧数据而不立即报错。因此,块设备抽象隐藏了实现细节,却不能自动保证设备诚实或可靠。

操作系统的块设备抽象#

随机访问不等于等延迟访问#

“随机访问”表示可以给出地址并访问任意位置,不表示所有地址的访问时间都相等:

  • 磁带需要卷动到目标位置;
  • 磁盘和光盘需要机械寻道与旋转;
  • NAND 需要按 Die → Plane → Block → Page 层级选通;
  • FTL 还可能在后台执行映射、搬运和回收。

因此,设备提供随机访问语义,具体介质仍决定访问延迟、并行度和最优请求形状。

随机可访问的块数组#

为了摊薄寻址和选通成本,操作系统把存储设备建模为固定大小块的数组:

struct block disk[NUM_BLOCKS];

抽象接口可理解为:

read(block_id, buffer)
write(block_id, buffer)

这个模型向上隐藏了磁头、激光、浮栅和 FTL,使文件系统只需处理逻辑块编号。连续块还可以合并为较大的请求,以利用介质的顺序带宽或设备并行性。

块抽象的代价#

统一抽象不是免费的。上层请求与底层物理粒度不匹配时,会发生放大:

  • 读放大:应用只需要少量字节,设备却必须读取完整 Page 或块;
  • 写放大:小写入触发读改写、FTL 搬运、垃圾回收或文件系统元数据更新;
  • 语义丢失:通用块接口无法完整表达介质的追加写、擦除和并行结构。

需要极致性能时,系统可能减少这层伪装。NVMe Zoned Namespaces(ZNS)把设备划分为 Zone,并要求在 Zone 内按顺序追加写入,使主机软件直接适应底层介质,更少依赖设备内部的随机写重映射。

Linux 块 I/O 路径#

bio 与请求队列#

Linux 文件系统不需要直接控制 NAND Page 或磁盘磁头。块层接收文件系统提交的块 I/O,并把对若干内存页、扇区范围和操作方向的描述组织为 bio。随后块层进行合并、拆分和排队,再通过块设备驱动提交给硬件。

应用 read/write/mmap
→ 文件系统确定文件对应的逻辑块
→ 块层用 bio 描述块范围与内存缓冲区
→ request queue / blk-mq 组织并调度请求
→ 块设备驱动向控制器提交命令
→ 设备完成后逐层通知上层

设备驱动实现块设备操作并接入请求队列后,文件系统即可在其上提供文件、目录和映射等更高级接口。bio 和请求队列通常是应用程序“看不见”的接口,却是文件系统语义落到具体设备的关键边界。

抽象边界与持久化保证#

块写入完成不必然等价于数据已经安全进入非易失介质。数据仍可能停留在页缓存、块层队列、控制器缓存或设备写缓冲中。块设备抽象解决的是“按什么地址和粒度访问”,而以下问题必须由文件系统和设备协议继续回答:

  • 写入何时真正越过易失缓存;
  • 多个块以什么顺序到达介质;
  • 崩溃发生在中途时,元数据与文件内容是否一致;
  • 如何通过 flush、barrier、日志或 copy-on-write 建立持久化顺序。

因此,存储介质、块设备和文件系统形成分层关系:

物理介质:决定状态、粒度、寿命和故障模式
FTL/控制器:把介质约束转换为逻辑块接口
块设备层:提供统一寻址、排队和完成通知
文件系统:把块组织成文件,并定义一致性与持久化语义

存储技术的演化主线#

技术状态载体主要寻址方式优势核心限制
磁带磁化方向一维卷动低成本、高容量、适合归档随机访问极差
磁鼓磁化方向旋转,多固定磁头有界的旋转等待容量和密度受限
硬盘盘面磁化方向寻道 + 旋转大容量、顺序吞吐高机械随机访问延迟
软盘可移动磁性盘片寻道 + 旋转低成本、便于携带容量、速度、可靠性低
光盘坑与反射差异激光寻道 + 旋转易于低成本批量复制难以快速改写
NAND Flash浮栅电荷量电路分层选通高并行、低延迟、抗震擦写寿命和写放大

整讲的核心不是“闪存比磁盘快”,而是:每种存储技术都把物理世界中的一种稳定状态包装成可寻址的数据;操作系统再用块设备抽象屏蔽介质差异。抽象带来了通用性,也隐藏了机械延迟、擦除粒度、寿命、放大和掉电语义。理解这些被隐藏的约束,才能解释存储系统的真实性能与正确性边界。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

23.存储设备原理
https://katyusha-blog.com/posts/nju-os/os/persistence/store/
作者
katyusha
发布于
2026-07-18
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录