操作系统-Part4——文件管理

[TOC]

文件系统基础

初识文件管理

image-20211111183657165
  • 文件属性
    • 文件名:由创建文件的用户决定文件名,主要是为了方便用户找到文件,同一目录下不允许有重名文件
    • 标识符:一个系统内的各文件标识符唯一,对用户来说毫无可读性,因此标识符只是操作系统用于区分各个文件的一种内部名称。
    • 类型:指明文件的类型
    • 位置:文件存放的路径(让用户使用)、在外存中的地址(操作系统使用,对用户不可见)
    • 大小:指明文件大小
    • 创建时间、上次修改时间
    • 文件所有者信息
    • 保护信息:对文件进行保护的访问控制信息
  • 文件内部的数据组织
    • 无结构文件(如文本文件),由一些二进制或字符流组成,又称“流式文件”
    • 有结构文件(如数据库表),由一组相似的记录组成,又称“记录式文件”
      • 记录是一组相关数据项的集合
      • 数据项是文件系统中最基本的数据单位
      • image-20211111182113600
  • 文件之间的组织
    • 目录(文件夹)其实也是一种特殊的有结构文件
    • image-20211111182238302
  • 操作系统向上提供的功能
    • image-20211111182641475
    • 图形化交互操作的本质也是调用操作系统提供的接口
    • 可用几个基本操作完成更复杂的操作,比如:“复制文件”:先创建一个新的空文件,再把源文件读入内存,再将内存中的数据写到新文件中
    • 读/写文件之前,需要“打开文件”
    • 读/写文件结束之后,需要“关闭文件”
  • 文件在外存的存放
    • 外存也是由一个个存储单元组成的,每个存储单元可以存储一定量的数据(如 1B)。
      • 每个存储单元对应一个物理地址
    • 类似于内存分为一个个“内存块”,外存会分为一个个“块/磁盘块/物理块”。每个磁盘块的大小是相等的,每块一般包含 2 的整数幂个地址
      • 文件的逻辑地址也可以分为(逻辑块号,块内地址),操作系统同样需要将逻辑地址转 换为外存的物理地址(物理块号,块内地址)的形式。
      • 块内地址的位数取决于磁盘块的大小
    • 操作系统以块为单位为文件分配存储空间、读入内存
      • 即使一个文件大小只有 10B,但它依然需要占用 1KB 的磁盘块
  • 其他需要由操作系统实现的文件管理功能
    • 文件共享:使多个用户可以共享使用一个文件
    • 文件保护:如何保证不同的用户对文件有不同的操作权限

文件的逻辑结构

image-20211111224112533

  • 逻辑结构,指在用户看来,文件内部的数据应该是如何组织起来的。物理结构,指在操作系统看来,文件的数据是如何存放在外存中的。
  • 按文件是否有结构分类,可以分为无结构文件、有结构文件两种。
    • 无结构文件:文件内部的数据就是一系列二进制流或字符流组成。又称“流式文件”。
    • 有结构文件:由一组相似的记录组成,又称“记录式文件”。每条记录又若干个数据项组成。一般来说,每条记录有一个数据项可作为关键字(作为识别不同记录的ID)
      • 根据各条记录的长度(占用的存储空间)是否相等,又可分为定长记录可变长记录两种。
  • 有结构文件的逻辑结构
    • 顺序文件:文件中的记录一个接一个地顺序排列(逻辑上),记录可以是定长的或可变长的。各个记录在物理上可以顺序存储链式存储
      • 串结构:记录之间的顺序与关键字无关
      • 顺序结构:记录之间的顺序按关键字顺序排序
      • 一般来说,考试题目中所说的“顺序文件”指的是物理上顺序存储的顺序文件
        • 顺序文件的缺点是增加/删除一个记录比较困难
      • image-20211111223019417
    • 索引文件:
      • 索引表本身是定长记录的顺序文件。
      • 主要用于对信息处理的及时性要求比较高的场合。
      • 可以用不同的数据项(属性)建立多个索引表。
      • image-20211111223256012
    • 索引顺序文件:
      • 是索引文件和顺序文件思想的结合。区别在于,不是每个记录对应一个索引表项,而是一组记录对应一个索引表项
      • image-20211111223511426
    • 多级索引顺序文件
      • image-20211111223713847

