【操作系统】4.3文件管理(操作系统需要对磁盘的管理)

1. 对非空闲磁盘的管理

“文件的物理结构/文件分配方式” 的探讨

  • 知识补充:
    1. 文件块、磁盘块
      1. 类似于内存分页,磁盘中的存储单元也会被分为一个个“块/磁盘块/物理块”,很多操作系统中磁盘块的大小与内存块页面的大小相同
      2. 内存于磁盘之间的数据交换(即读/写操作,磁盘I/O)都是以“块”为单位的,即每次读入一块 在这里插入图片描述
      3. 内存管理中,进程的逻辑地址空间被分为一个个页面。同样的,在外存管理中,文件的逻辑地址空间同样被分为了一个个文件的块
      4. 于是文件的逻辑结构地址也可以表示为(逻辑块号,块内地址)的形式 在这里插入图片描述

操作系统怎么完成 逻辑地址到物理地址的映射
(逻辑块号,块内地址)→(物理地址,块内地址),只需要转换块号就行,块内地址保持不变

1. 连续分配

  1. 要求每个文件在磁盘上占有一组连续的块
  2. 文件目录中记录着文件的起始块号长度(总共占几块) 在这里插入图片描述
  3. 映射过程:
    1. 用户给出要访问的逻辑块号,操作系统找到该文件对应的目录项(FCB)
    2. 物理块号=起始块号+逻辑块号(绝对=起始+相对)
    3. 话需要检查用户提供的逻辑块号<= 文件长度
  4. 性能:
    1. 优点:
      1. 可以直接算出逻辑块号对应的物理块号,因此连续分配支持顺序访问和直接访问

        顺序访问:一块一块顺序访问
        直接访问:要访问2号块,可以跳过1号块直接访问(能直接算出2号块)

      2. 连续分配的文件在顺序读写时速度最快

        读取某个磁盘块时,需要移动磁头。访问的两个磁盘块相距越远,移动磁头所需的时间就越长

    2. 缺点:
      1. 不方便文件的拓展 在这里插入图片描述
      2. 存储空间利用率低,会产生磁盘碎片
        在这里插入图片描述

2. 链接分配

  1. 采取离散分配方式,可以为文件分配离散的磁盘块
  2. 分类:
    1. 隐式链接:考试中默认的链接方式
      1. 文件记录了文件存放的起始块号和结束块号
      2. 除了文件最后一个磁盘外,每个磁盘中都会保存指向下一个盘块的指针,这些指针对用户是透明的 在这里插入图片描述
      3. 从目录项中找到起始块号(即0号块),将0号逻辑块读入内存,由此知道1号逻辑块存放的物理块号,于是读入1号逻辑块,再找到2号块的逻辑地址——因此,读入 i 号逻辑块,总共需要 i + 1 次磁盘I/O
      4. 性能:
        1. 优点:
          1. 由于是离散的,故方便文件的拓展,且不会有碎片问题
        2. 缺点:
          1. 采用隐式的链接分配,只支持顺序访问,不支持随机访问,查找效率低
          2. 块内存储下一个逻辑块的指针也会占用少量的存储空间
    2. 显式链接:
      1. 把用于链接文件的各个物理块的指针显式地、统一地存放在一张表中,即 文件分配表FAT
      2. 假设有一个文件aaa依次存放在磁盘块2,5,0,1,目录中只会存放文件的起始块号
        在这里插入图片描述
      3. 注意:
        1. 一个磁盘仅设置一张FAT,开机时,将FAT读入内存,并⭐常驻内存
        2. FAT各个表项在物理上连续存储,且每一个表项大小相同,所以物理块号可以隐含
      4. 从目录项中找到起始块号(即0号块),如要查找的 i 号块,i > 0 ,则查询 内存中 的FAT,依次找到 i 号块的物理地址,因此,逻辑块号转换成物理块号的过程不需要读磁盘操作
      5. 性能:
        1. 优点:
          1. 由于是离散的,故方便文件的拓展,且不会有碎片问题
          2. 采用显式的链接分配,不仅支持顺序访问,也支持随机访问(有FAT的存在,不需要像之前一样依次访问之前的磁盘块,在FAT中找就行),查找效率高
        2. 缺点:
          1. 文件分配表FAT也会占用少量的存储空间

