操作系统-第十一章-文件系统的实现

一、文件系统

  • 磁盘提供大多数的外存,以便维护文件系统
  • 文件系统提供高效和便捷的磁盘访问,以便允许轻松存储、定位、提取数据
  • 在存储设备上组织文件的方法和数据结构
  • 操作系统中负责管理存储文件信息的模块
  • 系统角度的
    • 对存储设备的空间进行组织和分配
    • 负责文件检索、读写等操作
    • 目标:存取速度和存储空间效率
  • 用户角度
    • 提供按名存取的文件访问机制
    • 文件的组织管理,如目录等
    • 目标:方便的文件存取机制

1.文件系统结构

  • 文件系统本身通常由许多不同的层组成,文件系统具有层次架构
  • 每层设计利用更底层的功能,创建新的功能,以用于更高层服务
  • 当使用分层结构实现文件系统时,可最小化代码的重复
    • I/O控制的代码,有时还包括基本文件系统的代码,可以用于多个文件系统
  • 每个文件系统可以拥有自己的逻辑文件系统文件组织模块
  • 分层可能增加了操作系统开销,导致性能降低
  • I/O控制
    • 包括设备驱动程序(Device Drivers)和中断
    • 设备驱动程序:
      • 控制I/O设备运行
      • 向硬件控制器发送专门控制命令
      • 操作系统通过设备驱动程序控制设备进行文件的读写操作
      • 可以作为翻译器
      • 输入为高级命令
      • 输出由底层的、硬件特定的指令组成,硬件控制器利用这些指令来使I/O设备与系统其他部位相连
      • 设备驱动程序通常在I/O控制器的特定位置写入特定位格式,告诉控制器对设备的什么位置采取什么动作
  • 基本文件系统
    • 负责物理块读写
    • 每个物理块由磁盘的数字地址来标识
    • 向设备驱动程序发送控制命令控制设备控制器对存储设备(磁盘的物理块)进行读写操作
    • 管理内存缓冲区和保存各种文件系统、目录和数据块的缓存
      • 在进行磁盘块传输之前,分配一块缓冲区
      • 当缓冲区已满时,缓冲管理器必须找到更多缓冲内存或释放缓存空间,以便允许完成I/O请求
      • 缓存用于保存常用的文件系统元数据,以提高性能
  • 文件组织模块
    • 管理文件、逻辑块和物理块
    • 把文件的逻辑地址转换为物理地址,以供基本文件系统传输
    • 每个文件的逻辑块从0(或1)到N编号,而包含数据的物理块并不与逻辑号匹配,因此需要通过转换来定位块
    • 管理空闲空间
    • 为文件分配物理块
    • 可用空间管理器:以跟踪未分配的块并根据要求提供给文件组织模块
  • 逻辑文件系统
    • 管理文件系统中的元数据
      • 除了文件数据外的所有结构数据
    • 文件按名存取,根据给定文件名称为文件组织模块提供所需信息
    • 文件目录组织管理
    • 把文件名转换为文件ID,文件句柄
    • 管理FCB,通过文件控制块来维护文件结构
      • FBC:包含有关文件的信息,包括所有者、权限、文件内容的位置等
    • 存储保护

2.文件系统实现

  • 为了创建新的文件,应用程序调用逻辑文件系统。逻辑文件系统知道目录结构的格式;它会分配一个新的FCB。(或者如果文件系统的实现在文件系统创建时已经创建了所有的FCB,则可从空闲的FCB集合中分配一个可用的FCB)然后,系统将相应的目录读到内存,使用新的文件名和FCB进行更新,并将它写回到磁盘
2-1.基本概念
  • 物理块):一个或多个(2n)扇区组成,基本文件读写单位
  • 物理分区Partition):磁盘分割成若干个独立的空间,每个空间称为分区
    • 两大类分区:主分区扩展分区
    • 主分区:能够安装操作系统的启动分区
    • 扩展分区:不能直接使用,必须分成若干逻辑分区
  • (逻辑磁盘)(Volume):磁盘上的逻辑分区,建立在物理分区上
    • 一般每个卷可以建立一个文件系统:
  • 典型文件系统

