文件系统与磁盘

沿目录到数据块的访问路径,讲解文件分配、索引容量、访盘、空间回收与磁盘调度。

文件系统把“按名字访问文件”落实为“找到并读写若干磁盘块”。目录、inode、索引块和位图各自保存不同的信息;磁盘调度则决定这些块按什么顺序访问。先知道要经过哪些结构,容量和访盘次数才有依据。

这个板块包含哪些知识

在存储系统图谱中,文件系统位于持久化数据这一侧;向下连接输入输出系统。本页展开以下内容:

  • 文件与目录:目录项、FCB / inode、路径解析、打开文件表与硬链接。
  • 空间分配:连续、链式、FAT、索引与混合索引;逻辑块号怎样映射到物理块号。
  • 空间管理:数据块和 inode 的分配回收、位示图、元数据更新。
  • 磁盘组织与访问:扇区、簇、磁道和柱面,调度算法、访问时间、格式化与引导。

沿一次读取来看:先通过目录找到文件,再由元数据找到目标逻辑块对应的盘块,最后发出设备请求。目录查找、索引查找和数据读取是不同环节,哪些已经在内存,要从题设中逐项扣除。

删除、扩展文件还会修改元数据,不能只计算数据块的变化。

常见考点与题型

综合题可能组合下面几类小问。先看要求求什么,再确定需要调用哪些知识。

题型题干中的线索解题思路
容量与索引覆盖范围块大小、指针长度、各级索引项数先算每块索引项数,再按各级能覆盖的数据块累计容量
偏移定位与访盘次数字节偏移、inode 号、缓存条件字节偏移转逻辑块号,画到目标数据块的路径,逐块检查是否需 I/O
结构选型与文件修改随机读、顺序读、插入、增长按定位成本、搬移和元数据更新比较,结合题目约束选择
位图、链接与删除空间回收、同 inode、目录树分别记录目录项、链接计数、inode 和块的变化;按题设位图约定改位
磁盘调度与时间请求序列、方向、转速、扇区数先排服务次序和磁头路径,再分项累计寻道、旋转和传输时间
格式化与引导操作排序、创建哪类结构区分物理格式化、分区、逻辑格式化和启动加载各自的任务

解题前要弄清的关系

一、按路径名读取文件的一般过程

路径名 → 目录文件(一个个目录项) → inode / FCB → 数据块号 → 数据块

需要读取的盘块才计入访盘;一个目录可能跨多个块,多条元数据也可能位于同一块,已经缓存的块不重复读取。目录项和 inode 的分工见 目录概念、inode 表、文件元信息。

二、物理结构决定「块号从哪来」,也就决定了一切计算

结构块号怎么得到能随机访问吗见
连续分配起始块号 + 逻辑块号能连续分配
链式分配顺着每块末尾的指针走不能链式分配
FAT在内存的表里顺着簇号跳仍需沿 FAT 链查找,但表在内存时不必为每一跳读数据块文件分配表
索引 / 混合索引查索引块能索引分配、混合索引

三、空闲空间管理:重点掌握位图计算

位图一位对应一块,所以「位图占多大」= 块数 ÷ 8 字节,见 位图法。其余三种(空闲表法、空闲链表法、成组链接法)也应理解分配与回收机制,本页重点展开位图题。

四、磁盘是独立的一段:先算距离,再算时间

调度算法只数磁头移动的磁道数,见 机械硬盘调度算法;时间四项齐全,见 磁盘性能指标。CHS 换算属于驱动程序的活,见 CHS 地址。

五、格式化与引导是两串固定顺序

制盘:物理格式化(划分扇区) → 分区 → 逻辑格式化(建引导记录、FAT/inode 区、根目录、数据区) → 装操作系统
引导:ROM 引导程序 → 磁盘引导程序 → 分区引导程序 → 操作系统初始化

见 磁盘格式化、引导流程。

各类题的解法

前四条围着索引和位图转,最后一条的磁盘部分和它们没有关系,按小问挑着用。

