面试基础篇|操作系统复习(九)——文件管理

398 阅读17分钟
1. 文件的属性
  • 文件名,用户自定义的文件名,同一目录下不允许有重名文件

  • 标识符,操作系统用于区分各个文件的一种内部名称

  • 类型,文件的类型

  • 位置,文件存放的路径(用户可见使用)、在外存中的地址(操作系统使用)

  • 大小,文件的大小

  • 保护信息,对文件进行保护的访问控制信息

  • 结构

    • 无结构文件,由一系列二进制或字符流组成
    • 有结构文件
2. 操作系统提供的文件基本功能
  • 创建文件(create系统调用)
  • 删除文件(delete系统调用)
  • 读文件(read系统调用)
  • 写文件(write系统调用)
  • 打开文件(open系统调用)
  • 关闭文件(close系统调用)
3. 文件的逻辑结构
  • 无结构文件

    • 文件内部的数据就是一系列二进制流或字符流组成,又称“流式文件”,如:Windows操作系统中的.txt文件
  • 有结构文件

    • 由一组相似的记录组成,又称“记录式文件”,如:数据库表文件

    • 每个记录又若干个数据项组成,每条记录有一个数据项可作为关键字(用于识别不同的记录)

    • 根据每条记录的长度(占有的存储空间)是否相等,又可分为定长记录和可变长记录两种

    • 逻辑结构

      • 顺序文件

        • 文件中的记录一个接一个地顺序排列(逻辑上),记录可以是定长的或可变长的

        • 各个记录在物理上可以顺序存储或链式存储

        • 串结构,记录之间的顺序与关键字无关

        • 顺序结构,记录之间的顺序按关键字顺序排列

        • 链式存储

          • 无论是定长或者是可变长记录,都无法实现随机存取,每次只能从第一个记录开始依次往后查找
        • 顺序存储

          • 可变长记录

            • 无法实现随机存取,每次只能从第一个记录开始依次往后查找
          • 定长记录

            • 可实现随机存储,记录长度为L,则第i个记录存放的相对位置是i*L
            • 采用串结构,无法快速找到某关键字的对应的记录
            • 采用顺序结构,可以快速找到某关键字对应的记录(如折半查找)
      • 索引文件

        • 建立一张索引表以加快文件的检索速度,每条记录对应一个索引项
        • 索引表本身是定长记录的顺序文件,可以快速找到第i个记录对应的索引项
        • 可将关键字作为索引号内容,若按关键字顺序排列,可以支持按照关键字折半查找
        • 用于对信息处理的及时性要求比较高的场合
        • 可以用不同的数据项建立多个索引表
      • 索引顺序文件

        • 索引文件和顺序文件思想的结合
        • 建立一张索引表,一组记录对应一个索引表项
        • 索引顺序文件的索引项不需要关键字顺序排列,可以提升新表项插入的速度
      • 多级索引顺序文件

        • 建立多级索引表,提高检索效率
4. 文件目录
  • 文件控制块

    • 目录文件中的一条记录就是一个“文件控制块(FCB)”
    • FCB的有序集合称为“文件目录”,一个FCB就是一个文件目录项
    • FCB中的最重要、最基本的是文件名、文件存放的物理地址
    • FCB中包含了文件的基本信息(文件名、物理地址、逻辑结构、物理结构等),存取控制信息(是否可读/可写、禁止访问的用户名单等),使用信息(如文件的建立时间、修改时间等)
  • 目录结构

    • 单级目录结构

      • 整个系统中只建立一张目录表,每个文件占一个目录项
      • 单级目录实现了“按名存取”,但是不允许文件重名
      • 创建文件时,先检查目录表是否存在重名文件,确定不重名后才能允许建立文件,并将新文件对应的目录项插入到目录表中
      • 不适用于多用户操作系统
    • 两级目录结构

      • 分主文件目录(MFD)和用户文件目录(UFD)
      • 主文件目录记录用户名及相应用户文件目录的存放地址
      • 用户文件目录由该用户的文件FCB组成
      • 允许不同用户的文件重名
      • 可以在目录上实现访问控制
      • 用户不能对自己的文件进行自定义分类
    • 多级目录结构

      • 又称树形目录结构
      • 用户访问某个文件时要用文件路径名标识文件,文件路径名时个字符串
      • 各级目录之间用“/”隔开,从根目录出发的路径称为绝对路径
      • 从当前目录出发称为“相对路径”,在Linux中,“.”表示当前目录
      • 不便于实现文件的共享
    • 无环图目录结构

      • 树形目录结构的基础上,增加一些指向同一节点的有向边,使整个目录成为一个有向无环图
      • 可以方便地实现多个用户间的文件共享
      • 可以用不同的文件名指向同一个文件,甚至可以指向同一个目录(共享同一目录下的所有内容)
      • 设置每个共享节点设置一个共享计数器,用于记录此时有多少个地方在共享该结点。用户提出删除结点请求时,只是删除该用户的FCB,并使共享计数器减1,并不会直接删除共享结点。只有共享计数器减为0时,才删除结点
      • 共享文件不同于复制文件,在共享文件,由于各用户指向的是同一个文件,文件数据一旦被修改,所有用户都可以看到文件数据的变化
  • 索引结点

    • 文件控制块(FCB)的简化改进
    • 除了文件名之后的所有信息都放到索引结点中,每个文件对应一个索引结点
    • 目录项中只包含文件名、索引结点指针,每个目录项的长度大幅减小,磁盘块可以存储更多个目录项,检索文件时磁盘的I/O的次数就会减少
