跳转至

第 5 章 文件系统

依据:《操作系统概论》(2017 年版)第 5 章、配套自考大纲及附录答案。下文编号指大纲“考核内容与考核要求”;标注“自编”的算例为学习辅助,不是真题。

复习导航:大纲要求与笔记位置

大纲条目 层次 位置 学完应能做到
1 文件概述 识记 第 1 节 说明文件与文件系统的含义、命名规则与逻辑结构
1 文件概述 识记 第 2 节 区分顺序与随机存取,说出常用属性与操作
2.1–2.3 目录、路径与目录操作 识记、领会 第 3 节 区分单层、多级、树形目录,会用绝对与相对路径,说出目录操作
3.1 连续和链接分配 简单应用 第 4 节 由逻辑块定位物理块
3.2 目录、FAT、i 结点 综合应用 第 5 节 按名访问并沿 FAT 链定位簇
3.2 目录、FAT、i 结点 综合应用 第 6 节 比较 CP/M、MS-DOS、UNIX 的目录项结构
3.2 目录、FAT、i 结点 综合应用 第 7 节 按地址结构算出最大文件长度
3.3 空间管理 简单应用 第 8 节 算簇数与末簇碎片,说明空闲链与位图

全章八节按“名字 → 目录 → 盘块 → 空闲空间”展开:第 1–2 节介绍文件逻辑结构、存取方式和基本操作;第 3、6 节讲目录树及 CP/M、MS-DOS、UNIX 的目录项布局;第 4、5、7 节对比连续、盘块内链接、FAT 与 i 结点模型;第 8 节讨论簇大小和空闲空间管理。

本章学习目标

这一章把“用户给个名字、系统找到数据”拆成三段:目录管名字,分配方式管数据块放在哪,i 结点和 FAT 把名字接上数据。

可先对照连续分配、盘块内链接、FAT 和 i 结点模型,分清各自如何定位数据块,再学习按名访问和最大文件长度计算。簇大小与位图部分则侧重空间占用的计算。

1 文件、文件系统与逻辑结构(1,识记)

文件是存储在外存介质上、具有名称的一组相关信息。文件系统由文件、管理文件的软件,以及目录、i 结点、空闲表等管理数据结构共同构成,负责按名存取、外存空间管理、共享与保护。

用户通过文件名访问数据。文件名允许的字符、最大长度、大小写规则及扩展名限制因系统而异,教材以 CP/M、MS-DOS 和 UNIX 作对比。

从应用程序眼里看过去,文件内容有三种逻辑结构:

逻辑结构 含义 示例
无结构字节序列 系统只把文件当成一串无格式字节流,怎么解释归应用程序自己管 UNIX/Windows 普通文本、二进制流文件
固定长度记录序列 按等长记录排列,给出记录号就能直接算出偏移位置 定长表格、学生学籍记录文件
树形结构 每条记录带关键字,按关键字组织成检索树 大型按键检索数据库文件

“无结构流式文件”并非内容没有格式,而是操作系统不解释其内部结构。C 源码、JPEG 图片和可执行程序在 UNIX 中都可视为字节流,由相应软件解析。这里要区分两个维度:逻辑结构描述用户看到的数据组织,第 4 节的物理分配描述数据在磁盘簇上的存放方式。

按内容编码和用途,教材还区分 ASCII 文本文件、二进制文件和可执行文件等。可执行文件头包含代码段、数据段的装入信息;普通二进制文件通常不能直接用文本编辑器正确解读。

2 存取方式、属性和操作(1,识记)

顺序存取按当前读写位置依次处理数据;随机存取(直接存取)允许指定偏移位置读写。例如,定长记录每条长 \(r\) 字节、编号从 0 开始,第 \(k\) 条记录的字节偏移为 \(k \times r\)。能否随机存取取决于系统接口与底层介质,不能仅根据文件扩展名判断。

除文件数据外,系统还要记录文件属性,如文件名或内部标识、类型、长度、所有者、权限及有关时间戳。部分系统把属性放在目录项中,UNIX 则主要由 i 结点保存属性,目录项保留文件名和 i 结点号。

以下文件操作需要按语义区分,尤其注意右列列出的边界:

