← 返回知识卡片总目录

DS1号 · 自学教材系列 | 计算机软硬件

第 10 章 存储的原理

内存「易失」,关机就忘。但你的文件、照片、系统,为什么关机后还在?这一章讲两种「永久存储」:靠磁性存数据的机械硬盘(HDD),和靠电荷存数据的固态硬盘(SSD)。最后再看,这些裸数据是如何被组织成你熟悉的「文件」和「文件夹」的。

🎯 本章学习目标

  1. 理解「非易失存储」与内存易失性的区别。
  2. 掌握 HDD 的磁性存储原理:磁化方向如何表示 0/1。
  3. 掌握 SSD 的浮栅晶体管原理:如何用电荷永久存 0/1。
  4. 理解文件系统如何把裸数据组织成文件与目录。

10.1从易失到非易失:为什么要「永久」存储

上一章讲过,内存(DRAM)靠电容存电荷,一断电就流光,数据全没。但我们需要一种断电后数据依然在的存储,用来长期保存文件、照片、操作系统。这种特性叫 非易失性(non-volatile)。

核心思想 易失 = 断电即失(内存);非易失 = 断电仍在(硬盘/SSD)。两者的分工:内存负责「正在跑」的临时数据,硬盘/SSD 负责「要留住」的长期数据。开机时,程序从硬盘「搬到」内存再跑,就是这个道理。

实现「非易失」有两条主流技术路线,一个靠磁、一个靠电,下面分别拆解。

深一层:非易失的物理总纲——「能量壁垒」

三种存储介质摆在一起,非易失的秘密可以用一句话串起来:把 0/1 存进「有能量壁垒保护的状态」。DRAM 的电荷存在普通电容里,没有任何壁垒,电荷顺着漏电的缝自然流走——不设防,所以易失。HDD 的磁畴要翻转方向,必须对抗材料内部的「矫顽力」,靠外部强磁场硬推;平时没有外场,磁畴稳稳呆着——壁垒挡住了自发变化,所以非易失。SSD 的浮栅电荷被绝缘层团团围住,想逃得「打穿」一层绝缘体,这需要极高的能量——壁垒高到常温下亿万年也漏不了多少,所以非易失。你看,「磁」和「电」两条技术路线殊途同归:都是给数据修一道翻不过去的墙。

这道墙也解释了「写入为什么费劲」:DRAM 写数据只是给电容充放电,轻快;HDD 写要驱动磁头产生强磁场去推磁畴,SSD 写要用高压把电荷「压」进绝缘层包裹的浮栅(量子隧穿效应,10.4 节细讲)——都要翻墙,都比易失存储慢而费力。存储器设计永恒的三角关系在此现形:想要跑得快(DRAM)就守不住(易失);想要守得住(非易失)就写得慢(要翻墙)。后面各章你会反复看到这个权衡。

📐 例题 1 给 1 TiB 的硬盘数扇区:地址要多宽?

某 HDD 总容量 1 TiB,按传统 512 B 一个扇区划分。(1) 全盘共有多少个扇区?(2) 给每个扇区编一个号(逻辑块地址 LBA 的思路),需要多少位二进制地址?(3) 若把扇区改为 4 KiB(现代的 4K 扇区),需要多少位?

思路 扇区数 = 总字节 ÷ 扇区字节;地址位数 n 需满足 2n ≥ 扇区数。全程用 2 的幂:1 TiB = 240 B,512 B = 29 B,4 KiB = 212 B。

解 (1) 240 ÷ 29 = 231 = 2 147 483 648 个(约 21.5 亿)。
(2) 231 个扇区恰好需要 31 位地址——一个 31 位无符号整数刚好从 0 编到 21.47 亿。
(3) 240 ÷ 212 = 228,只需 28 位,比 512 B 扇区省 3 位。

答:约 21.5 亿个扇区、31 位;4 KiB 扇区只要 28 位。 ⚠ 易错点:① 这是第 2 章幂运算的实战——把字节都化成 2 的幂再相除,指数相减即可,不要拿 1012 去除 512(那是十进制 GB 口径,硬盘铭牌才是那样);② 「扇区」是 HDD 的物理读写单位,而 SSD 对应概念是「页/块」,10.4 节会讲;③ 旧式硬盘直接用「柱面-磁头-扇区」三元组编号(CHS),后来统一改成线性递增的逻辑块地址(LBA)——CPU 眼里硬盘就是「一堆按号码排队的可读块」,这正是 9.5 节「地址」思想在存储界的延续。

📖 工程现场:飞行记录器为什么「打死也要保住数据」 飞机上的飞行数据记录装置(俗称「黑匣子」,其实外壳是醒目的橙色)是非易失存储的极端工程:它必须在坠机撞击、大火、深海浸泡之后,数据依然可读。于是它用的存储介质要同时满足:强冲击不断电不失效(无机械悬浮部件的固态介质天然占优)、高温下数据不退磁不泄电荷(能量壁垒要足够高)、封装能扛千度火烧与数千米水压。日常你手里「断电不丢文件」的需求,与它「坠毁不丢数据」的需求,本质是同一条物理原理(能量壁垒)在不同严酷度下的应用——非易失不是「要不要」的问题,是「壁垒要多高」的问题。

