想象你走进一家热闹的餐厅后厨:掌勺大厨(CPU)手上握着趁手的刀勺(寄存器),灶台边的调料架(缓存)一伸手就够到,身后的冰柜(内存)转身两步就能拉开;食材不够了,得换鞋跑一趟街角的生鲜超市(SSD),要是连超市也没有,只能开货车去郊外的总仓库(磁盘)。大厨取一份食材的耗时,从“零点几秒”到“大半天”,差出好几个数量级——这就是存储层次最直观的写照。 SSD 之所以在存储江湖中独当一面,是因为它就像那家“生鲜超市”:没有机械硬盘“开着卡车满城找路”的寻道动作,闪存芯片直接读取数据,随机读写快得惊人。但它也有自己的“店规”:食材只能按箱搬(页读写),货架只能整排清空(块擦除)。于是需要老板娘(FTL)记好每样货的位置,还要定期“倒腾货架”(垃圾回收)、“轮流用锅”(磨损均衡)来保养设备。 这篇文章用后厨的一天,带你彻底看懂存储层次与 SSD 的底层逻辑:为什么延迟差那么多、SSD 凭什么快、它又有什么难言之隐。

岗位关联

对 AI 从业者而言,理解存储层次与 SSD 是设计与部署高性能数据管道的基石——训练数据加载、向量检索、缓存设计,全都建立在这套延迟数量级的直觉之上。

目录
  1. 可视化演示
  2. 存储层次结构:后厨的取物链条
  3. 访问延迟数量级:从纳秒到毫秒的鸿沟
  4. 闪存基本特性:页读写、块擦除的店规
  5. FTL映射机制:老板娘手上的食材账本
  6. 磨损均衡:让每口锅都被雨露均沾
  7. 垃圾回收:打烊后的归位与清空
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示存储器金字塔层次结构与延迟模型、FTL闪存转换层逻辑到物理映射及垃圾回收、磨损均衡与写放大控制策略,切换模式理解SSD核心机制。

本节配有交互动效(进入视口后自动加载,约 3KB)。

存储器金字塔层次结构 寄存器(1ns)→Cache(3-10ns)→RAM(80ns)→SSD(50μs)→HDD(10ms),每层延迟差数量级 容量递增、速度递减,层次间通过缓存预取和局部性原理弥补速度差距 Latency: Reg 1ns < Cache 10ns < RAM 80ns < SSD 50μs < HDD 10ms 存储层次设计的核心是用快速小容量存储缓冲慢速大容量存储

存储层次结构:后厨的取物链条

走进一家餐厅的后厨,最核心的永远是掌勺大厨——他手边的东西决定出菜速度:刀勺(寄存器)就攥在手里,一个念头就能举起来;灶台旁的调料架(缓存)一伸手就够到,连步子都不用迈;身后两米是冰柜(内存),转身走两步就能拉开;食材见底了,得换鞋跑一趟街角的生鲜超市(SSD);要是超市也没货,只能开货车去郊外的总仓库(磁盘)。大厨取东西的距离从“零”到“几公里”,计算机的存储层次正是这样一层一层搭出来的。

计算机里的“大厨”是 CPU,它要访问的“食材”是数据。假如所有数据都放在最慢的仓库里,CPU 每秒数十亿次的运算就得等上毫秒级,性能被彻底拖垮;假如全部放在最快的寄存器里,造价又高到离谱。于是设计者把存储分成五层:寄存器、缓存、内存、SSD 和磁盘。越靠上,速度越快、容量越小、每字节越贵;越靠下,容量越大、速度越慢、每字节越便宜。

上层存储实际上是下层数据的“临时副本”:寄存器存当前正在计算的数,缓存存最近访问的数据块,内存存进程的地址空间,SSD 与磁盘负责持久化。CPU 找数据时“由上往下”逐层查找——绝大多数访问命中在最快的那几层,平均延迟就被拉低了。这种“快而小 + 慢而大”的组合,是计算机体系结构最核心的工程权衡。