操作 主要作用 容易混淆的地方
创建 create 登记新文件、建好目录项与元数据 刚创建时可以是 0 字节空文件,未必当场分数据块
删除 delete 释放管理结构并按链接数回收盘块 清空内容(截断为 0)文件还在;删除则连名字带空间一并撤掉
打开 open 按路径找目录项,把文件属性与盘块地址装入内存打开文件表 只装管理信息(属性+地址),不是把整份文件内容读进内存
关闭 close 释放内存打开文件表项,把缓存在内存的元数据刷回磁盘 只是结束本轮访问,不会删掉磁盘上的文件
读 read 按当前读写指针把一段数据拷进用户缓冲区,推进指针 实际读到的字节数可能少于请求数(如撞上文件尾)
写 write/追加 append 在当前指针处改写,或强制跳到文件末尾追加 超出原有簇边界时会触发分配新数据簇
定位 seek 只改写内存打开文件表里的当前读写指针 纯改内存整数,这一步本身不读盘也不写盘
获取/设置属性 读取或修改权限、时间戳等元数据 不碰文件正文数据
重命名 rename 改目录项里的名字字段(或挂到新目录) 数据块原地不动,不用把几 GB 内容搬一遍

open 的作用是按路径查找文件,并在内存中建立后续访问所需的管理信息,包括属性和盘块地址等。之后的 read/write 可利用这些信息定位数据块,无需每次从根目录重新查找。打开文件不等于把文件全部内容读入内存。

3 目录与路径(2.1–2.3,识记、领会)

文件目录把文件名与文件管理信息关联起来,使系统能够按名查找属性和数据块地址。目录本身通常也作为文件存储,内容由多条目录项组成。

目录的组织方式经历了三代演进:

目录结构 特点 局限/用途
单层目录 整块盘就一张扁平目录表,所有文件挤在一层 文件一多查找极慢,而且不同用户、不同用途的文件绝不能重名
两级/多级目录 先按用户分主目录,再往下分子目录 解决了多用户重名冲突,检索范围随之收窄
树形目录 根目录往下任意嵌套子目录与普通文件 靠路径名唯一锁定文件,不同目录下的文件随便重名

树形目录使用两类路径:绝对路径从根目录出发,UNIX 中以 / 开头;相对路径从进程的当前工作目录出发,其中 . 表示当前目录,.. 表示父目录。

自编例:当前工作目录为 /home/student/os,访问 /home/student/material/book.txt 时,可使用相对路径 ../material/book.txt,即先到父目录,再进入 material。调用 chdir 改变工作目录后,同一相对路径的指向可能变化;绝对路径不受工作目录变化影响。

目录操作包括创建、删除、读取和重命名。删除非空目录通常需先清空或递归处理。UNIX 还提供硬链接(link)与解除链接(unlink):目录项保存“文件名+i 结点号”,创建硬链接就是增加一条指向同一个 i 结点号的目录项,并使链接计数加 1;unlink 删除目录项并使链接计数减 1。只要仍有硬链接,文件就可通过其他名字访问;最后一个链接删除后,还需满足文件不再被打开等条件,系统才会回收数据块。

4 文件的物理分配(3.1,简单应用)

查到文件管理信息后,还需把文件内部的逻辑块号 \(0, 1, 2, \dots\) 映射到磁盘物理簇(物理块)。以下比较四种分配模型,可联系第 4 章连续分区、分页和多级页表的组织方式理解。

4.1 连续分配

连续分配让文件占用相邻的磁盘簇,目录项记录起始簇号 \(s\)和文件长度。第 \(j\) 号逻辑块(从 0 编号)对应物理簇 \(s + j\),便于顺序和随机访问。缺点是会产生外部碎片,且创建时不易预估最终长度;若相邻簇已被占用,文件扩展可能需要整体迁移。

自编例:簇大小 \(1\ \text{KB} = 1024\ \text{B}\),某文件起始簇号 40、长 \(2500\ \text{B}\)。共占 \(\lceil 2500 / 1024 \rceil = 3\) 个连续簇,即 40、41、42 号簇。要读文件内字节偏移 2200 处的数据:\(2200 = 2 \times 1024 + 152\),落在第 2 号逻辑块、块内偏移 152,直接去读物理簇 \(40 + 2 = 42\) 的偏移 152 字节处即可;末簇 42 号里闲置了 \(3072 - 2500 = 572\ \text{B}\) 的内部碎片。