辨析:非易失 ≠ 永恒不变 壁垒「高」不等于「无限高」。磁畴在热扰动下会极缓慢地随机翻转(理论上几十年量级,高温会加速);浮栅电荷在绝缘层里也有极微小的隧穿泄漏(通电不用也可能十年八年掉一格电平)。所以长期冷置的硬盘、SSD 并非「放多久都行」——重要数据要定期「盘活」(重写一遍刷新状态)并多地备份。工程上的「数据保存年限」规格(典型 10 年量级)就是这些微观退化的宏观体现。

10.2HDD:磁性存储的物理原理

HDD(Hard Disk Drive,机械硬盘)的核心原理是 磁性存储:用物质被磁化的方向来记录 0 和 1。

回忆第 3 章的物理:物质由原子组成,铁、钴、镍这类铁磁性材料,内部有大量微小的「磁畴」——每个磁畴像一根微型磁针,有 N 极和 S 极。平时它们方向杂乱,整体不显磁性;但被强磁场「捋」一下,磁畴就会整齐地指向同一个方向,这块材料就被磁化了。而且关键在:磁场撤走后,磁畴依然保持这个方向——这就是「磁性能记住」的根本原因。

磁畴方向表示 0 和 1 磁畴指向不同方向,约定一个方向记1,反方向记0。 磁畴朝一个方向 → 记作 1 磁畴朝反方向 → 记作 0 磁畴方向由「写磁头」的磁场翻转,撤走磁场后依然保持
图 10-1磁性存储:约定磁畴指向一个方向为 1、反方向为 0。磁场撤走后方向不变,所以能永久保存。

📖 名词溯源:为什么叫「硬盘」 HDD 的「硬」(hard)是相对于早期的软盘(floppy disk,软磁碟)而言——软盘的盘片是柔软的塑料,硬盘的盘片是刚性的金属或玻璃圆盘。「盘」(disk)则来自它圆盘状的盘片。

🧠 一句话记忆 HDD 靠「磁畴方向」记 0/1,磁场撤走方向不变,所以断电不丢。

深一层:磁畴怎么变小——密度提升的三级跳

硬盘容量几十年翻了几万倍,靠的是把「一个磁畴」越做越小。但这碰上物理天花板:磁畴小到一定程度,相邻磁畴的磁场会互相拆台(相邻反向磁畴彼此削弱,术语叫退磁场),热扰动也容易把太小的磁畴「晃」回随机方向——数据自己把自己抹了。垂直磁记录(PMR)是第一跳:把磁化方向从「沿盘面躺平」改为「垂直站立」,相邻磁畴从「头对头顶牛」变成「脚跟脚排队」,退磁场大减,密度立刻翻倍。叠瓦式记录(SMR)是第二跳:像屋顶叠瓦那样让磁道彼此搭边,挤一挤再省面积——代价是改写一条磁道会殃及隔壁,速度打折。热辅助记录(HAMR)是第三跳:写入瞬间用激光把盘面局部加热,磁畴「变软」了再用磁场翻转,写完降温定型——用「趁热打铁」突破矫顽力对写磁场的限制,让更小更顽固(更抗热扰动)的磁畴成为可能。三跳的共同逻辑:让磁畴变小,同时让它的「墙」更高、排列更不互相干扰——能量壁垒的故事再次上演。

📐 例题 2 HDD 平均访问时间估算:寻道 + 旋转 + 传输

某 7200 rpm 机械硬盘,平均寻道时间 8 ms,顺序读取速率约 200 MB/s。现随机读取一个 1 MB 的文件。(1) 平均旋转延迟是多少?(2) 本次访问平均总耗时约多少?(3) 若换同样数据的随机 1000 次小读取(每次 1 KB、每次重新寻道),总耗时大约多少?

思路 平均旋转延迟 = 转半圈的时间:一圈 = 60 s ÷ 转速。总耗时 ≈ 寻道 + 旋转 + 数据传输(传输 = 数据量 ÷ 速率)。

解 (1) 一圈时间 = 60 ÷ 7200 = 8.33 ms,平均延迟 = 8.33 ÷ 2 ≈ 4.17 ms(平均而言要等目标扇区转过来半圈)。
(2) 总耗时 ≈ 8 + 4.17 + (1 MB ÷ 200 MB/s = 5 ms) ≈ 17.2 ms。
(3) 每次:8 + 4.17 + (1 KB ÷ 200 MB/s ≈ 0.005 ms) ≈ 12.17 ms;1000 次共 约 12.2 s——同样的 1 MB 数据,随机碎读比整读慢了 700 倍。

答:4.17 ms;约 17.2 ms;碎读约 12.2 s(慢约 700 倍)。 ⚠ 易错点:① 平均旋转延迟取「半圈」——目标扇区可能刚转过(要等几乎一整圈)也可能马上到(几乎不用等),均匀平均即半圈;② 传输时间常被忽略,1 MB ÷ 200 MB/s = 5 ms 这步别漏;③ 第(3)问揭示 HDD 的命门:随机小读取被机械时间支配——寻道与旋转占了 12.17 ms 里的 99.96%。这就是数据库、操作系统拼命把相关数据「摆在一起」的原因,也是 SSD 崛起的物理动机。

