文件管理

文件管理

  • 引入:

    • 核心:屏蔽底层不同存储介质的异构性
    • 每种存储介质的 基本存储单元 显然是不同的 (磁盘、磁带、光盘…)
    • 每台计算机显然可以同时拥有这些不同的存储介质
    • 操作系统为了统一管理不同的存储介质的存储而提出了 文件 的这种抽象的概念
      • 解释1:无论具体的存储介质是如何实现的,操作系统都只会认为这种存储介质的基本存储单元是文件而不是其他的
      • 解释2:操作系统如果不提供 文件 这种抽象概念,那么显然操作系统需要为每种介质单独提供管理的实现,显然是非常麻烦的
  • 组成:

文件系统接口

概念

  • 定义:

  • 组成:数据 + 程序

  • 属性:所有 文件属性 信息都保存在 目录结构

    • 名称:(1) 以人类的可读形式保存的 唯一 信息 (2) 名称 是否区分大小 写取决于操作系统的具体实现 (Window 不区分大小写 )
    • 标识符:操作系统用于识别每个文件的 唯一 符号
    • 类型:扩展名 (可以指明文件内部结构)
    • 尺寸:文件当前的大小 (文件的 实际占用空间 会比文件自身要大)
    • 访问:用户对于文件读写和执行的 权限
    • 时间 & 日期:文件被创建或者被修改的时间

    1cf8fc38110237e37c958a12e3c04fdc.png

  • 操作:所有文件操作都是通过 系统调用 实现

    • 创建文件:

    • 读文件:

      • 系统调用参数:文件名称 + 读入数据大小 + 读入数据存放的内存地址
      • 系统实际行为:(1) 使用 文件名称 在目录中搜索其在 磁盘的位置 (2) 将文件加载到指定的内存地址中 (3) 文件读指针 指向文件中的第一条数据
    • 写文件:

    • 重定位文件:(?)

      • 系统调用参数:文件地址
      • 系统实际行为:将当前文件指针指向新的文件地址
    • 删除文件:

      • 系统调用参数:文件名称
      • 系统实际行为:(1) 使用 文件名称 在目录中搜索其在 磁盘的位置 (2) 释放文件在磁盘中占用的空间 (3) 删除目录中相应的文件条目
    • 截断文件

    • 注意点:上述 6 个文件操作仅组成了文件操作的最小集合,实际的文件操作并不只有这些

  • 打开文件表:

    • 引入:

      • 上述所有的文件操作几乎都涉及搜索文件在磁盘中的位置
      • 为了简化这个重复搜索的操作,要求每次对文件操作之前都应该执行打开文件的操作
      • 被打开的文件的属性都会被打开文件表记录
    • 定义:(1) 维护所有打开文件的属性 (2) 每个打开文件都与一个索引映射 (便于其余文件操作可以快速找到文件而不用搜索)

    • 分类:

    • 问题:为什么需要系统打开文件表和进程打开文件表?

      • 多个进程可以同时打开同一个文件并且各自对其进行操作,每个进程对文件的操作不同显然文件指针不应该是共享的
      • 文件指针如果保存在系统打开文件表中,那么想要实现文件指针独立,那么多个进程打开同一个文件需要非常多重复的映射关系
      • 为此只能够将文件指针独立存放在进程打开文件表中,而系统打开文件表中仅存放文件相关信息
  • 文件锁

    • 引入:多个进程可以同时打开同一文件并对其进行操作显然就很容易造成数据的不一致性

    • 锁类型:

      • 共享锁:多个进程可以同时获取共享锁:允许多个进程同时对文件进行读取操作
      • 独占锁:仅有一个进程可以获取独占锁:仅允许一个进程对文件进行写入操作
    • 锁机制:

      • 强制文件锁定机制:文件的独占锁已经被进程获取时,其余想要访问该文件的进程都会被操作系统禁止

      • 建议文件锁定机制:文件的独占锁已经被进程获取时,操作系统不会禁止访问,而是由开发人员自行控制锁的获取和释放

        注:控制不当显然是会造成死锁的

    • 细节:

访问

目录

概念

结构

挂载

共享

文件系统实现