4.2 盘块内链接

盘块内链接允许文件使用离散的空闲簇。目录项记录首簇号,每个数据簇保存下一簇的指针,末簇存结束标记,文件扩展时可接入新簇。它没有外部碎片,但随机访问第 \(j\) 块时,需要从首簇读取前面 \(j\) 个数据簇以追踪指针;指针损坏会使后续链条无法访问,且每块可用数据容量不再是完整的 \(2^k\) 字节。

计算容量时应扣除块内指针:物理块长 \(B\) 字节、指针占 \(a\) 字节,则每块净数据容量为 \(B - a\),长度为 \(L\) 的文件需要 \(\lceil L / (B - a) \rceil\) 块。这一扣减仅适用于盘块内隐式链接;FAT 将指针单独存表,不必从数据块中扣去 \(a\),仍可容纳 \(B\) 字节。

4.3 FAT:集中保存簇间链接

文件分配表(FAT)将各数据簇的链接指针集中存入卷首的表中,并按物理簇号索引。在教材的 FAT 驻留内存模型中,目录项提供首簇号,查找第 \(j\) 块时,CPU 沿内存中的 FAT 链前进 \(j\) 次即可定位,无需为读取中间指针逐次访问磁盘。

比较 连续分配 盘块内链接 FAT
数据块位置 必须连续 可离散 可离散
下一个块的位置 首簇号 + 逻辑块号 藏在当前数据块内部 集中在内存 FAT 表的对应下标处
随机定位 \(O(1)\) 直接算出 需从首块依次读取前序数据块 在内存沿链查表,无需逐次读取中间数据块
文件扩展 受邻接空闲簇限制 随时挂新簇 随时挂新簇
主要代价 外部碎片、追加难 随机读极慢、指针占块内空间、怕断链 整张 FAT 表要常驻内存占空间

5 FAT 与按名访问(3.2,综合应用)

教材例中,某文件依次使用簇 4 → 7 → 2 → 10 → 12。FAT 表对应记录为 FAT[4]=7, FAT[7]=2, FAT[2]=10, FAT[10]=12, FAT[12]=EOF(结束标记)。

按文件名查目录 → 拿到首簇号 4
逻辑块 0 → 物理簇 4
逻辑块 1 → 查 FAT[4],得物理簇 7
逻辑块 2 → 查 FAT[7],得物理簇 2
……一路查到表项值为 EOF 为止

下表对应教材图 5-8。注意区分:FAT 的下标是当前簇号,表项的值是下一簇号;读取下一项时,再以该值作为新的下标:

FAT 下标 4 7 2 10 12
表项值 7 2 10 12 EOF

自编例:设簇长 \(1\ \text{KB} = 1024\ \text{B}\),要读上面这个文件字节偏移 3500 处的内容。先算逻辑块号:\(3500 = 3 \times 1024 + 428\),即第 3 号逻辑块、簇内偏移 428。首簇 4 本身就是第 0 号逻辑块,往后跳 3 次链接(4 → 7 → 2 → 10)落到 10 号簇,去读 10 号簇偏移 428 的字节即成。至于最后一个簇(12 号簇)里到底哪几个字节有效,靠目录项里记的“文件总字节长度”卡边界。

若分区有 \(N\) 个数据簇、每个 FAT 表项占 \(a\) 字节,单份表的基本容量为 \(N \times a\) 字节。FAT12 的 12 指表项宽 12 比特(1.5 字节),并非 12 字节;紧凑排列的 \(N\) 项占 \(\lceil 12N / 8 \rceil\) 字节。FAT12/16/32 的位宽限制可编号的簇数,还需扣除保留簇号。单文件长度除受簇数和簇大小限制外,也受长度字段约束,例如 32 位无符号长度字段的上限为 \(4\ \text{GB} - 1\)。

6 CP/M、MS-DOS、UNIX 目录的比较(3.2,综合应用)