📖 工程现场:为什么磁头「悬而不坠」 磁头飞行在盘片上方的间隙只有几纳米——比尘埃小几百倍,比病毒还小。它不掉下去的秘密是「空气动压轴承」:盘片每秒上百米的线速度带动空气,在磁头与盘面间的楔形间隙里形成一层高压气膜,把磁头稳稳托住,原理近于滑水时脚踩的滑板。这层「气垫」娇贵无比——盘腔必须全封闭并净化到无尘级(车间里打开硬盘基本等于宣判报废),飞机起飞着陆的冲击、拍一下桌面都可能让磁头「擦地」,划伤盘面磁层造成物理坏道。数据手册里「运行冲击 70 G、非运行 300 G」之类的规格,说的就是这层纳米气膜的脆弱。对比 SSD 的「全固态、零机械」,抗震差距的根源全在这里。

辨析:读写磁头是两副担子 写磁头靠电磁感应:线圈通电产生磁场,翻转磁畴——本质是第 3 章电磁学的直接应用。读磁头却不「感应」了:翻转的磁场太弱,普通感应法读不出,现代读磁头用的是磁阻效应——材料电阻随外磁场微小变化而变,磁头扫过磁畴时电阻随之抖动,电路量出电压变化即读出 0/1。一副「发号施令」(写),一副「察言观色」(读),合装在一个磁臂末端。读磁头的磁阻材料迭代(AMR→GMR→TMR),每一步都把「能读多小的磁畴」推进一格——其中巨磁阻效应的发现还拿过诺贝尔物理学奖。

10.3盘片、磁道与磁头:HDD 的结构

一块 HDD 的物理结构,核心是三个部件:

HDD 盘片的磁道与扇区 盘片表面是同心圆磁道,磁道被切成扇区,磁臂带动磁头读写。 同心圆 = 磁道;被红线切成段 = 扇区 磁头 磁臂
图 10-2盘片表面是同心磁道,磁道切成扇区;磁臂带动磁头,到指定磁道读写。

要读某个数据,HDD 必须做两件「机械动作」:磁臂把磁头移到正确的磁道(寻道),等盘片转到正确的扇区(旋转延迟)。因为是机械运动,HDD 的速度受物理极限制约——这也为 SSD 的崛起埋下伏笔。

🧠 一句话记忆 HDD = 转盘 + 磁头;寻道 + 旋转,机械动作拖慢了它。

深一层:从「柱面-磁头-扇区」到「逻辑块」

结构图之外,还有三个影响使用方式的工程细节值得点透。其一,多盘片与「柱面」:一块 HDD 通常叠着 2~4 张盘片,每张正反两面都有磁头,各面同半径的磁道上下对齐围成一个假想的「筒」——柱面。连续数据尽量存满一个柱面再换下一个柱面,这样磁头不必反复寻道:换面只需电子切换磁头(纳秒级),换柱面才要机械移动磁臂(毫秒级)。其二,扇区从 512 B 进化到 4 KiB:现代盘物理扇区多为 4 KiB(例题 1 里算过,地址还能省 3 位),目的是让纠错码「集中力量办大事」——纠错保护的数据更连贯,磁密度能做得更高;代价是老系统一次小改写会引发「读-改-写」三步(先读整 4 KiB、改其中 512 B、再写回整块),这就是著名的「4K 对齐」问题的来源。其三,CHS 编址被 LBA 取代:早年操作系统要亲自记录「数据在第几柱面、第几磁头、第几扇区」,换了盘型号就得重新换算;LBA 把全盘扇区统一编号成 0、1、2……操作系统只说「要第几号块」,换算由硬盘固件自己完成。硬件对软件藏起了物理细节——「抽象」这个软件工程最重要的武器,在硬盘接口上早已身先士卒。

📐 例题 3 转速与延迟:一张表看懂「越转越快值不值」

四种转速的 HDD:5400、7200、10 000、15 000 rpm。设平均寻道时间均为 8 ms。(1) 分别求平均旋转延迟;(2) 分别求一次随机小读取的平均总延迟(寻道 + 旋转,忽略传输);(3) 从 5400 提到 7200 提升了多少?从 7200 提到 15 000 呢?

思路 平均旋转延迟 = (60 ÷ rpm) ÷ 2。总延迟 = 寻道 + 旋转延迟。提升幅度用总延迟相除。

解 (1) 逐个代入:
5400 rpm:60÷5400 = 11.11 ms,半圈 5.56 ms;
7200 rpm:8.33 ms,半圈 4.17 ms;
10 000 rpm:6 ms,半圈 3.0 ms;
15 000 rpm:4 ms,半圈 2.0 ms。
(2) 总延迟:13.56 ms → 12.17 ms → 11.0 ms → 10.0 ms。
(3) 5400→7200:(13.56 − 12.17) ÷ 13.56 ≈ 延迟降低 10.3%;7200→15 000:(12.17 − 10.0) ÷ 12.17 ≈ 延迟降低 17.8%。

