操作系统 | 文件管理

文章目录

    • 初识文件管理
      • 文件的属性
      • 文件内部的数据应该怎样组织起来?
      • 文件之间应该怎样组织起来
      • 操作系统应该向上提供哪些功能?
      • 从上往下看,文件应该如何存放在外存?
      • 其他需要由操作系统实现的文件管理功能
    • 文件的逻辑结构
      • 无结构文件
      • 有结构文件
        • 顺序文件
        • 索引文件
        • 索引顺序文件
          • 索引顺序文件
          • 索引顺序文件检索效率分析
          • 多级索引顺序文件
    • 文件目录
      • 文件控制块
      • 目录结构
        • 单级目录结构
        • 两级目录结构
        • 多级目录结构
        • 无环图目录结构
      • 索引结点(FCB的改进)
    • 文件的物理结构(文件的分配方式)
      • 文件块、磁盘块
      • 连续分配
      • 链接分配
        • 隐式链接
        • 显式链接
      • 索引分配
    • 逻辑结构 v.s. 物理结构
      • C语言创建无结构文件
        • 逻辑结构(从用户视角看)
        • 物理结构(从操作系统视角看)
      • C语言创建顺序文件
        • 逻辑结构(从用户视角看)
        • 物理结构(从操作系统视角看)
      • 懵逼点:顺序文件采用顺序存储/链式存储?
      • 链式存储的顺序文件采用连续分配
      • 链式存储的顺序文件采用链接分配
      • 逻辑结构:索引文件
      • 索引文件采用索引分配
    • 文件存储空间管理
      • 存储空间的划分与初始化
      • 存储空间管理
        • 空闲表法
        • 空闲链表法
        • 位示图法
        • 成组链接法
    • 文件的基本操作
      • 创建文件
      • 删除文件
      • 打开文件
      • 关闭文件
      • 读文件
      • 写文件
    • 文件共享
      • 基于索引结点的共享方式(硬链接)
      • 基于符号链的共享方式(软链接)
    • 文件保护
      • 口令保护
      • 加密保护
      • 访问控制
        • Windows的访问控制
    • 文件系统的层次结构(408大纲不要求考察)
    • 文件系统的全局结构(布局)
      • 文件系统在外存中的结构
        • 原始磁盘
        • 物理格式化
        • 逻辑格式化
      • 文件系统在内存中的结构
      • open系统调用打开文件的背后过程
    • 虚拟文件系统
      • 普通的文件系统
      • 虚拟文件系统
    • 文件系统的挂载(mounting)
    • 磁盘的结构
      • 磁盘、磁道、扇区
      • 如何在磁盘中读/写数据
      • 盘面、柱面
      • 磁盘的物理地址
      • 磁盘的分类
        • 活动头磁盘和固定头磁盘
        • 可换盘磁盘和固定盘磁盘
    • 磁盘调度算法
      • 一次磁盘读/写操作需要的时间
        • 寻道时间
        • 延迟时间
        • 传输时间
      • 磁盘调度算法
        • 先来先服务算法FCFS
        • 最短寻找时间优先SSTF
        • 扫描算法SCAN
        • LOOK调度算法
        • 循环扫描算法C-SCAN
        • C-LOOK调度算法
    • 减少磁盘延迟时间的方法
      • 减少延迟时间的方法:交替编号
      • 磁盘地址结构的设计
      • 减少延迟时间的方法:错位命名
    • 磁盘的管理
      • 磁盘初始化
      • 引导块
      • 坏块的管理
    • 固态硬盘SSD
      • 机械硬盘 v.s. 固态硬盘
      • 固态硬盘的结构
      • 读写性能特性
      • 磨损均衡技术

初识文件管理

操作系统 | 文件管理_第1张图片

文件的属性

操作系统 | 文件管理_第2张图片

文件内部的数据应该怎样组织起来?

操作系统 | 文件管理_第3张图片

操作系统 | 文件管理_第4张图片

文件之间应该怎样组织起来

操作系统 | 文件管理_第5张图片
操作系统 | 文件管理_第6张图片

操作系统应该向上提供哪些功能?

操作系统 | 文件管理_第7张图片
操作系统 | 文件管理_第8张图片

从上往下看,文件应该如何存放在外存?

操作系统 | 文件管理_第9张图片
操作系统 | 文件管理_第10张图片

其他需要由操作系统实现的文件管理功能

操作系统 | 文件管理_第11张图片
操作系统 | 文件管理_第12张图片

文件的逻辑结构

操作系统 | 文件管理_第13张图片

无结构文件

操作系统 | 文件管理_第14张图片

有结构文件

操作系统 | 文件管理_第15张图片
操作系统 | 文件管理_第16张图片
操作系统 | 文件管理_第17张图片
操作系统 | 文件管理_第18张图片

顺序文件

操作系统 | 文件管理_第19张图片
在这里插入图片描述
操作系统 | 文件管理_第20张图片
操作系统 | 文件管理_第21张图片

  • 只有顺序存储的定长记录文件才可以实现随机存取