2-2.两种文件系统
  • 文件系统的实现需要采用多个磁盘和内存的结构
  • 磁盘文件系统内存文件系统
  • 磁盘文件系统
    • 可能包含的信息:如何启动存储在那里的操作系统、总的块数、空闲块的数量和位置、目录结构以及各个具体文件等
    • 引导控制块:包含了系统引导操作系统的各种信息,只有安装操作系统的分区才会有引导控制块
      • UFS:引导块(Boot block)
      • NTFS:分区引导扇区(Partition boot sector)
    • 分区控制块(卷控制块):包含分区(卷)信息
      • 总的块数、空闲块数、块大小、空闲块的数量和指针、空闲的FCB数量和FCB指针等信息
      • UFS:超级块(superblock)
      • NTFS:主控文件表(master file table)
    • 目录结构
      • 用于组织文件
      • 在UFS中,包含文件名和相关的inode的号码
      • 在NTFS中,存储在主控文件表中
    • FCB
      • 包含该文件的许多详细信息
      • 有一个唯一的标识号,以便与目录条目相关联
      • 在NTFS中,这些信息实际上存储在主控文件表中,它使用关系数据库结构,每个文件独占一行
    • 用户文件
    • 磁盘结构
  • 内存文件系统
    • 内存中的信息用于管理文件系统并通过缓存来提高性能
      • 这些数据在安装文件系统时被加载,在文件系统操作期间被更新
      • 在卸载时被丢弃
    • 包含:
      • 分区表:所有安装分区信息
      • 目录缓冲结构:保存最近访问的目录信息
      • 系统打开文件表:包括每个打开文件的FCB的副本以及其他信息
      • 进程打开文件表:包括一个指向整个系统的打开文件表中的适当条目的指针,以及其他信息
    • 文件操作需要用到内存文件系统
    • 目的:通过缓冲技术提高文件系统性能
    • 引入内存文件系统的目的是为了节省外存空间
    • 内存中文件系统结构

2-3.虚拟文件系统(Virtual File System)
  • 目的
    • 为了支持多个文件系统,引入虚拟文件系统VFS
    • 把多个文件系统整合成一个目录结构
    • 为用户屏蔽各个文件系统的差异
    • 虚拟文件系统可以把多个文件系统整合成一个目录结构,为用户屏蔽各个文件系统的差异
  • 虚拟文件系统(VFS):
    • 提供了一种面向对象的方法来实现文件系统
    • 为不同类型的文件系统提供了接入VFS的接口
    • 为用户提供了统一的系统调用接口(API)
  • 文件系统接口(File system interface):
    • 统一的应用程序访问文件的接口
    • 各个文件系统提供给应用程序的接口可能不同,如:open、openfile、openf、open_file等
  • VFS接口(VFS interface):
    • 为各类不同的文件系统定义VFS接口
    • 符合该接口的文件系统都可以接入VFS
  • 示意图

2-4.网络文件系统(NFS)
  • 网络文件系统(NFS,Network File System):用于通过LAN(或WAN)访问远程文件系统的软件系统的实现或规范
  • 好处:节省存储空间,实现共享


2-5.CIFS
  • 通用Internet文件系统(Common Internet File System):在Windows主机之间进行网络文件共享
  • CIFS使用客户/服务器模式


2-6.常用文件系统
  • Windows
    • FAT(File Allocation Table)
    • NTFS(New Technology File System)
    • ReFS(Resilient File System)
  • Linux
    • Ext(Ext2、Ext3、Ext4)
  • Mac OS
    • HFS(Hierarchical File System)
  • CD
    • CDFS

二、分配方法

1.基本概念

1-1.物理块
  • 读写存储设备的基本单位
    • 文件读写操作时,以块为单位进行读写
    • 好处:减少读写次数,提高访问效率
  • 存储设备的基本分配单位
    • 以物理块为单位为文件分配存储空间
  • 和内存的页面大小相对应
    • 页面大小:4KB
    • 物理块大小:4KB的倍数

1-2.逻辑块
  • 在文件空间中的块
  • 编号从0开始
  • 大小和物理块一致
  • 一个逻辑块存储在一个物理块中


1-3.存储空间分配方式
  • 连续存储空间:连续存储空间分配,和内存的连续分配相似,是指一个 文件在磁盘上存储在连续的物理块中
    • 连续分配
  • 离散存储空间:离散存储空间分配,是指一个文件的物理块可以分布在 磁盘的各处,类似于内存分配中的分页和分段
    • 链接分配
    • 索引分配
  • 物理块块号
    • 一维空间
    • 从0开始编号
    • 可以根据物理设备的特性进行转换

2.连续分配

2-1.基本概念
  • 连续分配问题可以作为通用动态存储分配问题的一个具体应用
    • 从一组空闲孔中寻找一个空闲孔的最为常用的策略是:首次适合最优适合
  • 每个文件在磁盘上占用一组连续的物理块
  • FCB仅需给出:
    • 起始块号
    • 长度
  • 例:

2-2.地址映射
  • 逻辑地址LA:文件内相对地址(一维)
  • 物理地址(B,D):存在在物理块中的地址(二维)
  • 物理块大小S


