Skip to content

408

操作系统

OS-04-08 文件系统全局结构与空闲空间管理


一、定位信息

  • 所属圈层:核心层
  • 前置知识回顾:理解磁盘的基本结构(磁道、扇区、磁盘块),了解文件的物理结构(连续/链接/索引分配),知道inode和数据块的概念。
  • 知识网络位置:本单元从宏观视角描述文件系统在磁盘上的整体布局,是理解文件系统如何组织和管理磁盘空间的关键。空闲空间管理直接影响文件创建和扩展的效率。
  • 考点热度等级M级(中频常考)——磁盘分区结构和空闲空间管理方法是选择题常见考点。

二、知识点讲解

2.1 文件系统全局结构

一个典型的文件系统在磁盘上的布局(以Unix/Linux的ext系列为例):

┌──────────┬──────────┬──────────┬──────────┬──────────┐
│ 引导块   │ 超级块   │ inode区  │ 数据块区 │ ...      │
│ (Boot)   │ (Super)  │ (inodes) │ (Data)   │          │
└──────────┴──────────┴──────────┴──────────┴──────────┘
  • 引导块(Boot Block):磁盘的第一个块,包含引导操作系统的代码。即使该分区不用于引导,也保留此块。
  • 超级块(Super Block):存储文件系统的元信息——块大小、inode总数、数据块总数、空闲块数量、空闲inode数量等。系统启动时读入内存。
  • inode区:存储所有inode的区域。每个inode大小固定(如128字节或256字节),按编号排列。
  • 数据块区:存储文件实际数据的区域。

2.2 空闲空间管理方法

空闲表法(空闲区表)

维护一张空闲区表,每项记录一个连续空闲区的起始块号和长度。类似于内存管理中的动态分区分配。

  • 适合连续分配方式
  • 空闲区合并方便
  • 表本身占用空间

空闲链表法

将所有空闲磁盘块用指针链接成一条链表。

  • 实现简单
  • 释放块时插入链头,分配时从链头取
  • 链表本身占用磁盘空间(每个空闲块需要一个指针)
  • 效率较低(大文件分配需要多次操作)

位示图法(Bitmap)

用一个二进制位图表示所有磁盘块的状态。每一位对应一个磁盘块:0 = 空闲,1 = 已分配(或反之)。

  • 查找空闲块:扫描位图找0
  • 释放块:将对应位设为0
  • 空间开销小(每块只需1位)
  • 最常用的方法(Unix/Linux的ext系列、NTFS等)

例如:磁盘有16个块,位图 = 1110011010011010,表示块0、1、2、5、6、8、11、12、14已分配,块3、4、7、9、10、13、15空闲。

成组链接法

成组链接法是Unix系统使用的方法。将空闲块分组,每组的第一个块记录下一组的空闲块号,形成链式结构。内存中维护一个栈,保存当前组的空闲块号。

  • 分配:从栈中取块号,栈空时从磁盘读入下一组
  • 释放:将块号压入栈,栈满时将整组写入新释放的块

三、记忆与理解辅助

1. 类比记忆

  • 空闲表法 = 酒店空房登记表(记录哪些房间空闲)
  • 空闲链表法 = 空房间串成一串(每个空房间门上贴着下一个空房间号)
  • 位示图法 = 房间状态看板(每个房间一盏灯,亮=有人,灭=空闲)
  • 成组链接法 = 分组管理(每组有一个组长,组长知道下一组在哪)

2. 口诀:"空闲表法像分区,链表法简单效率低;位示图最常用,成组链接Unix系。"

3. 四种空闲空间管理方法对比表(★高频考点)

对比项空闲表法空闲链表法位示图法成组链接法
数据结构表(起始块号+长度)链表位图分组链+栈
空间开销大(每块一个指针)小(每块1位)
分配效率高(扫描位图)
释放效率高(合并空闲区)高(插入链头)高(置0)
适合分配方式连续分配链接/索引分配任何任何
典型应用早期系统早期系统ext系列、NTFSUnix

4. 文件系统层次结构

用户/应用程序

文件系统接口(open/read/write/close)

逻辑文件系统(目录管理、FCB管理)

文件组织模块(逻辑块→物理块映射)

基础文件系统(磁盘块读写)

设备驱动程序(磁盘硬件控制)

四、例题与精解

例题1(基础巩固)

