Skip to content

文件系统

文件

文件命名

文件结构

  • 无结构字节序列: Unix & Windows
  • 固定长度记录序列
  • 树形结构

文件类型

类型 描述
正规文件 包含用户信息, 分为 ASCII 文件, 二进制文件
目录文件 用于管理文件的系统文件
字符设备文件 和输入输出有关, 用于串行IO类设备(终端,打印机)
块设备文件 磁盘类文件

文件存取

  1. 顺序存取
  2. 随机存取 (直接存取)

文件属性

文件操作

  • SEEK: 将位置指针指向文件特定的位置
  • GETATTRIBUTES: 获取文件属性
  • SETATTRIBUTES: 设置文件属性
  • CLOSE: 当存取存取结束后, 不再需要文件属性和地址信息,此时应该关闭文件以释放内部表空间

文件系统的用户接口

  • 文件的命名
  • 类型
  • 属性
  • 对文件的操作

目录

目录是文件系统中 实现按名访问文件 的重要数据结构

目录项

每个目录项用来描述一个文件, 目录文件包含许多目录项

文件属性位置

  • 文件属性放在目录项中
  • 文件属性放在i节点中
    • 目录项中有一个文件名和一个i节点号

目录结构

  • 单层目录/根目录
  • 两级目录
    • 为每个用户提供一个私有目录, 第一级 为主目录, 第二级为 用户目录
    • 解决了文件的重名问题和文件共享问题, 查找时间降低
    • 增加了系统的存储开销
  • 树形目录

    • 最高层为根目录, 最底层为文件
    • 优点: 1. 便于文件的分类, 层次结构清晰, 2. 便于管理和保护, 解决了重名问题, 查找速度加快
    • 缺点: 查找一个文件按路径逐层次检查, 由于每个文件在外存中, 多次访问影响速度, 结构相对复杂
  • 路径名: 绝对路径名, 相对路径名

  • 树形目录会有两个特殊目录项 "." 和 ".."

目录操作

  • OPENDIR: 读取目录时需要打开该目录
  • READDIR: 以标准格式返回打开目录的下一级目录项

文件系统的实现

实现文件

分配给文件的连续扇区构成的磁盘块称为簇

文件分配类型

文件系统通常以 2^n 个连续扇区对文件进行磁盘空间的分配 1. 连续分配 * 连续分配内存就是把每个文件作为一连串数据块存储在磁盘上 * 优点: 实现简单, 读操作性能好 * 缺点: 随着事件推移, 磁盘变得零碎, 产生了空洞 2. 使用 磁盘链接表 分配 * 为每个文件构造簇的链接表, 每个簇的开始几个字节用来存放下一个簇的簇号, 其他部分存放数据. 每个文件可以存放在不连续的簇中 * 优点: 充分利用每个簇 * 缺点: 随机存取相当缓慢 3. 使用 内存链接表 分配 * 将文件所在的的磁盘的簇号存放在内存的表中, 访问文件只需要从内存分配表中顺着某种连接关系查找簇号, 在目录项中只需记录记录文件的第一块数据所在簇的簇号,根据它查找到文件的所有块 * 缺点: 必须把整个表都加载到内存中 4. i-节点 * 为每个文件赋予一个被称为i节点的数据结构, 其中列出了文件属性和文件块的磁盘地址 * 访问文件时,找到文件所在的目录文件, 从该文件对应的目录项找到文件的i节点号,根据i节点号从磁盘中将i节点信息读入内存,文件在磁盘肿的地址信息都存放在i节点中

Ext2

i节点包含了15个地址项 12个存直接地址, 其余三个存间接地址(一次间接, 二次间接, 三次间接) \ 文件大小计算方式: 设文件块大小为 1K, 地址大小为 4 字节 * 直接地址: 12 * 1k = 12k * 一次间接 = (1k/4) * 1k = 256k * 二次间接 = 256 * 256 * 1k = 65536K * 三次间接 = 256 * 65536K = 16777216K * 总大小 16843020K ≈ 16G

实现目录

目录属性位置: 目录项中 或 i节点中 * CP/M中的目录: 一层目录, 只有一个目录文件 * MS-DOS: 使用 FAT 文件分配表作为索引表来存放文件所在簇的簇号 * 目录项 * ... * 第一簇的簇号 2 * 根据这个簇号和索引连接表可以找到所有簇 * 长度 4字节 * FAT-12 FAT-16 FAT-32: 取决于用多少二进制位存放簇号 * Unix 中的目录 * 目录项: 文件名, i节点号(每个i节点在磁盘上的位置是固定的)

磁盘空间管理

簇大小: 根据文件的大小选择合适的簇, 一般为2的幂

记录空闲块

  1. 空闲簇链接表

    用一些空闲簇存放空闲簇的簇号, 一个簇存放尽可能多的空闲簇的簇号, 并专门留出最后几个字节存放指向下一个存放空闲簇的指针

  2. 位图

    n 位位图对应磁盘的 n 个簇, 在位图中, 空闲簇用 1 表示, 已分配的簇用 0 表示