大厨之所以能高效出菜,不是因为仓库建得大,而是因为最常用的东西都摆在手边。计算机设计存储层次,就是把“热数据”留在最快的层里——这是理解一切存储系统的第一直觉,也是后续所有延迟优化的出发点。

Tn+1≈10×Tn\displaystyle T_{n+1} \approx 10 \times T_n
这是一个简化模型:紧邻的存储层之间,访问延迟大约相差一个数量级;从内存跨到 SSD 时差距会扩大到千倍以上。
  1. 层级编号 n把存储从上到下编号,离 CPU 最近的寄存器是第 1 层。
    n=1,2,3,4,5n = 1, 2, 3, 4, 5
  2. 延迟 T_n第 n 层的访问延迟,寄存器约 1ns,内存约 100ns。
    T1≈1 ns,T3≈100 nsT_1 \approx 1\,\text{ns}, \quad T_3 \approx 100\,\text{ns}
  3. 约 10 倍关系紧邻两层延迟差一个数量级,跨层到外存会扩大到千倍。
    Tn+1≈10×TnT_{n+1} \approx 10 \times T_n

访问延迟数量级:从纳秒到毫秒的鸿沟

回到后厨那次取货:大厨取刀只需 0.1 秒,拿调料 1 秒,开冰柜 5 秒,跑超市 5 分钟,去仓库 50 分钟。把这些数字画在纸上你会发现,后半段的时间跨度大到惊人——从“秒”到“分钟”,中间隔了整整三个数量级。系统设计者最怕的不是“慢一点”,而是“慢一千倍”。

把微观时间映射到存储世界里:寄存器、缓存约 1ns 到 10ns;内存约 100ns;SSD 约 100μs;磁盘约 10ms。100ns 是 10⁻⁷ 秒,100μs 是 10⁻⁴ 秒,两者相差整整 1000 倍——访问一次 SSD 的时间,足够内存访问一千次。这就是为什么操作系统要拼命把热数据留在内存里。

那为什么 SSD 比内存慢千倍还被称为“革命”?因为机械磁盘更夸张:随机读要移动磁头寻道、等盘片转到目标扇区,约 10ms,比 SSD 又慢两三个数量级。随机读场景下,SSD 对磁盘是“代差碾压”;而顺序读时磁盘靠持续旋转也能跑出较高带宽,差距就会缩小。理解这套数量级,就能解释为什么 AI 训练和数据库都要用 SSD 做随机读加速。

大厨如果每天要为一种菜跑 50 分钟仓库,他一定会提前把这种菜屯进后厨冰柜。系统设计也是一样:凡是频繁访问的数据,一定要尽量留在内存甚至缓存里,别让 SSD 和磁盘成为热路径上那趟“50 分钟的取货之旅”。

tSSDtDRAM=10−4 s10−7 s=103\displaystyle \frac{t_{SSD}}{t_{DRAM}} = \frac{10^{-4}\,\text{s}}{10^{-7}\,\text{s}} = 10^3
内存约 100 纳秒,SSD 约 100 微秒,两者相差约千倍。
  1. 分子 t_SSDSSD 的典型随机访问延迟约为 100 微秒。
    tSSD≈10−4 st_{SSD} \approx 10^{-4}\,\text{s}
  2. 分母 t_DRAM内存 DRAM 的典型访问延迟约为 100 纳秒。
    tDRAM≈10−7 st_{DRAM} \approx 10^{-7}\,\text{s}
  3. 求比值同底数幂相除、指数相减,得到差距为三个数量级。
    10−410−7=10−4+7=103\frac{10^{-4}}{10^{-7}} = 10^{-4+7} = 10^3

闪存基本特性:页读写、块擦除的店规

街角的生鲜超市有条奇怪的店规:买食材必须按“箱”买,一箱至少 4 个;扔过期食品必须按“整排货架”清空,不能单独丢一个。大厨嫌麻烦,但店规就是店规——这正是闪存的“页读写、块擦除”特性。