题目:某磁盘有 10241024 个磁盘块,采用位示图法管理空闲空间。 (1)位示图需要多少字节? (2)若位示图为 11111111 11111111 11111111 11111111 ...(前32位全为1),表示什么含义? (3)如何快速找到第一个空闲块?

命题意图:考查位示图法的基本计算和使用。

精解

1. 审题分析:1024个块,每块对应1位,需要计算位示图大小。

2. 解题思路:位示图大小 = 块数 / 8(字节)。

3. 完整步骤

(1)位示图大小 = 1024/8=1281024 / 8 = 128 字节

(2)前32位全为1表示:前32个磁盘块(块0~块31)都已分配

(3)快速找到第一个空闲块的方法:

  • 以字(32位或64位)为单位扫描位示图
  • 找到第一个不全为1的字
  • 在该字中找到第一个为0的位
  • 该位对应的块号即为第一个空闲块
  • 可以用位运算加速:~word & (word + 1) 快速定位最低位的0

4. 方法反思:位示图法的优势在于空间效率高(每块只需1位)且查找效率高(可以按字扫描)。实际系统中还会维护一个"提示指针",记录上次扫描到的位置,避免每次都从头扫描。

例题2(中等提升)

题目:某Unix文件系统采用成组链接法管理空闲块,磁盘块大小为 4KB4\text{KB},块号占 44 字节。每组最多记录 10231023 个空闲块号(第一个位置存储下一组的块号)。当前内存中的空闲栈有 100100 个空闲块号。问: (1)一个磁盘块最多能存储多少个块号? (2)当内存中的空闲栈用完后,会发生什么? (3)当释放一个块时,如果内存中的栈已满,会发生什么?

命题意图:考查成组链接法的工作机制。

精解

1. 审题分析:需要理解成组链接法的分配和释放过程。

2. 解题思路:分析栈的使用和磁盘块的读写时机。

3. 完整步骤

(1)每个磁盘块可存储块号数 = 4096/4=10244096 / 4 = 1024 个。其中第一个位置存储下一组的块号,所以每组最多 10231023 个空闲块号。

(2)内存中的空闲栈用完后:

  • 读取栈底记录的"下一组块号"
  • 将该磁盘块的内容读入内存,作为新的空闲栈
  • 该磁盘块本身被"消耗"(因为它原来是空闲块组的索引块)
  • 如果下一组块号为0或特殊标记,表示没有更多空闲块,磁盘已满

(3)释放块时栈已满:

  • 将内存栈中的所有块号写入新释放的磁盘块中
  • 该磁盘块成为新的"组索引块"
  • 将新释放的块号作为栈底的"下一组块号"
  • 清空内存栈,将新释放的块号压入栈

4. 方法反思:成组链接法是Unix系统中经典的空闲空间管理方法。它将多个空闲块号打包存储,减少了磁盘访问次数。分配时"消耗"组索引块,释放时"创建"新的组索引块,形成动态的链式管理。


五、考情分析

  • 考查频次:文件系统全局结构和空闲空间管理在近5年真题中出现约2-3次。
  • 常见题型:选择题(位示图计算、空闲管理方法比较)、综合题(文件系统整体设计)。
  • 分值占比:选择题2分,综合题3-5分。
  • 命题趋势:位示图的计算和成组链接法的工作原理是常见考点。基于大纲与命题规律推测

六、易错点提醒

  1. 错误表现:位示图计算时混淆"位"和"字节"。 错误原因:单位换算错误。 正确理解/做法:每块对应1(bit),8位 = 1字节。位示图大小 = 块数 / 8 字节。

  2. 错误表现:认为位示图中1一定表示"已分配"。 错误原因:对位示图的约定理解不全面。 正确理解/做法:1可以表示"已分配"或"空闲",取决于系统约定。考试中需要根据题目说明判断。通常约定1=已分配,0=空闲。

  3. 错误表现:成组链接法中,认为每组的块号数量等于磁盘块大小 / 块号大小。 错误原因:忽略了第一个位置用于存储下一组的块号。 正确理解/做法:每组最多记录 N1N-1 个空闲块号(NN = 磁盘块大小 / 块号大小),因为第一个位置存储下一组的块号。


七、来源标注

  • 依据2026考研统考408大纲
  • 依据《操作系统概念》(Operating System Concepts, Silberschatz)第11章
  • 依据汤小丹《计算机操作系统》第4版第4章

考研全科复习资料 - 基于2026考研统考大纲