答:旋转延迟 5.56 / 4.17 / 3.0 / 2.0 ms;总延迟 13.56 / 12.17 / 11.0 / 10.0 ms;延迟分别降低约 10% 与 18%。 ⚠ 易错点:① 半圈公式别记成整圈;② 注意结论的分母效应——寻道 8 ms 是「地板」,转速再高也压不下去它:15 000 rpm 的盘比 7200 只降低两成延迟,却费电多、噪声大、价格贵数倍,这就是高转速盘只活在服务器领域的原因;③ 对比 SSD 的随机访问不到 0.1 ms,这张表也解释了「机械盘提转速」这条路线的天花板——旋转延迟再怎么压也是毫秒级,物理决定了量级。

这张表还藏着 HDD 的「正确用法」:把随机变顺序。既然机械时间(寻道+旋转)才是主角,就尽量让磁盘「顺着转的方向一口气读完」——操作系统与数据库为此发展出一整套「顺序化」技术:预读(读一块时顺手把后面几块也读进内存,反正磁头顺路)、碎片整理(把散落各处的文件块搬到相邻位置,读时少寻道)、请求排队重排(把一堆等待中的读写请求按磁道位置排序,让磁臂少走冤枉路,像电梯顺层接客,术语就叫「电梯算法」)。理解了机械结构,这些软件策略全部顺理成章——软件永远在替硬件的物理缺陷打补丁。

辨析:HDD 速度看「场景」而不是看「型号」 同一块 7200 rpm 盘,顺序读写能到 200 MB/s(顺着磁道一口气读),随机 4 KB 读取却只有每秒上百次(每次都寻道+旋转,吞吐不足 1 MB/s)——同一个硬件,两种场景差三个数量级。所以「机械硬盘多快」是没标准答案的问题,先问「顺序还是随机」。这也解释了两件日常:拷大文件机械盘并不算慢、而拿它当系统盘开机就慢得难受——开机的几千个小文件读,正是 HDD 最弱的「随机」场景。判断一个存储方案够不够快,第一步永远是问清访问模式。

把「不同介质擅长不同场景」再推一步,就是存储工程的经典布局——冷热分层:极热的数据(正在跑的程序与数据)放内存,随取随用;温热的数据(近期会用的文件、系统盘、工作目录)放 SSD,读写都在亚毫秒级;冷的数据(往年归档、备份镜像、日志流水)放 HDD 甚至磁带库,图的就是每 TB 成本最低、容量最大。企业级存储系统甚至让软件自动搬运:文件闲置三个月自动「降冷」迁到机械盘阵列,再闲置迁到归档库,访问时再按需「回热」。你可能已经认出来了——这正是第 9 章「存储金字塔」从单机拆到机房版的全貌:金字塔不是一张静态地图,而是一套随时按冷热搬迁数据的流水线。

10.4SSD:浮栅晶体管存电荷

SSD(Solid State Drive,固态硬盘)没有转盘、没有磁头,全程纯电子,所以又快又抗震。它的存储核心是一个天才的发明——浮栅晶体管(floating-gate transistor)。

浮栅晶体管和普通 MOSFET 很像,但多了一层被绝缘层完全包裹的「浮栅」。这层浮栅像一座被隔绝的孤岛,电荷一旦注入,就被困在里面,出不去了。

底层原理:用「被困的电荷」记 0/1 浮栅里有电荷,就改变晶体管的导通阈值,让它「难以导通」——记作一种状态;浮栅里没有电荷,晶体管正常导通——记作另一种状态。关键在:因为浮栅被绝缘层包死,电荷不会漏走,所以断电几年、十几年,数据依然还在。这就是 SSD 非易失的根源。

浮栅晶体管 浮栅被绝缘层包裹,电荷注入后被困住,改变导通状态。 源 漏 浮栅(困住电荷) 控制栅极 浮栅被绝缘层包死,电荷进得去、出不来
图 10-3浮栅晶体管:浮栅被绝缘层包裹,电荷注入后被永久困住,从而改变导通状态、记录数据。

还记得第 4 章的「与非门完备性」吗?SSD 里正是用海量浮栅晶体管组成 NAND 闪存阵列来存数据——所以 SSD 常被称为「NAND 闪存」。之前埋的伏笔,在这里兑现了。

📖 名词溯源:闪存为什么叫「闪」 闪存(flash memory)的名字,据说来自东芝工程师舛冈富士雄的灵感——擦除数据时,整块数据「唰」地一下全部清空,快得像相机的闪光灯(flash)。这种「整块擦除」的特性,是 flash 与普通内存的一大区别。

🧠 一句话记忆 SSD = 浮栅晶体管存电荷;电荷被绝缘层困住、不漏,所以断电不丢。

深一层:电荷怎么「进去」?——量子隧穿与擦写循环

绝缘层不是密不透风的铁板。给控制栅极加上足够高的电压,电子会获得一种奇怪的本领:量子隧穿——按经典物理它没有足够能量翻越绝缘层这座「山」,但量子力学允许它以一定概率「穿山而过」直达浮栅。写 0(或写 1,取决于约定)就是给栅极加高压、让电子隧穿进浮栅;擦除则反向加压,把电子再「抽」出去。隧穿是概率事件,电压越高、时间越长,穿过去的电子越多——所以 SSD 的「写」本质是「用电场把电子押过山」,而不是「打开阀门放进去」。