教材选用 CP/M、MS-DOS 和 UNIX,对比目录项如何关联文件名、属性与数据块地址:

实现 目录项保存什么 怎样找到文件数据
CP/M 文件名、属性,以及目录项中直接记录的 16 个簇号 读取目录项中的簇号;文件超过 16 簇时,用“范围(extent)”字段续接其他目录项
MS-DOS 32 B 定长目录项:8+3 短文件名、属性、时间、首簇号、文件长度 从目录项取得首簇号,再按 FAT 表项依次查找后续簇
UNIX 目录项只保存文件名+i 结点号 按 i 结点号读取文件的 i 结点,再用其中的直接/间接地址定位盘块

三种目录项的区别在于管理信息放在哪里:CP/M 将地址放在目录项中,大文件可能需要多条目录项;MS-DOS 用全局 FAT 保存簇链,目录项记录首簇号;UNIX 将属性和盘块地址放入每个文件的 i 结点,目录项主要保存“名字 → i 结点号”。因此,多个目录项可以通过同一 i 结点号建立硬链接。

以教材路径 /usr/ast/mbox 为例,从根目录逐级查找。以下按所需目录信息尚未缓存、可以逐项读入的简化过程说明:

  1. 读出固定位置的根目录 / 的 i 结点,拿到根目录的数据块地址。
  2. 读根目录数据块,找到目录项 usr 对应的 i 结点号,再读出 /usr 的 i 结点。
  3. 按 /usr 的 i 结点读取其目录数据块,查出 ast 的 i 结点号,再读出 /usr/ast 的 i 结点。
  4. 读 /usr/ast 的目录数据块,查出目标文件名 mbox 对应的 i 结点号,读入 mbox 的 i 结点。
  5. 将 mbox 的属性与盘块地址登记到内存打开文件表,后续读写直接按 i 结点里的地址项定位数据块。

相对路径的查找过程类似,但从当前工作目录的 i 结点开始。计算磁盘读取次数时,应逐项确认根目录 i 结点、各级目录块和目标 i 结点是否已在缓存中,再累加实际读取次数,不能仅按路径层数套用固定数字。

7 i 结点与最大文件长度(3.2,综合应用)

i 结点大小固定,能够容纳的盘块地址项有限。若全部使用直接地址,支持的文件长度较小;若全部采用多级索引,小文件访问又会增加查表次数。

教材的 UNIX 模型采用混合索引:前若干项为直接地址项,直接指向数据簇;其余分别为一次、二次、三次间接地址项。一次间接通过一层索引簇定位数据,二次和三次间接分别增加到两层、三层。这样既照顾小文件的访问效率,也能覆盖较大的文件。

最大文件长度可由地址结构计算。设簇(块)大小为 \(B\) 字节,每个地址项占 \(a\) 字节,一个索引块可存 \(n = B / a\) 个地址。若 i 结点有 \(d\) 个直接地址项,以及一、二、三次间接地址项各 1 个,理论上可索引的最大数据长度为:

\[ L_{\max} = (d + n + n^{2} + n^{3}) \times B \]

索引簇本身也占用磁盘空间,但保存的是地址而非文件正文。因此,计算最大文件数据长度时,只计数据簇,不计中间索引簇;计算实际磁盘占用时才需计入后者。

7.1 教材综合题:4 KB 簇的 Ext2 地址模型

已知 15 个地址项,每项 4 B;12 个直接项,其余各为一级、二级、三级间接项,簇长 4096 B。

\[ \begin{aligned} n &= 4096 / 4 = 1024\\ \text{直接} &: 12 \times 4\ \text{KB} = 48\ \text{KB}\\ \text{一次} &: 1024 \times 4\ \text{KB} = 4\ \text{MB}\\ \text{二次} &: 1024^{2} \times 4\ \text{KB} = 4\ \text{GB}\\ \text{三次} &: 1024^{3} \times 4\ \text{KB} = 4\ \text{TB}\\ \text{合计} &: 48\ \text{KB} + 4\ \text{MB} + 4\ \text{GB} + 4\ \text{TB} \end{aligned} \]

这一结果与教材附录一致,表示给定地址结构能够覆盖的数据量。实际 Ext2 的单文件限制还可能受到其他字段与实现条件约束。