SSD 里的闪存芯片不是按字节自由读写的。物理上,芯片分成很多块(Block),每块又分成很多页(Page)。读取和编程(写入)的最小单位是页,常见 4KB 到 16KB;擦除的最小单位是块,一个块通常包含 128 到 1024 个页。更要命的是“先擦后写”:一个页只能从“空闲”状态写一次,想改写同一位置,必须先把所在的整个块擦干净——而擦除整块意味着所有页一起被清空。

这个特性决定了 SSD 无法像机械磁盘那样“原地覆写”。数据更新时,控制器把新数据写到另一块空闲页上,旧页立刻变成“无效数据”,占着位置等垃圾回收来清。另外,闪存颗粒按每单元存储的比特数分为 SLC、MLC、TLC、QLC,数字越大容量越大、成本越低,但寿命和写入速度也依次变差。

既然超市的店规改不了,能干的后厨就得想别的办法:不能原地改数据,就记一本账,把“新买的食材”登记在别的货架上。于是,FFL——也就是下一页的主角,登场了。

terase≫tprogram>tread\displaystyle t_{erase} \gg t_{program} > t_{read}
读页最快、写页次之、块擦除最慢,三者数量级约为 0.1ms / 0.5ms / 5ms。
  1. 读页 t_read读只需感应单元电荷状态,动作最轻快。
    tread≈0.1 mst_{read} \approx 0.1\,\text{ms}
  2. 写页 t_program写要施加高压改变浮栅电荷,明显更慢。
    tprogram≈0.5 mst_{program} \approx 0.5\,\text{ms}
  3. 块擦除 t_erase擦除要把整块所有单元拉到统一状态,最耗时。
    terase≈5 mst_{erase} \approx 5\,\text{ms}

FTL映射机制:老板娘手上的食材账本

为了让大厨不被店规逼疯,老板娘发明了一本“食材账本”:客人点一份“菠萝炒饭”,账本上写着“菠萝在 3 号货架第 2 箱”。大厨只报菜名,老板娘负责翻账、告诉大厨去哪儿取。这本账,就是 FTL——闪存翻译层。

操作系统和文件系统可不认识“页读块擦”这套闪存黑话,它们只发出逻辑块地址(LBA)。SSD 控制器里的 FTL 维护一张映射表,把每个 LBA 翻译成物理地址(PBA)——具体到哪个芯片、哪个块、哪一页。由于闪存要走“异地更新”,同一个 LBA 每次写入都可能落在不同的物理页,映射表也随之不断更新。

映射粒度通常是 4KB 页级别,而映射表本身大得惊人:一块 1TB 的 SSD,页级映射表可能占 1~2GB,需要压缩或分层存储在 DRAM 中。这又带来一个经典难题——掉电一致性:映射表在 DRAM 里断电即失,SSD 上电时必须扫描闪存或读取备份来重建映射,否则数据会“找不回来”。FTL 的调度水平,直接决定了 SSD 的性能、寿命与可靠性。

老板娘这本账,让“按箱进货、整排清货”的超市看起来和普通菜市场一样方便。FTL 的存在,把闪存的怪脾气严严实实藏在了 SSD 的外壳之下——上层系统完全感知不到那些复杂规则。

PBA=Map[ LBA ]\displaystyle PBA = \text{Map}[\,LBA\,]
每一次读写,SSD 控制器都要查这张映射表;每一次写入,都要更新它。
  1. LBA 逻辑块地址主机视角的地址,按 4KB 粒度连续编号。
    LBA=0,1,2,…LBA = 0, 1, 2, \ldots
  2. Map 映射表FTL 维护的核心数据结构,将逻辑地址翻译成物理位置。
    Map:LBA→PBA\text{Map}: \text{LBA} \rightarrow \text{PBA}
  3. PBA 物理块地址最终定位到芯片、块、页三级坐标。
    PBA=(chip,block,page)PBA = (\text{chip}, \text{block}, \text{page})