隧穿的每一次发生都不白来:电子粗暴地穿过绝缘层,会在其中留下细微的结构性损伤(晶格缺陷、被捕获的电荷)。损伤逐次累积,绝缘层慢慢「漏」了、浮栅越来越存不住电——这就是 SSD 寿命有限的物理根源,工程上以 P/E 循环(Program/Erase,编程/擦除循环)计数:一个存储单元被完整擦写多少次后,就不能再可靠存数。另一个结构性限制是:擦除只能按「块」(数十到数百页的集合)整块进行,写入只能按「页」(数 KB)进行——想改写一页,得先把整块读出来、整块擦除、再整体写回。这个别扭的规矩(源自浮栅阵列的电路结构:擦除靠整块共用的衬底电极)带来「写放大」等一连串工程麻烦,SSD 主控芯片大半的智慧都花在替这个规矩打圆场上。

一个单元存几个 bit?——SLC / MLC / TLC / QLC

既然浮栅里存的电荷「量」可以精细控制,就有人打起了它的主意:何不把不同电荷量解释成不同的 bit 组合?存 1 档(有电/没电)就是一个 bit;把电荷精细地分成 2、4、8 档,一个单元就能存 2、3、4 个 bit——容量翻倍再翻倍,成本立减。代价是两副:档位越多,各档间的电压间隔越窄,读写要靠多次比较电压才能辨清,速度下降;且绝缘层稍受磨损、电荷稍有漂移,窄间隔就更容易误判,寿命骤降。

SLC / MLC / TLC / QLC:一个浮栅存几个 bit
类型每单元 bit 数电荷档数(含 0)典型 P/E 寿命定位
SLC(Single-Level)12约 10 万次工业/车载/航电,最贵最快最耐
MLC(Multi-Level)24约 3 000 次企业级主力,均衡
TLC(Triple-Level)38约 1 000 次消费级主流,性价比高
QLC(Quad-Level)416约 300~500 次大容量低价盘,适合读多写少

表格背后有一条清晰的经济逻辑:每翻一档,同容量所需单元数减半、成本大降,但电压间隔也跟着收窄——16 档(QLC)意味着把浮栅的可控电荷量均分成 16 份,每份之间的「墙」已经薄得要靠多次测量、纠错码抢救才能守住。这就是为什么大容量 QLC 盘便宜得惊人,却「写起来肉、寿命短」:物理上每个单元都在走钢丝。

📐 例题 4 SSD 寿命账本:标称 TBW 能扛几年?

某 1 TB QLC 固态硬盘标称写入寿命 TBW(Total Bytes Written,累计可写入总量)为 300 TB。(1) 某用户平均每天写入 100 GB,不考虑写放大,这块盘理论寿命是多少年?(2) 若该盘的写放大系数为 2(主控每收到 1 B 写入,盘内实际写 2 B——因擦写必须按块整备),寿命变为多少?(3) 换成每天写入 1 TB 的重度用户,结论如何?

思路 寿命 = TBW ÷ 每日写入量。写放大相当于把每日写入量乘上系数。

解 (1) 300 TB ÷ 100 GB/天 = 300 ÷ 0.1 = 3000 天 ≈ 8.2 年。
(2) 有效写入速率 = 100 × 2 = 200 GB/天,寿命 = 300 ÷ 0.2 = 1500 天 ≈ 4.1 年。
(3) 300 ÷ (1×2) = 150 天 ≈ 5 个月——重度写入场景下,低成本 QLC 盘确实可能「写死」。

答:约 8.2 年;写放大后约 4.1 年;重度用户仅 5 个月。 ⚠ 易错点:① TBW 按总写入量算,与「盘里存了多少」无关——空盘满盘都按写的流量折寿;② 写放大 WA 是 SSD 特有的坑,根子在「擦除按块、写入按页」的规矩,顺序大文件写 WA 接近 1,随机小写可达 3~5;③ 对比一下 SLC:同样的使用强度,10 万次 P/E 的耐性折算 TBW 高出百倍量级——工业级设备宁愿花大价钱买「小而耐」的 SLC,买的是这份余量。

📖 工程现场:主控的三件「延寿」法宝 知道单元会写坏,SSD 主控芯片就发展出三件延寿法宝。磨损均衡(wear leveling):像老师傅把整箱蜡烛轮流点——不让任何一根(任何单元)被单独烧完,把擦写压力摊到全盘所有块上,避免「局部写穿」。预留空间(over-provisioning):明面是 1 TB,盘内其实多备了 7%~10% 的替换块,坏一块顶一块,也给磨损均衡留腾挪余地。垃圾回收与 TRIM:文件系统删除文件时告诉主控「这些块不要了」(TRIM 指令),主控便提前在后台把有效数据搬走、整块擦净待命——免得真到写入时才临时「腾房」,又慢又费擦写。装机圈「新 SSD 要开 TRIM」的讲究,说的就是这套机制是否顺畅。