索引文件

操作系统 | 文件管理_第22张图片

索引顺序文件
索引顺序文件

操作系统 | 文件管理_第23张图片

索引顺序文件检索效率分析

操作系统 | 文件管理_第24张图片

多级索引顺序文件

操作系统 | 文件管理_第25张图片
操作系统 | 文件管理_第26张图片
操作系统 | 文件管理_第27张图片

文件目录

操作系统 | 文件管理_第28张图片
操作系统 | 文件管理_第29张图片

文件控制块

  • 实现文件目录的关键数据结构
    操作系统 | 文件管理_第30张图片
  • 目录也是一种特殊的文件
  • 文件目录就是FCB的有序集合,一个FCB就是一个文件目录项
  • 很显然,每一个文件都会对应一个FCB
    操作系统 | 文件管理_第31张图片
  • FCB实现了文件名和文件之间的映射,其最重要的是文件名和文件存放的物理地址,FCB必须建立起文件名到文件实际存放的物理地址这样的一个映射关系
    操作系统 | 文件管理_第32张图片

目录结构

单级目录结构

操作系统 | 文件管理_第33张图片

两级目录结构

操作系统 | 文件管理_第34张图片

多级目录结构

操作系统 | 文件管理_第35张图片
操作系统 | 文件管理_第36张图片
操作系统 | 文件管理_第37张图片

无环图目录结构

操作系统 | 文件管理_第38张图片

索引结点(FCB的改进)

操作系统 | 文件管理_第39张图片
操作系统 | 文件管理_第40张图片
操作系统 | 文件管理_第41张图片

文件的物理结构(文件的分配方式)

  • 即文件的数据应该怎样存放在外存中,这些数据应该怎样被组织起来?
    操作系统 | 文件管理_第42张图片
    操作系统 | 文件管理_第43张图片

文件块、磁盘块

操作系统 | 文件管理_第44张图片

  • 内存和磁盘之间的数据交换都是以“块”为单位进行的,磁盘块的大小与内存块、页面的大小相同会给我们数据交换带来方便
    操作系统 | 文件管理_第45张图片
  • 用户在操作自己的文件的时候,可以用逻辑块号还有块内地址的形式来定位到自己文件当中的任何一个位置
  • 操作系统为文件分配存储空间也都是以块为单位的

连续分配

操作系统 | 文件管理_第46张图片

  • 顺序访问:如果我要访问逻辑块号2,那么我必须先顺序访问逻辑块号0和逻辑块号1,之后才能找到逻辑块号2
  • 直接访问/随机访问:如果我要访问逻辑块号2,那么我并不需要访问其他的逻辑块,我们可以直接找到逻辑块号2存放的位置
    操作系统 | 文件管理_第47张图片
    操作系统 | 文件管理_第48张图片
    操作系统 | 文件管理_第49张图片
    操作系统 | 文件管理_第50张图片

链接分配

在这里插入图片描述

隐式链接

操作系统 | 文件管理_第51张图片
操作系统 | 文件管理_第52张图片
操作系统 | 文件管理_第53张图片

显式链接

操作系统 | 文件管理_第54张图片
操作系统 | 文件管理_第55张图片
操作系统 | 文件管理_第56张图片

索引分配

操作系统 | 文件管理_第57张图片
操作系统 | 文件管理_第58张图片
操作系统 | 文件管理_第59张图片

  • 如果一个文件的大小超过了一个索引表所能表示的最大索引项,一个磁盘块装不下整张索引表,该如何解决?
    操作系统 | 文件管理_第60张图片
  • 如果一个文件的大小超过了256个磁盘块,那么就意味着这个文件的索引表的索引项肯定也超过了256个,因此可以把这个索引表拆分,为这个文件分配多个索引块,每一个索引块当中存放256个索引项,并且在每个索引块当中用一定的空间存储指向下一个索引块的一个指针,这样的话就可以把一个很长的索引表拆分成不同的部分,并且用链接的方式把它们连起来了
  • 我们可以看到,如果说用户想要访问的那个逻辑块号对应的索引项是在索引表当中的第二个部分的话,那么系统首先必须顺序读取索引表的第一部分,之后才能找到索引表的第二部分
    操作系统 | 文件管理_第61张图片

操作系统 | 文件管理_第62张图片

  • 若采用多层索引,则各层索引表大小不能超过一个磁盘块
  • 上面这个条件即为考试中经常会遇到的要我们计算文件最大长度的题的约束
    操作系统 | 文件管理_第63张图片
    操作系统 | 文件管理_第64张图片
    操作系统 | 文件管理_第65张图片
    操作系统 | 文件管理_第66张图片

逻辑结构 v.s. 物理结构

操作系统 | 文件管理_第67张图片

C语言创建无结构文件

操作系统 | 文件管理_第68张图片

逻辑结构(从用户视角看)

操作系统 | 文件管理_第69张图片