5. 文件的物理结构
  • 磁盘中的存储单元会被分为“块/磁盘块/物理块”,很多操作系统中,磁盘块的大小与内存块、页面的大小相同,有利于内存与磁盘之间的数据交换
  • 在外存管理中,为了方便对文件数据的管理,文件的逻辑地址空间也被分为一个个的文件“块”,文件的逻辑地址表示为(逻辑块号,块内地址)的形式
  • 操作系统以块为单位为文件分配存储空间
  • 用户通过逻辑地址来操作自己的文件,操作系统要负责实现从逻辑地址到物理地址的映射
6. 文件分配方式
  • 连续分配

    • 每个文件在磁盘中占用一组连续的块
    • 文件目录中记录存放的起始块号和长度
    • 操作系同可以直接算出逻辑块号对应的物理块号,连续分配支持顺序访问和直接访问(即随机访问)
    • 连续分配的文件在顺序读/写时速度最快
    • 物理上采用连续分配的文件不方便拓展
    • 物理上采用连续分配,存储空间利用率低,会产生难以利用的磁盘碎片,可以耗费很大的事件代价用紧凑来处理碎片
  • 链接分配

    • 采取离散分配的方式,可以为文件分配离散的磁盘块,可分为隐式链接和显式链接两种

      • 隐式链接

        • 文件目录中存储了起始块号和结束块号,或者增加一个字段来表示文件的长度
        • 每个硬盘块中保存指向下一个盘块的指针,这些指针对用户时透明的
        • 采用链式分配(隐式链接)方式,只支持顺序访问,不支持随机访问,查找效率低
        • 每个磁盘块会耗费少量的空间存储指针
        • 采用链式分配(隐式链接)方式,方便文件拓展,不会有碎片问题,外存利用率高
      • 显式链接

        • 文件目录中只存储文件的起始块号
        • 把用于链接文件各物理块中的指针显式地存放在一张表中,即文件分配表(FAT)
        • 一个磁盘仅设置一张FAT,启动时,将FAT读入内存,并常驻内存
        • FAT的各个表项在物理上连续存储,且每一个表项长度相同,因此“物理块号”字段可以是隐含的
        • 采用链式分配(显式链接)方式,支持顺序访问,也支持随机访问,块号转换不需要访问磁盘,直接访问内存,查找效率较快
        • 采用链式分配(显式链接)方式,文件分配表会占用内存
  • 索引分配

    • 采取离散分配地方式,系统会为每个文件建立一张索引表

    • 索引表记录了文件的各个逻辑块对应的物理块

    • 索引表存放的磁盘块称为索引块,文件数据存放的磁盘块称为数据块

    • 文件目录存储索引块的块号,通过索引块可以找到对应的物理块,从而实现文件逻辑块号到物理块号的转换

    • 支持随机访问,文件拓展也很容易实现(只需要给文件分配一个空闲块,并增加一个索引表项即可)

    • 索引表需要占用一定的存储空间

    • 文件太大,索引项不能使用一个硬盘块全量存入的解决方案

      • 链接方案

        • 使用指针把索引块链接起来,文件目录存储第一个索引块
        • 磁盘I/O次数过多,查找效率低下,找第i号索引块,必须先读入0~i-1号索引块
      • 多级索引

        • 建立多层索引,是第一层索引块指向第二层索引块,文件目录存储顶级索引表
        • 采用K层索引结构,且顶级索引表未调入内存,则访问一个数据块需要K+1次读盘操作
        • 即便小文件,访问一个数据块依然需要K+1次读磁盘
      • 混合索引

        • 顶级索引表中包含直接地址索引(直接指向内存块),又包含一级间接索引(指向单层索引表)、还包含两级间接索引(指向两层索引表),文件目录存储顶级索引表
        • 对于小文件,访问一个数据块所需的读磁盘次数更少