7.2 自编:判断逻辑块属于哪一层

沿用上例,数据逻辑块从 0 编号:

  • 0–11:直接寻址。
  • 12–1035:一次间接,索引为 j−12。
  • 1036 起的 1024² 块:二次间接。令 r=j−1036,先取 r//1024 对应的一次间接块,再取 r%1024 对应的数据簇。

例如 j=1040,r=4,应取二次间接索引簇的第 0 项,再取下级索引簇的第 4 项。若相关管理信息都不在缓存,且 i 结点已在内存,读这个数据块共需 3 次磁盘块读取:两层索引簇加数据簇本身。

7.3 FAT 与 i 结点:链接分配与混合索引

两者都允许文件的数据块离散存放,但定位方式不同。FAT 是显式链接分配:以当前簇号查表,得到下一簇号。本章 i 结点模型采用混合索引分配:由文件逻辑块号选择直接地址,或逐级查间接索引块。后者查的是索引层次,不是沿“下一块”指针逐块追链。

比较项 FAT i 结点
地址组织 卷内 FAT 表保存各簇的后继簇号;可有备份表 i 结点保存直接地址和间接索引块入口
目录项存什么 文件名、属性、首簇号、长度 文件名 + i 结点号,属性随 i 结点走
最大文件长度怎么算 同时检查可寻址簇范围、文件长度字段及题设上限 一、二、三次间接各 1 项时,地址覆盖上限为 (d + n + n² + n³) × B,n = B/a;实际还受文件系统限制
随机访问代价 从首簇沿链查到目标逻辑块;表在内存时,中途不用逐块读数据盘块 按逻辑块号选择索引项;i 结点已在内存且索引未缓存时,每层间接需读 1 个索引块,最后再读数据块
空间开销 每簇一项,表的大小取决于卷的簇数和表项宽度 每个文件有 i 结点,大文件还需分配间接索引块
适合的场景 簇数可控、要紧凑管理的中小容量卷(教材的 MS-DOS 模型) 文件多、单文件可能很大(教材的 UNIX 模型)

做定位题时,先看目录项给的是首簇号还是 i 结点号。FAT 从首簇沿链找目标;混合索引先由逻辑块号判断落在哪一级。两者都不要求文件的数据块连续,也都不能仅凭逻辑块号加首块号直接得到物理块号。

再将簇长改为 B = 1 KB、地址项改为 a = 4 B,逐层计算。一个索引簇可存 n = 256 个地址;i 结点有 12 个直接项,以及一、二、三次间接项各一个:

\[ \begin{aligned} \text{直接} &: 12 \times 1\ \text{KB} = 12\ \text{KB}\\ \text{一次间接} &: 256 \times 1\ \text{KB} = 256\ \text{KB}\\ \text{二次间接} &: 256^{2} \times 1\ \text{KB} = 65\ 536\ \text{KB} = 64\ \text{MB}\\ \text{三次间接} &: 256^{3} \times 1\ \text{KB} = 16\ 777\ 216\ \text{KB} = 16\ \text{GB} \end{aligned} \]

理论合计为 12 KB + 256 KB + 64 MB + 16 GB。计算时还应检查两点:n = B/a 应按整数地址项计数,不能整除时依题设取整;若题目另给文件长度字段限制,则应取地址结构容量与字段上限的较小值。例如,约 4 GB 的字段上限会限制本例的理论容量,具体最大字节数仍需按字段定义计算。

8 簇大小和空闲空间管理(3.3,简单应用)

分配结构记录各文件占用的簇,空闲空间管理则记录尚未分配的簇,供文件创建、扩展时分配,并在删除后回收。

文件系统分配外存的基本单位是簇(由一个或若干个连续扇区拼成),哪怕文件只写了 1 个字节也得占整整 1 个簇。设文件实际长 \(S\) 字节、每簇长 \(B\) 字节:

\[ \begin{aligned} \text{占用数据簇数} &= \left\lceil S / B \right\rceil\\ \text{实际分配容量} &= \left\lceil S / B \right\rceil \times B\\ \text{末簇内部碎片} &= \text{实际分配容量} - S \end{aligned} \]