物理结构(从操作系统视角看)

操作系统 | 文件管理_第70张图片
操作系统 | 文件管理_第71张图片
操作系统 | 文件管理_第72张图片

  • 我们只需要给出逻辑地址,操作系统会帮我们实现逻辑地址到物理地址的转换

C语言创建顺序文件

操作系统 | 文件管理_第73张图片

逻辑结构(从用户视角看)

操作系统 | 文件管理_第74张图片

物理结构(从操作系统视角看)

操作系统 | 文件管理_第75张图片
操作系统 | 文件管理_第76张图片
操作系统 | 文件管理_第77张图片

懵逼点:顺序文件采用顺序存储/链式存储?

操作系统 | 文件管理_第78张图片

链式存储的顺序文件采用连续分配

操作系统 | 文件管理_第79张图片

链式存储的顺序文件采用链接分配

操作系统 | 文件管理_第80张图片

  • 文件内部各条记录链式存储:由创建文件的用户自己设计的
  • 文件整体用链接分配:由操作系统决定分配策略

逻辑结构:索引文件

操作系统 | 文件管理_第81张图片

索引文件采用索引分配

操作系统 | 文件管理_第82张图片

  • 索引文件的索引表:用户自己建立的,映射:关键字→记录存放的逻辑地址
  • 索引分配的索引表:操作系统建立的,映射:逻辑块号→物理块号
    操作系统 | 文件管理_第83张图片

文件存储空间管理

  • 其实就是对空闲磁盘块的管理
    操作系统 | 文件管理_第84张图片
    操作系统 | 文件管理_第85张图片

存储空间的划分与初始化

操作系统 | 文件管理_第86张图片

  • 目录区主要是用于存放文件目录相关的一些信息,比如文件目录项FCB、索引结点、用于磁盘存储空间管理的数据结构,如空闲表、位示图等
  • 文件区就是用来存放普通的文件数据

存储空间管理

空闲表法
  • 适用于文件的物理结构是【连续分配方式】

操作系统 | 文件管理_第87张图片

  • 此时用最佳适应算法找到的第一个符合的空闲磁盘块式10号,所以我们摘出3个磁盘块分配给这个文件并修改对应的空闲盘块表

操作系统 | 文件管理_第88张图片
操作系统 | 文件管理_第89张图片

  • 这里需要注意表项合并的问题
    1. 回收区前后都没有相邻的空闲区,这种情况下会在空闲盘块表中新增一个表项
    2. 回收区的前后都是空闲区,这种情况下需要把其前后的空闲区还有新回收的这个区域合并成同一个空闲区(此时表项的数量会减少一个)
    3. 回收区的前面是空闲区(不会导致空闲表表项数量的改变)
    4. 回收区的后面是空闲区(不会导致空闲表表项数量的改变)

操作系统 | 文件管理_第90张图片
操作系统 | 文件管理_第91张图片

空闲链表法

在这里插入图片描述

  • 空闲盘块链是以盘块为单位,组成一条空闲链
  • 空闲盘区链是以盘区为单位,组成一条空闲链(盘区:连续的空闲盘块可以组成一个空闲盘区)

操作系统 | 文件管理_第92张图片

  • 21号盘块就记录了21号所在盘区的长度是3并且记录了指向下一个盘区的指针

操作系统 | 文件管理_第93张图片
操作系统 | 文件管理_第94张图片

  • 假如一个文件此时需要6个磁盘块,由于在这个盘区链当中找不到连续的6个空闲磁盘块,所以我们可以把中间的12、13、14、21、22、23这两个盘区分配给文件
  • 因为空闲盘块链只能从这个链当中一个一个地把这些磁盘块摘下来,而空闲盘区链可以一次摘出大片连续的空闲区间,所以空闲盘区链在分配多个磁盘块的时候效率是要更高的
位示图法

操作系统 | 文件管理_第95张图片

成组链接法

操作系统 | 文件管理_第96张图片
操作系统 | 文件管理_第97张图片

  • 超级块中记录了下一组空闲盘块的数量,充当了链头的作用,在这个链头当中永远要保持指向下一个分组的一些信息