7. 文件存储空间管理
  • 存储空间的划分与初始化

    • 存储空间的划分,将物理磁盘划分为一个个文件卷(逻辑卷、逻辑盘)
    • 存储空间的初始化,将文件卷划分为目录区、文件区,目录区主要存放文件目录(FCB),文件区存放文件数据
  • 存储空间管理

    • 空闲表法

      • 适用于“连续分配方式”
      • 分配连续的存储空间,可采用首次适应、最佳适应、最坏适应的算法决定为文件分配区间
      • 回收时需要注意表项的合并问题
    • 空闲链表法

      • 空闲盘块链

        • 以盘块为单位组成一条空闲链,操作系统保存着链头、链尾指针
        • 分配空间时,从链头开始依次进行盘块分配,并修改空闲链的链头指针
        • 回收空间时,回收的盘块依次挂到链尾,并修改空闲链的链尾指针
      • 空闲盘区链

        • 以盘区为单位组成一条空闲链,操作系统保存着链头、链尾指针
        • 分配空间,可采用首次适应、最佳适应等算法,从链头开始检索,按照算法规则找到适合的空闲盘区分配给文件
        • 回收空间时,回收区和空闲盘区相邻,则需要将回收区合并到空闲盘区中,若回收区没有和任何空闲区相邻,将回收区作为单独的一个空闲盘区挂到盘尾
    • 位示图法

      • 每个二进制位对应一个盘块
      • 分配空间,顺序扫描位示图,找到位标识为空闲的连续或不连续的盘块;根据字号,位号算出对应的盘块号,将相应盘块分配给文件;将相应位设置为已分配标识
      • 回收空间,根据回收的盘块号计算出对应的字号、位号;将相应位设为空闲标识
    • 成组链接法

      • UNIX采用的策略,适合大型文件系统
8. 文件的基本操作
  • 创建文件

    • create系统调用

    • 进行create系统调用,需要提供的主要参数

      • 所需的外存空间大小
      • 文件存放路径
      • 文件名
    • 操作系统处理create系统调用时,主体流程

      • 在外存中找到文件所需的空间
      • 根据文件存放路径的信息找到该目录对应的目录文件,在目录中创建该文件对应的目录项
  • 删除文件

    • delete系统调用

    • 进行delete系统调用,需要提供的主要参数

      • 文件存放路径
      • 文件名
    • 操作系统处理delete系统调用时,主体流程

      • 从目录中找到文件名对应的目录项
      • 根据目录项纪录的文件在外存的存放位置等信息,回收文件占用的磁盘块
      • 从目录表中删除文件对应的目录项
  • 打开文件

    • open系统调用

    • 进行open系统调用,需要提供的主要参数

      • 文件存放路径
      • 文件名
      • 要对文件的操作类型(如:r只读;rw读写等)
    • 操作系统处理open系统调用时,主体流程

      • 根据文件存放路径的信息找到该目录对应的目录文件,在目录中创建该文件对应的目录项,检查用户是否有指定的操作权限
      • 将目录项复制到内存中的“打开文件表”中,返回对应表目的索引号(也称“文件描述符”),之后用户使用打开文件表的编号来指明要操作的文件
    • 打开文件表

      • 每个进程有自己的打开文件表、系统中也有一张总的打开文件表
      • 进程打开文件表中的特有属性,读写指针、访问权限(只读?读写?)
      • 系统打开文件表中的特有属性,打开计数器(有多少个进程打开了多少该文件)
  • 关闭文件

    • close系统调用

    • 进行close系统调用

    • 操作系统处理close系统调用时,主体流程

      • 将进程的打开文件表相应表项删除
      • 回收分配给该文件的内存空间等资源
      • 系统打开文件表的打开计数器count减1,若conut=0,则删除对应表项
  • 读文件

    • read系统调用

    • 进行read系统调用,需要提供的主要参数

      • 打开文件表的索引号
      • 指明读入的数据量
      • 指明读入的数据放在内存中的位置
    • 操作系统处理close系统调用时,主体流程

      • 从读指针指向外存中,将用户指定大小的数据读入用户指定的内存区域中
  • 写文件

    • write系统调用

    • 进行write系统调用,需要提供的主要参数

      • 提供文件在打开文件表中的索引号
      • 指明写入的数据量
      • 指明写入的数据放在内存中的位置
    • 操作系统处理write系统调用时,主体流程

      • 从用户指定的内存区域中,将指定大小的数据写回写指针指向的外存