磨损均衡:让每口锅都被雨露均沾

后厨有八口锅,大厨炒菜总爱用最顺手的那口。一年下来,那口锅锅底快烧穿了,其余七口还崭新如初。老板娘发现后立下规矩:每隔一阵,就把常用锅和闲置锅换换位置——让所有锅均匀受热,整套餐具才能用得更久。这就是磨损均衡的思路。

闪存的每个块都有擦写次数上限:SLC 约 10 万次,TLC 约 1000 到 3000 次,QLC 更是只有几百次。如果热点数据总写同一批块,这些块很快就会被“写穿”,SSD 的可用容量随之缩水,甚至整盘报废。磨损均衡的目标,就是让所有块的擦写次数尽量接近,避免个别块成为木桶上最短的那块板。

实现上有两条路线:动态磨损均衡在每次写入时,优先从擦写次数少的块中分配新页,适合应对热点数据;静态磨损均衡更进一步,把长期不动的“冷数据”搬到磨损较重的块上,腾出低磨损块给频繁写入使用——虽然多了一次数据搬移,但能更彻底地拉平全盘磨损。此外,预留空间(OP)越大,控制器腾挪的自由度越高,均衡效果越好。

换锅虽然麻烦,但能让八口锅一起“光荣退休”,而不是三天两头换锅。磨损均衡牺牲一点写入开销,换来整块 SSD 寿命的大幅延长——这笔账,老板娘算得清清楚楚。

W‾=1Nblock∑i=1NblockWi\displaystyle \overline{W} = \frac{1}{N_{\text{block}}} \sum_{i=1}^{N_{\text{block}}} W_i
均衡的目标:让每个块的擦写次数贴近这个平均值,别让某一口锅先报废。
  1. W_i 单块磨损第 i 个物理块的累计擦除次数,只能非负。
    Wi≥0,i=1,2,…,NblockW_i \ge 0, \quad i = 1, 2, \ldots, N_{block}
  2. N_block 块总数由 SSD 总容量除以块大小得到。
    Nblock=容量块大小N_{block} = \frac{\text{容量}}{\text{块大小}}
  3. 求平均所有块的擦写次数相加后除以块数,就是磨损均衡盯着的平均值。
    W‾=∑i=1NblockWiNblock\overline{W} = \frac{\sum_{i=1}^{N_{block}} W_i}{N_{block}}

垃圾回收:打烊后的归位与清空

一天营业结束,后厨早就乱成一锅粥:青菜堆在案板上,用过的盘子占着水槽,过期食材还赖在货架上。老板娘让帮工把所有能用的食材挑出来归到一边,把堆满垃圾的货架整体清空——这样明天才有地方放新货。这个收尾动作,就是垃圾回收(GC)。

SSD 里的“垃圾”是无效页:数据更新后,旧物理页没用了却还占着空间。当闪存中的空闲页不足时,GC 从候选块里挑一个无效页最多的块,把其中仍然有效的页搬到空闲块,然后整块擦除,一次性腾出一大片空间。由于搬移有效页本身也要写入,GC 会造成额外的闪存写入,这就是“写入放大”的来源。

GC 的触发时机有两种:后台 GC 在空闲块数量低于阈值时悄悄执行,对用户影响小;前台 GC 在写请求找不到空闲块时被迫强制执行,会造成明显的性能卡顿——这就是为什么 SSD 快装满时反而变慢。写入放大系数 WAF 用来衡量这个代价:WAF 越接近 1,SSD 的写入效率越高、寿命越长;加大预留空间、优化 GC 调度,都能有效压低 WAF。

打烊后的整理看似白费力气,却保证了明天还能正常开张。GC 是 SSD 必须付出的“家务成本”——下次遇到 SSD 突然卡顿,你就明白了:不是老板在偷懒,而是后厨该清理垃圾了。

