文件系统的概念

  • 文件系统是操作系统中管理持久性数据的子系统,提供数据存储和访问功能(涉及到数据的持久保存)
    • 组织 检索 读写访问数据
    • 大多数计算机系统都有文件系统
    • 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 带分布式校验的磁盘条带化

校验和 分布 。