文件目录

image-20211111230036761

  • 文件控制块(File Control Block,FCB)
    • 目录本身就是一种有结构文件,由一条条记录组成。每条记录对应一个在该放在该目录下的文件
    • image-20211111230640935
    • 对目录进行的操作
      • 搜索:当用户要使用一个文件时,系统要根据文件名搜索目录,找到该文件对应的目录项
      • 创建文件:创建一个新文件时,需要在其所属的目录中增加一个目录项
      • 删除文件:当删除一个文件时,需要在目录中删除相应的目录项
      • 显示目录:用户可以请求显示目录的内容,如显示该目录中的所有文件及相应属性
      • 修改目录:某些文件属性保存在目录中,因此这些属性变化时需要修改相应的目录项(如:文件重命名)
  • 目录结构
    • 单级目录结构
      • 早期操作系统并不支持多级目录,整个系统中只建立一张目录表,每个文件占一个目录项。
      • 特点:单级目录实现了“按名存取”,但是不允许文件重名。
      • 缺点:不适用于多用户操作系统。
    • 两级目录结构
      • 早期的多用户操作系统,采用两级目录结构。分为主文件目录(MFD,Master File Directory)和用户文件目录(UFD,User Flie Directory)。
      • 特点:1. 允许不同用户的文件重名;2. 可以在目录上实现实现访问限制
      • 缺点:依然缺乏灵活性,用户不能对自己的文件进行分类
    • 多级目录结构(树形目录结构)
      • image-20211111231141027
      • 系统根据绝对路径一层一层地找到下一级目录。刚开始从外存读入根目录的目录表;找到“照片”目录的存放位置后,从外存读入对应的目录表;再找到“2015-08”目录的存放位置,再从外存读入对应目录表;最后才找到文件“自拍.jpg”的存放位置。整个过程需要 3 次读磁盘 I/O 操作
      • 引入当前目录相对路径后,磁盘 I/O 的次数减少,提升了访问文件的效率。
      • 特点:可以很方便地对文件进行分类,层次结构清晰,也能够更有效地进行文件的管理和保护。
      • 缺点:不便于实现文件的共享
    • 无环图目录结构
      • image-20211111231431422
      • 可以用不同的文件名指向同一个文件或目录
      • 实现:为每个共享结点设置一个共享计数器,用于记录此时有多少个地方在共享该结点。用户提出删除结点的请求时,只是删除该用户的 FCB、并使共享计数器减 1,并不会直接删除共享结点。只有共享计数器减为 0 时,才删除结点
      • 共享文件不同于复制文件。在共享文件中,由于各用户指向的是同一个文件,因此只要其中一个用户修改了文件数据,那么所有用户都可以看到文件数据的变化。
  • 索引结点(FCB的改进)
    • 使用索引结点机制,磁盘块可容纳的 FCB 增多,对于拥有较多目录项的目录来说,减少了 I/O 次数,大大提升文件检索速度。
    • 存放在外存中的索引结点称为“磁盘索引结点”;当索引结点放入内存后称为“内存索引结点”。
    • 相比之下内存索引结点中需要增加一些信息,比如:文件是否被修改、此时有几个进程正在访问该文件等
    • image-20211111231941136

文件保护

