文件逻辑结构、物理结构与磁盘空闲存储空间管理

前言

本章核心分为两大模块:

1.文件逻辑结构 :站用户视角,描述文件数据、记录的组织形式;

2.文件物理结构 :站操作系统视角,描述文件数据在磁盘上的存储分配方式;

3.磁盘空闲存储空间管理 :操作系统对磁盘空闲盘块的四种管理方案(考试高频考点)。

重点区分易混淆概念:逻辑层的链式/索引结构、物理层的链接/索引分配;所有存储管理方法均围绕数据结构、盘块分配、盘块回收三个维度学习。

第一部分 文件逻辑结构 与 物理结构 辨析

一、基础认知

1.文件逻辑结构

面向用户/应用程序,是用户感知到的文件组织形式。用户只需操作逻辑地址,无需关心数据在磁盘的真实位置。

分类:无结构文件(流式文件)、有结构文件(记录式文件)。

2.文件物理结构(文件分配方式)

面向操作系统,操作系统将文件拆分为等大逻辑块,再映射到磁盘物理块,负责逻辑块 → 物理块的地址转换。

三大分配方式:连续分配、链接分配、索引分配(此前已学)。

3.核心关系

用户只操作逻辑地址;操作系统自动完成「逻辑地址 → 逻辑块号+块内偏移 → 物理块号」转换,两层结构相互独立。

二、无结构文件(流式文件)

1.定义

文件由一串连续字符/二进制流组成,无独立"记录"概念,是最通用的文件类型(如 .txt 文本文件)。

2. C 语言实操示例(理解逻辑地址)

(1)写入文件

使用 fopen / fputs / fclose 向 test.txt 循环写入 10000 个 Hello World。

•文件在用户视角:字符连续排列,占用连续逻辑地址空间;

•每个字符占 1 字节,可通过字节偏移定位任意字符。

(2)随机读取

使用 fseek(移动文件读写指针)+ fgetc(读取单个字符):

•fseek 依据逻辑字节偏移定位,无需关心磁盘物理位置;

•底层由操作系统将逻辑偏移转为逻辑块、再转为物理块,完成读写。

3. 底层存储

操作系统会把整个文件按磁盘块大小(如1KB) 切分为多个逻辑块,再使用连续/链接/索引任意一种物理方式存到磁盘,用户完全感知不到。

三、有结构文件(记录式文件)

1.定义

文件由多条固定/变长记录组成,一条记录对应一组关联数据(如学生信息、员工信息),常见分类:顺序文件、索引文件、索引顺序文件。

2. 顺序文件

逻辑上记录按顺序排列,分为顺序存储和链式存储两种实现,属于用户层面的逻辑组织。

(1)顺序存储(逻辑层)

•特点:所有记录在逻辑空间连续存放,每条记录大小固定;

•访问:通过「记录序号 × 记录大小」计算逻辑地址,支持随机访问;

•示例:定义学生结构体(学号、姓名、专业),批量写入文件,读取第 N 条记录可直接计算偏移。

(2)链式存储(逻辑层,高频易混点)

•实现:在每条记录中增加 next 指针字段,指向下一条记录的逻辑位置;

•特点:记录逻辑顺序由指针串联,物理逻辑空间可以不连续;

•访问:仅支持顺序访问,查找目标记录必须从头逐个遍历。

🔔 重点区分:逻辑层链式存储 VS 物理层链接分配

1.逻辑层链式:用户/程序维护指针,串联文件内部的记录,属于文件内容组织;

2.物理层链接分配:操作系统维护指针,串联磁盘上的逻辑块/物理块,属于磁盘存储组织;

3.二者层级不同,互不干扰。

4.例:一个逻辑链式的顺序文件,操作系统依然可以用连续、链接、索引任意物理方式存储。

3. 索引文件(逻辑层,高频易混点)

1.实现方式

  1. 文件分为两部分:索引区 + 数据区;
  2. 索引区:存放索引项,每条索引记录「关键字(如学号)→ 记录逻辑地址」;
  3. 数据区:存放所有业务记录。

2. 访问流程

先读取索引区,通过关键字查找对应索引项,得到记录逻辑地址,再读取数据区记录。

🔔 重点区分:逻辑索引文件 VS 物理索引分配

1.逻辑索引文件:用户/程序自建索引,映射「记录关键字 → 记录逻辑地址」;

2.物理索引分配:操作系统自建索引,映射「逻辑块号 → 物理块号」;