SSD 还有一个鲜为人知的软肋:怕「写到一半」断电。写一个页要经历「隧穿注入电荷、校验、更新映射表」一串动作,主控还要在闪存里维护那张「逻辑地址→物理块」的翻译表——若恰在更新翻译表的半途断电,轻则这一页数据报废,重则整表错乱、整盘「变砖」。所以企业级 SSD 会在电路板上多焊几颗钽电容:侦测到外部掉电的瞬间,靠电容里存的最后一点电把缓存数据写完、翻译表落盘,然后从容「断气」。消费级盘省掉这颗电容,就靠「上电后主控自检修复」硬扛——这也是「SSD 用着用着突然全盘不见」这类惨案的主要剧本。飞机、汽车上的存储模块全部按「任意时刻断电不得损坏」的标准设计验证,道理同源:非易失的介质,也要配上不掉链子的管理机制,才凑得成一句「数据保住」。

辨析:SSD「写坏」vs HDD「坏法」 两者都会坏,机理全然不同。HDD 的故障以机械与意外为主:磁头老化、电机卡死、磕碰划伤盘面——故障往往突发、灾难性,且与使用强度关系不大。SSD 的故障以磨损与耗尽为主:P/E 次数耗尽、坏块逐渐增多——过程是渐变的、可预测的(主控能上报「健康度剩余百分比」),但重度写入确实会加速它。工程选型的推论:怕摔、怕震、读写频繁但数据吞吐可控的场景选 SSD(特别是 SLC);要海量廉价冷数据归档、不怕慢就怕贵的场景,机械盘依然无可替代——两种介质在可预见的未来仍是分工共存,而非谁取代谁。

好在两种盘都会「提前打招呼」:盘片内置的自监测系统会持续记录健康指标——HDD 的磁头加载次数、重试与重映射扇区数(发现读不稳的扇区,悄悄把数据搬到备用扇区,原扇区标记退役),SSD 的剩余寿命百分比、备用块余量与累计写入量。系统里用一句命令就能读出这页「体检报告」(术语叫 SMART 数据)。运维的基本功之一就是盯着这几项做趋势:重映射扇区持续上涨、磨损余量逼近下限,就该安排数据撤离了——存储工程的第一守则从来是「备份」,第二守则是「在盘死之前搬家」。

10.5文件系统与目录:把存储组织起来

硬盘/SSD 上存的,本质只是一长串 0 和 1。但你在电脑上看到的是「文件」「文件夹」。把裸数据组织成这些,靠的是 文件系统(file system)。

文件系统做两件关键的事:

核心思想 文件系统 = 一本「地址簿」。它不改变数据本身,只负责记住「哪个文件散落在哪些块、怎么拼回去、叫什么名字、放在哪个文件夹」。你双击一个文件名,文件系统就顺着这本地址簿,把散落的块拼成完整文件。

文件系统把散块组织成文件 文件被拆成散块存在盘上,文件系统通过索引表把它们拼回完整文件。 文件 report.doc 块1 块2 块3 ↓ 拆成小块散落 索引表(地址簿) 块1→块2→块3 文件系统照它拼回完整文件
图 10-4文件可能散落在盘上不同位置,文件系统靠「索引表」把它们拼回完整文件。

🧠 一句话记忆 文件系统 = 地址簿;目录 = 名字→位置 的对照表。你看到的「文件」,是它拼出来的。

深一层:inode——文件真正的「身份证」

「地址簿」这个比喻还能再往深处走一步。在主流文件系统(如 Linux 的 ext4、多数类 UNIX 系统)里,每个文件都对应一条固定格式的档案记录,叫 inode(index node,索引节点)。它记着这个文件的一切「身份信息」:多大、谁拥有、何时创建修改、能否读写执行、由哪些数据块组成(一串块号指针)——但唯独不记文件名。文件名记在哪?记在目录里。所以更准确的说法是:目录(本质是一张特殊的表)存「文件名 → inode 编号」的对照,inode 存「这个文件的一切身份与住址」,数据块存「文件的内容本身」。三层接力,才拼出你双击看到的东西。

名字、inode、数据块的三层接力 目录表把文件名映射到inode编号,inode记录元数据与数据块指针,数据块存放内容。 /docs 目录(一张表) report.doc → inode #1024 photo.jpg → inode #2048 文件名住在这里,不住在 inode 里 inode 表(身份证档案) #1024:2.3 MB·权限rw·块[5,17,33] 大小/权限/时间/块指针,就是没有名字 #2048:1.8 MB·权限rw·块[42,43] 每个 inode 唯一对应一个文件实体 数据块 5、17、33 数据块 42、43 真正的内容字节住在这里 查找文件 = 「按名字查目录 → 拿到 inode 号 → 按 inode 里的块指针拼回内容」三层接力 两个文件名可以指向同一个 inode(硬链接)——删掉一个名字,另一个照常能打开 (删除 = 从目录抹去一行、inode 链接计数减一;计数归零,数据块才真正归还系统)
图 10-5三层接力:目录存「名字→inode 号」,inode 存「身份+块指针」,数据块存内容。文件名只是 inode 的别名。

