文件系统
文件
文件命名
文件结构
- 无结构字节序列: Unix & Windows
- 固定长度记录序列
- 树形结构
文件类型
| 类型 | 描述 |
|---|---|
| 正规文件 | 包含用户信息, 分为 ASCII 文件, 二进制文件 |
| 目录文件 | 用于管理文件的系统文件 |
| 字符设备文件 | 和输入输出有关, 用于串行IO类设备(终端,打印机) |
| 块设备文件 | 磁盘类文件 |
文件存取
- 顺序存取
- 随机存取 (直接存取)
文件属性
文件操作
- 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的幂
记录空闲块
-
空闲簇链接表
用一些空闲簇存放空闲簇的簇号, 一个簇存放尽可能多的空闲簇的簇号, 并专门留出最后几个字节存放指向下一个存放空闲簇的指针
-
位图
用
n位位图对应磁盘的n个簇, 在位图中, 空闲簇用1表示, 已分配的簇用0表示