操作系统 | 文件管理_第98张图片
操作系统 | 文件管理_第99张图片

  • 第一个分组100个空闲盘块,所以第一个分组是足够本次分配的,因此接下来我们会把第一个分组的这100个磁盘块全部分配出去
  • 不过值得注意的是300号磁盘块储存了在下一个分组的这些磁盘块的信息,因此如果我们把300号磁盘块直接分配给那个文件,不做任何处理的话,那和下一组的这些链接信息就全断掉了,因此在我们把300号磁盘块正式分配给文件之前,我们需要把300号磁盘块当中的数据给复制到超级块当中,这样的话就可以保证虽然这个分组已经全部分配给这个文件了,但是下一个分组的这些链接信息我们依然是保存在超级块当中的
    操作系统 | 文件管理_第100张图片
    操作系统 | 文件管理_第101张图片
  • 需要注意的是每个分组真实分配出去之前需要把这个分组指向下一分组的那些链接信息复制到超级块当中,超级块充当了链头的作用,在这个链头当中永远要保持指向下一个分组的一些信息
    操作系统 | 文件管理_第102张图片
  • 如果分组没满的话可以把这个回收的空闲块插到第一个分组当中
    操作系统 | 文件管理_第103张图片
    操作系统 | 文件管理_第104张图片
  • 假设此时第一个分组已经满了,总共100个块,如果此时还要回收一个空闲块的话,我们可以把这个新回收的空闲块作为一个新的分组
  • 不过需要注意的是我们需要把这个超级块里面的内容复制到新回收的块当中,这样的话这个新回收的块作为新的分组就拥有了指向下一个分组的这些链接指针
    操作系统 | 文件管理_第105张图片
    操作系统 | 文件管理_第106张图片
    操作系统 | 文件管理_第107张图片
  • 这种情况下链表很长,从头到尾扫描一遍效率会非常低
    操作系统 | 文件管理_第108张图片
  • 把相邻的块当作一个链表节点,一串相邻的块就设置一个指针,这样整条链就短了很多了
  • 但是万一大部分的空闲盘块都是不相邻的,链表整体也会变得很长,我们可以把不相邻的块也归为一组
    操作系统 | 文件管理_第109张图片
  • 有4组,每组内的盘块不一定相邻,它们通过指针与第一个盘块保持关系,每组的第一个盘块串成一个链表
    操作系统 | 文件管理_第110张图片
    操作系统 | 文件管理_第111张图片
    操作系统 | 文件管理_第112张图片
  • 1号盘块即为超级块,它比较特殊,需要事先调入内存
  • 内部其实保存了一个栈,名字叫s.free,也就是空闲盘区栈,N指明了栈中的元素个数,同时也指明了超级块所指的下一组空闲盘块数
    操作系统 | 文件管理_第113张图片
  • 3、4是单纯的空闲盘块,而盘块2是不一样的,它保存了下一组的链接信息
    操作系统 | 文件管理_第114张图片
    操作系统 | 文件管理_第115张图片
    操作系统 | 文件管理_第116张图片
  • 再来看空间分配问题,假如要为文件分配几个磁盘块,系统会先从超级块中出栈一个编号,然后把这个编号所对应的磁盘块分配给文件
    操作系统 | 文件管理_第117张图片
    操作系统 | 文件管理_第118张图片
  • 如果还不够则继续出栈
    操作系统 | 文件管理_第119张图片
    操作系统 | 文件管理_第120张图片
  • 盘块2保存着下一组空闲盘块的信息,其实盘块2也可以像其他普通盘块一样分配出去的,只不过在分配之前我们需要把盘块2里面的信息保存道超级块中
  • 如果此时还要继续给文件分配盘块,那么我们需要把盘块2的信息先保存到超级块当中
    操作系统 | 文件管理_第121张图片
  • 把盘块2分配给文件,作为普通的盘块使用
    操作系统 | 文件管理_第122张图片
  • 重新更新下指针
    操作系统 | 文件管理_第123张图片
  • 每当超级块所指的下一组只剩下一个盘块的时候,如果需要继续分配,就要把这个栈和n保存到超级块当中
  • 再来看下空间回收,加入此时有新的空闲盘块到来,如果超级块的栈中还有位置,我们直接往栈中填充就好了
    操作系统 | 文件管理_第124张图片
  • 当此时超级块中的栈满了之后,我们就需要把超级块的内容复制到新回收的盘块中,比如盘块3
    操作系统 | 文件管理_第125张图片
    操作系统 | 文件管理_第126张图片
    操作系统 | 文件管理_第127张图片
    操作系统 | 文件管理_第128张图片
    操作系统 | 文件管理_第129张图片
  • 如果超级块中的栈空间没有满,就直接把空闲盘块插进;如果满了之后,就需要新建一个含有栈的结点,即分组,把原来超级块中的信息转接给这个新结点,再修改超级块中的数据
    操作系统 | 文件管理_第130张图片

文件的基本操作

操作系统 | 文件管理_第131张图片

创建文件

操作系统 | 文件管理_第132张图片

删除文件

操作系统 | 文件管理_第133张图片

打开文件

操作系统 | 文件管理_第134张图片
操作系统 | 文件管理_第135张图片

关闭文件

操作系统 | 文件管理_第136张图片

读文件

  • 读文件之前必须要先打开文件
    操作系统 | 文件管理_第137张图片

写文件

操作系统 | 文件管理_第138张图片
操作系统 | 文件管理_第139张图片

  • 打开文件时并不会把文件数据直接读入内存,只是把文件的目录项给复制到了内存的打开文件表当中
  • 文件描述符:打开文件表的索引号

文件共享

操作系统 | 文件管理_第140张图片

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