3. 索引分配

  1. 索引分配允许文件离散地存放在各个磁盘中,系统会为每个文件建立一张索引表,索引表中建立了文件的各个逻辑块相对的物理块号(逻辑页面到物理块之间的映射关系)
  2. 索引表存放的物理块称为索引块文件数据存放的物理块称为数据块
  3. 目录中需要记录的是文件的索引块所在的物理块
  4. 假设有一个文件aaa依次存放在磁盘块2,5,0,1,目录中只会存放文件的索引块所在的7号物理块,去7号物理块调出文件aaa的索引表内容后,里面存放着文件aaa每个逻辑块对应的物理块号
    在这里插入图片描述
  5. 可以用固定长度表示索引表中的物理块号。如:若磁盘总容量为1TB=240 B,而一个物理快大小为1KB=210B,则一共有物理块数=240 B/210B= 230则要表示这么多块,需要30位二进制,所以需要用于存储物理块号的大小应为:4B。同时,索引表在索引块中是顺序存储的,且每个索引表项位4B,故逻辑块号是可以隐含的,即索引表项大小为4B
  6. 性能:
    1. 优点:
      1. 索引分配方式可以支持随机访问
      2. 方便实现文件的拓展只需要给文件分配一个空闲块,同时增加一个索引表项即可
    2. 缺点:
      1. 索引表需要占用一定空间
  7. 思考:

    上面例子中,一个物理快大小为1KB=210B,索引表项大小为4B,故一个索引块中能放210 / 4 =256个索引表项,但是如果一个文件的索引表项大于256个,该怎办呢?

    1. 链接方案
      1. 如果索引表太大,则可以将大索引表拆分成很多小的索引表,再将这些索引表链接起来 在这里插入图片描述
      2. 存在的问题:
        如果一个文件大小为64MB=226 B,而一个磁盘块大小为1KB,则该文件需要226 /210 =216 个物理块,又由于一个磁盘块中只能放256=28 个索引项,所以光存放索引表的索引块就需要216 / 28 =28 个,这些索引块是一个个串起来的,如果要读文件的结尾,就需要访问 256个磁盘块才能实现,可见这样的磁盘I/O是很大的
    2. 多层索引
      1. 建立多层索引(原理类似于多级页表),使第一层索引块指向第二层索引块,还可以根据文件大小的要求再建立第三层、第四层索引块
        在这里插入图片描述
      2. 假设磁盘块大小为1KB,一个索引表项占4B,所以一个磁盘块中能存放28 个索引表项,因此,两级索引中能存放的文件的最大大小28 *28 * 1KB= 226 B=64MB
      3. 如何根据逻辑块号找到它的物理块号:
        1. 要访问1026号逻辑块,则1026 % 28 =4,1026 / 28 =2,也就是1026号逻辑块需要去 4号二级索引表第2个表项去找
        2. 先由7号找到一级索引表,再由一级索引表的第4个索引表项,再找到4号二级索引表,再由该二级索引表的第2个表项访问目标物理块——可见需要3次磁盘I/O
        3. 若采用三级索引,则文件最大为28 * 28 * 281KB= 232 B=16GB,访问目标数据块需要4次磁盘I/O,( i 级索引,需要 i +1 次I/O
      4. 多级索引存在的问题
        虽然大读入文件的磁盘I/O次数大幅减少了,但这又会使得小文件徒增I/O,如果一个1KB的文件采用二级索引,同样也要3次磁盘I/O
        如何解决呢?
    3. 混合索引
      1. 多种索引分配方式的结合,既包含直接索引(直接指向数据块),又包含二级索引、三级索引 在这里插入图片描述
      2. 上边这种索引结构支持的最大文件为:(8+256+65536) * 1KB=65800KB
      3. 若顶级索引表还没读入内存:
        1. 访问0~7号逻辑块:两次读磁盘(对于小文件,只需要较少的读磁盘数也可以访问目标数据块
        2. 访问8~263号逻辑块:三次读磁盘
        3. 访问264~65799号逻辑块:四次读磁盘
    4. ⭐⭐⭐重要考点:
      1. 根据多级索引、混合索引结构算出支持最大的文件大小(key:各级索引表的大小不能超过一个物理块)
      2. 分析访问某个数据块需要的读磁盘次数(key:FCB中会有指向定级索引表的指针;因此可以根据FCB读入顶级索引表,每次读入下一级索引块都需要一次磁盘I/O,注意:看清题目顶级索引块是否已经调入内存

4. 总结

在这里插入图片描述

2. 对空闲磁盘的管理

“文件的存储空间管理” 的探讨

1. 存储空间的划分与初始化

  1. 磁盘分区——存储空间的划分:将物理磁盘划分为一个个文件卷(逻辑卷、逻辑盘)
  2. 文件卷又会划分成目录区与文件区:
    1. 目录区:主要存放 ① 文件的目录信息(FCB)、② 用于磁盘存储空间管理的信息如:空闲表、位示图、超级块等)
    2. 文件区:用于存放文件数据
  3. 存储空间的初始化:将各个文件卷划分为目录区和文件区

2. 几种管理方法

  1. 空闲表法
    1. 怎么记录空闲区?
      记录空闲区的第一个空闲块号空闲物理块数
    2. 如何分配磁盘?
      与内存管理中的动态分配很类似,为一个文件分配连续的存储空间。同样可采用首次适应、最佳适应、最坏适应等算法来决定为文件分配哪个空间
    3. 如何回收磁盘块?
      与内存管理中的动态分配很类似,回收时要注意与相邻空闲磁盘块的合并问题
    4. 适用于连续分配的物理结构
      在这里插入图片描述
  2. 空闲链表法
    1. 空闲盘块链:以盘块为单位组成一条空闲链
      1. 操作系统保存着链头、链尾指针
      2. 如何分配:若某文件申请K个磁盘块,则从链头开始依次摘下 K个盘块分配,并修改空闲链的链头指针
      3. 如何回收:回收的盘块依次挂到链尾并修改空闲链的尾指针
      4. 适用于离散分配的物理结构
        在这里插入图片描述
    2. 空闲盘区链:以盘区为单位组成一条空闲链
      1. 操作系统保存着链头、链尾指针
      2. 如何分配:若某文件申请K个磁盘块,则从链头开始使用相应的算法,找到符合的盘区,若没有合适的盘区,也可以将不同盘区的物理块分配个同一个文件,分配完要修改相应的指针和盘区大小
      3. 如何回收:注意与相邻盘区的合并问题
      4. 连续、离散分配的物理结构 都适用在这里插入图片描述
  3. 位示图法
    1. 位示图:每个二进制位对应一个盘块,0代表空闲,1代表已分配,位示图中一般用连续的来表示,下面例子中,一个字的字长是16位,因此,可以用 (字号,位号) 对应一个盘块号,或(行号,列号)
    2. 转换时:注意,字号、位号、盘块号是从0开始,还是从1开始的
    3. 如何分配:①顺序找到 K 个0,② 根据这些 0 盘块的(字号,位号)计算出相应的盘块号,将这些盘块分配给文件,③ 并改0 为1
    4. 如何回收:根据要回收的盘块号计算出这些盘块的(字号,位号),并改 1 为 0
    5. 连续、离散分配都适用
      在这里插入图片描述
  4. 成组链接法

空闲表法、空闲链表法不适合用于大型的文件系统,因为空闲表和空闲链表可能过大
UNIX系统中采用了成组链接法对磁盘空闲块进行管理

  1. 文件卷的目录区中专门用一个磁盘块作为超级块,当系统启动时需要将超级块读入内存。并且要保证内存与外存中的“超级块”数据一致
    在这里插入图片描述
  2. 如何分配?
    1. 例一:需要分配一个空闲块
      1. 检查第一个分组是否够,1<100
      2. 分配第一个分组的1个空闲块,并修改超级块中的“下一分组的空闲盘块数”为99
        在这里插入图片描述
    2. 例二:需要分配100个空闲块
      1. 检查第一个分组是否够,100=100
      2. 分配第一个分组的100个空闲块
      3. 由于需要将第一分组的第一块也分配,所以,需要将第一个分组的第一块中的第二分组的信息复制到超级块中 在这里插入图片描述
  3. 如何回收?
    与分配反操作

猜你喜欢

转载自blog.csdn.net/Qmilumilu/article/details/114518583
今日推荐