3.两个索引分属不同层级,功能、维护主体完全不同。

  1. 索引顺序文件

结合顺序文件与索引文件的优点,先对记录分组,为每组建立索引,兼顾查找效率与存储效率(了解即可)。

四、逻辑结构 & 物理结构 核心总结

1.视角不同

○逻辑结构:用户视角,组织文件/记录,操作逻辑地址;

○物理结构:操作系统视角,管理磁盘块,负责逻辑块到物理块的映射。

2.独立性

用户选择的逻辑组织形式,不会限制操作系统的物理分配方式,组合灵活。

3.易混概念对照表

第二部分 磁盘空闲存储空间管理

一、前置概念:磁盘存储空间划分

1.文件卷(逻辑卷/逻辑盘)

•日常所说 C 盘、D 盘、E 盘,就是文件卷;

•两种组合形式:

a.一个物理磁盘 → 多个文件(Windows 常规分区);

b.多个物理磁盘 → 一个文件卷(大型服务器/存储系统)。

2. 文件卷分区

每个文件卷会被划分为 目录区 和 文件区:

1.目录区

存放:文件目录项(FC)、索引节点、磁盘空闲管理的数据结构(空闲表、位示图、超级块等);

作用:系统管理核心区域,用户无权限修改。

2.文件区

专门存放用户的普通文件数据(磁盘物理块主体)。

3. 学习通用思路

以下四种空闲盘块管理方法,统一从 ①数据结构 ②盘块分配 ③盘块回收 三个维度掌握。

二、方法一:空闲表法

1.数据结构

借鉴内存动态分区空闲表,用一张表格记录所有连续空闲盘区。

•表项字段:起始盘块号、空闲盘块数量;

•每一行代表一段连续的空闲磁盘块。

2. 盘块分配

  1. 适用场景:优先配合连续分配的文件物理结构(要求连续空间);
  2. 分配算法(同内存分区):
    ○首次适应:从表头开始,找到第一个满足大小的空闲区;
    ○最佳适应:选择大小最匹配的空闲区;
    ○最坏适应:选择最大的空闲区。
  3. 分配流程:从选中空闲区中截取所需盘块,修改表项的起始块和剩余数量。

3. 盘块回收

删除文件、释放盘块时,需要判断回收区与原有空闲区的相邻关系,共 4 种情况:

  1. 回收区上下均无空闲区:新增一条空闲表项;
  2. 回收区上下都是空闲区:合并三个区域,表项总数 -1;
  3. 回收区上方相邻空闲区:合并,表项数量不变;
  4. 回收区下方相邻空闲区:合并,表项数量不变。

4. 优缺点

•优点:结构简单,连续分配场景效率高;

•缺点:大量碎片化空闲块会导致空闲表庞大,大型系统不适用。

三、方法二:空闲链表法

以链表形式串联所有空闲盘块,分为两类:空闲盘块链、空闲盘区链。

(一)空闲盘块链

1.数据结构

以单个磁盘块为链表节点,每个空闲块内存储「下一个空闲块指针」,系统维护链头、链尾指针。

2. 盘块分配

从链头依次摘下所需数量的盘块,更新链头指针。

3. 盘块回收

将回收盘块挂载到链尾,更新链尾指针。

4. 适用场景

适配离散分配的文件物理结构;缺点:分配多块时需要多次操作,效率低。

(二)空闲盘区链

1.数据结构

以连续空闲盘区为链表节点(一个节点 = 多个连续空闲块);

每个节点记录:盘区总长度、下一个盘区指针。

2. 盘块分配

1.可使用首次/最佳/最坏适应算法查找合适盘区;

2.支持分配连续块、也可拆分多个盘区组合分配。

3. 盘块回收

和空闲表逻辑一致,优先判断相邻空闲区,合并相邻盘区后再挂载到链表尾部。

4. 优缺点

•优点:分配连续空间效率远高于空闲盘块链,连续/离散分配都支持;

•缺点:链表过长时检索效率下降。

四、方法三:位示图法(考试最高频考点)

1.数据结构

用二进制位表示单个磁盘块状态:

•0:磁盘块空闲;

•1:磁盘块已分配;

所有二进制位按字分组(如一个字占 16/32 位),形成二维位示图。

2. 核心换算公式(必考)

设定:N = 单个字的位数;

区分前提:盘块号、字号、位号 从 0 开始 / 从 1 开始(做题优先看题干)。