在这里插入图片描述
操作系统 | 文件管理_第141张图片
操作系统 | 文件管理_第142张图片

  • 让不同用户的目录项指向同一个文件的索引结点,且不同用户对这个文件起的文件名可以是不同的

操作系统 | 文件管理_第143张图片
操作系统 | 文件管理_第144张图片
操作系统 | 文件管理_第145张图片

基于符号链的共享方式(软链接)

操作系统 | 文件管理_第146张图片

  • 此时并不是把自己的目录项直接指向这个文件的索引结点,而是创建了一个新的link型的文件,然后link型的文件当中记录了这个文件的存放路径,之后操作系统会根据这个路径来找到想要共享的那个文件

操作系统 | 文件管理_第147张图片
操作系统 | 文件管理_第148张图片
操作系统 | 文件管理_第149张图片

  • 假设此时user1和user2都不再需要使用文件1,count=0,文件和索引结点直接被操作系统干掉了

操作系统 | 文件管理_第150张图片

  • 此时访问ccc这个link型的文件,同样的操作系统会首先检查c盘下面的user这个目录,然后尝试找到aaa这个文件对应的目录项,但是由于此时aaa已经被删除了,所以通过这个路径其实已经找不到文件1了,此时软链接失效

操作系统 | 文件管理_第151张图片
操作系统 | 文件管理_第152张图片
操作系统 | 文件管理_第153张图片

文件保护

操作系统 | 文件管理_第154张图片

口令保护

操作系统 | 文件管理_第155张图片

加密保护

在这里插入图片描述

  • 系统当中保存的并不是文件的原始数据,而是保存了对文件进行加密之后的这一份数据,所以一个用户想要访问这个文件的话必须对这个文件进行解密才行,不然的话读出来的其实就是一串没有意义的乱码

操作系统 | 文件管理_第156张图片

在这里插入图片描述

访问控制

操作系统 | 文件管理_第157张图片
操作系统 | 文件管理_第158张图片

Windows的访问控制

操作系统 | 文件管理_第159张图片
操作系统 | 文件管理_第160张图片
操作系统 | 文件管理_第161张图片
操作系统 | 文件管理_第162张图片
操作系统 | 文件管理_第163张图片
操作系统 | 文件管理_第164张图片

文件系统的层次结构(408大纲不要求考察)

操作系统 | 文件管理_第165张图片
操作系统 | 文件管理_第166张图片

  • 用户接口文件基本操作那部分的内容
  • 文件目录系统文件目录那部分的内容
  • 存取控制模块文件保护那部分的内容
  • 逻辑文件系统和文件信息缓冲区文件逻辑结构那部分的内容
  • 物理文件系统文件物理结构那部分的内容
  • 辅助分配模块文件存储空间管理那部分的内容
  • 设备管理模块磁盘管理那部分的内容
    操作系统 | 文件管理_第167张图片

文件系统的全局结构(布局)

文件系统在外存中的结构

原始磁盘
  • 崭新磁盘,没有划分扇区

操作系统 | 文件管理_第168张图片

物理格式化
  • 物理格式化,即低级格式化

操作系统 | 文件管理_第169张图片

  • 物理格式化会把磁盘划分为一个一个的扇区,同时在物理格式化的时候也会检测这个磁盘当中有没有坏扇区的存在,如果有坏扇区的存在的话就会使用一些备用扇区来顶替坏扇区
  • 坏扇区的存在对于操作系统来说是透明的,假设操作系统要访问一个编号为n的坏扇区,磁盘驱动器在物理格式化之后知道哪些是坏扇区,在操作系统想要访问n号扇区的时候,磁盘驱动器就会用一个好的备用扇区来替代坏扇区工作,因此坏扇区对操作系统是透明的,操作系统意识不到坏扇区的存在
逻辑格式化
  • 逻辑格式化,又叫高级格式化
    操作系统 | 文件管理_第170张图片

  • 逻辑格式化会把磁盘分为一个一个的分区,又叫一个一个的分卷,也叫卷Volume

  • 磁盘被分为多个分区,每个分区的大小是多少,地址范围是哪里到哪里,这样的信息就需要用分区表来记录,分区表其实就是一个数据结构,说明了在这个磁盘里面每一个盘/每一个分区分别占多大的空间以及每个分区的地址范围

  • 在每个分区当中可以建立各自独立的分区系统,比如我们在C这个分区里面可以建立一个Unix文件系统,其内部结构如此:
    在这里插入图片描述

  • 引导块:负责开机的一系列操作
    操作系统 | 文件管理_第171张图片

  • 超级块:成组链接法中便于迅速找到这个磁盘分区里边的所有空闲块
    操作系统 | 文件管理_第172张图片
    操作系统 | 文件管理_第173张图片

  • 空闲空间管理:比如位示图,可以迅速判断某一个磁盘块是否空闲(注意和超级块区别,超级块的作用更多的是迅速找到若干个空闲的磁盘块)
    操作系统 | 文件管理_第174张图片

  • i 结点区:就是我们所谓的索引结点,每个文件都会有一个与之对应的索引结点,Unix文件系统当中所有的索引结点都是连续存放在 i 结点区的,可以把这个区域认为就是一个超大的数组,而数组的元素就是一个一个的索引结点,我们很容易通过一个索引结点的下标迅速定位到一个索引结点
    操作系统 | 文件管理_第175张图片

  • 根目录:当我们完成了逻辑格式化之后根目录也会被建立起来,因为任何一个文件系统都必须从根目录出发,来建立新的下一级目录或者存储新的文件

  • 所以逻辑格式化之后,C盘中灰色的部分就是已经有实际数据的部分,这是逻辑格式化填充进去的一些东西;而白色的区域会用于保存其他文件和其他目录,这片区域在逻辑格式化之后暂时为空的,只有你新建了文件或者新建了其他的目录之后这些部分才会慢慢被填充上数据

