基本概念简述
文件
文件是指一组带标识(文件名), 在逻辑上有完整意义的信息项序列. 信息项是构成文件内容的基本单位, 各个信息项之间具有一定的顺序关系. 文件包含两部分内容:
- 文件体: 文件本身的内容.
- 文件说明: 文件存储和管理的相关信息(文件名, 文件内部标识, 文件存储地址, 访问权限, 访问时间等).
文件内容的意义由创建者和使用者解释.
文件是指一种抽象, 它提供了一种把信息保存在磁盘等外部存储上且便于访问的方法. 用户不必具体的实现细节. 且文件可以视为一个独立连续的逻辑地址空间, 其大小为文件的大小, 与进程的地址空间无关.
一切皆文件
文件的本质是一组字节序列, 源于用户程序对所要输入处理的原始数据和输出结果的长期保存需求, 并按一定格式呈现. 所欲需要长期保存的文件都按照某种组织形式存放(映射)在磁盘中.
所有的 I/O 设备(字符设备, 块设备和网络设备)都可以看作字节序列的载体. 因此所有的 I/O 设备都可以抽象为文件.
文件管理
- 用户视角(使用逻辑文件):
- 用户关心文件中要使用的数据, 不关心具体的存放形式.
- 用户关心文件系统对外的接口, 包括文件的命名, 保护, 访问.
- OS视角(组织和管理物理文件):
- 文件的描述和分类, 关心的是如何实现与文件相关的各个功能模块, 包括如何来管理存储空间, 文件系统的布局, 文件的存储位置, 磁盘实际运作方式等.
文件系统
文件系统是操作系统中统一管理信息资源的一种软件, 管理文件的存储, 检索, 更新, 提供安全可靠的共享和保护手段, 并方便用户使用.
- 统一管理磁盘空间, 实现磁盘空间的分配与回收.
- 实现文件的按名存取.
- 实现文件信息的共享, 并提供文件的保护, 保密手段.
- 向用户提供一个方便使用, 易于维护的接口, 并向用户提供有关的统计信息.
- 提高文件系统的性能.
- 提供与I/O系统的统一接口.
文件名与文件类型
文件被创建时, 需要指定一个文件名, 方便用户通过文件名来访问文件.
程序处理的数据种类繁多, 为使用方便, 人们定义了各种类型的文件.
- 按性质与用途: 系统文件, 库文件, 用户文件.
- 按数据形式: 源文件, 目标文件, 可执行文件.
- 按对文件实施的保护级别: 只读文件, 读写文件, 执行文件, 不保护文件.
- 按逻辑结构: 有结构文件, 无结构文件.
- 按文件中物理结构: 顺序文件, 链接文件, 索引文件.
文件逻辑结构
这里是从用户角度(逻辑上)来看文件.
主要有三种逻辑结构:
- 字节为单位的流式结构: 构成文件的基本单位是字节(字符).
- 记录式文件结构: 由若干记录组成, 可以按照记录进行读写, 查找. 每一条记录都有其内部结构.
- 树形结构: 类似B-树的索引查找形式.
文件控制块
文件控制块是为管理文件而设置的数据结构, 保存管理文件所需的所有有关信息(文件属性与元数据):
文件属性: 文件名, 文件大小, 文件所在的物理地址, 创建时间, 最后修改时间, 最后访问时间, 保护信息, 口令, 创建者, 当前拥有者, 文件类型, 共享计数, 标识信息.
目录文件与目录管理
目录是由文件说明索引组成的用于文件检索的特殊文件. 其内容主要是文件访问与控制信息(文件控制块).
目录分类
- 单级文件目录:
- 结构简单, 只在早期个人计算机上使用.
- 文件多时, 目录检索时间长.
- 命名冲突: 多个文件有相同文件名(不同用户的相同作用文件), 一个文件有多个文件名(不同用户对同一文件的命名).
- 不便于实现共享.
- 两级文件目录: 根目录下每一个用户对应一个目录, 用户目录下不再有下一级目录.
- 多级文件目录: 几乎所有现代文件系统都采用这样的方案.
- 绝对路径: 对于每一个文件或目录, 可以用从根目录开始依次经由各级目录名, 再加上最终的文件名或目录名来表示. 一个文件或目录的绝对路径是唯一的.
- 相对路径: 结合当前路径使用.
- 当前目录: 也称为工作目录, 用
.
来表示当前目录. - 上一级目录: 用
..
来表示上一级目录. 特别地, 根目录的下..
表示它本身, 仍是根目录.
- 当前目录: 也称为工作目录, 用
多级目录有如下特点:
- 层次清楚.
- 解决了文件命名冲突.
- 查找速度快.
目录级别太多时, 会增加路径检索时间.
实现方法
操作系统中, 与文件管理有关的软件和被管理文件以及实施管理所需要的数据结构总体, 就是文件系统. 其需要解决的主要问题是:
- 有效地分配文件存储器的存储空间.
- 提供合适的存取方法.
- 命名的冲突和文件的共享.
- 提供良好的执行效率.
- 提供 I/O 的统一接口.
文件系统实现的任务与目标:
- 方便的文件访问.
- 并发文件访问与控制.
- 统一的用户接口.
- 多种文件访问权限.
- 执行效率.
- 差错恢复.
文件系统层次
- 接口: 为方便用户使用操作系统, 文件系统为用户提供了两种类型的接口.
- 系统调用.
- 命令行(与Shell交互, 本质上还是系统调用).
- 对象操作管理的软件集合: 文件系统的核心.
- 对文件存储空间的管理.
- 对文件目录的管理.
- 用户将文件的逻辑地址转换为物理地址的机制.
- 对文件的读写管理.
- 对文件的共享和保护.
- 对象及其属性.
- 文件: 文件管理的直接对象.
- 目录: 为方便用户对文件的存取与检索, 在文件系统中必须配置目录. 每一个目录项中, 存放文件名和文件所在的物理地址等信息.
- 磁盘存储空间: 对磁盘空间的高效管理, 不仅能够提高外存的利用率, 而且能够提高对文件的检索速度.
文件的实现
文件的实现需要解决的两个问题:
- 元数据: 如何描述文件, 如何记录文件的各种管理信息?
- 数据组织: 如何存放文件, 即如何把文件的各个连续的逻辑块存放在磁盘上的空闲物理块中? 如何来记录逻辑块与物理块之间的映射关系?
文件控制块(FCB)
- 基本信息
- 文件名: 字符串, 通常在不同系统中有不同的最大长度, 可修改.
- 物理位置.
- 文件逻辑结构: 有/无结构(流式文件, 记录文件)
- 文件物理结构: 顺序, 索引.
- 访问控制信息
- 文件所有者: 通常是创建文件的用户, 或者改变已有文件的用户.
- 访问权限: 读, 写, 执行, 删除等.
- 使用信息
- 创建时间, 上一次修改时间, 当前使用时间等.
文件的逻辑结构
选择适当的文件逻辑结构可以提高检索效率, 便于修改, 降低文件存储费用.
文件的物理结构
文件的物理结构, 表示文件在存储介质上的存放方式: 位置, 链接, 编目的方法.
文件的物理结构需要解决的两个问题:
- 假设一个文件的内容被划分为 N 块数据, 则这 N 块数据在磁盘上如何存放?
- 数据块在 FCB 中如何记录?
文件的物理结构主要有: 顺序结构, 串联结构, 索引结构.
顺序结构
这样实现的优点是:
- 结构简单, 实现简单, 不需要额外的空间开销.
- 支持顺序存取和随机存取, (空间上)顺序存取的速度快.
但也有明显的缺点:
- 文件长度不容易改变.
- 不利于文件的动态增加与修改.
串联结构
这样实现的优点是:
- 空间利用率高, 能较好地利用外存空间.
- 文件可以动态扩充和修改.
- 顺序存取的效率高.
但也有明显的缺点:
- 随机存取的效率很低.
- 可靠性低(指针域损坏/数据丢失).
- 链接指针占用了一部分空间, 有空间开销.
索引结构
索引结构的文件系统在磁盘中分为两个区: 索引区与数据区. 访问文件需要两步:
- 查文件对应的索引表所在的物理地址, 并读出.
- 根据索引表, 查数据块所在的物理地址, 并读出.
索引结构综合了顺序结构和串联结构的优点:
- 既能快速顺序存取, 又能快速随机存取.
- 满足了动态增长, 插入删除的要求.
- 能充分利用外存的空间.
但索引表也引入了系统开销.
直接索引与多级间接索引下, 可以很容易地实现文件存储与访问.
目录的实现
一般有两种方法:
- 直接法: 目录项=文件名+FCB. 如: Windows/MS-DOS.
- 间接法: 目录项=文件名+FCB地址. 如: Unix.
长文件名
现代OS中, 一般支持更长/可变长的文件名. 有三种实现方法:
- 在目录项中, 将文件名的长度固定为255字符.
- 浪费空间, 很少文件会有长名.
- 每个目录项的长度可变.
- 文件删除后, 对应目录项的空间不容易回收.
- 目录项本身长度固定, 把长度可变的文件名统一放在文件末尾.
文件保护
保护文件的三个方法:
- 建立副本: 把同一个文件保存到多个存储介质上, 故障时, 可使用备份副本替换.
- 这种做法十分简单, 但是设备费用和系统开销增大, 只适用于短小且极重要的文件.
- 定时转储: 每隔一定时间, 就将文件转储到其他存储介质上, 当文件发生故障时, 就用转储的文件复原, 把有故障的文件恢复到转储时刻的文件状态.
- 设定权限:
- 防止未被批准的用户存取文件
- 防止用户冒充其他用户存取文件
- 防止核准用户(包括文件属主)误用文件.
其他
文件一致性检验
主要检查两类一致性:
- 磁盘一致性: 对于每一个磁盘块, 设置两个计数器. 其中一个记录其在文件中出现的次数, 另一个记录其在空闲块中出现的次数. 最终检查这两个计数值是否不一致.
- 文件一致性: 对于每一个文件, 设置两个计数器. 其中一个记录其inode被引用的次数, 另一个记录文件目录引用它的次数. 最终检查这两个计数值是否不一致.
文件并发访问
文件并发访问控制的目的是提供多个进程并发访问同一个文件的机制. 利用文件锁定(File Lock)可以协调对文件指定区域的互斥访问.
此外, 可以利用进程间通信来协调文件的访问.
文件系统性能与提升
磁盘速度是系统性能的主要瓶颈之一. 设计文件系统时应尽可能减少对磁盘的访问. 提高文件系统性能的方法: 目录项分解, 当前目录与磁盘碎片整理, 块高速缓存, 磁盘调度, 提前读, 合理分配磁盘空间, 信息的优化分布, RAID技术等.
块高速缓存(Block Cache)又称为文件缓存, 磁盘高速缓存, 缓冲区高速缓存等. 它是指在内存中为磁盘块设置一个缓冲区, 保存磁盘中某些块的副本. 当对文件系统进行操作时:
- 检查所有读请求, 看所需数据块是否存在于高速缓存中.
- 若在, 则可以直接进行读操作.
- 否则, 先将数据块读入块高速缓存, 再拷贝到所需处.
由于访问的局部性原理, 当一个数据块被读入到块高速缓存以满足一个 I/O 请求时, 很可能将来还会再次访问到这一数据块.
磁盘块大小: 需要进行权衡.
- 块过大: 读取磁盘次数减少, 但浪费空间.
- 块过小: 磁盘空间利用率高, 但因多次读取磁盘而浪费空间.