这套「名字与实体分离」的设计妙处极多,挑两个最实用的讲。其一,硬链接:既然文件名只是指向 inode 的一条记录,就完全可以给同一个 inode 再登记一个名字——两个「文件」,其实是同一份内容的两个入口。删除时只是抹掉一条目录记录、给 inode 的「链接计数」减一,减到零才真正释放数据块。这解释了一个新手惊悚现象:删除了一个「大文件」,空间没回来——多半还有另一个名字(或某个正在使用它的程序)握着它的 inode,数据块自然不敢回收。其二,删除与恢复:常规删除从不擦除数据块内容,只把目录记录与 inode 标记为「空闲」——所以删错的文件在数据块被新数据覆盖之前,恢复软件总能把内容扫回来。同样的道理反过来读:想真正销毁敏感数据,必须整块覆写,而不是拖进回收站清空。

深一层:为什么目录长成一棵「树」

目录之下还可以再放目录,层层嵌套长成一棵树。为什么选树形?因为它同时解决了两件事:命名的唯一性与管理的可分性。有树,才有「路径」这个概念——从树根(/)出发的一串目录名唯一确定一个文件,/docs/report.doc 与 /photos/report.doc 互不冲突;有树,才支持「挂载」——把一个独立的存储设备(U 盘、外置硬盘)的整棵树接到主树的某个空位上,插上即用、拔下即走。你在文件管理器里翻文件夹,翻的就是这棵树的枝条;地址栏里的每一级路径,就是从树根到那个节点的一条链。顺带记住一个细节:目录既然是「名字→inode 的表」,那它自己也是个文件(一张特殊的表文件),也有自己的 inode——「目录是一种文件」,这句话现在你能从硬件层往上完全打通了。

📐 例题 5 「盘没满,却说没空间了」——inode 用尽的怪象

某 1 TiB 的分区按 Linux 常见比例配置:每 16 KiB 空间预留 1 个 inode(创建文件系统时定死,事后不能加)。(1) 这个分区最多有多少个 inode?(2) 若用户全存 1 KiB 的小文件,最多能存多少个?此时实际数据占盘多大比例?(3) 这类分区更适合什么用途?

思路 inode 总数 = 容量 ÷ 每 inode 配额;一个文件至少占一个 inode;占用比 = 文件数 × 文件大小 ÷ 总容量。用 2 的幂计算:1 TiB = 240 B,16 KiB = 214 B,1 KiB = 210 B。

解 (1) inode 数 = 240 ÷ 214 = 226 = 67 108 864 个(约 6710 万)。
(2) 每文件一个 inode,最多 6710 万个文件;数据实占 = 226 × 210 B = 236 B = 64 GiB,仅占总量的 6.25%(1/16)——inode 先用光,空间还剩 93% 以上。
(3) 适合大文件场景(影像、虚拟机镜像、数据归档);海量小文件场景应换用「小文件专用」的文件系统或调大 inode 比例重建。

答:226 ≈ 6710 万个 inode;小文件场景 64 GiB 就「撑满」,占盘 6.25%。 ⚠ 易错点:① inode 是建文件系统时按比例一次性分配的固定资源,跟磁盘剩余空间无关——这是初学者最意外的点;② 日常家用很少撞上这个墙(照片视频都是大文件),但邮件服务器、新闻组缓存这类「亿万小文件」系统历史上真被它咬过;③ 想确认自己盘的 inode 余量,查的不是空间命令,是 inode 使用率命令——两套「余量」,必须分开看。

📐 例题 6 簇的「最低消费」:百万小文件浪费多少空间

某 U 盘用 FAT32 文件系统,簇大小 32 KiB(每簇是空间分配的最小单位,一个文件至少占一簇)。现在存入 100 万(220)个 1 KiB 的小文件。(1) 实际占用多少空间?(2) 有效数据多大?(3) 空间利用率是多少?

思路 每个文件占整数个簇:1 KiB < 32 KiB,按 1 簇计。实占 = 文件数 × 簇大小;利用率 = 有效数据 ÷ 实占。

解 (1) 实占 = 220 × 32 KiB = 220 × 215 B = 235 B = 32 GiB。
(2) 有效数据 = 220 × 1 KiB = 230 B = 1 GiB。
(3) 利用率 = 1 ÷ 32 = 3.1%,96.9% 的空间被「凑整」浪费在簇的尾巴里。

答:实占 32 GiB;有效 1 GiB;利用率仅 3.1%。 ⚠ 易错点:① 簇是文件系统的「最低消费」单位——文件再小也要占一整个簇,这不是故障而是设计(分配记账按簇走,表才能做得小);② 簇调小能省空间(FAT32 对大分区默认 32 KiB,U 盘小分区可能只有 4 KiB),但簇越小、簇数越多、分配表越大——又是经典的空间-账本权衡;③ 这个例子的工程名字叫「内部碎片」,与「文件散落各处」的外部碎片是两回事,别混。

📖 工程现场:为什么工程档案要「打包」再存 把成千上万的小文件裸存进盘,是数据管理的经典反面教材:簇的最低消费让空间利用率暴跌(例题 6),目录表本身膨胀到几百 MB,备份、杀毒、同步软件要逐个打开百万个小文件——每个都有元数据开销,慢到怀疑人生。工程界的解法朴素而有效:打包——把一堆小文件压进一个归档文件(zip/tar)再存,一举三得:空间按实际内容算、传输只搬一个文件、备份按块整体走。航空维护记录、试验数据归档常用「按项目打包 + 按年归档」两级结构,背后正是这道例题的账。