文件系统在内存中的结构

  • 内存分为用户区和内核区
  • 内核区有3个重要的东西:
    1. 目录的缓存:保存着你最近访问过的一些目录数据,会被暂时缓存在内存当中,这样不用每次都从磁盘读入目录文件,加快目录检索的速度
    2. 系统打开文件表:整个系统只有一张
    3. 用户/进程打开文件表:每个进程都会有一张对应的打开文件表,包含在每个进程的PCB当中,记录了某个进程当前打开了哪些文件
      操作系统 | 文件管理_第176张图片

open系统调用打开文件的背后过程

操作系统 | 文件管理_第177张图片

  1. 找到文件A所在的目录M,把这个目录M的数据读入内存,保存在目录缓存中保存起来
  2. 检查这个目录项,找到和文件A的文件名对应上的目录项,把文件A的FCB给复制到系统打开文件表中,表示这个文件被打开,同时设置其打开计数为1,这意味着当前有一个进程正在打开A这个文件
  3. 刚才打开文件A的这个进程有一个进程打开文件表,操作系统需要在它的进程打开文件表当中新建一个条目,同时返回这个条目的一个文件描述符
    • 这个条目当中会记录它的打开方式(只读/读/写),但是我们不会在进程打开文件表中保存这个文件A的FCB,我们只会有一个系统打开文件表的索引,这样通过进程打开文件表就可以找到系统打开文件表当中对应的条目,而在这个条目当中就可以找到这个文件所对应的FCB了
    • 文件描述符可以简单地理解为指向进程打开文件表的一个指针,也就是说当我们open打开一个文件之后,这个系统调用会给我们程序员有返回一个文件描述符fd,接下来我们通过这个文件描述符fd就可以对我们打开的文件进行相应的操作,操作系统接收到我们提交的系统调用参数中的文件描述符fd之后,首先会去进程打开文件表当中找到相应的条目,然后再根据这个索引信息再找到系统打开文件表当中对应的条目,然后再从这个条目当中找到这个文件它的FCB,通过FCB操作系统就可以确定文件存放在外存当中的什么位置

虚拟文件系统

普通的文件系统

操作系统 | 文件管理_第178张图片

  • 我们在使用计算机的时候计算机上难免会插上很多存储设备,如移动硬盘、U盘等,不同的存储设备里面的文件系统格式可能是各不相同的,那这就意味着开发者在开发不同的文件系统的时候定义的函数接口可能各不相同
  • 这就意味着程序员在写代码的时候如果要从一个文件系统打开一个文件,我们得按照不同操作系统的不同规范来写出不同的函数调用格式代码,这是十分麻烦的,程序员得根据文件所在的存储的文件系统格式来调整自己的代码
  • 操作系统内核应该向上层的用户提供一个统一的标准的函数调用接口,所以在操作系统当中就引入了虚拟存储系统VFS

虚拟文件系统

操作系统 | 文件管理_第179张图片

  • 有了虚拟文件系统之后,用户在打开一个文件的时候他只需要跟这个虚拟文件系统制定的标准来写自己的代码就可以了,虚拟存储系统会向上层用户进程提供一个统一标准的系统调用接口,屏蔽底层具体文件系统的实现差异

操作系统 | 文件管理_第180张图片

  • 接下来虚拟文件系统会负责操作底层一个具体的文件系统,但是虚拟操作系统不可能因为不同的文件系统来改变自己的系统内核代码,这是不科学的,所以虚拟文件系统会要求:如果底层的文件系统想要在我这个虚拟存储系统上被支持,就必须实现虚拟存储系统规定好的函数接口,函数名、函数里面的参数的含义和格式,都是规定好的,规定死的,如果不实现则不会被支持

