• 文件的物理结构


    文件的物理结构

    在这里插入图片描述

    • 对空闲磁盘块的管理
    • 对非空闲磁盘块的管理(存放文件数据的磁盘块)

    文件块、磁盘块

    在这里插入图片描述

    • 外存的分块类似我们的内存分页,我们的磁盘中的存储单元也会被分为一个个块/磁盘块/物理块,很多磁盘块的大小与内存卡,页面的大小相同
    • 内存和磁盘之间的数据交换都是以块为单位进行

    在这里插入图片描述

    • 在内存管理中,进程的逻辑地址空间被分为了一个个页面,同样的,在外存的管理中,为了方便对文件数据的管理,文件的逻辑地址空间也被分为了一个一个的磁盘块,于是文件的逻辑地址也可以表示为(逻辑块号,块内地址)的形式
    • 用户通过逻辑地址来操作自己的文件,操作系统要负责从逻辑地址到物理地址的映射

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

    连续分配

    在这里插入图片描述

    • 连续分配方式要求每个文件在磁盘上占用一组连续的块
    • 因为是连续分配,所以我们在我们目录项中只需要记录对应的起始块号,我们可以通过起始块号+逻辑块号==物理块号
    • 因此连续分配支持顺序访问和直接访问(即随机访问)
      • 随机访问:就是需要哪个逻辑块的数据,直接能得到对应的磁盘块地址
      • 顺序访问:读取某个磁盘块,需要我们移动磁头,所以访问的两个磁盘块相隔太远,或导致磁头移动时间太长,连续分配的文件在读取数据的速度最快

    连续分配的缺点

    在这里插入图片描述

    在这里插入图片描述

    • 因为必须要连续的磁盘块,所以可能会产生难以利用的磁盘碎片,降低存储空间的利用率
    • 由于需要连续的磁盘空间,所以文件不方便扩展

    链接分配

    • 链接分配采用的是离散分配的方式,可以为文件分配离散的磁盘块

    隐式链接

    在这里插入图片描述

    • 对于隐式链接我们对应的目录项需要记录起始块号和结束块号,当然还需要除了文件的最后一个磁盘块之外,每个磁盘块都需要保存指向下一个盘块的指针(对用户是透明的)
    • 对于一个文件,从目标项中找到起始块号,将起始块号读入内存,然后就可以知道1号逻辑块的物理块号,依次类推,如果想读第n个逻辑块,需要n+1次磁盘I/0
    • 采用隐式链接方式的文件,只支持顺序访问,不支持随机访问,查找效率低

    显式链接

    在这里插入图片描述

    • 把我们用于链接文件各物理块的指针显式存放在一张表中——文件分配表
      • 文件分配表中存放物理块号和对应的下一块的块号
      • 我们文件的目录项存储我们的物理起始块号
      • 一个磁盘仅设置一张FAT,开机的时候,就将FAT读入内存,并常驻内存
      • 因为FAT各个表项在物理上也是连续存储,且每个表项的长度相同,因此物理块号字段可以隐藏

    在这里插入图片描述

    • 这种文件分配表是常驻内存的,所以查询这个表不会涉及到I/O操作,如果我们想找逻辑上第N个逻辑块,我们就先从目录项中找到对应的起始块号,到对应的FAT中找对应的下一块,找寻N次也就是我们的第N个逻辑块的物理块地址
    • 这种显式链接,也支持顺序访问,也支持随机访问(因为想访问i号逻辑块,并不需要依次访问前i-1个逻辑块)

    链接方式总结

    在这里插入图片描述

    索引分配方式

    在这里插入图片描述

    • 索引分配方式允许文件离散的地分配在各个磁盘块中,系统为每个文件建立一个索引表(显式链接的链式分配方式中,文件分配表是一个磁盘对应一张),索引表中记录了文件的各个逻辑块对应的物理块(类似我们在内存管理中的页表——建立逻辑页面到物理页之间的映射关系)
      • 索引表存放的磁盘称为索引块,文件数据存放的磁盘块称为数据块
    • 我们的文件的目录项中存放对应的索引块(物理地址)

    在这里插入图片描述

    • 怎么将逻辑块号转换成物理块号
      • 首先用户提出要访问的逻辑块号N,操作系统找到该文件对应的目录项(FCB)
      • 从目录项中中找到索引块的地址,将索引块从外存读入内存,根据索引表和逻辑块号找到对应的物理块号
    • 索引分配方式也是支持随机访问的,文件拓展也很容易实现

    遇到的问题

    在这里插入图片描述

    • 如果一个磁盘1KB,一个索引项表4B,那么一个磁盘块也就是存放256个索引项,如果一个文件很大,一个磁盘块是装不下的,而且我们的索引项需要连续存储
      • 链接方式
      • 多层索引
      • 混合索引

    链接方案

    在这里插入图片描述

    • 索引表太大,一个索引块装不下,可以将多个索引块链接存放起来
    • 这种方式是低效的:如果我们的索引块有很大,那么也会涉及很多的I/O操作,想访问最后一个块,需要遍历前面的块

    多层索引

    在这里插入图片描述

    • 类似我们的多级页表(我们的页表太大,采用多级页表,利用分割逻辑地址,获得对应的一级页表的页表项和二级页表项)
    • 我们使第一层索引块指向第二层的索引块…
    • 我们页目录项存放着我们的一级索引表的索引块,索引块中放着二级索引表的索引块
      • 我们想要第N个逻辑块的物理块地址 一个索引表能放256个索引项 先除256 得到的数说明在第几个二级索引表,然后通过取余获得在第二级索引表的哪个位置
    • N层索引说明需要N+1次磁盘I/O

    混合索引

    在这里插入图片描述

    • 混合索引有三种索引方式
      • 直接地址
      • 一级间接
      • 二级间接

    在这里插入图片描述

  • 相关阅读:
    在ubuntu(20.04)上搭建基于docker的yolov5环境(GPU:3060)
    电子制造行业的数字化转型突破点在哪?精益制造是关键
    [HDLBits] Exams/m2014 q4k
    itk中图像2d-3d配准整理
    Acwing.889 满足条件的01序列
    C++文件操作
    Spring Boot 技术架构图(InsCode AI 创作助手辅助)
    个人课设---玩家血条(包括攻击掉血,复活重生功能)
    Abbexa丨Abbexa粪便样本收集和稳定试剂盒收集程序
    学习Maven Web 应用
  • 原文地址:https://blog.csdn.net/qq_50985215/article/details/127698417