2-3.性能分析
  • 优点
    • 支持顺序访问
    • 支持随机访问(可直接访问指定块号的物理块)
    • 存取速度快(上一个块到下一个块移动距离短)
    • 适用一次性写入操作
    • 例:
  • 缺点
    • 存在外部碎片
    • 预分配可能产生内部碎片(文件增长缓慢)
    • 难以确定一个文件需要多少空间
    • 浪费空间(小空间无法分配)
    • 文件不能动态增长(文件A)
    • 不利于文件的插入和删除(需要移动数据)
    • 例:

2-4.连续分配的改进
  • 改进的连续分配方案(Veritas File System)
  • 基于扩展的文件系统(局部连续)
    • 扩展是一组连续的磁盘块集合
    • 扩展在文件分配时被分配
    • 一个文件可能包含一个或多个扩展
    • 需要一个指向下一个扩展的指针
    • 文件块的位置记录:地址、块数、下一扩展的首块的指针

3.链接分配

3-1.基本概念
  • 链接分配
    • 文件信息存放在若干个不连续物理块中
    • 文件的所有物理块通过指针链接成链表结构
    • 用户不能使用这些指针,在计算大小时要减去指针的大小
  • 分类
    • 显式链接
    • 隐式链接

3-2.隐式链接-基本概念
  • 链表的指针隐藏在物理块中
  • 每个物理块中的指针指向下一个物理块
  • FCB给出文件首块地址
  • 文件结束于空指针
  • 每个物理块用于存放文件信息的空间变小
    • 减去指针占据的空间
    • 4KB物理块,指针4Bytes:4092Bytes
  • 例:

3-3.隐式链接-地址映射
  • 逻辑地址LA:文件内相对地址(一维)
  • 物理地址(B,D):存在在物理块中的地址(二维)
  • 物理块大小S
  • 指针大小P


3-4.隐式链接-性能分析
  • 优点
    • 没有外碎片,无需合并磁盘空间
    • 可以离散存放,提高磁盘的利用率
    • 可以动态扩充文件大小
    • 便于文件的插入和删除操作
  • 缺点
    • 只能有效用于顺序访问文件
    • 无法实现随机访问,访问文件慢,访问第i块,需要把0-(i-1)块都读入
    • 指针需要存储空间
    • 指针分散存放
    • 可靠性差
      • 解决方法:①双向链表②每块存储文件名称和相对块号(这些方案都为文件增加了额外开销)
  • 优化方法:多块集合成组(簇),按簇而不是按块来分配

3-5.显示链接-基本概念
  • 指针集中存放
  • 把所有指针存放在一张链接表中
    • 每个卷的开头部分的磁盘用于存储该表
    • 在该表中,每个磁盘块都有一个条目,并可按块号来索引
  • 大大提高了检索速度
    • 先访问链接表,再访问物理块
  • 链接表一般在文件系统装载时装入内存
  • 链接表大小
    • 表项16位:最大216*2Bytes=128KB
    • 表项32位:最大232*4Bytes=16GB
  • 不适合大容量磁盘
    • 如4TB磁盘,物理块4KB
    • 链接表大小=(4TB/4KB)*4Bytes=4GB
  • 例:
    • FAT
    • FAT32

4.索引分配

4-1.基本概念
  • 每个文件一张文件分配表,即索引表
    • 磁盘地址块的数组
    • 索引块的第i个条目指向文件的第i个块
    • 目录包含索引块的地址
    • 当查找和读取第i个块时,采用第i个索引块条目的指针
    • 磁盘访问的次数:索引块访问次数+文件块的访问次数
  • 索引块:存放指向文件每个物理块块号的物理块
  • 索引块中的第i个项:存放第i个逻辑块对应的物理块块号
  • FCB指向索引块
  • 例:

4-2.地址映射
  • 逻辑地址LA:文件内相对地址(一维)
  • 物理地址(B,D):存在在物理块中的地址(二维)
  • 物理块大小S


4-3.索引分配性能
  • 优点
    • 支持随机访问(先访问索引块,然后访问具体的物理块)
    • 离散存放,没有碎片
  • 缺点
    • 需要额外空间存放索引表
    • 磁盘访问时间增加(物理块分布在磁盘各地)

4-4.索引分配-链接策略
  • 一个索引块通常为一个磁盘块
    • 本身支持直接读写
  • 可以通过将多个索引块链接起来来支持大文件
  • 把索引块通过链表组织(没有长度限制)
    • 访问块号B=索引表中第Q1块索引块中第Q2项存放的块号
    • 块内偏移D=R2
    • 指针大小P
  • 缺点:可能需要读入多个索引块