簇大小需要权衡:大簇可减少地址项,有利于顺序传输,但小文件较多时,末簇内部碎片会增加;小簇可减少这类浪费,却会增大 FAT 或索引结构,并使大文件包含更多数据块。实际访问成本还取决于这些块的分布。

教材介绍两种空闲簇管理方法:

  • 空闲簇链接表:管理簇保存一组空闲簇号,并用一个槽位指向下一管理簇。教材例中,管理簇为 \(1\ \text{KB}\),簇号为 32 位(\(4\ \text{B}\)),共有 \(1024 / 4 = 256\) 个槽位,扣除链接指针后,可记录 255 个其他空闲簇。管理簇自身也属于空闲空间,最终也可分配使用。
  • 位图(位示图):第 \(k\) 号簇用 1 位表示空闲或占用,0、1 的具体含义依题设约定。位图不保存文件名,也不记录文件的数据块次序。设全盘有 \(N\) 个簇,簇号 \(k\)、字节号和位号均从 0 开始:
\[ \begin{aligned} \text{位图体积} &= N\ \text{位} = \left\lceil N / 8 \right\rceil\ \text{字节}\\ \text{所在字节下标} &= \left\lfloor k / 8 \right\rfloor, \quad \text{字节内位下标} = k \bmod 8 \end{aligned} \]

位图定位前,先确认簇号从 0 还是从 1 开始,以及字节内的位序约定。

自编例:簇号和位号均从 0 开始时,第 19 号簇满足 \(19 = 2 \times 8 + 3\),因此位于第 2 号字节的第 3 位。

再看容量。一块 \(8\ \text{GB}\) 的数据区按 \(4\ \text{KB}\) 分簇,共有 \(2^{21}\) 个簇。位图每簇占 1 位,所需空间为 \(2^{21} / 8 = 2^{18}\ \text{B} = 256\ \text{KB}\)。若每个空闲表或 FAT 表项占 \(4\ \text{B}\),则需 \(8\ \text{MB}\),是位图空间的 32 倍。

9 考核要求

本章大纲分文件概述、目录、文件存储空间管理三部分。第 1–2 节与目录结构(2.1–2.2)要求识记,目录操作(2.3)要求领会,连续与链接分配(3.1)、簇大小与空闲管理(3.3)为简单应用,3.2 目录、FAT 与 i 结点为综合应用。复习时重点追踪按名访问的路径,对照 MS-DOS 的“目录项首簇+FAT 链”和 UNIX 的“目录项 i 结点号+混合索引”,并练习最大文件长度与位图容量计算。

10 教材本章习题

题目取自教材第 5 章“思考题与练习题”(共 10 题),答案取自教材附录“部分习题参考答案”(全部收录)。

10.1 单项选择题

1. 关于文件系统,下列叙述正确的是【 】。

  • A. 文件的集合

  • B. 文件的目录

  • C. 实现文件管理的一组软件

  • D. 文件、管理文件的软件及数据结构的总体

答案与解析

参考答案: D。文件系统包含文件本身、管理文件的软件集合,以及相关的数据结构(如目录、i 结点、空闲表)。A、B、C 各只覆盖其中一部分。

2. 位图可用于管理【 】。

  • A. 文件目录

  • B. 磁盘空间

  • C. 文件的访问

  • D. 文件的保护

答案与解析

参考答案: B。位图以每簇一位记录该簇是否已分配,用于磁盘空间(空闲块)管理。目录管理靠目录结构,访问与保护靠权限位等机制。

3. 从用户角度看,引入文件系统的主要目的是【 】。

  • A. 实现虚拟存储

  • B. 保存系统文档

  • C. 保存用户文档

  • D. 实现对文件的按名存取

答案与解析

参考答案: D。用户只需给出文件名即可访问文件,无须知道它在磁盘上的物理位置。虚拟存储由存储管理完成,保存文档只是文件的用途之一。

10.2 填空题

4. 常用的文件存取方式有两种:顺序存取和___。

答案与解析

参考答案: 随机存取。

5. 在使用文件之前,必须先打开文件。打开文件的目的是将文件的___和___信息装入主存,以便于在对文件的后续访问中能快速存取文件信息。

答案与解析