操作系统 | 文件管理_第181张图片

  • UFS文件系统和FAT文件系统的目录项格式是有很大的差别的,这就意味着如果虚拟存储系统面对着不同的文件系统,在打开文件后在内存表示的文件目录项信息各不相同
    操作系统 | 文件管理_第182张图片

  • 为了解决这个问题,虚拟文件系统在我们打开了一个文件之后,虚拟文件系统就会给这个文件在主存中新建一个vnode,又叫v结点,里面包含着文件各种各样的信息,不管文件来自什么文件系统,在文件被打开之后都会把这个文件相关的信息给复制到这个vnode结点当中,这样的话虚拟文件系统就会用一个统一的数据结构vnode来表示任何一个文件的信息

  • 注意vnode和inode的区别:vnode只存在于内存当中,每一个被打开的文件在内存中都会有一个与之对应的vnode;但是inode即会被调入内存同时在外存中也会存储inode,如果我们此时打开的文建刚好实在UFS文件系统当中,那么我们找到这个文件所对应的目录项之后,会把文件的inode从外存调入内存,然后再内存中新建了一个vnode,inode里的各种信息会被复制到vnode里面

操作系统 | 文件管理_第183张图片

  • 注意vnode中标红的函数功能指针:不同的文件系统需要实现虚拟文件系统规定的一些函数的功能,如open()、read()、write()等,每个函数背后具体的代码都是不同的,所以这个vnode当中的函数功能指针其实是指向了对应文件系统的函数功能列表
  • 这样的话之后如果我们要对文件进行任何的操作,比如read()或者write()等任何操作,都可以先找到这个文件的vnode,然后根据vnode当中记录的函数功能指针再找到具体的对应的这个文件系统的函数功能列表,去执行具体的函数,实现了从上自下一层一层的函数调用,实现了对外接口的统一

文件系统的挂载(mounting)

  • 现实中的文件系统挂载:把U盘插到电脑上,U盘的这个文件系统就需要挂载到电脑的操作系统里边,具体来说就是要挂载到操作系统的虚拟文件系统里面
    操作系统 | 文件管理_第184张图片
  1. 在虚拟文件系统中注册新挂载的文件系统;在内存当中虚拟文件系统会管理一个挂载表的数据结构,表里面包含了每个文件系统的相关信息,如格式、容量大小等信息
  2. 新挂载的文件系统要向VFS提供一个函数地址列表;每一个文件系统它对文件具体操作的函数的实现都各不相同,如open()、read()、write()等,所以新挂载的文件系统需要向虚拟文件系统提供一个自己的函数地址列表,也就是vnode里面函数功能指针所指向的地方,有了它才可以让虚拟文件系统来调用我们新挂载的这个文件系统所提供的功能函数
  3. 把新文件系统加到挂载点 mount point,也就是将新文件系统挂载在某个父目录下;比如Windows操作系统中,U盘插入后会对应一个新的盘符H,和C、D、E、F盘平级,只有确定了新文件系统挂载的位置,那接下来我们才可以正常的访问和使用这个新的文件系统
    操作系统 | 文件管理_第185张图片

磁盘的结构

操作系统 | 文件管理_第186张图片

磁盘、磁道、扇区

操作系统 | 文件管理_第187张图片

操作系统 | 文件管理_第188张图片

如何在磁盘中读/写数据

操作系统 | 文件管理_第189张图片

  • 如果要对一个扇区进行读/写操作的话,需要通过磁头臂来带动磁头,让磁头放到那个扇区对应的磁道上
    操作系统 | 文件管理_第190张图片

盘面、柱面

操作系统 | 文件管理_第191张图片
在这里插入图片描述

磁盘的物理地址

操作系统 | 文件管理_第192张图片

磁盘的分类

活动头磁盘和固定头磁盘

操作系统 | 文件管理_第193张图片

可换盘磁盘和固定盘磁盘

操作系统 | 文件管理_第194张图片
操作系统 | 文件管理_第195张图片

磁盘调度算法

操作系统 | 文件管理_第196张图片

一次磁盘读/写操作需要的时间

操作系统 | 文件管理_第197张图片

寻道时间

操作系统 | 文件管理_第198张图片

延迟时间

操作系统 | 文件管理_第199张图片

传输时间

操作系统 | 文件管理_第200张图片

磁盘调度算法

先来先服务算法FCFS

操作系统 | 文件管理_第201张图片

最短寻找时间优先SSTF

操作系统 | 文件管理_第202张图片

扫描算法SCAN
  • 又称电梯算法

在这里插入图片描述
操作系统 | 文件管理_第203张图片

  • 由于规定磁头只能移动到最边上的磁道才能改变磁头的移动方向,所以即使我们此时访问完184号磁道后没有了需要处理的那种磁道访问请求了,但是此时磁头依然还是会把磁头移动到最外侧的200号磁道这个位置,只有到最外侧之后才可以往另外的这个方向移动

操作系统 | 文件管理_第204张图片

LOOK调度算法

操作系统 | 文件管理_第205张图片

循环扫描算法C-SCAN
  • Circular-SCAN

操作系统 | 文件管理_第206张图片

C-LOOK调度算法

操作系统 | 文件管理_第207张图片

减少磁盘延迟时间的方法

操作系统 | 文件管理_第208张图片

  • 延迟时间指的是把目标扇区转到磁头下面所花的时间