image-20211112110535854

  • 口令保护
    • 用户请求访问该文件时必须提供口令
      • 口令一般存放在文件对应的 FCB索引结点中。
    • 优点:保存口令的空间开销不多,验证口令的时间开销也很小。
    • 缺点:正确的口令存放在系统内部,不够安全
  • 加密保护
    • 使用密码对文件进行加密保存,在访问文件时需要提供正确的密码才能对文件进行解密。
    • 优点:保密性强,不需要在系统中存储“密码”
    • 缺点:编码/译码,或者说加密/解密要花费一定时间。
    • image-20211112111542108
  • 访问控制
    • image-20211112112011037
    • 在每个文件的 FCB(或索引结点)中增加一个访问控制列表(Access-Control List,ACL),该表中记录了各个用户可以对该文件执行哪些操作。
    • 精简的访问列表以组为单位,标记各组用户可以对文件执行哪些操作。
    • 如果对某个目录进行了访问权限的控制,那也要对目录下的所有文件进行相同的访问权限控制

文件共享

image-20211112112227710

  • 注意:
    • 多个用户共享同一个文件,意味着系统中只有一份文件数据。用户对该文件的修改,在用户之间是共享的、可见的。
    • 多个用户复制同一个文件,意味着系统中会有多份文件数据。用户对自己文件的修改,对其他用户的文件数据并没有影响。
  • 基于索引结点的共享方式(硬链接)
    • image-20211112113309277
    • 索引结点中设置一个链接计数变量 count,用于表示链接到本索引结点上的用户目录项数。
    • 若 count>1,说明此时有多个用户目录项链接到该索引结点上,或者说有多个用户在共享此文件
    • 若某个用户删除该文件,则只是把目录中与该文件对应的目录项删除,且索引结点的 count 值减 1
    • 若 count>0,说明还有别的用户要使用该文件,暂时不能把文件数据删除,否则会导致指针悬空。
    • 当 count=0 时系统负责删除文件。
  • 基于符号链的共享方式(软链接)
    • image-20211112113608981
    • 当 Link 型文件被删除时,Link 指向的文件依然存在
    • 当 Link 指向的文件被删除时,该 Link 型文件失效

文件系统实现

文件的物理结构(重点)

image-20211112114305513

  • 文件块、磁盘块

    • 文件的逻辑地址空间也被分为了一个个文件块,也可以表示为(逻辑块号,块内地址)的形式。
    • 通常,磁盘块的大小与内存块、页面的大小相同
    • 内存与磁盘之间的数据交换(即读/写操作、磁盘 I/O)都是以块为单位进行的。
  • 连续分配

    • 连续分配方式要求每个文件在磁盘上占有一组连续的块

    • 逻辑地址到物理地址的映射

      • (逻辑块号,块内地址)->(物理块号,块内地址)。只需转换块号就行,块内地址保持不变
      • 物理块号 = 起始块号 + 逻辑块号
      • 同时,还要检查逻辑块号是否合法(逻辑块号 ≤ 长度)
    • 优点

      • 连续分配支持顺序访问和直接访问(随机访问)
      • 连续分配的文件在顺序读/写时速度最快
    • 缺点

      • 文件不方便拓展
      • 存储空间利用率低会产生难以利用的磁盘碎片(可以用紧凑来处理碎片,但是需要耗费很大的时间代价)
    • image-20211112210113773
  • 链接分配
    • 隐式链接
      • 除文件的最后一个盘块之外,每个盘块中都存有指向下一个盘块的指针。文件目录包括文件第一块的指针和最后一块的指针。
      • 优点:
        • 很方便文件拓展
        • 不会有碎片问题,外存利用率高。
      • 缺点:
        • 只支持顺序访问,查找效率低
        • 指向下一个盘块的指针也需要耗费少量的存储空间
      • image-20211112211102158
    • 显式链接
      • 把用于链接文件各物理块的指针显式地存放在一张表中。即,文件分配表FAT,File Allocation Table)
      • 注意:一个磁盘仅设置一张FAT。开机时,将FAT读入内存,并常驻内存
        • 逻辑块号转换成物理块号的过程不需要读磁盘操作
      • 优点:
        • 支持顺序访问,也支持随机访问
        • 块号转换的过程不需要访问磁盘,文件的访问效率更高
        • 不会产生外部碎片,也可以很方便地对文件进行拓展
      • 缺点:
        • 文件分配表的需要占用一定的存储空间。
      • image-20211112211434277
  • 索引分配
    • 系统为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块(内存管理中的页表:建立逻辑页面物理页之间的映射关系)。
    • 索引表存放的磁盘块称为索引块。文件数据存放的磁盘块称为数据块
    • 注意:
      • 显式链接方式中,文件分配表 FAT 是一个磁盘对应一张
      • 索引分配方式中,索引表是一个文件对应一张
    • 优点:
      • 可以支持随机访问。
      • 文件拓展也很容易实现
    • 缺点
      • 索引表需要占用一定的存储空间
    • image-20211112212647379
    • 链接方案
      • 如果索引表太大,一个索引块装不下,那么可以将多个索引块链接起来存放。
      • 缺点:若文件很大,索引表很长,就需要将很多个索引块链接起来。查找效率低下
      • image-20211112213257207
    • 多层索引
      • 建立多层索引(原理类似于多级页表)。
      • 结论:
        • 采用 k 层索引结构时,且顶级索引表未调入内存,则访问一个数据块只需要 K+1 次磁盘操作
      • 缺点:
        • 即使是小文件,访问一个数据块依然需要 K+1 次读磁盘。
      • image-20211112213345728
    • 混合索引
      • 多种索引分配方式的结合。
      • 优点:
        • 对于小文件来说,访问一个数据块所需的读磁盘次数更少
      • image-20211112214310115
    • 超级超级超级重要考点
      • 要会根据多层索引、混合索引的结构计算出文件的最大长度(Key:各级索引表最大不能超过一个块);
      • 要能自己分析访问某个数据块所需要的读磁盘次数Key:FCB 中会存有指向顶级索引块的指针,因此可以根据 FCB 读入顶级索引块。每次读入下一级的索引块都需要一次读磁盘操作。另外,要注意题目条件:顶级索引块是否已调入内存

