【操作系统】文件系统(十一)
1. 文件系统基本概念
文件系统:一种持久性存储的系统抽象。
- 在存储器上:组织、控制、导航、访问和检索数据。
- 大多数计算机系统包含文件系统。
文件:文件系统中一个单元的相关数据在操作系统中的抽象。
文件系统的功能
- 分配文件磁盘空间
- 管理文件块(哪一块属于哪一个文件)
- 管理空闲空间(哪一块是空闲的)
- 分配算法(策略)
- 管理文件集合
- 定位文件及其内容
- 命名:通过名字找到文件的接口
- 最常见:分层文件系统
- 文件系统类型(组织文件的不同方式)
- 提供的遍历及特征
- 保护:分层来保护数据安全
- 可靠性/持久性:保持文件的持久,即使发生崩溃、媒体错误、攻击等
文件属性
- 名称、类型、位置、大小、保护、创建者、创建时间、最近修改时间、….
文件头
- 在存储元数据中保存了每个文件的信息
- 保存文件的属性
- 跟踪哪一块存储块属于逻辑上文件结构的哪个偏移
需要元数据来管理打开文件:
- 文件指针:指向最近的一次读写位置,每个打开了这个文件的进程都指向这个指针。
- 文件打开计数:记录文件打开的次数 ---当最后一个进程关闭了文件时,允许将其从打开文件表中移除。
- 文件磁盘位置:缓存数据访问信息
- 访问权限:每个程序访问模式信息
用户视角:
- 持久的数据结构
系统访问接口
- 字节的集合
- 系统不会去关心你想存储在磁盘上任何的数据结构
操作系统内部视角
- 块的集合(块是逻辑转换单元,而扇区是物理转换单元)
目录
- 文件是以目录的方式组织起来
- 目录是一类特殊文件
- 每个目录都包含了一张表<name,pointer to file header>
- 目录和文件的树型结构
- 早期的文件系统时扁平的(只有一层目录)
- 层次命名空间
- 典型操作
- 搜索文件
- 创建文件
- 删除文件
- 枚举目录
- 重命名文件
- 在文件系统中遍历一个路径
- 操作系统应该只允许内核模式修改目录
- 确保映射的完整性
- 应用程序能够读目录(如ls)
路径的遍历
- 名字解析:逻辑名字转换成物理资源(如文件)的过程
- 在文件系统中:到实际文件的文件名(路径)
- 遍历文件目录直到找到目标文件
- 举例:解析"'/bin/ls"
- 读取root的文件头(在磁盘固定位置)
- 读取root的数据块:搜索"bin"项
- 读取bin的文件头
- 读取bin的数据块,搜索"ls"项
- 读取ls的文件头
- 当前工作目录
- 每个进程都会指向一个文件目录用于解析文件名
- 允许用户指定相对路径来替代绝对路径
文件系统的挂载
文件别名
- 如果删除一个有别名的文件会如何呢?
- 这个别名将成为一个“悬空指针”
- Backpointers方案
- 每个文件有一个包含多个backpointers的列表,所以删除所有backpointers
- Backpointers使用菊花链管理
- 添加一个间接层:目录项数据结构
- 链接--已存在文件的另外一个名字(指针)
- 链接处理--跟随指针来定位文件
文件系统种类
- 磁盘文件系统
- 文件存储在数据存储设备上,如磁盘
- 例如、FAT, NTGS, ext2/3, ISO9660等
- 数据库文件系统
- 文件根据其特征是可被寻址的
- 例如:WinFS
- 日志文件系统
- 记录文件系统的修改/事件
- 例如: journaling file system
- 网络/分布式文件系统
- 例如:NFS,SMB,AFS,GFS
- 特殊/虚拟文件系统
2. 虚拟文件系统
目的
- 对所有不同文件系统的抽象
功能
- 提供相同的文件和文件系统接口
- 管理所有文件和文件系统关联的数据结构
- 高效查询例程,遍历文件系统
- 与特定文件系统模块的交互
3. 文件分配
大多数文件都很小
- 需要对小文件提供强力支持
- 块空间不能太大
一些文件非常大
- 必须支持大文件
- 大文件访问需要相当高效
分配方式
- 连续分配
- 链式分配
- 索引分配
指标
- 高效:如存储利用(外部碎片)
- 表现:如访问速度
(1) 连续分配
(2) 链式分配
(3) 索引分配
4. 空闲空间列表
- 跟踪在存储中的所有未分配的数据块
- 空闲空间列表存储在哪里?
- 空闲空间列表的最佳数据结构是什么样的?
5. 多磁盘管理(RAID)
RAID部分参考:计算机组成原理(下)