一、基本概念
1. 文件系统和文件
概念
- 文件系统是操作系统中管理持久性数据的子系统,是一种持久性存储的系统抽象,提供数据存储和访问功能;
- 文件是文件系统中一个单元的相关数据在操作系统中的抽象,是具有符号名,由字节序列构成的数据项集合。
文件系统的作用
- 分配文件磁盘空间;
- 管理文件集合;
- 提供文件保护,可靠性。
2. 文件和块
文件属性
名称、类型、位置、大小、保护、创建者、创建时间、最近修改时间、…
文件头
文件系统元数据中的文件信息。
3. 文件描述符
文件打开模式
- 进程访问文件数据前必须先“打开”文件
- 操作系统为每个进程维护一个打开文件表
- 文件描述符是打开文件的标识
管理打开文件的元数据
- 文件指针:指向最近一次读写位置,每个打开了这个文件的进程都有这个指针;
- 文件打开计数:记录文件打开的次数,当最后一个进程关闭了文件时,允许将其从打开文件表中移除;
- 文件磁盘位置:缓存数据访问信息;
- 访问权限:每个进程的访问权限信息
用户视图到系统视图的转换
- 进程读文件:获取字节所在的数据块,返回数据块内对应部分;
- 进程写文件:获取数据块,修改数据块中相应的部分,再写回数据块。
访问模式
- 顺序访问:按字节依次读取;
- 随机访问
- 索引访问
文件内部结构
- 无结构:单词、比特的队列
- 简单记录结构
- 复杂结构
Unix 模式访问控制
<用户|组|所有人, 读|写|可执行>
语义一致性
规定多进程如何同时访问共享文件,以文件不同的块形成锁,可以更加高效。
4. 目录
目录
目录是一类特殊的文件,它的内容是文件索引表<文件名, 指向文件的指针>。
典型操作
- 搜索文件
- 创建文件
- 删除文件
- 枚举目录
- 重命名文件
- 在文件系统中遍历一个路径
操作系统应该只允许内核修改目录
- 确保映射的完整性
- 应用程序通过系统调用访问目录
目录实现
- 目录线性列表
- 哈希表
路径遍历
- 名字解析:逻辑名字转换成物理资源的过程;
- 当前工作目录:每个进程都会指向一个文件目录用于解析文件名,允许用户指定相对路径来代替绝对路径。
挂载
文件系统需要先挂载才能被访问。
5. 文件别名
- 两个或多个文件名关联同一个文件;
- 硬链接:多个文件项指向一个文件;
- 软链接:以快捷方式指向其他文件;
- 通过存储真实文件的逻辑名称来实现。
6. 文件系统的类别
- 磁盘文件系统
- 数据库文件系统
- 日志文件系统
- 网络/分布式文件系统
- 特殊/虚拟文件系统
二、虚拟文件系统
1. 分层结构
- 上层:虚拟文件系统
- 底层:特定文件系统模块
2. 虚拟文件系统的功能
- 对不同文件系统的抽象;
- 提供相同的文件和文件系统接口;
- 管理所有文件和文件系统关联的数据结构;
- 高效查询例程,遍历文件系统;
- 与特定文件系统模块的交互。
3. 文件系统基本数据结构
- 卷控制块(superblock)
- 文件控制块(inode)
- 目录节点(dentry)
三、数据缓存
1. 数据块缓存
2. 页缓存
四、打开文件的数据结构
1. 文件描述符
- 每个被打开的文件都有一个文件描述符;
- 文件状态信息:目录项、当前文件指针、文件操作设置等。
2. 打开文件表
- 每个进程一个进程打开文件表;
- 一个系统级的打开文件表;
- 有文件被打开时,文件卷就不能被卸载。
五、文件分配
1. 连续分配
- 文件头指定起始块和长度;
- 位置分配策略:最先匹配,最佳匹配…
- 优势:文件读取表现好,高效的顺序和随机访问;
- 劣势:碎片,文件增长问题。
2. 链式分配
- 文件以数据块链表方式存储;
- 文件头包含了到第一块和最后一块的指针;
- 优点:创建、增大、缩小很容易,没有碎片;
- 劣势:不可能进行真正的随机访问,可靠性。
3. 索引分配
- 为每个文件创建一个名为索引数据块的非数据数据块;
- 文件头包含索引数据块;
- 优点:创建、增大、缩小很容易,没有碎片,直接访问;
- 缺点:当文件很小时,存储索引的开销大;大文件,多级索引。
六、空闲空间列表
- 位图
- 链式列表
- 分组列表
七、多磁盘管理
- RAID-0:磁盘条带化,把数据块分成多个字块,存储在独立的磁盘中;
- RAID-1:磁盘镜像,向两个磁盘写入,从任何一个读取;
- RAID-4:带校验的磁盘条带化;
- RAID-5:带分布式校验的磁盘条带化。