海量的阅读帮助我们形成正确的 “计算机科学世界观”,用计算机科学的方式处理问题
- 在计算机硬件五花八门的设备中,有一类专门负责持久化数据的存储设备
- 而 “文件系统” 就是在存储设备上实现的,使我们的计算机能可靠地保存宝贵的数据。
- 在短短几十年间,我们经历了存储器从 KB 到 TB 的跨越。
本文内容:1. 存储设备是如何持久保存数据的,2. 以及存储设备在操作系统中的抽象。
Review & Comments
设备和驱动程序
概念很简单
- 实现了 struct file_operations 的一个 “东西”
实现很复杂
- 打印机、扫描仪、显卡、kvm、……
- 每种设备背后都有一整个产业链
正式进入 “持久化” 部分
Persistence: “A firm or obstinate continuance in a course of action in spite of difficulty or opposition.”
- 我们的祖先就就希望数据能永久留存
- 在石头上刻字就行啦 (呃,但我们还想修改)
21.1 1-Bit 的存储:磁铁
正 v.s. 反
“持久化” 可能没有想象的那么困难
一个 “能反复改写的状态”
- 当然,要能寻址 + 用电路改写
电磁感应:物理和数字世界的桥梁
1D 存储设备:把 Bits “卷起来” (磁带:1928)
- 纸带 (今天是塑料) 上均匀粘上铁磁性颗粒
- 只需要一个机械部件 (转动) 定位
-
- 读取:放大感应电流
- 写入:电磁头 (电磁铁) 改变磁畴磁化方向
磁带:可以密度很高,也可以密度不那么高
磁带:作为存储设备的分析
存储特性
- 价格低 (廉价材料,几乎不涉及大规模集成电路)
- 容量高
- 可靠性高 (适当封装)
读写性能
- 顺序读写勉强 (需要等待定位)
- 随机读写几乎完全不行
应用场景
- 冷数据的存档和备份
磁鼓 (Magnetic Drum, 1932)
1D → 1.5D (1D x nn)
- 用旋转的二维平面存储数据 (无法内卷,容量变小)
- 读写延迟不会超过旋转周期 (随机读写速度大幅提升)
疯狂内卷:磁盘 (Hard Disk, 1956)
1.5D → 2.5D (2D x n)
- 在二维平面上放置许多磁带
磁盘:克服各种工程挑战
磁盘:克服各种工程挑战 (cont'd)
磁盘:作为存储设备的分析
存储特性
- 价格低:高密度、低成本
- 容量高:2.5D,上万磁道
- 可靠性高 (高速运转的机械部件是潜在的威胁)
读写性能
- 顺序读写:较高
- 随机读写:勉强 (需要等待定位)
应用场景
- 计算机系统的主力数据存储 (便宜;坏了还有可能修)
磁盘:性能调优
为了读/写一个扇区
- 读写头需要到对应的磁道
-
- 7200rpm → 120rps → “寻道” 时间 8.3ms
- 转轴将盘片旋转到读写头的位置
-
- 读写头移动时间通常也需要几个 ms
通过缓存/调度等缓解
- 例如著名的 “电梯” 调度算法
-
- 成为了历史的尘埃
- Advanced Host Controller Interface (AHCI); Native Command Queuing (NCQ)
软盘 (Floppy Disk, 1971)
把读写头和盘片分开——实现数据移动
- 计算机上的软盘驱动器 (drive) + 可移动的盘片
-
- 8" (1971), 5.25" (1975), 3.5" (1981)
-
-
- 最初的软盘成本很低,就是个纸壳子
- 3.5 英寸软盘为了提高可靠性,已经是 “硬” 的了
-
曾经,软件是通过软盘发行的
软盘:作为存储设备的分析
存储特性
- 价格低:极低成本
- 容量低:裸露介质,密度受限
- 可靠性低:不要抱有太大的期望
读写性能
- 顺序读写:低
- 随机读写:低
应用场景
- 存盘按钮
21.2 1-Bit 的存储:挖坑
坑 v.s. 平
坑:天然容易 “阅读” 的数据存储
跨越千年的持久化存储方法
现代工业:我们可以挖出更精细的坑!
Compact Disk (CD, 1980)
在反射平面 (1) 上挖上粗糙的坑 (0)
- 激光扫过表面,就能读出坑的信息来
-
- 44.1kHz, 16-bit, 2 声道贝多芬第九交响曲 (74 分钟, ~700MB),飞利浦 (碟片) 和索尼 (数字音频) 发明
光盘最有趣的特性:容易复制!
光盘的坑是挖在透明塑料上的
- “压盘” 后镀上反射膜
- 3s 生产一张 Blue Ray 100GB (33,000MB/s 写入速度)
光盘:作为存储设备的分析
存储特性
- 价格极低
- 容量高 (当然,也没有那么高)
- 可靠性高 (你划伤的是没有数据的那一面)
读写性能
- 顺序读:一般
- 随机读:低;很难写入 (CD/R & CD/RW)
应用场景
- 一个时代的数字内容分发
Project Silica: 回归 Rosetta Stone
Can we preserve data sustainably?
https://www.youtube.com/watch?app=desktop&v=-rfEYd4NGQg
(玻璃存储)
21.3 1-Bit 的存储:电荷
充电 v.s. 放电
Solid State Drive (1991)
存储介质的致命的缺陷
- 磁:机械部件 (无法避免的 ms 级延迟)
- 坑 (光):挖坑效率低、填坑很困难
我们想要的是电子的密度、电路的速度!
- Flash Memory “闪存”
- 如何在电路中持久 1-bit?
-
- 挖个坑
- 把电子填进去 = 一个状态
- 把电子放跑 = 另一个状态
1-Bit Flash Memory
闪存:作为存储设备的分析
存储特性
- 价格低:大规模集成电路
- 容量高
- 可靠性高:集成电路封装,不怕摔
读写性能
- 极高,而且有极高的扩展性 (电路是天然并行的)
-
- 极为离谱的优点:容量越大,速度越快
应用场景
- Tape is Dead, Disk is Tape, Flash is Disk, RAM Locality is King (Gim Gray, 2006)
开启 “优盘” 时代 (1999)
是!Flash Memory 会 Wear Out
放电 (erase) 做不到 100% 放干净
- 放电数千/数万次以后,就好像是 “充电” 状态了
- Dead cell; “wear out”
有没有感觉有点害怕?
- 我竟然还在用优盘给大家上课?
- 很多文件应该写了上千次了?
答案:软件定义磁盘
SSD、优盘,甚至是 TF 卡里都藏了完整的计算机系统
FTL: Flash Translation Layer
- “Wear Leveling”: 用软件使写入变得 “均匀” (虚拟内存)
Flash Disk 与 NAND Flash
优盘, SD 卡, SSD 都是 NAND Flash
- 但软件/硬件系统的复杂程度不同,效率/寿命也不同
-
- 典型的 SSD
-
-
- CPU, on-chip RAM, 缓存, store buffer, 操作系统 ...
- 寿命: ~1 PB 数据写入 (~1,000 年寿命)
-
-
- SD 卡/TF 卡
-
-
- 标准没有规定必须内置 FTL
- 但良心厂家依然有 ARM 芯片
-
结论:一定不要买过度便宜的优盘!
更不要保存重要数据
- 还记得什么是 “设备” 吗?
- 设备是可以 “伪造” 的
-
- 可以假装成另一个厂商的设备
- 甚至可以伪造容量
-
-
- 超过容量的部分自动丢弃了
-
奸商什么事都干得出来
学了《操作系统》,你也可以当奸商
- 挣钱的途径写在《刑法》第一百四十条【生产、销售伪劣产品罪】:生产者、销售者在产品中掺杂、掺假,以假充真,以次充好或者以不合格产品冒充合格产品
Prompt: 解释一下1-Bit NAND Flash的工作原理
1-Bit NAND Flash是一种非易失性存储器,每个存储单元只能存储1位二进制数据(0或1),属于SLC(Single-Level Cell)存储。其核心结构为浮栅晶体管(Floating Gate Transistor),存储单元通过是否存有电子来表示数据状态。
其工作原理如下:
- 存储结构:NAND Flash由许多浮栅晶体管串联组成“字线”和“位线”;每个晶体管对应一个存储单元,仅存储1 bit。
- 编程(写入):通过在控制门和源漏极施加一定电压,实现电子通过隧穿效应注入浮栅。当浮栅内有电子时,单元状态为“0”;无电子为“1”。
- 擦除:通过反向电压,使浮栅电子释放。擦除操作以“块”为单位进行。
- 读取:给控制门施加适当电压,根据浮栅是否有电子,当前存储单元的导通情况(阈值电压高为“0”,低为“1”)即可判断数据。
- 特点:SLC NAND Flash速度快、寿命长、可靠性高,适用高端存储领域。
总结,1-Bit NAND Flash通过控制浮栅晶体管中电子的有无,实现数据的写入、读取与擦除。
21.4 存储设备在操作系统中的抽象
存储设备与操作系统
从 1-Bit 到 1TB
实现 “寻址能力” 的代价
- 磁盘:位置划分 + 扇区头
- 电路:行 (字线) 和列 (位线) 选通信号
-
- 这些都会消耗额外的资源 (面积)
解决方法:按块访问
- “一块” 可以共享 metadata
-
- 物理分割、Erase 信号、纠错码……
- 磁盘是
struct block disk[NUM_BLOCKS]
-
-
- Block 是读/写的最小单位
- “Block devices” (ls -l /dev/sd*)
-
Block Devices
首先,block devices 也可以是普通的文件
- “字节序列” 抽象
- 可以直接 mmap 到进程的地址空间
透明抽象的代价
- 不经意间的读/写放大 (read/write amplifications)
- 存储设备在实际执行读写操作时,处理的数据量超过用户实际请求的数据量
-
- 随机读/写一个 byte,都会导致大量数据传输
- 文件系统的实现应该能够感知 “块” 的概念
Linux Bio
Request/response 接口
- 上层 (进程、文件系统……) 可以任意提交请求
- 下层 (Bio + Driver) 负责调度
-
- “Multi-queue block I/O queuing”
- 核心数据结构
-
-
-
- 真正的 I/O vector: sector_t 的 “扇区号”
-
-
- (现在 vibe coding 真的好简单)
Multi-queue Block I/O Queuing
总结
Take-away messages:
- 无论是内存还是持久存储,最终胜出的仍然是电——它的密度和速度是其他介质难以比拟的。
- 但同时我们也看到,NAND Flash 作为持久存储时有着巨大的缺陷——写入寿命。
- 但我们也看到了工业界竟然敢于试制这样跨时代的产品,在十多年的争议中终究成为了今天存储的主角。
如果更快的 non-volatile memory 到来又退场,我们的计算机系统是否会发生翻天覆地的变化?欢迎到大家在 AI 的帮助下扩展自己的知识面,例如 Coding for SSDs(之前有翻译过)。