参考答案: 属性;地址。

6. 目录是文件系统中实现___的重要数据结构。

答案与解析

参考答案: 按名访问。

10.3 简答题

7. 举例说明文件系统是如何实现文件的“按名存取”的?

答案与解析

参考答案: 系统沿路径逐级检索目录,取得目标文件的目录项。若文件采用 FAT,则由目录项中的首簇号沿 FAT 链追出全部数据簇;若采用 i 结点,则由目录项中的 i 结点号读出 i 结点里的直接与间接地址,再定位数据块。整个过程对用户只暴露文件名。

8. 文件系统如何管理空闲磁盘空间?

答案与解析

参考答案: 常用空闲簇链与位图两种方式。前者保存空闲簇号及其链接关系,后者以每簇一位表示占用状态。分配时删除相应的空闲记录或把状态位置为已占用,回收时执行相反操作。

9. 什么是 i 结点?在 i 结点中使用间接地址项有什么好处?

答案与解析

参考答案: i 结点集中保存文件的属性和数据块地址。直接地址便于小文件快速访问;间接地址在 i 结点大小有限的前提下支持大文件,由一级、二级、三级间接项逐层扩展可索引的地址范围。

10.4 综合应用

10. Ext2 文件系统的一个 i 结点包括 15 个地址项,每个地址项存 32 位地址(4 个字节),其中 12 个存直接地址,一个存一次间接地址,一个存二次间接地址,一个存三次间接地址。当簇大小为 4 KB 时,Ext2 能管理的文件的最大长度是多少?

答案与解析

参考答案: 每个簇可存放的簇号个数为 4096 B ÷ 4 B = 1024 个。

地址类型 可寻址空间
12 个直接地址 12 × 4 KB = 48 KB
一次间接 1024 × 4 KB = 4 MB
二次间接 1024 × 1024 × 4 KB = 4 GB
三次间接 1024³ × 4 KB = 4 TB

最大长度 = 48 KB + 4 MB + 4 GB + 4 TB。注意教材所称“4 KB 的簇”,在 Ext2 中即 4 KB 的块。

11 闭卷复习与跨章联系(补充)

一、闭卷自答(合上书逐题口述)

  1. 文件与文件系统各指什么,命名规则、逻辑结构、存取方式与常用操作有哪些?
  2. 单层、多级、树形目录各解决什么问题,绝对路径与相对路径怎么用?
  3. 连续、盘块内链接、FAT 三种分配,各怎么由逻辑块号定位物理簇?
  4. FAT 的下标和表项值各表示什么?CP/M、MS-DOS、UNIX 的目录项各存什么?
  5. i 结点的直接项与三级间接怎么算最大文件长度?
  6. 簇大小怎么影响碎片与开销,空闲簇链与位图怎么算?

二、本章易错

  1. FAT 的下标是当前簇、表项值是下一簇,两者不能互换(第 5 节)。
  2. 一个索引块能容纳的地址项数按完整表项计算:本章算例中 \(n=B/a\) 恰好为整数;不能整除时,若无其他约定则向下取整。若另给文件长度字段限制,还需与地址结构上限比较,取较小值(第 7.3 节)。
  3. 位图不存文件名,也不直接表示每个文件的完整块链(第 8 节)。

三、本章骨架

层次 管什么 所在节
目录 名字到文件,含路径与目录项 第 3、6 节
分配 逻辑块到物理簇:连续、链接、FAT、i 结点 第 4–7 节
空间 簇大小、末簇碎片、空闲链、位图 第 8 节

四、跨章指路

  1. 内存分页将进程的虚拟页映射到物理页框(见第 4 章);FAT 与 i 结点则将文件的逻辑位置映射到磁盘簇。两者都允许底层存储位置不连续,但映射对象和管理结构不同。
  2. 一次文件读写的真实耗时要落到磁盘寻道、旋转与系统缓冲池上(见第 6 章);多个进程并发读写同一文件时的互斥协调,则要用到信号量与读者—写者模型(见第 2 章)。
  3. 见《计算机组成原理》第 5 章:那边讨论虚拟地址到主存物理地址的硬件转换,这边讨论文件逻辑块号到磁盘物理簇的软件映射。