文章目录
- [操作系统 · 文件管理系统性总结](#操作系统 · 文件管理系统性总结)
-
- 1、文件管理
-
- [1.1 逻辑结构:流式文件与记录式文件](#1.1 逻辑结构:流式文件与记录式文件)
- [1.2 物理结构:顺序结构、链式结构、索引结构](#1.2 物理结构:顺序结构、链式结构、索引结构)
-
- [① 顺序结构(连续分配)](#① 顺序结构(连续分配))
- [② 链式结构(链接分配)](#② 链式结构(链接分配))
- [③ 索引结构(索引分配)](#③ 索引结构(索引分配))
- [1.2.1 索引结构分类:直接索引与间接索引](#1.2.1 索引结构分类:直接索引与间接索引)
- [1.3 树形目录结构](#1.3 树形目录结构)
- 2、文件管理空闲存储空间的管理
-
- [2.1 位图示法(Bitmap)](#2.1 位图示法(Bitmap))
- [2.2 链表法(空闲块链)](#2.2 链表法(空闲块链))
- [2.3 索引法(空闲表法)](#2.3 索引法(空闲表法))
- 总结对比表
我来为你系统性地整理文件管理的相关知识,并搜索一些示意图来辅助说明。
以下是操作系统中 文件管理 的系统性图文总结:
操作系统 · 文件管理系统性总结
1、文件管理
1.1 逻辑结构:流式文件与记录式文件
文件的逻辑结构是从用户视角看到的文件组织形式,分为两大类:
| 类型 | 别名 | 特点 | 适用场景 |
|---|---|---|---|
| 流式文件 | 无结构文件 | 由一系列二进制或字符流组成,无记录划分,以字节为单位 | 文本文件、图片、可执行程序 |
| 记录式文件 | 有结构文件 | 由若干条逻辑记录组成,每条记录有固定或可变长度 | 数据库表、日志文件 |
记录式文件可进一步细分:
- 定长记录文件:每条记录长度固定,可通过记录号直接计算偏移量。
- 变长记录文件:每条记录长度可变,需通过指针或长度字段定。
1.2 物理结构:顺序结构、链式结构、索引结构
文件的物理结构是指文件数据在磁盘等存储设备上的实际存放方式。
① 顺序结构(连续分配)
| 项目 | 说明 |
|---|---|
| 原理 | 为文件分配一组连续的物理盘块 |
| 优点 | 存取速度快,支持顺序和随机存取 |
| 缺点 | 易产生外部碎片,文件长度不易动态增长 |
| 适用 | 长度固定的系统文件 |
磁盘块: [文件A][文件A][文件A][空闲][文件B][文件B][空闲][空闲]
↑起始块号 ↑起始块号
长度=3 长度=2
② 链式结构(链接分配)
| 项目 | 说明 |
|---|---|
| 原理 | 文件分散存放在不连续的盘块中,各块通过指针链接 |
| 优点 | 无外部碎片,文件可动态增长 |
| 缺点 | 只能顺序存取,指针占用额外空间,可靠性差(一个块损坏则后续全丢) |
| 变体 | 隐式链接(块内藏指针)→ 显式链接(FAT表集中管理指针) |
磁盘块: [文件A:数据+指向下一块] → [文件A:数据+指向下一块] → [文件A:数据+结束标记]
块号5 块号12 块号8
③ 索引结构(索引分配)
| 项目 | 说明 |
|---|---|
| 原理 | 为每个文件建立一张索引表,记录该文件所有数据块的盘块号 |
| 优点 | 支持直接存取,无外部碎片,文件可动态增长 |
| 缺点 | 索引表本身需占用存储空间,存取需两次磁盘I/O(先读索引表) |
文件控制块(FCB)
┌─────────┐
│ 文件名 │
│ ... │
│ 索引块号 │──→ [索引表: 0→块5, 1→块12, 2→块8, 3→块20]
└─────────┘ ↓
[数据块0] [数据块1] [数据块2] [数据块3]
块5 块12 块8 块20
1.2.1 索引结构分类:直接索引与间接索引
为了支持不同大小的文件,索引结构通常采用混合索引方式,在文件控制块(如UNIX的inode)中设置多个地址项:
| 索引类型 | 说明 | 特点 |
|---|---|---|
| 直接索引 | 地址项直接指向数据盘块 | 访问快,适合小文件 |
| 一级间接索引 | 地址项指向一个索引块,该索引块中存放数据盘块号 | 可指向更多盘块,适合中等文件 |
| 二级间接索引 | 地址项指向一级索引块,一级索引块再指向二级索引块,二级索引块才指向数据盘块 | 可指向海量盘块,适合大文件 |
| 三级间接索引 | 再增加一层索引 | 支持超大文件 |
每多一级间接索引,查询开销变大,可以存储的空间指数增长。
典型混合索引示例(如UNIX inode):
┌─────────────────────────────────────┐
│ 直接索引项 [0] → 数据块 │
│ 直接索引项 [1] → 数据块 │
│ ... │
│ 直接索引项 [9] → 数据块 │ ← 10个直接索引(小文件)
│ 一级间接索引 [10] → 索引块 → 数据块 │ ← 1个一级间接(中等文件)
│ 二级间接索引 [11] → 索引块 → 索引块 → 数据块 │ ← 1个二级间接(大文件)
│ 三级间接索引 [12] → 索引块 → 索引块 → 索引块 → 数据块 │ ← 1个三级间接(超大文件)
└─────────────────────────────────────┘
1.3 树形目录结构
现代操作系统普遍采用树形目录结构(多级目录结构)来组织文件:
┌─────────┐
│ / │ ← 根目录
└────┬────┘
┌──────┬───────┼───────┬──────┐
▼ ▼ ▼ ▼ ▼
┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐
│bin │ │etc │ │home│ │usr │ │var │
└────┘ └────┘ └──┬─┘ └────┘ └────┘
│
┌────┼────┐
▼ ▼ ▼
┌────┐┌────┐┌────┐
│user││user││user│
│ A ││ B ││ C │
└────┘└────┘└────┘
树形目录结构的特点:
| 特性 | 说明 |
|---|---|
| 层次清晰 | 从根目录出发,形成一棵倒立的树,每个目录可包含子目录和文件 |
| 路径唯一 | 每个文件都有唯一的绝对路径(如 /home/user/file.txt) |
| 便于管理 | 不同用户、不同用途的文件可分类存放 |
| 支持共享 | 可通过链接(硬链接/软链接)实现文件共享 |
| 检索高效 | 从根或当前目录出发逐级查找 |
2、文件管理空闲存储空间的管理
为了记录磁盘上哪些盘块是空闲的、哪些已被占用,操作系统需要维护空闲空间管理表。常用方法有三种:
2.1 位图示法(Bitmap)
| 项目 | 说明 |
|---|---|
| 原理 | 用一串二进制位表示磁盘块的使用状态:1表示已分配,0表示空闲(或相反) |
| 优点 | 占用空间小,易于找到连续的空闲块,可常驻内存 |
| 缺点 | 磁盘容量大时,位图本身也较大 |
示例:假设磁盘有16个块,位图如下:
磁盘块号: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
位图: 1 1 0 0 1 0 0 0 1 1 0 0 0 1 0 0
↑已分配 ↑空闲 ↑已分配 ↑空闲
- 块0、1、4、8、9、13 已分配
- 块2、3、5、6、7、10、11、12、14、15 空闲
2.2 链表法(空闲块链)
| 项目 | 说明 |
|---|---|
| 原理 | 将所有空闲盘块用指针链接成一条链,系统保存链头指针 |
| 优点 | 实现简单,空闲块分配和回收只需修改指针 |
| 缺点 | 分配和回收需多次I/O操作,效率较低;大量离散小块时链很长 |
| 改进 | 成组链接法(UNIX采用):将空闲块分组,每组用一块记录下一组的块号 |
空闲块链表示意:
系统保存链头指针 ──→ [空闲块5] → [空闲块2] → [空闲块9] → [空闲块7] → NULL
↓ ↓ ↓ ↓
数据区 数据区 数据区 数据区
成组链接法(链表法的优化):
┌─────────────────┐
│ 超级块中的空闲栈 │
│ [100, 99, 98...] │ ← 记录一组空闲块号
└────────┬────────┘
│
▼
┌─────────────────┐ ┌─────────────────┐
│ 空闲块100 │────→│ 下一组空闲块号 │
│ [数据区...] │ │ [50, 49, 48...] │
└─────────────────┘ └────────┬────────┘
│
▼
┌─────────────────┐
│ 空闲块50 │────→ ...
│ [数据区...] │
└─────────────────┘
2.3 索引法(空闲表法)
| 项目 | 说明 |
|---|---|
| 原理 | 建立一张空闲表,每个表项记录一组连续空闲块的起始块号和块数 |
| 优点 | 适合连续分配,可快速找到足够大的连续空间 |
| 缺点 | 表的大小难以确定,可能产生表溢出或空间浪费 |
| 适用 | 与顺序结构(连续分配)配合使用 |
空闲表示例:
| 序号 | 第一个空闲块号 | 空闲块个数 |
|---|---|---|
| 1 | 2 | 3 |
| 2 | 8 | 3 |
| 3 | 13 | 2 |
| 4 | ... | ... |
磁盘块: [1][2][3][4][5][6][7][8][9][10][11][12][13][14][15]
└─空闲─┘ └─空闲──┘ └─空闲─┘
已分配 已分配 已分配 已分配
总结对比表
| 维度 | 分类/方法 | 核心思想 | 主要优缺点 |
|---|---|---|---|
| 逻辑结构 | 流式文件 | 无记录划分的字节流 | 简单通用,但不利于结构化查询 |
| 记录式文件 | 由定长/变长记录组成 | 结构化强,变长记录存取复杂 | |
| 物理结构 | 顺序结构 | 连续盘块存放 | 快但有碎片 |
| 链式结构 | 指针链接离散盘块 | 灵活但只能顺序存取 | |
| 索引结构 | 索引表映射逻辑块→物理块 | 支持随机存取,需额外索引空间 | |
| 索引分类 | 直接索引 | 直接指向数据块 | 快,适合小文件 |
| 间接索引 | 通过多级索引块指向数据 | 容量大,适合大文件 | |
| 目录结构 | 树形目录 | 根→子目录→文件的层次树 | 层次清晰、路径唯一、便于管理 |
| 空闲管理 | 位图示法 | 二进制位标记块状态 | 省空间、易找连续块 |
| 链表法 | 空闲块链式链接 | 简单但I/O多 | |
| 索引法 | 空闲表记录连续空闲区 | 适合连续分配,表大小难定 |