先算「一块能放几个地址项」

这个数(记作 N)是索引类题目的全部起点:

N = 块大小 ÷ 地址项长度

2018#46 与 2022#45 都是 4KB ÷ 4B = 1024。反过来问「索引项至少几字节」,就先由 总容量 ÷ 块大小 得块总数 M,再取 ⌈log₂M / 8⌉ 字节;若有保留编码还需计入——2012#46 由此得 4B。

最大文件长度按级数拆开写

最大长度 = (直接项数 + 一级间接项数×N + 二级间接项数×N² + 三级间接项数×N³) × 块大小

分级写、不要合成一个数,2018#46 的答案就写成 32KB + 4MB + 4GB + 4TB。另外两种结构各有自己的算法:

  • 链接分配要扣掉指针:每块可用 块大小 − 指针长度,2014#46 是 1024 − 4 = 1020B,答 4G × 1020B;
  • FAT 表项位宽给出可编码簇号的上限;最大文件还受实际数据簇数、保留编码和文件长度字段约束,而 FAT 自身长度 = 表项数 × 表项字节,两个别混(2016#47)。

问「用到哪几级索引」就把文件块数夹进前缀和之间:2022#45 的 6MB 是 1536 块,10 + 1024 < 1536 < 10 + 1024 + 1024²,所以用到一级和二级。

访盘次数按路径逐层数

先列需要访问的目录、inode、索引和数据块,再结合缓存条件数次数;修改题将读与写分开记录:

场景怎么数出处
连续分配中间插一条记录每搬一条 = 读 1 + 写 1,再加写入新记录 1 次2014#46:29 × 2 + 1 = 59
链接分配中间插一块顺链找到前驱(只读)+ 写新块 1 + 改前驱指针写回 12014#46:29 + 2 = 31
给了字节偏移读一个字节先算逻辑块号,再看它落在第几级索引2026#46:一级间接 1 + 数据块 1 = 2
目录已在内存只数 inode 所在块 + 数据块2022#45:2 块
逻辑块号 = ⌊字节偏移 ÷ 块大小⌋,块内偏移 = 字节偏移 mod 块大小
inode 所在盘块号 = inode 区起始块号 + ⌊inode 号 ÷ (块大小 ÷ inode 大小)⌋

FAT 题还要记住一句:下一簇号存在当前簇号的表项里。2016#47 里簇 106 的号存在 100 号表项中。

删除与回收:分别检查目录项、inode 和块位图

对题设要求递归删除、对象无其他硬链接且不再被打开的场景,按“先删子文件,再删自己”分析。若位图以 1 表示已分配,需要分别处理(2026#46):

  1. 释放它的数据块(间接索引块本身也要释放),在磁盘位示图里清零;
  2. 它的 inode 在 inode 位示图里清零;
  3. 在父目录的数据块里删掉这一条目录项。

位图自身的大小:位图字数 = 块数 ÷ 字长,2010#45 是 16384 ÷ 32 = 512 字 = 2KB,正好装得下。要定位某一块在位图的第几个字第几位,用

所在盘块号 = 起始块号 + ⌊块号 ÷ (每块字节数 × 8)⌋
块内字节号 = ⌊(块号 mod (每块字节数 × 8)) ÷ 8⌋

若要求块内位号,取 块号 mod (每块字节数×8);若已定位字节,要该字节内位号则取 块号 mod 8。两种位号的基准不同,编号起点也要按题设确认。

磁盘时间三段分行写

移动时间 = 移动磁道总数 × 单磁道时间
旋转延迟 = 请求数 × (60 ÷ 转速) ÷ 2
传输时间 = 请求数 × 一转时间 ÷ 每道扇区数

2010#45 的 C-SCAN 走了 170 个磁道,加 4 个请求的 20ms 旋转延迟和 0.4ms 传输,合计 190.4ms。在该题只比较机械寻道优化收益的模型中,换成闪存后可说明:没有寻道和旋转延迟,按磁道距离调度失去原有收益,FCFS 更简单。不能由此推成所有 SSD 场景都应使用 FCFS。

簇号型的调度题要先把当前柱面折算成簇号区间再比距离:2019#44 每柱面 1000 个簇,85 号柱面就是簇 85000~85999。CHS 换算三行:

柱面号 = ⌊簇号 ÷ 每柱面簇数⌋
磁道号 = ⌊(簇号 mod 每柱面簇数) ÷ 每磁道簇数⌋
扇区号 = (柱面内余数 × 每簇扇区数) mod 每磁道扇区数

分配结构选型:按访问方式比较代价

连续分配容易按逻辑块号直接定位,也便于顺序访问,但文件增长可能需要搬移。链式分配便于追加,定位中间块却要沿链寻找;FAT 把链放在表中,表驻内存时减少找链的磁盘 I/O,但没有把链查找变成数组直接索引。索引分配便于定位,代价是索引空间和可能的额外访盘。

插入题先确定移动单位是记录还是整块,再分别列出“查找前驱、搬移旧数据、写新数据、修改元数据”。若允许使用缓存,同一块内的多个修改未必对应多次磁盘写入,应按题设 I/O 模型计数。

硬链接与删除:名字消失不等于数据立即释放

两个目录项指向同一 inode 时,访问的是同一个文件。删除其中一个名字,通常先删目录项并减少链接计数;仍有其他硬链接时,不能把数据块也释放。即使链接计数已为 0,若文件仍被打开,实际回收还可能推迟到最后一次关闭。

因此列修改清单前,要确认题目是否涉及硬链接、打开文件和递归删除,不能对每个目录项都重复释放同一组块。

历年题索引

上面这几条覆盖了绝大多数小问,下面这张表用于按考点选题和对照不同问法。

真题主线这一年特别问了什么
2010#45位图管理 + 磁盘调度2KB 内存能不能管 16384 块;C-SCAN 总时间;闪存该用 FCFS
2011#46物理结构选型 + FCB一次写入不可改,该选哪种结构;FCB 要加什么字段
2012#46索引分配的最大文件长度索引项最少几字节;<起始块号, 块数> 混合结构怎么划分最优
2014#46插入记录的访盘次数插第 30 条各要访盘几次;链接式的最大文件长度
2016#47FAT + 目录文件内容写出目录文件的内容;某簇号存在哪个 FAT 表项里
2018#46混合索引 + inode 数量最大长度的表达式;能存几个 5600B 的文件
2019#44磁盘容量 + SSTF + CHS簇号转 CHS,以及这个转换由谁完成
2021#46引导流程 + 磁盘格式化四个操作的正确顺序;扇区划分和根目录各在哪一步
2022#45目录项 + 硬链接 + 间接索引两个目录项 inode 号相同求块号;6MB 用到哪几级
2026#46inode 定位 + 位示图 + 删目录inode 号推盘块号;删一个目录要改哪些元数据

2021#46 的第 1 问其实是系统引导,2019#44 的第 3 问跨到组成原理的 CHS 与 I/O 软件层次,两处都在上面的框架第四、五条里。

易错清单

  • 链接分配忘了扣指针。每块可用 1020B 而不是 1024B,2014#46 的评分说明写明按 1024 算只给 1 分。
  • 访盘次数把读写混算。搬一条记录是 2 次(读 + 写),顺链查找只算读,改指针写回只算 1 次。
  • FCB 的变化写不全。2014#46 要求同时点名起始块号和文件长度,少写一项不给分。
  • 文件个数只看一个上限。要同时受 inode 总数和数据块数限制、取小者,且文件大小要向上取整成整簇(2018#46)。
  • 索引项字节数和索引项个数弄混。前者由磁盘总块数推出,后者由索引表区大小推出(2012#46)。
  • 两个目录项 inode 号相同还另算一遍块号。那就是硬链接、同一个文件,块号照抄(2022#45)。
  • 位图定位时该要位号却除了 8。除以 8 得到的是字节号。

上一页:进程调度与状态转换;下一页:计算机网络综合题。