4-5.索引分配-多级索引
  • 比较适合大文件
  • 磁盘访问的次数:索引块访问次数+文件块的访问次数
  • 大文件无法用单级索引实现
    • 物理块大小S=4KB
    • 表项大小:4个字节(最多232块)
    • 每个物理块存放的块号数目:4K/4=1K个
    • 单级目录最大文:1K*4KB=4MB
    • 大于4MB的文件如何存放?⇨多级索引
  • 二级索引
    • 把索引块通过再次索引的模式组织(有长度限制)
    • 二级索引
      • 外层索引表(一个物理块)
      • 内层索引表(物理块数目=外层索引表的项数)
  • 二级索引地址映射
    • 访问块号B=外层索引表中第Q1项中存放的块号对应的内层索引块中第Q2项存放的块号
    • 块内偏移D=R2
  • 索引和文件大小

4-6.联合策略:UNIX(每块4KB)
  • 多种索引混合
  • 将索引块的前几个指针存在文件的inode中
    • 这些指针的前12个指向直接块,即包含存储文件数据的块的地址
    • 接下来的3个指针(13、14、15)指向间接块,分别对应一级间接块二级间接块三级间接块
  • 0级索引:
    • FCB中12个指针指向文件开头的12个逻辑块
  • 一级索引:
    • 1K项,对应1K个物理块,总大小为4MB
  • 二级索引:
    • 1M块,容量为4GB
  • 三级索引:
    • 1G块,容量为4TB


5.性能

  • 好的分配方法依赖于访问类型
  • 连续分配可用于随机或顺序访问,效率高
  • 链接分配适合顺序访问,不适合随机访问
  • 在文件创建时根据访问类型选择链接还是连续
  • 索引分配更加复杂
    • 依赖于索引结构、文件大小、块大小
  • 增加磁盘I/O速度是提高性能的一个因素

三、空闲空间管理

1.基本概念

  • 文件系统不仅需要记录下磁盘上还没有分配出去的空闲物理块,还需要为新文件分配物理块和回收被删除文件的物理块,所以文件系统需要包含空闲空间管理模块
  • 把不连续的空闲块集合在一起
  • 有利于给文件分配连续的物理块

2.空闲空间管理方法

2-1.空闲表
  • 空闲区:连续的未分配物理块集合
  • 空闲表
    • 每个表项对应一个空闲区
    • 内容:空闲区的第一块号、空闲块的块数
    • 条目可以存储在平衡树而不是链表中,以便于高效查找、插入和删除
  • 空闲表适用连续分配
  • 分配和回收方式:和内存的连续分配类似
  • 缺点:需要额外空间来存放空闲表
  • 例:

2-2.空闲链表
  • 将磁盘上所有空闲块链接在一个链表中
  • 分配:从链表头依次摘下适当数目的空闲块
  • 回收:空闲块加入链表尾部
  • 优点:不需专用块存放管理信息,不浪费空间
  • 缺点:增加I/O操作,得到连续空间难
  • 例:

2-3.位示图
  • 利用二进制一位(bit)来表示一个块的使用情况
    • 1:盘块空闲
    • 0:盘块已分配
  • 所有块都有一个二进制位与之对应
  • 所有块对应的位形成位示图
  • 位示图存放在物理块中
  • 分配:1⇨0      回收:0⇨1
  • 比较容易得到连续物理块
  • 在查找磁盘上的第1个空闲块和第n个连续的空闲块时相对简单和高效
  • 块号计算
    • 例:

2-4.成组链接
  • 结合了空闲表和空闲链表
  • 例:
  • 从头分配,从头回收
  • 分配:从前往后分配,从第一组开始分配,分完再分下组
  • 回收
    • 先将释放的空闲块放到第一组
    • 满100块后,在第一组前再开辟一组
    • 原来的第一组变成第二组,新组为第一组

四、一致性检查

  • 一致性检查程序:比较目录结构的数据和磁盘的数据块,并且试图修复发现的不一致。分配和空闲空间管理的算法**决定了检查程序能够发现什么类型的问题,及其如何成功修复问题
  • 每个文件的目录或FCB中会记录这个文件分配到的物理块信息,位示图同样会记录每个物理块是否被使用,这两者应该是一致的
  • 即文件系统中所有的物理块减去文件用掉的,剩余的都是空闲块。但是有 时不是这样,存不一致性
  • 所以,文件系统提供了一致性检查,将目录结构数据与磁盘空闲块结构相 比较,纠正发现的不一致
    • 空闲块在某个文件的物理块中(A)
    • 非空闲块不属于任意一个文件(B)
    • 一个物理块属于多个文件(C)


原文地址:https://www.cnblogs.com/fangzhiyou/p/14122162.html