文件系统的概念
- 文件系统是操作系统中管理持久性数据的子系统,提供数据存储和访问功能(涉及到数据的持久保存)
- 组织 检索 读写访问数据
- 大多数计算机系统都有文件系统
- google也是一个文件系统,涉及大量数据的保存和检索
- 文件是具有符号名,由字节序列构成的数据项集合
- 文件系统的基本数据单位
- 文件名是文件的标识符号
功能:
- 分配文件磁盘空间
- 管理文件块(位置和顺序)
- 管理空闲空间(位置)
- 分配算法(策略)
- 管理文件集合
- 定位:文件及其内容
- 命名:通过名字找到文件
- 文件系统结构:文件组织方式
- 数据可靠和安全
- 安全:多层次保护数安全
- 可靠
- 持久保存文件
- 避免系统崩溃 媒体错误 攻击
文件属性
- 文件属性
- 名称、类型、位置、大小、保护、创建者、创建时间、最近修改时间、…
- 文件头:文件系统元数据中的文件信息
- 文件属性
- 文件存储位置和顺序
打开文件
- 文件访问模式
- 进程访问文件数据前必须先打开文件
- 内核跟踪进程打开的所有文件
- 维护一个打开文件表,为每一个进程
- 文件描述符是打开文件的标识,表项
文件描述符
- 操作系统在打开文件表中维护的打开文件状态和信息
- 文件指针
- 最近一次读写位置
- 每个进程分别维护自己的打开文件指针
- 文件打开计数
- 当前打开文件的次数
- 最后一个进程关闭文件时,将其从打开文件表中去除
- 文件磁盘位置
- 缓存数据访问信息
- 访问权限
- 每个进程的文件访问信息模式
- 文件指针
文件的用户视图
持久的数据结构
系统视图
系统访问接口;字节序列的集合。系统不关心存储在磁盘上的数据结构; 数据块的集合。数据块是逻辑存储单位,扇区是物理存储单元
用户视图到系统视图的转换
- 进程读文件
- 获取字节所在的数据块(最小单位,想读写一个字节 必须 读一整块)
- 返回数据块内对应的部分
- 进程写文件
- 获取数据块
- 修改数据块中对应部分
- 写回数据块
- 文件系统中的基本操作单位是数据块
- 例如,getc()和putc()即使每次只访问1字节的数据,也需要缓存目标数据4096字节
访问模式
操作系统需要了解进程如何访问文件
- 顺序访问:按字节依次读取
- 大多数的文件访问都是顺序访问
- 随机访问:从中间读写
- 不常用,但仍然重要
- 虚拟内存中把内存也存储到文件,对系统性能影响大
- 不常用,但仍然重要
- 索引访问:依据数据特征索引
- 通常操作系统不完整提供索引访问
- 数据库是建立在索引内容的磁盘访问上
- os 小型数据库
文件内部结构
- 无结构
- 单词、字节序列
- 简单记录结构
- 分列
- 固定/可变 长度
- 复杂结构
- 格式化的文档
- 可执行文件
文件共享和访问控制
- 多用户系统中的文件共享是很有必要的,节约磁盘存储空间
- 访问控制
- 每个用户能够获得哪些文件的哪些访问权限
- 读 写 执行 删除 列表
- 文件访问控制列表 acl
- <文件实体,权限>
- <用户|组|所有人,读|写|可执行>
- 用户标识ID
- 识别用户,表明每个用户所允许的权限及保护模式
- 组标识ID
- 允许用户组成组,并指定了组访问权限
语义一致性
- 规定多进程如何同时访问共享文件
- 与同步算法相似
- 因磁盘i/o和网络延迟而设计简单
- unix文件系统ufs 语义
- 对打开文件的写入内容立即对其他打开同一文件的其他用户可见
- 共享文件指针允许多用户同时读取和写入文件
- 甩给应用进程处理
- 会话语义
- 写入内容只有当文件关闭时可见
- 读写锁
- 一些操作系统和文件系统提供该功能
分层文件系统
- 文件以目录的方式组织起来
- 目录是一种特殊的文件
- 目录的内容是文件索引表<文件名、指向文件的指针>
- 目录和文件的树形结构
目录操作
- 搜索文件
- 创建文件
- 删除文件
- 列目录
- 重命名文件,目录项中的文件属性
- 遍历路径
- 这些操作 封装在内核里面。
- 确保映射的完整性
- 应用进程通过系统调用访问目录
目录的实现
- 文件名的线性列表,包含了指向数据快的指针
- 编程简单
- 执行耗时
- 哈希表-哈希数据结构的线性表
- 减少目录搜索时间
- 冲突-两个文件名哈希值相同
- 固定大小 的表项
文件别名
- 两个或多个文件名关联同一个文件
- 硬链接:多个文件项指向一个文件
- 软链接:以快捷方式指向其他文件,通过存储真实文件的逻辑名称来实现
文件目录中的循环
指向下一级的子目录,子目录指向父目录 处理办法
- 只允许到文件的连接,不允许在子目录的链接
- 增加链接时,用循环检测算法
- 而实践上,限制路径可遍历文件目录的数量
名字解析(路径遍历)
如何找一个文件?
- 把逻辑名字转换为物理资源(如文件)
- 依据路径名,在文件系统中找到实际文件位置
- 遍历 文件目录直到找到目标文件
- 例子:解析”/bin/ls”
- 读取根目录的文件头 磁盘固定位置
- 读取根目录的数据块,搜索bin项
- 读取bin的文件头
- 读取bin的数据块,搜索ls项
- 读取ls 的文件头,获取文件信息
- 当前目录 pwd
- 每个进程都会指向一个文件目录用于解析文件名
文件系统挂载
- 文件系统需要先挂载才能被访问
- 未挂载的文件系统被挂载在挂载点上
文件系统种类
- 磁盘文件系统
- 文件存储在数据存储设备上,如磁盘
- 数据库文件系统
- 文件特征是可被寻址的
- 日志文件系统
- 记录文件系统的修改/事件
- 网络/分布式文件系统
- 存到远端机器上。文件位于远程服务器。通过网络 文件共享。
- 客户端远程挂载服务器文件系统
- 标准系统文件访问被转换为远程访问
- 安全 一致性问题 错误处理模式
- 特殊/虚拟文件系统
虚拟文件系统
对上提供统一的接口
- 分层结构
- 虚拟文件系统 vfs,文件访问和系统调用控制的 接口。数据结构和常用的操作算法。
- 目的
- 对所有不同文件系统抽象
- 功能
- 对上 提供相同的文件和文件系统接口
- 管理所有文件和文件系统关联的数据结构
- 高效查询例程,遍历文件系统
- 与特定文件系统模块的交互,对下
文件系统基本数据结构
- 超级块superblock,文件卷控制块
- 每个文件系统一个
- 文件系统详细信息
- 数据块有多大,有多少数据块已经分配出去了,还有多少是空闲的,共享 引用的计数等
- 文件控制块 inode
- 每个文件一个
- 文件详细信息
- 访问权限、拥有者、大小、数据块位置等
- 目录项 dentry
- 每个目录像一个
- 将目录项数据结构及树形布局编码成树形数据结构
- 指向文件控制块、父目录、子目录等
文件系统的存储结构
- 文件系统数据结构
- 卷控制块
- 文件控制块
- 目录节点
- 持久存储在外村中
- 存储设备的数据块中
- 当需要时加载进内存
- 卷控制块:当文件系统挂载时
- 文件控制块:当文件被访问时
- 目录节点:在遍历一个文件路径时
文件缓存和打开文件
多种磁盘缓存位置
磁盘 →磁盘控制器 :扇区缓存 →内存:数据块缓存 ,内存虚拟盘 打开文件表- >cpu
数据块缓存
- 数据块按需读入内存
- 提供read()操作
- 预读:预先读取后面的数据块
- 数据块使用后被缓存
- 假设数据将会再次用到
- 写操作可能被缓存和延迟写入
- 两种数据块缓存方式
- 数据块缓存
- 页缓存:统一缓存数据块和内存页
页缓存
- 虚拟页式存储
- 在虚拟地址空间中虚拟页面可映射到本地外存文件中
- 文件数据块的页缓存
- 在虚拟内存中文件数据块被映射成页
- 文件的读写操作被转换成对内存的访问
- 可能会导致缺页 或 设置为 脏页
打开文件的数据结构
- 文件描述符
- 每个打开的文件都有一个文件描述符
- 文件状态信息
- 目录项、当前文件指针、文件操作设置等
- 打开文件表
- 每个进程一个进程打开文件表
- 一个系统级的打开文件表
- 有文件被打开时 ,文件卷就不能被卸载
文件分配
文件大小分布情况
- 大多数文件很小
- 需要对小文件提供很好的支持
- 块空间不能太大
- 一些文件非常大
- 必须支持大文件(64位文件偏移)
- 大文件访问需要高效
- 光盘映像
分配
- 如何表示 分配给一个文件数据块的位置和顺序
- 分配方式
- 连续分配
- 链式分配
- 索引分配
- 指标
- 存储效率:外部碎片 连续分配
- 读写性能:访问速度 找到中间的一块
连续分诶
- 文件头指定起始块和长度
- 分配策略 最先匹配 最佳匹配
- 优点
- 文件读取表现好
- 高效的顺序和随机访问
- 缺点
- 碎片
- 文件增长问题
- 预分配
- 按需分配
链式分配
- 文件以数据块链表方式存储
- 文件头包含了到第一块和最后一快的指针
- 优点
- 增加 删除 创建 很容易
- 没有碎片
- 缺点
- 无法实现真正的随机访问 中间的块
- 可靠性差
- 破环一个链,后面的数据块都丢了
索引分配
- 为每个文件创建了一个索引数据块:指向文件数据块的指针列表
- 文件头包含了索引数据块指针
- 优点
- 创建 增大 缩小很容易
- 没有碎片
- 支持直接访问
- 缺点
- 当文件很小时,存储索引的开销
- 如何处理大文件
- 大文件 链式索引块 ,或者 多级索引块。
多级索引分配
inode里 前面10个是直接索引,第11个 1级间接索引 块 ,12 2级 13 3级
- 效果
- 提高了文件大小限制阈值
- 动态分配数据块,文件扩展很容易
- 小文件开销大
- 只为大文件分配间接数据块,在查询时速度有所下降
空闲空间管理
- 跟踪记录文件卷中未分配的数据块
- 采用什么数据结构表示空闲空间列表?
空闲空间组织:位图
链表、链式索引
冗余磁盘阵列RAID
提高文件系统可靠性和读写性能的一组技术
一个典型的磁盘文件系统组织
文件卷:一个拥有完整文件系统实例的外存空间,通常常驻在磁盘的单个分区上
多磁盘管理
- 使用多磁盘可改善
- 吞吐量 并行
- 可靠性和可用性 冗余
- redundant array of inexpensive disks
- 多种磁盘管理技术
- raid 分类 raid -0 /1/5
- 冗余磁盘阵列的实现
- 软件:os 内核的文件卷管理
- 硬件:raid硬件控制器i/o
raid-0 磁盘条带化
- 把数据块分成多个子块,存储在独立的磁盘中
- 通过独立磁盘上并行数据块提供更大的磁盘带宽
raid-1 磁盘镜像
- 向两个磁盘写入 ,从任何一个读取
- 可靠性成倍增长
- 读取性能线性增加
raid-4 带校验的磁盘条带化
- 数据块级的磁盘条带化加 专用的奇偶校验磁盘
- 允许从任意一个故障磁盘中恢复
raid-5 带分布式校验的磁盘条带化
校验和 分布 。