文件管理
下面是一篇可以直接当复习博客看的版本。
操作系统文件系统知识点串讲
文件系统要解决的核心问题是:用户看到的是“文件名和目录”,而磁盘上实际存的是“块”。因此,操作系统必须维护一套结构,把文件名、权限、位置、空闲空间、访问顺序等信息组织起来。
一、FCB:文件控制块
FCB,即 File Control Block,文件控制块,是操作系统用来描述一个文件的数据结构。它记录文件的管理信息,例如:
- 文件名或文件标识
- 文件属主、用户名
- 文件访问权限或口令
- 文件创建、修改、访问时间
- 文件长度
- 文件在磁盘上的存储位置
注意,文件分配表 FAT 不属于某个文件自己的 FCB。FAT 是文件系统级别的数据结构,用来记录整个磁盘块或簇的分配关系。
一句话记:
FCB 描述“某个文件”;文件分配表描述“磁盘空间怎么分配”。
二、open() 操作到底做什么
很多人容易把 open() 和 read() 混在一起。
open() 的目的不是把文件内容读入内存,而是:
- 根据路径名查目录;
- 找到对应的 FCB 或 inode;
- 把文件控制信息调入内存;
- 建立打开文件表项;
- 返回文件描述符或文件句柄。
真正读文件内容的是 read()。
所以:
open()打开的是文件控制信息;read()才读取文件内容。
三、磁盘空闲空间管理:位示图
文件创建、扩展、删除时,都涉及磁盘空间的分配和回收。操作系统常见的空闲空间管理方法有:
- 位示图
- 空闲块表
- 空闲块链
- 成组链接法
其中位示图最常考。它用一位表示一个磁盘块是否空闲,例如:
0 表示空闲
1 表示已分配
分配或回收磁盘块时,本质上就是修改位示图中的对应位。
四、文件逻辑结构
文件逻辑结构是用户看到的文件组织方式,常见有两类:
1. 流式文件
文件被看作一串连续字符或字节,没有明显记录结构。
典型例子:
.c 源程序文件
.txt 文本文件
所以源程序文件通常是:
一组无结构的字符流
2. 记录式文件
文件由一条条记录组成,例如学生信息表、工资表。记录式文件又可以分为:
- 定长记录
- 不定长记录
- 有序记录
- 无序记录
五、文件物理结构
文件物理结构指文件在磁盘块上的实际存放方式。
1. 顺序结构 / 连续分配
文件占用一组连续磁盘块。
优点:
- 顺序访问速度快
- 随机访问也方便
- 适合磁盘、光盘、磁带、磁盘阵列等设备上的连续读写
缺点:
- 容易产生外部碎片
- 文件增长不方便
2. 链接结构
文件块可以分散存放,每个块保存下一个块的位置。
优点:
- 没有外部碎片
- 文件容易增长
缺点:
- 随机访问慢
- 指针损坏会影响后续块
3. 索引结构
为文件建立索引块,索引块中保存文件各数据块地址。
优点:
- 支持随机访问
- 不要求连续存放
缺点:
- 索引块本身占空间
- 大文件需要多级索引
六、记录成组与磁盘利用率
如果一个文件有 100 条逻辑记录,每条 80 字符,磁盘块 1024 字符。
如果不采用成组操作,一条逻辑记录单独占一个物理块:
实际数据量 = 100 × 80 = 8000 字符
分配空间 = 100 × 1024 = 102400 字符
利用率 = 8000 / 102400 ≈ 8%
如果采用成组操作,多条记录可以放进同一块,磁盘利用率会大大提高。
口诀:
不成组:一条记录占一块,浪费大。
成组:多条记录合一块,利用率高。
七、UNIX inode 与多级索引
UNIX 文件系统中,目录项通常保存:
文件名 + inode 号
真正的文件属性和数据块地址保存在 inode 中。
假设:
- 磁盘块大小 512B
- 一个物理块号 16 位,也就是 2B
- 一个索引块能保存:
512 / 2 = 256 个地址
如果 inode 中有:
- 10 个直接地址
- 1 个一级索引
- 1 个二级索引
- 1 个三级索引
那么最大文件块数为:
10 + 256 + 256^2 + 256^3
通用公式:
每个索引块地址数 = 块大小 / 地址大小
八、目录项分解法
传统目录项如果直接存完整 FCB,目录文件会很大,查找时访盘次数多。
目录项分解法把 FCB 拆成两部分:
- 第一部分:文件名 + 文件内部号,用于目录查找
- 第二部分:文件其他属性信息
这样目录文件变小,查找更快。
例如目录有 256 个 FCB,分解后第一部分每项 10B,磁盘块 1024B:
目录第一部分大小 = 256 × 10 = 2560B
占用磁盘块数 = ceil(2560 / 1024) = 3 块
平均查找访盘次数 ≈ (1 + 3) / 2 = 2 次
找到后还要读取第二部分:
总平均访盘次数 = 2 + 1 = 3 次
九、UNIX 路径查找与读文件访盘
路径 /usr/ast/mbox 的查找过程是逐级进行的:
- 在根目录中找
usr - 读
usr的 inode - 读
/usr目录内容,找ast - 读
ast的 inode - 读
/usr/ast目录内容,找mbox - 读
mbox的 inode - 根据 inode 读取文件数据块
读文件内容时,数据块数通常按:
ceil(文件大小 / 磁盘块大小)
计算。比如 2080B 文件、块大小 1024B,严格来说需要 3 个数据块。
十、磁盘调度:SCAN 电梯算法
SCAN 算法也叫电梯算法。
规则是:
磁头沿当前方向移动,服务该方向上的请求;到达边界或该方向无请求后,再反向服务另一侧请求。
例如当前磁道 107,当前方向是向小磁道号移动,请求中小于 107 的先按降序访问:
90, 86, 77, 65, 42, 27, 19, 4
然后反向访问大于 107 的:
134, 142, 151, 167, 174, 179, 190
考试时注意两个坑:
- 先看当前移动方向;
- 如果请求中包含当前磁道,通常可立即处理,有些题库会按自己的序列口径放置。
十一、RAID 基础
RAID 是多磁盘组织技术,用来提高性能或可靠性。
常见类型:
RAID 0:条带化,无冗余,速度快
RAID 1:镜像,有冗余,可靠性高
RAID 5:条带化 + 分布式奇偶校验
RAID 6:双重奇偶校验,容错更强
题目中如果出现:
数据以条、带方式同时存入一组并联磁盘,提高读写速度
对应的就是 RAID 0。
十二、UNIX 文件权限
UNIX 权限通常写成三位八进制数,例如:
511
三位分别表示:
属主权限 / 同组用户权限 / 其他用户权限
权限值含义:
r = 4
w = 2
x = 1
所以:
5 = 4 + 1 = r-x
1 = --x
1 = --x
511 表示:
属主:可读、可执行
同组用户:可执行
其他用户:可执行
看 ls -l 时,例如:
-rw-r--r--
拆开为:
- rw- r-- r--
类型 属主 同组 其他
表示普通文件,属主可读写,同组和其他用户只可读。
总结
这组题的主线其实很清楚:
FCB/inode 负责描述文件;目录负责把文件名映射到文件控制信息;位示图负责管理空闲块;索引和顺序结构负责决定文件如何落盘;磁盘调度和 RAID 负责提高访问效率;权限位负责控制谁能读写执行。
复习时抓住三个层次最稳:
用户视角:文件名、目录、权限
系统视角:FCB、inode、打开文件表
磁盘视角:块、索引、位示图、调度算法、RAID