9. 文件共享
  • 操作系统为用户提供文件共享功能,可以让多个用户共享地使用同一个文件

  • 基于索引结点的共享方式(硬链接)

    • 索引结点中设置一个链接计数变量count,用于表示链接到本索引结点上的目录项数
    • 当链接计数变量count>0的时候,还有别的用户要使用该文件,暂时不能把文件数据删除,否则会导致指针悬空
    • 当链接计数变量count=0的时候,系统负责删除文件
  • 基于符号链的共享方式(软链接)

    • 通过创建Link类型的文件,记录文件存放路径
    • 即使软链接指向共享文件已被删除,Link型文件依然存在,只是通过Link型文件中的路径区查找共享文件会失败
    • 访问共享文件时要查询多级目录,会有多次磁盘I/O,访问速度相对硬链接会较慢
10. 文件保护
  • 口令保护

    • 口令存放在文件对应的FCB或索引结点中,用户访问校验的时候,会与FCB中存储的口令进行对比
    • 保存口令的空间开销不多,验证口令的时间开销也很小
    • 正确的“口令”存放在系统内部,不够安全
  • 加密保护

    • 通过加密算法对文件进行加密,在访问文件时,需要提供正确的“密码”才能对文件进行正确的解密
    • 保密性强,不需要在系统中存储“密码”
    • 编码/译码,或者说加密/解密要花费一定时间
  • 访问控制

    • 每个文件的FCB(或索引结点)增加一个访问控制列表(ACL),记录各个用户可以对该文件执行哪些操作
    • 访问类型包含,读,写,执行,添加,删除,列表清单
    • 精简的访问控制列表,简化访问控制列表,以“组”为单位,标记各“组”用户可以对文件执行哪些操作
    • 实现灵活,可以实现复杂的文件保护功能
11. 文件系统的层次结构
  • 层次排序(从上至下)

    • 用户接口->文件目录系统->存储控制模块->逻辑文件系统与文件信息缓冲区->物理文件分配模块->辅助分配模块,设备管理模块
  • 用户接口

    • 文件系统需要向上层的用户提供一些简单易用的功能接口
    • 用于处理用户发出的系统调用请求(Read、Write、Open、Close等系统调用)
  • 文件目录系统

    • 根据用户给出的文件路径找到相应的FCB或索引结点
    • 所有与目录、目录项相关的管理工作都在本层完成,如:管理活跃的文件目录表、管理打开文件表等
  • 存储控制模块

    • 文件保护相关功能
  • 逻辑文件系统与文件信息缓冲区

    • 将记录号转换为对应的逻辑地址
  • 物理文件分配模块

    • 将上一层提供的文件逻辑地址转换为实际的物理地址
  • 辅助分配模块

    • 负责文件存储空间的管理,负责分配和回收存储空间
  • 设备管理模块

    • 直接与硬件交互,负责和硬件直接相关的一些管理工作,如:分配设备、分配设备缓冲区等
11. 总结
  • 重点:文件的逻辑结构
  • 重点:文件目录
  • 重点:文件分配方式
  • 重点:文件存储空间管理
  • 重点:文件共享
  • 请各位大佬发现错误,能指导菜鸟小弟
  • 菜鸟也想努力进大厂,加油