• 操作系统 | 文件管理


    文章目录

    初识文件管理

    在这里插入图片描述

    文件的属性

    在这里插入图片描述

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

    在这里插入图片描述

    在这里插入图片描述

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

    在这里插入图片描述
    在这里插入图片描述

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

    在这里插入图片描述
    在这里插入图片描述

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

    在这里插入图片描述
    在这里插入图片描述

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

    在这里插入图片描述
    在这里插入图片描述

    文件的逻辑结构

    在这里插入图片描述

    无结构文件

    在这里插入图片描述

    有结构文件

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    顺序文件

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

    多级索引顺序文件

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    文件目录

    在这里插入图片描述
    在这里插入图片描述

    文件控制块

    • 实现文件目录的关键数据结构
      在这里插入图片描述
    • 目录也是一种特殊的文件
    • 文件目录就是FCB的有序集合,一个FCB就是一个文件目录项
    • 很显然,每一个文件都会对应一个FCB
      在这里插入图片描述
    • FCB实现了文件名和文件之间的映射,其最重要的是文件名和文件存放的物理地址,FCB必须建立起文件名到文件实际存放的物理地址这样的一个映射关系
      在这里插入图片描述

    目录结构

    单级目录结构

    在这里插入图片描述

    两级目录结构

    在这里插入图片描述

    多级目录结构

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    无环图目录结构

    在这里插入图片描述

    索引结点(FCB的改进)

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

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

    • 即文件的数据应该怎样存放在外存中,这些数据应该怎样被组织起来?
      在这里插入图片描述
      在这里插入图片描述

    文件块、磁盘块

    在这里插入图片描述

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

    连续分配

    在这里插入图片描述

    • 顺序访问:如果我要访问逻辑块号2,那么我必须先顺序访问逻辑块号0和逻辑块号1,之后才能找到逻辑块号2
    • 直接访问/随机访问:如果我要访问逻辑块号2,那么我并不需要访问其他的逻辑块,我们可以直接找到逻辑块号2存放的位置
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    链接分配

    在这里插入图片描述

    隐式链接

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    显式链接

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    索引分配

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

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

    在这里插入图片描述

    • 若采用多层索引,则各层索引表大小不能超过一个磁盘块
    • 上面这个条件即为考试中经常会遇到的要我们计算文件最大长度的题的约束
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

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

    在这里插入图片描述

    C语言创建无结构文件

    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

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

    C语言创建顺序文件

    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

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

    逻辑结构:索引文件

    在这里插入图片描述

    索引文件采用索引分配

    在这里插入图片描述

    • 索引文件的索引表:用户自己建立的,映射:关键字→记录存放的逻辑地址
    • 索引分配的索引表:操作系统建立的,映射:逻辑块号→物理块号
      在这里插入图片描述

    文件存储空间管理

    • 其实就是对空闲磁盘块的管理
      在这里插入图片描述
      在这里插入图片描述

    存储空间的划分与初始化

    在这里插入图片描述

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

    存储空间管理

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

    在这里插入图片描述

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

    在这里插入图片描述
    在这里插入图片描述

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

    在这里插入图片描述
    在这里插入图片描述

    空闲链表法

    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述
    在这里插入图片描述

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

    在这里插入图片描述

    成组链接法

    在这里插入图片描述
    在这里插入图片描述

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

    在这里插入图片描述
    在这里插入图片描述

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

    文件的基本操作

    在这里插入图片描述

    创建文件

    在这里插入图片描述

    删除文件

    在这里插入图片描述

    打开文件

    在这里插入图片描述
    在这里插入图片描述

    关闭文件

    在这里插入图片描述

    读文件

    • 读文件之前必须要先打开文件
      在这里插入图片描述

    写文件

    在这里插入图片描述
    在这里插入图片描述

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

    文件共享

    在这里插入图片描述

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

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

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

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    文件保护

    在这里插入图片描述

    口令保护

    在这里插入图片描述

    加密保护

    在这里插入图片描述

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

    在这里插入图片描述

    在这里插入图片描述

    访问控制

    在这里插入图片描述
    在这里插入图片描述

    Windows的访问控制

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

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

    在这里插入图片描述
    在这里插入图片描述

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

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

    文件系统在外存中的结构

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

    在这里插入图片描述

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

    在这里插入图片描述

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

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

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

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

    • 引导块:负责开机的一系列操作
      在这里插入图片描述

    • 超级块:成组链接法中便于迅速找到这个磁盘分区里边的所有空闲块
      在这里插入图片描述
      在这里插入图片描述

    • 空闲空间管理:比如位示图,可以迅速判断某一个磁盘块是否空闲(注意和超级块区别,超级块的作用更多的是迅速找到若干个空闲的磁盘块)
      在这里插入图片描述

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

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

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

    文件系统在内存中的结构

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

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

    在这里插入图片描述

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

    虚拟文件系统

    普通的文件系统

    在这里插入图片描述

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

    虚拟文件系统

    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

    • UFS文件系统和FAT文件系统的目录项格式是有很大的差别的,这就意味着如果虚拟存储系统面对着不同的文件系统,在打开文件后在内存表示的文件目录项信息各不相同
      在这里插入图片描述

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

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

    在这里插入图片描述

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

    文件系统的挂载(mounting)

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

    磁盘的结构

    在这里插入图片描述

    磁盘、磁道、扇区

    在这里插入图片描述

    在这里插入图片描述

    如何在磁盘中读/写数据

    在这里插入图片描述

    • 如果要对一个扇区进行读/写操作的话,需要通过磁头臂来带动磁头,让磁头放到那个扇区对应的磁道上
      在这里插入图片描述

    盘面、柱面

    在这里插入图片描述
    在这里插入图片描述

    磁盘的物理地址

    在这里插入图片描述

    磁盘的分类

    活动头磁盘和固定头磁盘

    在这里插入图片描述

    可换盘磁盘和固定盘磁盘

    在这里插入图片描述
    在这里插入图片描述

    磁盘调度算法

    在这里插入图片描述

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

    在这里插入图片描述

    寻道时间

    在这里插入图片描述

    延迟时间

    在这里插入图片描述

    传输时间

    在这里插入图片描述

    磁盘调度算法

    先来先服务算法FCFS

    在这里插入图片描述

    最短寻找时间优先SSTF

    在这里插入图片描述

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

    在这里插入图片描述
    在这里插入图片描述

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

    在这里插入图片描述

    LOOK调度算法

    在这里插入图片描述

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

    在这里插入图片描述

    C-LOOK调度算法

    在这里插入图片描述

    减少磁盘延迟时间的方法

    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

    磁盘地址结构的设计

    在这里插入图片描述

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

    在这里插入图片描述
    在这里插入图片描述

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

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    磁盘的管理

    在这里插入图片描述

    磁盘初始化

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    引导块

    在这里插入图片描述
    在这里插入图片描述

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

    坏块的管理

    在这里插入图片描述

    在这里插入图片描述

    固态硬盘SSD

    在这里插入图片描述
    在这里插入图片描述

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

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

    在这里插入图片描述

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

    固态硬盘的结构

    在这里插入图片描述

    读写性能特性

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

    在这里插入图片描述
    在这里插入图片描述

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

    磨损均衡技术

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    Unity之Hololens如何使用ARAnchorManager 锚点系统实现世界锁
    No6-3.从零搭建spring-cloud-alibaba微服务框架,实现资源端用户认证与授权等(三,no6-3)
    Python 爬取淘宝指定搜索商品评论 标题 销量 计算sign
    pg 函数匹配规则
    【Unity小功能开发实战教程】在UI画布上画网格线
    【python学习】枚举算法案例分析
    为什么说互联网是最坏的行业
    HCTL-2016, HCTL-2017 AB Decoder
    函数式编程-review
    代码随想录算法训练营第56天 | 编辑距离
  • 原文地址:https://blog.csdn.net/weixin_44043952/article/details/126197039