概述

  • 卷引导控制块:
    • 定义:存放引导并加载操作系统的信息 ( BIOS(加载程序) 使用引导控制块加载操作系统 )
    • 细节:(1) 没有存放操作系统的磁盘引导控制块的信息为空 (2) UFS 称为 引导块 & NTFS 称为 分区引导扇区
  • 卷控制块
    • 定义:存放每个分区的详细信息 (块数量,块大小,空闲 FCB 和 空闲块)
    • 细节:UFS 称为 超级块 & NTFS 仍然称为卷控制块并且存放在 主控文件表
  • 目录结构 & 文件控制块
    • 定义:每个目录结构中都存放文件控制块的指针 -> 文件控制块实际存放在磁盘中的某个位置
    • 细节:NTFS 中将 目录结构 同样存放在 主控文件表 中并且 文件控制块 的存放采用 关系型数据库 的方式
  • 挂载表:
  • 打开文件表:(1) 系统打开文件表 (2) 进程打开文件表

实现结构

f01ad08104791bb17392f3aae6bb9ce1.png

实现操作

  • 创建文件

    • 逻辑文件系统为新文件分配一个空闲的 FCB 并初始化 FCB
    • 逻辑文件系统向低层的机构发出指令将磁盘中的 目录结构加载到内存中
    • 逻辑文件系统将新的 FCB 更新到目录结构中再写回到磁盘中
  • 打开文件

    • 确定当前文件是否已经被打开

      (1) 如果当前文件没有被打开 -> 将该文件的 FCB 复制到系统打开文件表中 -> 在该 进程打开文件表创建条目 并指向 系统打开文件表 中的该文件

      (2) 如果当前文件已经被打开 -> 在该 进程打开文件表创建条目 并指向 系统打开文件表 中的该文件

    • 每个进程打开该文件都需要在系统打开文件表的计数器上增加一

  • 读文件

  • 写文件

051d4aab50f20c3d82c6b83460e755df.png

实现目录

  • 线性列表
    • 实现:目录条目 = ==文件名称 + FCB 指针==
    • 优点 & 缺点:
      • 优点:实现简单
      • 缺点:查找文件是 ==线性搜索==,效率非常低
    • 优化方式:(1) 形成有序列表使用二叉搜索 (2) 使用平衡树 (3) 使用缓存
    • 重用目录:(1) 将目录条目的名称改为空白 (2) 增加比特位标识使用情况或者表结构记录当前空闲条目 (3) 将目录结构最后一条复制到暂时不使用的位置并且清除最后一条
  • 哈希列表

实现分配

  • 前提:

  • 连续分配

  • 非连续分配

    • 链接分配

      • 定义:(1) 每个文件在磁盘空间中占有的物理块是分散的 (2) 每个物理块都具有下一个物理块的块号 (指针)

      • 优点:(1) 不会产生外部碎片 (每个块都是专属于一个文件的) (2) 不会产生文件扩展问题:(文件扩展时只需要链接空闲块就行)

      • 缺点:

        (1) 仅支持顺序访问 解决方式:文件分配表

        (2) 每个块存放数据 + 指针两种信息 导致文件实际占用的空间大于文件本身的大小

        ​ 解决方式:采用 为磁盘最小存储单位,每个簇包含多个块,每个簇使用一个指针

        (3) 不具有可靠性:指针出现损坏或者错误就会导致文件数据丢失

        ​ 解决方式:(1) 采用双向链表 (即使出现指针错误也能勉强找到文件的块) (2) 每块存储文件名称和逻辑块号 (即使指针错误也可以利用这两个参数找到) (3) 文件分配表

      • 文件分配表:

        • 定义:(1) 每个磁盘块都对应一个条目 & 使用 块号索引条目 (2) 每个条目包含下一个物理块的块号 (指针)

          注:只需要通过物理块就可以找到对应的数据了也就是说物理块号就是磁盘地址

        • 优点:(1) 改善随机访问的时间 (2) 指针的的损坏不会导致数据丢失

        • 缺点:(1) 过大的文件会导致 FAT 很大 (2) FAT 可能导致大量的寻道时间

    • 索引分配

实现空间管理

  • 位向量
  • 链表
  • 计数
Author: Fuyusakaiori
Link: http://example.com/2021/09/11/os/file-system/文件管理/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.