文件系统

文件管理

文件与文件系统

  • 什么是文件?
    • 我们知道, 进程是对CPU的抽象, 地址空间是对内存的抽象, 那么文件就是对磁盘的抽象。专业一点说, 就是指一组带标识(标识即为文件名)的, 在逻辑上有完整意义的信息项的序列。
    • 信息项: 构成文件内容的基本单位(单个字节或多个字节), 各信息项之间有顺序关系.
  • 文件内容的意义: 由文件建立者和使用者解释
  • 什么是文件系统?
    • 操作系统中统一管理信息资源的一种软件, 管理文件的存储, 检索, 更新, 提供安全可靠的共享和保护手段, 并且方便用户使用。
  • 文件系统的作用
    • 统一管理磁盘空间, 实现磁盘空间的分配和回收
    • 文件名和磁盘空间地址的映射
    • 实现文件信息共享, 并提供文件的保护, 保密手段
    • 提供接口(方便使用, 易维护)给用户
    • 提高文件系统的性能
    • 提供与I/O系统的统一接口
  • 文件的分类(UNIX)
    • 普通文件
      • 用户自己建立的文件
    • 目录文件
      • 操作系统的系统文件
    • 特殊文件
      • 设备文件, 个人理解就是将设备也抽象成文件, 这样接口设计的时候能够更加通用
    • 管道文件
    • 套接字文件

文件的逻辑结构

  • 流式文件
    • 构成文件的基本单位是字符, 就是有逻辑意义没有结构的一串字符的集合
  • 记录式文件
    • 文件由若干记录组成, 可以按记录进行读,写,查找等操作
    • 我们常说的目录文件, 就是记录式文件的一种典型代表
  • 读取方式
    • 顺序存取(访问)
    • 随机存取(访问)
      • 提供读写位置,UNIX中使用seek来操作

文件的存储介质

  • 典型存储介质: 磁盘(包括SSD固态盘), 磁带, 光盘, U盘…
  • 物理块(block, cluster)
    • 信息存储, 传输, 分配的独立单位
    • 存储设备划分为大小相等的物理块, 统一编号
  • 磁盘结构(转自:这里)
    文件系统
    • 任何一个时刻, 只有一个磁头属于活动状态, 输入输出形式以位串形式出现
    • 我们看图可以大致理解下读取数据的流程: 首先确定盘面 -> 磁臂控制磁头移动到相应磁道 -> 盘面转动到相应扇区 -> 数据从扇区中取出
    • 所以物理地址的形式是: 磁头号(盘面号), 磁道号(柱面号), 扇区号
    • 扇区的结构: 标题(10 字节), 数据(512字节), ECC纠错信息(12-16字节)
    • 以上是普通硬盘的结构, 如果想要了解SSD磁盘的构成, 参考这里
  • 磁盘的访问
    • 一次访盘请求: 读/写 , 磁盘地址(设备号, 柱面号, 磁头号, 扇区号), 内存地址(源/目)
  • 一次访问的几个动作(普通磁盘)
    • 寻道(时间): 磁头移动到磁道的时间
    • 旋转延时: 特定扇区从磁头旋转经过
    • 数据传输: 实际的数据从磁盘传输到内存的时间

ps. SSD盘是没有寻道和旋转时间的, 只有数据传输的时间,所以SSD盘速度快

磁盘空间管理

相关数据结构

  • 位图
    • 位图是管理磁盘物理块的数据结构,其中位图中的每一个数字对应一个物理块,其中0代表已经分配出去,1代表还是空闲。
    • 申请物理块时, 去位示图中寻找为1的号,返回对应的物理块号
    • 归还物理块时, 将位示图中对应的位置设置成1
  • 空闲块表
    • 将所有空闲块记录在一个表中
    • 记录信息主要是空闲块起始块号和数量(连续多少个空闲块)
  • 空闲块链表
    • 将所有空闲块链成一个链
    • 改进: 成组链接法(UNIX), 相当于将节点分组管理,具体参考这里
  • 磁盘地址和块号的转换方法, 参考这里

文件控制块与文件管理

  • 文件控制块
    • 为管理文件而设置的数据结构. 保存管理文件所需的所有有关信息(文件属性和元信息)
    • 常用属性: 文件名, 文件号码, 文件大小, 文件地址, 创建时间, 最后修改时间, 最后访问时间, 保护, 口令, 创建者, 当前拥有者, 文件类型, 共享计数, 标志(只读, 隐藏, 系统, 归档,ACII, 顺序/随机访问, 临时文件, 锁)
  • 文件目录
    • 统一管理每个文件的元数据, 支持文件名->物理地址的映射
    • 将所有文件的管理信息组织在一起就是文件目录
  • 目录文件
    • 将文件以目录的形式存放在磁盘上
  • 目录项
    • 构成文件的基本单元
    • 目录项可是是FCB(文件控制块), 或者是FCB的有序集合