(1)字号(i) + 位号(j) → 盘块号(b)

•从 0 开始:b = i × N + j

•从 1 开始:b = (i-1) × N + (j-1) + 1

(2)盘块号(b) → 字号(i) + 位号(j)

•从 0 开始:

i = b / N(整除),j = b % N(取余)

•从 1 开始:

i = (b-1) / N + 1,j = (b-1) % N + 1

3. 盘块分配

  1. 顺序扫描位示图,找到值为 0 的二进制位;
  2. 根据字号、位号计算对应盘块号;
  3. 将该位改为 1(标记为已分配)。

4. 盘块回收

  1. 根据回收盘块号,反推对应的字号、位号;
  2. 将该二进制位改为 0(标记为空闲)。

5. 特点

  1. 占用空间极小,查询速度快;
  2. 连续、离散分配均适用;
  3. 是各类考试选择题、计算题重点。

五、方法四:成组链接法(Unix 系统专用)

1.适用场景

专为大型文件系统设计,解决空闲表、空闲链表过长的问题,Unix/Linux 主流方案。

2. 数据结构

  1. 超级块:存放在文件卷目录区,系统启动后常驻内存;
    作用:记录当前组空闲块总数 + 本组所有盘块号,作为分组链表的头部。
  2. 分组规则:
    ○将所有空闲盘块分组管理,每组有最大块数上限(例:每组最多 100 块);
    ○每组的第一个盘块,记录下一组的块数 + 下一组所有盘块号,组与组之间链式衔接;
    ○最后一组标记特殊值(如 -1),表示链表结束。
  3. 补充:各组盘块不要求连续。

3. 盘块分配流程

  1. 优先读取内存中的超级块,判断当前组空闲块是否满足需求;
  2. 普通分配(组内块充足):取出组内末尾盘块,组计数减 1;
  3. 整组分配(当前组全部分配):
    先将下一组的信息复制到超级块(保留链表头部),再分配当前整组盘块。

4. 盘块回收流程

  1. 若当前分组未满:直接将回收盘块加入本组,组计数 +1;
  2. 若当前分组已满:
    将当前超级块内容写入新回收盘(作为新分组的链接信息),更新超级指向该新分组。

5. 优缺点

•优点:分组管理,内存开销小、读写磁盘次数少,大型系统性能优异;

•缺点:逻辑复杂,计算题考察较少,以概念理解为主。

第三部分 全章节总复习&考点梳理

一、逻辑结构 考点总结

1.两大视角区分:用户(逻辑)、操作系统(物理);

2.无结构文件:流式字符,fseek 按字节偏移访问;

3.有结构文件:顺序文件、索引文件;

4.重中之重:逻辑链式/索引 ≠ 物理链接/索引,层级不同,不可混淆。

二、空闲盘块四大管理方法对比

三、高频考试题型

1.概念辨析:逻辑/物理层的链式、索引区别;

2.计算题:位示图「盘块号、字号、位号」相互转换(重中之重);

3.分析题:空闲表、空闲链表的分配/回收规则;

4.简答题:四种空闲管理方法的特点、适用场景。

相关推荐
CIO_Alliance1 小时前
AI基础系列(1)| 向量、矩阵、张量在AI中分别扮演什么角色?
大数据·人工智能·线性代数·ai·矩阵·企业cio联盟·企业级ai化转型
doitnow20002 小时前
2026淘宝运营机构课程体系怎么比较?
大数据·人工智能
小此方2 小时前
Re:Linux系统篇(五十七)线程篇 · 十:基于环形缓冲的生产者消费者模型与信号量
linux·运维·驱动开发
长谷深风1113 小时前
AI工作流编排的三大关键问题
大数据·热门·ai agent·ai智能体·自主决策·agent设计·clarify机制
fanged3 小时前
Linux的DD命令
linux·运维·服务器
roman_日积跬步-终至千里3 小时前
【资源控制】自助查询的智能路由
java·大数据·数据库
名不经传的养虾人3 小时前
从0到1:企业级AI项目迭代日记 Vol.87|记忆链路切换了,系统接管有了质量门
大数据·人工智能·ai编程·企业ai·多agent协作
GlobalInfo3 小时前
2026年显微外科手术机器人系统市场报告:市场规模、产业研究、十五五规划与发展趋势预测
大数据·人工智能·机器人
Htr_3 小时前
Outcome 核心概念与实战应用指南
大数据·hadoop·apache