WAF=DflashDhost≥1\displaystyle WAF = \frac{D_{\text{flash}}}{D_{\text{host}}} \ge 1
WAF 大于等于 1,表示闪存的实际写入量永远不会小于用户请求的写入量。
  1. D_host 主机写入用户和应用实际请求写入的数据量。
    Dhost=应用写入字节数D_{host} = \text{应用写入字节数}
  2. D_flash 闪存写入实际落到闪存的写入量,包含 GC 搬移的额外部分。
    Dflash=Dhost+D搬移D_{flash} = D_{host} + D_{\text{搬移}}
  3. WAF 写入放大比值至少为 1,越大说明额外开销越严重。
    WAF∈[1,+∞)\text{WAF} \in [1, +\infty)

AI 应用场景

大模型训练数据管道

阶段:数据处理与加载

解决的问题:大模型预训练要从海量小文件语料(JSONL、Parquet)中反复随机采样。机械磁盘随机读约 200 IOPS、延迟 10ms,GPU 常常“等菜”饿肚子;SSD 无机械寻道,随机读可达数万 IOPS。把语料放在 SSD 上,数据加载不再是训练瓶颈,GPU 能持续吃饱。

具体案例:某 MLOps 团队把 5TB 训练语料从 HDFS 迁移到本地 NVMe SSD 后,数据加载时间下降约 70%,GPU 利用率从 55% 提升到 82%。

向量检索与 RAG 低延迟

阶段:线上推理

解决的问题:RAG 应用要把 query 的 embedding 与百万级向量比对,向量索引(HNSW、IVF)需大量随机读段。机械磁盘 10ms 延迟撑不起毫秒级交互;SSD 的亚毫秒随机读让向量检索回到可用范围,这直接决定聊天机器人“感觉快不快”。

具体案例:一个百万级文档的 RAG 服务,把 Faiss 索引从 HDD 迁到企业级 SSD 后,p99 检索延迟从 800ms 降到 45ms,用户明显感觉回复变“跟手”了。

数据库 WAL 与检查点加速

阶段:数据存储与落盘

解决的问题:OLTP 数据库的事务日志(WAL)持续追加写,数据页又要随机读。机械磁盘随机读慢导致长事务阻塞;SSD 的闪存结构天然适合“日志追加写 + 数据页随机读”的组合,FTL 和垃圾回收反而让这种混合负载更高效。

具体案例:将 PostgreSQL 数据目录迁移到 NVMe SSD 后,相同负载下 QPS 提升约 3 倍,checkpoint 期间的 IO 抖动基本消失,慢查询不再超时。

Python 演示

python38 行
"""FTL 映射演示: 逻辑地址(LBA)到物理地址(PBA)的转换""" PAGES_PER_BLOCK = 4NUM_BLOCKS = 4NUM_PAGES = PAGES_PER_BLOCK * NUM_BLOCKS  class FTL:    """闪存翻译层: 维护 LBA 到 PBA 的映射与物理页状态"""    def __init__(self):        self.map = {}                 # LBA -> PBA        self.state = [0] * NUM_PAGES  # 0=空闲 1=有效 2=无效     def write(self, lba):        """写入一个逻辑页, 返回分配的物理页号"""        if lba in self.map:            old = self.map[lba]            self.state[old] = 2       # 旧物理页变为无效        for pba, s in enumerate(self.state):            if s == 0:                # 找到空闲页                self.map[lba] = pba                self.state[pba] = 1                return pba        raise RuntimeError("无空闲页, 需要触发垃圾回收")     def show(self):        names = ['空', '有效', '无效']        print('映射表:', self.map)        print('物理页:', [names[s] for s in self.state])  if __name__ == '__main__':    ftl = FTL()    for lba in [0, 1, 2, 0, 3, 1]:        pba = ftl.write(lba)        print(f'逻辑页 {lba} -> 物理页 {pba}')    print()    ftl.show()
目的:小规模模拟 SSD 的 FTL——每次写入分配新物理页,重复写同一逻辑页时旧页变“无效”,直观展示垃圾产生与映射表更新过程。
  1. self.state = [0] * NUM_PAGES用数组记录每个物理页状态:0 空闲、1 有效、2 无效。
  2. if lba in self.map:该逻辑页已有映射,说明是覆写,旧物理页必须失效。
  3. self.state[old] = 2把覆写前的旧页标记为“无效”,这正是垃圾回收要清理的垃圾源头。
  4. for pba, s in enumerate(self.state):线性扫描找第一个空闲页,简化但符合 FTL 的基本逻辑。
  5. self.map[lba] = pba建立逻辑到物理的最新映射,等价于老板娘更新账本。
  6. raise RuntimeError("无空闲页, 需要触发垃圾回收")空间耗尽时报错,正好引出正文中的 GC 机制。

