文件管理

下面是一篇可以直接当复习博客看的版本。

操作系统文件系统知识点串讲

文件系统要解决的核心问题是:用户看到的是“文件名和目录”,而磁盘上实际存的是“块”。因此,操作系统必须维护一套结构,把文件名、权限、位置、空闲空间、访问顺序等信息组织起来。

一、FCB:文件控制块

FCB,即 File Control Block,文件控制块,是操作系统用来描述一个文件的数据结构。它记录文件的管理信息,例如:

  • 文件名或文件标识
  • 文件属主、用户名
  • 文件访问权限或口令
  • 文件创建、修改、访问时间
  • 文件长度
  • 文件在磁盘上的存储位置

注意,文件分配表 FAT 不属于某个文件自己的 FCB。FAT 是文件系统级别的数据结构,用来记录整个磁盘块或簇的分配关系。

一句话记:

FCB 描述“某个文件”;文件分配表描述“磁盘空间怎么分配”。

二、open() 操作到底做什么

很多人容易把 open()read() 混在一起。

open() 的目的不是把文件内容读入内存,而是:

  1. 根据路径名查目录;
  2. 找到对应的 FCB 或 inode;
  3. 把文件控制信息调入内存;
  4. 建立打开文件表项;
  5. 返回文件描述符或文件句柄。

真正读文件内容的是 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 的查找过程是逐级进行的:

  1. 在根目录中找 usr
  2. usr 的 inode
  3. /usr 目录内容,找 ast
  4. ast 的 inode
  5. /usr/ast 目录内容,找 mbox
  6. mbox 的 inode
  7. 根据 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