逻辑结构 VS 物理结构

image-20211112215804531image-20211112215911132

  • 个人理解:
    • 逻辑结构,是用户针对文件中价值内容的组织,追求对内容的查询效率
    • 物理结构,是操作系统针对空间利用率物理查询速度的优化,对内容是无关的

文件存储空间管理

image-20211112221825169

  • 存储空间的划分与初始化

    • 存储空间的划分:将物理磁盘划分为一个个文件卷逻辑卷、逻辑盘

      • 同时,也有系统可以支持由多个物理磁盘组成一个文件卷
    • 存储空间的初始化:将各个文件卷划分为目录区、文件区

      • 目录区,主要存放文件目录信息(FCB)、用于磁盘存储空间管理的信息
      • 文件区,用于存放文件数据
    • image-20211113222439483
  • 从三个方面进行理解:

    1. 用什么方式记录、组织空闲块?

    2. 如何分配磁盘块

    3. 如何回收磁盘块

  • 存储空间管理

    • 空闲表法

      • 特点:

        • 适用于“连续分配方式”
      • 如何分配磁盘块:

        • 内存管理中的动态分区分配很类似,为一个文件分配连续的存储空间
        • 可采用首次适应、最佳适应、最坏适应等算法来决定要为文件分配哪个区间。
      • 如何回收磁盘块:

        • 内存管理中的动态分区分配很类似,当回收某个存储区时需要有四种情况

          • 回收区的前后都没有相邻空闲区
          • 回收区的前后都是空闲区
          • 回收区前面是空闲区
          • 回收区后面是空闲区。
        • 总之,回收时需要注意表项的合并问题。

      • image-20211113223018472
    • 空闲链表法

      • 操作系统保存着链头、链尾指针

      • 空闲盘块链:

        • 如何分配:若某文件申请 K 个盘块,则从链头开始依次摘下 K 个盘块分配,并修改空闲链的链头指针。
        • 如何回收:回收的盘块依次挂到链尾,并修改空闲链的链尾指针。
      • 空闲盘区链:

        • 如何分配:若某文件申请 K 个盘块,则可以采用首次适应、最佳适应等算法,从链头开始检索,按照算法规则找到一个大小符合要求的空闲盘区,分配给文件。若没有合适的连续空闲块,也可以将不同盘区的盘块同时分配给一个文件,注意分配后可能要修改相应的链指针、盘区大小等数据。
        • 如何回收:若回收区和某个空闲盘区相邻,则需要将回收区合并到空闲盘区中。若回收区没有和任何空闲区相邻,将回收区作为单独的一个空闲盘区挂到链尾
      • image-20211113223526372
    • 位示图法(常考)

      • 每个二进制位对应一个盘块。
        • 位示图一般用连续的“字”来表示,如本例中一个字的字长是 16 位,字中的每一位对应一个盘块
        • 可以用(字号,位号)对应一个盘块号。当然有的题目中也描述为(行号,列号
      • 重要:要能自己推出盘块号与(字号,位号)相互转换的公式。
        • 注意题目条件,盘块号、字号、位号到底是从 0 开始还是从 1 开始
        • (字号,位号)=(i,j)的二进制位对应的*盘块号 b = n * i + j*
        • b 号盘块对应的字号 i = b / n,位号 j = b % n
      • 如何分配:若文件需要 K 个块
        • 顺序扫描位示图,找到 K 个相邻或不相邻的“0”
        • 根据字号、位号算出对应的盘块号,将相应盘块分配给文件
        • 将相应位设置为“1”。
      • 如何回收:
        • 根据回收的盘块号计算出对应的字号、位号
        • 将相应二进制位设为“0”
      • image-20211114190154046
    • 成组链接法

      • 针对问题:空闲表法、空闲链表法不适用于大型文件系统,因为空闲表或空闲链表可能过大。
      • 改进方向:UNIX 系统中采用了成组链接法对磁盘空闲块进行管理。
      • 文件卷的目录区中专门用一个磁盘块作为“超级块”,当系统启动时需要将超级块读入内存。并且要保证内存与外存中的“超级块”数据一致
      • 下一组(指第二列)空闲盘块数为 100;(第一列)有 99 个指针指向真正空闲的盘区,第一个指针指向的盘块记录下下组(第三列)的空闲盘块信息。
      • 如何分配:
        • 先从下一组(第二列)中取,同时删去第一列对应的指针,减少下一组空闲盘块数
        • 若下一组(第二列)分配完,则超级块更新内容(复制第一个空闲块的信息),指向第三组的信息,同时第二列第一块空闲被分配。
        • image-20211114192427463
      • 如何回收:
        • 需要将超级块中的数据复制到新回收的块中,并修改超级块的内容,让新回收的块成为第一个分组。
        • image-20211114193521443

文件的基本操作

image-20211114203102662

  • 创建文件

    • 需要提供的参数:

      • 所需的外存空间大小(如,一个盘块,即 1KB)
      • 文件存放路径(如,“D:/Demo”)
      • 文件名(如,“新建文本文档.txt”)
    • 操作系统处理 Create 系统调用:

      • 在外存中找到文件所需的空间分配空闲的磁盘空间
      • 根据文件存放路径的信息找到该目录对应的目录文件,在目录中创建该文件对应的目录项。目录项中包含了文件名、文件在外存中的存放位置等信息。
  • 删除文件

    • 需要提供的参数:

      • 文件存放路径(如,“D:/Demo”)
      • 文件名(如,“test.txt”)
    • 操作系统处理 Delete 系统调用:

      • 根据文件存放路径找到相应的目录文件,从目录中找到文件名对应的目录项
      • 根据该目录项记录的文件在外存的存放位置、文件大小等信息,回收文件占用的磁盘块。(回收空闲的磁盘空间
      • 从目录表中删除文件对应的目录项
  • 打开文件

    • 需要提供的参数:

      • 文件存放路径(如,“D:/Demo”)
      • 文件名(如,“test.txt”)
      • 要对文件的操作类型(如,r 只读、rw 读写等)
    • 操作系统处理 open 系统调用:

      • 根据文件存放路径找到相应的目录文件,从目录中找到文件名对应的的目录项,并检查该用户是否有指定的操作权限
      • 将目录项复制到内存中的“打开文件表”中。并将对应表目的编号返回给用户。之后用户使用打开文件表的编号来指明要操作的文件
    • image-20211114195520247
    • 进程的打开文件表和系统的打开文件表

      • 进程的打开文件表记录

        • 读写指针:记录了该进程对文件的读/写操作进行到的位置。每个进程都有不同的指针指向不同位置。
        • 访问模式:如果打开文件时声明的是“只读”,则该进程不能对文件进行写操作
      • 系统的打开文件表记录(系统唯一)

        • 打开计数器:记录此时有多少个进程打开了此文件。若多个进程占用,则不允许删除。
      • image-20211114200250821

  • 关闭文件

    • 操作系统处理 Close 系统调用:
      • 将进程的打开文件表响应的表项删除
      • 回收分配给该文件的内存空间等资源
      • 系统打开文件表的打开计数器 -1,若 count=0,则删除对应表项
  • 读文件

    • 需要提供的参数:
      • 指明哪个文件(在读文件之前已经打开文件了,所以只需要指明文件在进程的打开文件表中的索引号即可
      • 指明读入多少数据
      • 指明从外存读入的数据要放在内存中的位置
    • 操作系统处理 Read 系统调用:
      • 读指针指向的外存中,将用户指定大小的数据读入用户指定的内存区域中。
  • 写文件

    • 需要提供的参数:
      • 指明哪个文件(指明文件在进程的打开文件表中的索引号
      • 指明写出多少数据
      • 指明写回外存的数据放在内存中的位置
    • 操作系统处理 Write 系统调用:
      • 从用户指定的内存区域中,将指定大小的数据写回写指针指向的外存

文件系统的层次结构

image-20211114203949942

辅助记忆:假设某用户请求删除文件 “D:/工作目录/学生信息.xlsx” 的最后100条记录。

  1. 用户需要通过操作系统提供的接口发出请求——用户接口

  2. 由于提供的是文件的存放路径,因此需要操作系统一层一层地查找目录,找到对应的目录项——文件目录系统

  3. 不同的用户对文件有不同的操作权限,因此为了保证安全,需要检查用户是否有访问权限——存取控制模块(存取控制验证层)

  4. 验证了用户的访问权限之后,需要把用户提供的“记录号”转变为对应的逻辑地址——逻辑文件系统与文件信息缓冲区

  5. 知道了目标记录对应的逻辑地址后,还需要转换成实际的物理地址——物理文件系统

  6. 要删除这条记录,必定要对磁盘设备发出请求——设备管理程序模块

  7. 删除这些记录后,会有一些盘块空闲,因此要将这些空闲盘块回收——辅助分配模块

磁盘组织与管理

磁盘的结构

image-20211115125801360

  • 磁盘:磁盘的表面由一些磁性物质组成,可以用这些磁性物质来记录二进制数据
  • 磁道:磁盘的盘面被划分成一个个磁道,一个“圈”就是一个磁道
  • 扇区:一个磁道被划分成多个扇区,每个扇区就是一个“磁盘块”。各个扇区存放的数据量相同(如1KB)
    • 最内侧磁道上的扇区面积最小,因此数据密度最大
    • 重要:每个扇区就是一个“磁盘块”!
  • 盘面:一个盘片可能会有两个盘面
  • 磁头:每个盘面对应一个磁头。所有的磁头只能共进退
  • 磁盘的物理地址
    • 可用(柱面号,盘面号,扇区号)来定位任意一个“磁盘块”。外存中的块号就可以转换成(柱面号,盘面号,扇区号)的地址形式。
    • 读取一个“块”的流程
      • 根据“柱面号”移动磁臂,让磁头指向指定柱面
      • 激活指定盘面对应的磁头
      • 磁盘旋转的过程中,指定的扇区从磁头下面划过,完成对指定扇区的读/写。
  • 磁盘的分类
    • 根据磁头分类:
      • 磁头可以移动的称为活动头磁盘。磁臂可以来回伸缩来带动磁头定位磁道
      • 磁头不可移动的称为固定头磁盘。这种磁盘中每个磁道有一个磁头
    • 根据是否可以更换分类:
      • 盘片可以更换的称为可换盘磁盘
      • 盘片不可更换的称为固定盘磁盘
  • image-20211115125719713

磁盘调度算法

image-20211115125939512

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

    • **寻找时间(寻道时间)TS**:在读/写数据前,将磁头移动到指定磁道所花的时间。
      • 启动磁头臂是需要时间的。假设耗时为 s;
      • 移动磁头也是需要时间的。假设磁头匀速移动,每跨越一个磁道耗时为 m,总共需要跨越 n 条磁道;
      • 寻道时间 *TS = s + m * n*
    • **延迟时间 TR**:通过旋转磁盘,使磁头定位到目标扇区所需要的时间。
      • 设磁盘转速为 r (单位:转/秒,或 转/分)
        • 硬盘的典型转速为 5400 转/分,或 7200 转/分
      • 平均所需的延迟时间 *TR = (1/2)(1/r) = 1/2r**
        • 找到目标扇区平均需要转半圈,因此再乘以 1/2
    • **传输时间 Tt**:从磁盘读出或向磁盘写入数据所经历的时间
      • 假设磁盘转速为 r,此次读/写的字节数为 b,每个磁道上的字节数为 N
      • 传输时间 *Tt = (1/r) * (b/N) = b/(rN)*
    • 延迟时间、传输时间都与磁盘转速为线性相关。而转速是硬件的固有属性,因此操作系统无法优化延迟时间和传输时间
    • 移动磁头所花费的时间,是磁盘调度算法影响的指标
  • 磁盘调度算法

    • 先来先服务算法(FCFS)

      • 算法思想:根据进程请求访问磁盘的先后顺序进行调度。
        • image-20211115131917033
      • 优点:公平;如果请求访问的磁道比较集中,则算法性能还行
      • 缺点:如果有大量进程竞争使用磁盘,请求访问的磁道很分散,则 FCFS 在性能上很差,寻道时间长。
    • 最短寻找时间优先(SSTF)

      • 算法思想:SSTF 算法会优先处理的磁道是与当前磁头最近的磁道。
        • 可以保证每次的寻道时间最短,但是并不能保证总的寻道时间最短
        • image-20211115132033429
      • 优点:性能较好,平均寻道时间短
      • 缺点:可能产生“饥饿”现象
    • 扫描算法(SCAN)

      • 针对问题:SSTF 算法会产生饥饿
      • 问题原因:磁头有可能在一个小区域内来回移动
      • 算法思想:扫描算法(电梯算法)规定,只有磁头移动到最外侧磁道的时候才能往内移动,移动到最内侧磁道的时候才能往外移动
        • image-20211115132330637
      • 优点:性能较好,平均寻道时间较短,不会产生饥饿现象
      • 缺点:
        • 只有到达最边上的磁道才能改变磁头移动方向。
        • 对于各个位置磁道的响应频率不平均
    • LOOK 调度算法

      • 针对问题:扫描算法只有到达最边上的磁道才能改变磁头移动方向。
      • 算法思想:如果在磁头移动方向上已经没有别的请求,就可以立即改变磁头移动方向。(边移动边观察,因此叫 LOOK)
        • image-20211115132956097
      • 优点:比起 SCAN 算法,使寻道时间进一步缩短
    • 循环扫描算法(C-SCAN)

      • 针对问题:扫描算法对于各个位置磁道的响应频率不平均。
      • 算法思想:规定只有磁头朝某个特定方向移动时才处理磁道访问请求,而返回时直接快速移动至起始端而不处理任何请求
        • image-20211115133606481
      • 优点:比起 SCAN,对于各个位置磁道的响应频率很平均。
      • 缺点:
        • 只有到达最边上的磁道时才能改变磁头移动方向
        • 磁头返回时其实只需要返回到 18 号磁道即可,不需要返回到最边缘的磁道。
        • 比起 SCAN 算法,平均寻道时间更长。
    • C-LOOK 调度算法

      • 算法思想:如果磁头移动的方向上已经没有磁道访问请求了,就可以立即让磁头返回,并且磁头只需要返回到有磁道访问请求的位置即可。
        • 也就是 C-SCAN + LOOK
        • image-20211115133949701
      • 优点:比起 C-SCAN 算法,不需要每次都移动到最外侧或最内侧才改变磁头方向,使寻道时间进一步缩短
    • 若题目中无特别说明, 则 SCAN 就是 LOOK, C-SCAN 就是 C-LOOK

减少磁盘延迟时间的方法

image-20211115150136330

  • 针对问题:磁头读入一个扇区数据后需要一小段时间处理,如果逻辑上相邻的扇区在物理上也相邻,则将花费很长的延迟时间
  • 减少延迟时间的方法:交替编号
    • 采用交替编号的策略,即让逻辑上相邻的扇区在物理上有一定的间隔,可以使读取连续的逻辑扇区所需要的延迟时间更小。
    • image-20211115145219763
  • 磁盘地址结构的设计
    • 磁盘的物理地址是(柱面号,盘面号,扇区号)而不是(盘面号,柱面号,扇区号)
    • 原因:读取地址连续的磁盘块时,采用(柱面号,盘面号,扇区号)的地址结构可以减少磁头移动消耗的时间仅需激活不同盘面上的磁头
  • 减少延迟时间的方法:错位命名
    • 为了在读取地址连续的磁盘块、切换盘面激活磁头时,需要空出间隔保证磁头启动。
    • image-20211115145913456

磁盘的管理

image-20211115150211019

  • 磁盘初始化:
    1. 进行低级格式化(物理格式化),将磁盘的各个磁道划分为扇区。一个扇区通常可分为数据区域(如 512B 大小)、三个部分组成。
      • 管理扇区所需要的各种数据结构一般存放在头、尾两个部分,包括扇区校验码(如奇偶校验、CRC 循环冗余校验码等)
    2. 将磁盘分区,每个分区由若干柱面组成(即分为我们熟悉的 C盘、D盘、E盘)
      • image-20211115151139969
    3. 进行逻辑格式化创建文件系统。包括创建文件系统的根目录、初始化存储空间管理所用的数据结构(如 位示图、空闲分区表)
  • 引导块:
    • 计算机开机时需要进行初始化,这些初始化工作是通过执行初始化程序(自举程序)完成的
      • 出厂时在主板上将集成一块不可修改的 ROM(只读存储器),其中只存放很小的“自举装入程序
      • 完整的自举程序放在磁盘的启动块(即引导块/启动分区)上,启动块位于磁盘的固定位置
      • 开机时计算机先运行“自举装入程序”,通过执行该程序就可找到引导块,并将完整的“自举程序”读入内存,完成初始化
    • 拥有启动分区的磁盘称为启动磁盘系统磁盘
  • 坏块的管理
    • 对于简单的磁盘,可以在逻辑格式化时对整个磁盘进行坏块检查,标明哪些扇区是坏扇区,比如:在文件分配表(FAT)上标明。
      • 在这种方式中,坏块对操作系统不透明
    • 对于复杂的磁盘,磁盘控制器(磁盘设备内部的一个硬件部件)会维护一个坏块链表。
      • 在磁盘出厂前进行低级格式化(物理格式化)时就将坏块链进行初始化。
      • 会保留一些备用扇区,用于替换坏块。这种方案称为扇区备用
      • 这种处理方式中,坏块对操作系统透明