常见误区

误区“SSD 内部没有磁头也没有盘片,应该是无限寿命吧?我的笔记本用了五年也没坏啊。”

正解闪存靠浮栅晶体管保存电荷,每次擦写都会让绝缘层发生轻微损伤,所以擦写次数(P/E)是有限资源:TLC 颗粒约 1000 到 3000 次,QLC 甚至只有几百次。磨损均衡只是把损耗摊平、延长整体寿命,并不能消除磨损本身。

为何常见:SSD 静音、抗震、无机械运动,用户很容易把“没有机械磨损”误解为“永远不会损耗”,忽略了闪存特有的电子磨损。

误区“写文件就是覆盖旧数据,SSD 肯定也能把新内容直接写在原来的位置上吧?”

正解闪存的规矩是“页写入、块擦除”,且必须先擦后写。所以每次更新,SSD 都会把数据写到新的空闲页,再把旧页标记为“无效”。文件系统看到的“覆盖写”,在 SSD 内部其实是一场“异地更新 + 账本改记录”的戏码。

为何常见:操作系统提供的文件接口是“覆盖写”,把 SSD 内部的异地更新隐藏得天衣无缝,用户自然以为物理上也是覆写。

误区“WAF 只是评测软件里的一个参数,我日常用电脑根本感知不到它。”

正解WAF 越高,闪存实际写入越多,寿命消耗越快;更直接的是,前台垃圾回收会把搬移操作插到写请求中间,造成肉眼可见的卡顿。选购 SSD 时关注预留空间和 GC 策略,就是在管理 WAF。

为何常见:用户感知到的是结果——“这块盘越用越慢”“寿命比预期短”——而 WAF 是过程指标,两者之间隔着一层翻译。

误区“存储层次不就是速度排序吗?那全用最快的存储不就行了,何必分层?”

正解层次设计的本质是“容量 / 速度 / 成本”三方权衡。寄存器和 SRAM 缓存每字节价格极高,不可能装下 TB 级数据;磁盘虽然慢,但每字节成本极低。利用数据访问的局部性原理,把 90% 的访问压在最上层,才让整机既快又买得起。

为何常见:教科书总是先列延迟表格,让人只盯着速度排序,忽略了容量与成本才是分层存在的根本原因。

面试题

Q1. 存储层次中,访问延迟最小(最快)的是哪一层?

单选题 · easy

  • A.寄存器← 正确答案
  • B.内存
  • C.SSD
  • D.磁盘

答案:A。寄存器位于 CPU 内部,离计算单元最近,延迟约 1ns;内存约 100ns,SSD 约 100μs,磁盘约 10ms。就像大厨手上的刀勺最快拿到,摆在灶台边的调料次之。

Q2. SSD 中数据读取和写入的最小单位是什么?

单选题 · easy

  • A.页← 正确答案
  • B.块
  • C.字节
  • D.扇区

答案:A。闪存的读写以页为单位(常见 4KB 到 16KB),块是更大的擦除单位。操作系统可以读文件的一个字节,但 SSD 底层做不到按字节寻址读写。

Q3. 相比机械磁盘,SSD 随机读性能大幅提升的主要原因是?

单选题 · easy

  • A.没有机械寻道和旋转等待← 正确答案
  • B.接口带宽更宽
  • C.容量更大
  • D.缓存更大