操作系统 | 文件管理_第209张图片

减少延迟时间的方法:交替编号

操作系统 | 文件管理_第210张图片

磁盘地址结构的设计

操作系统 | 文件管理_第211张图片

  • 这样设计保证了柱面号一开始就被固定住了,避免了以后在读取不同盘面号和扇区号的时候还需要移动磁头臂的情况

操作系统 | 文件管理_第212张图片
操作系统 | 文件管理_第213张图片

减少延迟时间的方法:错位命名

操作系统 | 文件管理_第214张图片
操作系统 | 文件管理_第215张图片
操作系统 | 文件管理_第216张图片

磁盘的管理

操作系统 | 文件管理_第217张图片

磁盘初始化

操作系统 | 文件管理_第218张图片
操作系统 | 文件管理_第219张图片
操作系统 | 文件管理_第220张图片
操作系统 | 文件管理_第221张图片

引导块

操作系统 | 文件管理_第222张图片
操作系统 | 文件管理_第223张图片

  • 自举装入程序很小,复杂度不高,一般不需要修改,所以可以放在不可修改的ROM中
  • 而自举程序要修改的话修改后必须放进位于磁盘固定位置的启动块/引导块中,这样使自举程序的更新变得很方便

坏块的管理

操作系统 | 文件管理_第224张图片

操作系统 | 文件管理_第225张图片

固态硬盘SSD

操作系统 | 文件管理_第226张图片
操作系统 | 文件管理_第227张图片

  • 原理:基于闪存技术Flash Memory,属于电可擦除ROM,即EEPROM
  • 固态硬盘由多个闪存芯片Flash Chip构成,每个芯片包含多个块block,每个块包含多个页page

机械硬盘 v.s. 固态硬盘

操作系统 | 文件管理_第228张图片

  • 机械硬盘存储数据是通过盘面上的磁性物质来记录这个二进制的0/1的
  • 固态硬盘存储数据是基于闪存技术Flash Memory,我们熟悉的U盘也是采用了闪存技术,闪存属于电可擦除ROM,即EEPROM

固态硬盘的结构

操作系统 | 文件管理_第229张图片

读写性能特性

  • 系统通过I/O总线发过来一个逻辑地址,这个逻辑地址经由闪存翻译层的翻译【通过电路实现】之后会把逻辑地址映射到对应的物理地址,找到对应页,所以闪存翻译层做的就是一个地址变换的工作
  • 系统对【固态硬盘的读写是以页为单位的】,每次读或者每次写都是一个页,如果系统此时要读取的数据是存放在【磁盘】里面的,那么一个逻辑块号/物理地址对应的就是磁盘里面的某一个【块/扇区】;如果系统此时要读取的数据是存放在【固态硬盘】里面的,那么这所谓的逻辑块对应的就是固态硬盘里面的一个【页】,而不是固态硬盘里的一个块
  • 这里的固态硬盘的块类比磁盘的扇区,而固态硬盘的页类比磁盘里面的一个磁道

操作系统 | 文件管理_第230张图片
操作系统 | 文件管理_第231张图片

  • 块1的页0此时已经被写入数据了,如果我们此时还想对这一页写入数据的话是不被允许的,想要再往这一页写入数据,就必须先把这一整块进行擦除,然后再往里面写入数据
  • 以块为单位进行擦除,整块擦除干净之后其中的每一页就可以再次被写入数据
  • 但如果擦除的时候同一块里面的其他页面也有数据怎么办呢?固态硬盘的做法是:先把同一块中的其他页复制到一个新的可写入的块中,然后再把想要写入的数据写到新块里面的对应页里面,最后把原来原来的块整块擦除,这样就可以保证其他页的数据不会丢失
  • 但此时又会有另一个问题,闪存翻译层会把相应的逻辑块号映射到刚刚被我们擦除的页的物理位置,但是经过上述操作后对应数据的物理位置被我们改变了,为了让地址的映射关系保持正确,闪存翻译层在做了刚刚的数据迁移之后,会把新的逻辑块号重新进行映射,而把原有的映射直接舍弃,保持正确的映射关系,所以一个逻辑地址所对应的实际的物理位置是会变的,只不过闪存翻译层会把这个映射关系的变化修改正确而已
  • 磁盘是通过移动机械臂来定位到具体的地址,而固态硬盘是通过电路来直接固定到具体的物理地址,因此【固态硬盘支持随机访问】,访问任何地址所需要的时间都是相同的;但是对于机械硬盘而言,如果此时要访问的物理地址离磁臂的当前位置比较远那就需要移动磁臂,所以对于机械硬盘而言访问不同地址可能需要花的时间需要等的时间也各不相同

磨损均衡技术

操作系统 | 文件管理_第232张图片
操作系统 | 文件管理_第233张图片

你可能感兴趣的:(计算机学科专业基础综合408,操作系统,操作系统,文件系统,磁盘管理)