文件的物理结构

  • 概念: 文件在物理介质上的存放方式
  • 我们之前说的分块, 在磁盘上是怎么存放的?
  • 块号/簇号 在FCB中怎么记录的?

连续结构

  • 文件信息存放在若干连续的物理块中
  • FCB记录方式
    • 记录着文件第一块的块号
    • 记录着文件块长度
  • 连续结构优点
    • 简单
    • 支持顺序存取, 随机存取
    • 所需寻道时间和寻道次数少
    • 同时读入多个块, 检索一块简单
  • 缺点
    • 不能动态增长
    • 不利于文件插入删除
    • 容易产生外部碎片: 紧缩技术

链接结构

  • 文件信息存放在不连续的物理块中, 各块之间通过指针链接
  • FCB记录方式
    • 只需要记录第一块的信息就行,当然也可以存放长度信息
  • 优点
    • 提升了磁盘空间的利用率, 不存在外碎片, 任何一个物理块都可以分配
    • 利于插入删除, 动态操作
    • 利于动态扩充
  • 缺点
    • 存取速度慢, 不能随机存取
    • 指针可能会出错, 对文件可靠性产生影响
    • 更多的寻道次数和时间
    • 链接指针也占据一部分空间
  • 文件分配表(FAT)
    • 也是一种链接结构, 是链接结构的变形. 核心思想是将所有的文件连续块号存放在一张表中。我们通过查到某一块, 可以马上发现下一块直到某一块值为-1为止。
    • 文件的起始块号存放在哪?
      • 存放在FCB中

索引结构

  • 概念: 文件信息存放在不连续的物理块中, 系统为每个文件建立了专门的数据结构叫做索引表。
  • 索引表: 磁盘块地址的数组, 第i条就是磁盘中第i块
  • FCB中存放的是索引表的块号, 比如我要查B文件的地址, 那么从FCB中查找文件的存放索引的块号就行, 因为该块中存放了所有B文件需要的物理块
  • 优点
    • 保持了链的优点, 去除了缺点
    • 支持随机存取/顺序存取
    • 满足了文件动态增长, 插入删除要求
    • 能充分利用磁盘空间
  • 缺点
    • 较多的寻道次数和时间
    • 索引表本身带来一定的开销

索引表的组织方式

  • 索引表很大, 需要若干物理块来存放索引表
  • 解决方案
    • 链接方式: 一个盘块存一个索引表, 多个索引表链接起来
    • 多级索引方式: 索引表地址放另一个表中
    • 综合模式: 物理块中存放次级索引表或者文件物理块号索引

UNIX三级索引结构

  • 流程简介
    • 每个文件主索引表中有15个索引项(FCB中), 每项2个字节
    • 前12项直接存放文件的物理块号(直接寻址)
    • 如果文件大于12块, 则利用13项指向一个物理块, 该物理块存放的事一级索引表(ps.假设扇区512字节, 一个扇区等于一个物理块大小, 一级索引可以存放256个物理块)
    • 对于更大的文件14和15项可以支持2级3级索引

文件系统的实现

  • 需要考虑的问题
    • 磁盘上内容的布局
    • 内存中内容的布局
  • 相关术语
    • 磁盘分区: 把物理磁盘分为几个独立的分区
    • 文件卷: 磁盘上的逻辑分区, 由一个或多个物理块(簇)组成
      • 一个文件卷可以是整个磁盘或者部分磁盘或跨盘(RAID)
      • 同一个文件卷使用同一份管理数据进行文件的分配和磁盘空闲空间的管理, 不同文件卷中的管理数据是相互独立的
      • 文件卷上的内容: 文件系统信息, 一组文件(用户文件, 目录文件), 未分配空间
    • 块/簇: 一个或多个(2的幂)连续的扇区, 可寻址数据块
    • 格式化: 在一个文件卷上建立文件系统, 即建立并初始化用于文件分配和磁盘空闲空间管理的管理数据(元数据)

磁盘上的布局

  • 引导区
    • 包括了从该卷引导操作系统所需要的信息, 每个卷(分区)一个, 通常为第一个扇区
  • 卷(分区)信息
    • 包括该卷的块(簇)数,块(簇)大小,空闲块(簇)数量和指针, 空闲FCB数量和指针等
  • 目录文件
  • 用户文件

内存中的布局

  • 内存所需数据结构(UNIX)
    • 系统打开文件表: 整个系统维护一张表, 放在内存, 用于保存已打开文件的FCB.
      • 主要包括: FCB(i节点)信息, 引用计数, 修改标记
    • 用户打开文件表: 每个进程一个, 进程的PCB中记录了用户打开文件表的位置。
      • 主要包括: 文件描述符, 打开方式, 读写指针, 系统打开文件表索引

文件系统实例Unix

待更新