答案:A。机械磁盘随机读需要移动磁头寻道并等待盘片旋转到目标扇区,约 10ms 级别;SSD 通过闪存电路直接读取,无机械运动,约 0.1ms。就像超市就在街角,不必开车去郊区仓库。

Q4. SSD 闪存中,擦除操作的最小单位是?

单选题 · mid

  • A.页
  • B.块← 正确答案
  • C.芯片
  • D.字节

答案:B。页是读写单位,但擦除只能按块进行,一个块包含几百个页。因为闪存物理特性,写入前必须先整块擦除——这就是“先擦后写”的由来。

Q5. FTL(闪存翻译层)的核心职责是什么?

单选题 · mid

  • A.将逻辑块地址映射为物理块地址← 正确答案
  • B.压缩文件数据
  • C.加密操作系统文件
  • D.管理机械磁盘分区

答案:A。FTL 维护一张 LBA 到 PBA 的映射表,让上层把 SSD 当成普通块设备使用。它相当于后厨老板娘手里的食材账本,记录“客人点的菜(逻辑地址)对应哪排货架(物理地址)”。

Q6. 以下关于磨损均衡的说法,正确的是?

多选题 · mid

  • A.目标是让各块的擦写次数接近← 正确答案
  • B.分为动态均衡与静态均衡← 正确答案
  • C.只在磁盘启动时执行一次
  • D.可以彻底避免闪存磨损

答案:AB。磨损均衡把擦写次数分散到所有块,动态均衡在写入时选低磨损块,静态均衡主动搬移冷数据。C 错在它是持续运行而非一次性动作;D 错在磨损是物理特性,只能摊平、无法消除——就像轮流用锅能延长整套锅的寿命,但锅总会损耗。

Q7. 某 SSD 的写入放大系数 WAF = 3,表示什么?

单选题 · mid

  • A.闪存实际写入量是主机请求写入量的 3 倍← 正确答案
  • B.主机写入量是闪存实际写入量的 3 倍
  • C.读取放大是写入放大的 3 倍
  • D.磁盘碎片率达到 30%

答案:A。WAF = 闪存实际写入量 / 主机请求写入量,垃圾回收搬移有效页会造成额外写入,所以 WAF 通常大于 1。WAF=3 意味着磨损速度大约是理想情况的 3 倍。

Q8. 垃圾回收通常优先选择哪类块进行回收?

单选题 · single

  • A.无效页最多的块← 正确答案
  • B.空闲页最多的块
  • C.磨损最少的块
  • D.随机挑选的块

答案:A。无效页最多的块里有效数据最少,搬移成本最低、回收收益最大。就像先清理堆满垃圾的货架最省力,而不是去搬一个还装着大半箱菜的货架。

Q9. 关于存储层次的描述,正确的有?

单选题 · multiple

  • A.越往上访问速度越快← 正确答案
  • B.越往下每字节成本越低← 正确答案
  • C.上层容量远小于下层← 正确答案
  • D.SSD 的延迟低于寄存器

答案:ABC。存储层次设计就是“快而小、慢而大”:寄存器最快最贵,磁盘最慢最便宜。D 错误,SSD 延迟约 100μs,寄存器约 1ns,两者差五个数量级,SSD 比寄存器慢得多。

Q10. 如果 SSD 的 FTL 映射表只保存在 DRAM 中,掉电后会发生什么?

单选题 · multiple

  • A.闪存中所有数据物理损坏
  • B.逻辑地址到物理地址的映射关系丢失← 正确答案
  • C.上电后可通过扫描闪存重建映射表← 正确答案
  • D.SSD 彻底报废、完全无法恢复

答案:BC。DRAM 断电即失,映射关系会丢失,但闪存上的物理数据还在,固件上电时能通过扫描或日志重建映射。A 和 D 都夸大了后果。这就像账本被烧了,但厨房里的货还在,老板娘重新盘点一遍就能恢复营业。