辨析:两种「格式化」,差别巨大 新盘「格式化」这个词其实歧义很深。快速格式化只是重建「地址簿」——把目录表、分配表清零,宣布所有块空闲,数据块的内容一个字节都没动(所以快格式化后的盘还能被恢复软件扫回大部分数据);完全格式化(慢格)则逐块覆写,边写边验,既慢又能顺带检测坏块。旧硬盘年代还要做「低级格式化」(划磁道写扇区伺服信息),如今工厂出厂已做完、用户层不再涉及。下次卖二手硬盘前该做哪种,现在你心里应该门儿清。

最后把常见文件系统按「找块的方式」粗分两大门派,给你一张地图。FAT 家族(FAT16/32/exFAT,U 盘与存储卡的默认格式):靠一张链表找块——每个文件的起始簇号记在目录里,从起始簇出发,每簇末尾写着「下一簇在几号」,一环扣一环直到结束。结构简单到几乎所有设备都能读(相机、车机、嵌入式设备通吃),但链式查找跳来跳去,大文件碎片多时读得慢,也几乎没有权限与日志保护。inode 家族(ext2/3/4、XFS 等,类 UNIX 世界主流):靠 inode 的指针数组找块——直接记录前十几块的块号,更大文件再经一级、二级、三级间接指针展开,查任意一段数据只要按图索骥。NTFS(Windows 主盘格式)思路另辟蹊径,把一切(包括文件内容本体)都做成「主文件表」里的记录条目,功能最强、实现也最复杂。日常选型的直觉由此而生:小设备互通用 FAT/exFAT,系统盘跟平台走(Windows 用 NTFS、Linux 用 ext4),不懂就别格式化——格式化会把「地址簿」整套换掉,跨门派往往意味着数据「看不见」而非「消失」。

本章小结

  1. 内存易失、硬盘/SSD 非易失;开机时程序从硬盘「搬」进内存再运行。
  2. HDD 靠磁畴方向记 0/1,磁场撤走方向不变,故断电不丢;由盘片、磁头、磁道、扇区构成,机械动作偏慢。
  3. SSD 靠浮栅晶体管存电荷,电荷被绝缘层困住不漏,故断电不丢;纯电子,快而抗震。
  4. SSD 内部是海量浮栅晶体管组成的 NAND 闪存阵列。
  5. 文件系统像「地址簿」,把散落的数据块拼成文件;目录是「名字→位置」的对照表。

读完本章,你应该能……

思考题

1. HDD 为什么断电后数据不丢?从磁畴的角度解释。

提示:磁畴被磁化后方向保持,撤走磁场也不变,所以能长期记录。

2. HDD 读一个数据,要经历哪两个机械动作?为什么这拖慢了速度?

提示:寻道(磁头移到位)+ 旋转延迟(盘片转到扇区),都是机械运动。

3. SSD 的浮栅为什么能「困住」电荷?这如何实现非易失?

提示:浮栅被绝缘层完全包裹,电荷注入后漏不走;电荷有无改变导通状态,记 0/1。

4. 文件系统和目录分别是什么?文件为什么能「散落」在盘上?

提示:文件系统=地址簿(记录块的位置和顺序);目录=名字→位置的对照表。

5. 一块 15 000 rpm 的高转速服务器盘,平均旋转延迟是多少?

提示:一圈 = 60 s ÷ 15 000 = 4 ms,平均等半圈 = 2 ms。但别忘寻道时间才是大头——高转速盘的收益远小于成本,这解释了它为何只活在服务器机房。

6. FAT32 单个文件最大约 4 GB,这个上限是哪来的?

提示:FAT32 用 32 位字段记录文件大小,最大可表达 232 − 1 = 4 294 967 295 B ≈ 4 GiB。想存大于 4 GB 的高清视频就得换 exFAT/NTFS——「文件系统规定的字段宽度」决定了文件的天花板,与盘还剩多少空间无关。

7. 机载、车载电子为什么普遍选 SLC 闪存而不是便宜几十倍的 QLC?

提示:三笔账一起算——寿命(SLC 约 10 万次 P/E,QLC 约几百次,宽温环境下差距更大)、可靠性(SLC 只辨两档电压,抗温漂抗翻转余量足)、一致性(写入延迟稳定,不靠垃圾回收「抽风」)。安全攸关场景买的不是容量,是余量。

8. 某 512 GB 的 TLC 固态盘,每单元标称擦写寿命 1500 次(P/E),盘内维护机制带来写放大 3——每写 100 GB 用户数据实际擦写 300 GB。若每天写入 100 GB,这块盘大约能用几年?

解析:先算总擦写额度:1500 × 512 = 768 000 GB(即 768 TBW);每天实擦 100 × 3 = 300 GB;768 000 ÷ 300 = 2560 天 ≈ 7 年。两个杠杆一目了然:写放大越小越长寿,每天写入量减半寿命翻倍(若每天 50 GB 则约 14 年)。再对比第 7 题:SLC 的 10 万次 P/E 在同条件下约 470 年——安全攸关系统宁可要小容量,买的就是这个数量级差。