Skip to content
Self-Knowing

第四章:文件管理

约 1396 个字 预计阅读时间 5 分钟

操作系统以 ”物理块“ 为单位分配存储空间。

概念

按文件是否有结构分类:无结构文件,有结构文件。

有结构文件的逻辑结构:顺序文件,索引文件,索引顺序文件。

文件控制块:包含基本信息,存取控制信息,使用信息。

  • 基本信息:文件名,文件的物理地址。
  • 存取控制信息:一些权限控制。
  • 使用信息:文件建立时间,文件修改时间。

一个文件对应一个FCB,一个FCB就是一个目录项,多个FCB组成文件目录。

索引节点(inode):FCB的改进,将文件名和文件信息分开,使文件信息单独形成一个称为索引结点的数据结构。

  • 在文件目录中的每个目录项仅有目录名和指向该文件所对应结点的指针构成。

文件的逻辑结构

分为 无结构文件(流式文件)有结构文件(记录式文件)

有结构文件:

  • 顺序文件:平均查找 \(N/2\)
  • 索引文件:对于定长记录文件,可随机访问;对不定长记录文件,采用「索引表」
  • 索引顺序文件:分块查找,平均查找 \(\sqrt{N}\)
  • 散列文件(Hash File):存取速度快,但会引起冲突

文件的物理结构

逻辑地址:逻辑块号 + 块内偏移量

连续分配

  • 支持顺序访问,随机访问
  • 在顺序读/写时速度最快
  • 存储空间利用率低,会产生磁盘碎片

链接分配

隐式链接:每个盘块中都有指向下一个盘块的指针。

  • 方便文件扩展,不会产生碎片
  • 只支持顺序访问,查找效率低

显式链接:把所有盘块的指针放在一张表中,即「文件分配表」(FAT,File Allocation Table)。

  • 支持顺序访问,随机访问
  • 不产生碎片,文件分配表占用一定的空间。

索引分配

每个文件建立一张索引表,表中记录逻辑块到物理块的映射关系。

  • 链接方案:将多个索引块链接起来
  • 多层索引:类似多级页表
  • 混合索引:包含 直接地址索引,一级间接索引,两级间接索引

直接地址索引:两次读磁盘(一:读索引表,二:读对应的物理块)

一级间接索引:三次读索引

例题

在文件的索引节点中存放直接索引指针10个,一级和二级索引指针各1个。磁盘块大小为1KB,每个索引指针占4个字节。若某文件的索引节点已在内存中,

则把该文件偏移量(按字节编址)为12345和987654处所在的磁盘块读入内存,需访问的磁盘块个数分别是( 1,3 )

文件的索引节点在内存中,所以拿到这个不用访问磁盘。

第一个地址是一级索引表的地址,第二个地址是二级索引表的地址,二级索引表中的地址才是 文件的物理磁盘块的地址。

所以访问磁盘三次。

外存空闲空间管理

  1. 空闲表法:适用于连续分配方式,回收时注意合并上下空闲的盘块
  2. 空闲盘块链
  3. 位示图法:盘块号与(字号,位号)相互转化
  4. 成组链接法: 记录下一组空闲盘块数

文件的基本操作

打开文件表

  • 整个系统的「打开文件表」:用于跟踪所有进程打开的文件。
  • 每个进程的「打开文件表」:用于跟踪该进程所打开的文件。

打开文件: 将目录项中的信息(FCB)复制到内存中的 打开文件表中,并将打开文件表中的索引号(文件描述符)返回给用户 FILE fd

文件共享

硬链接就是多个指针指向 同一个索引节点,软连接就是记录 访问路径

基于索引节点的共享方式(硬链接)

  • 目录项:只包含文件名、索引节点指针。
  • 索引节点中有一个链接计数:count
  • 删除文件,只是删除该用户的目录项,且 count -- ,只有 count == 0 时才把系统的打开文件表中对应的文件数据删除。

基于符号链的共享方式(软链接)

  • LINK类型的文件
  • 只记录创建 LINK 文件时的 路径名,count,不具备指向索引节点的指针。
  • 存放的是绝对路径,要一层一层访问,多次访问磁盘。

例题

若文件f1的硬链接为f2,两个进程分别打开f1和f2,获得对应的文件描述符为fd1和fd2,则下列叙述中,正确的是( Ⅱ,Ⅲ )。

  • Ⅰ.f1和f2的读写指针位置保持相同

  • Ⅱ.f1和f2共享同一个内存索引结点

  • Ⅲ.fd1和fd2分别指向各自的用户打开文件表中的一项

值得注意的是:先fopen再fork,子进程完全复制父进程的用户文件打开表,此时父子进程的fd相同,指向同一个file对象,也意味着读写位置指针相同。但要是先fork再fopen的话由于fork返回了2次,因而父进程与子进程各自创建了自己的file对象(fd不同),也意味着读写位置指针不同互相独立,但依然指向的是同一个内存索引结点


Created: April 24, 2026
Last update: April 24, 2026

Discussion