成组链接法介绍

计算机上的文件是记录在磁盘上的,而磁盘空间的分配是以盘块为单位的,那么如何管理磁盘中已经被使用的块和未被使用的块是操作系统必须要考虑的问题。下面将介绍比较实用又有点复杂的成组链接法,看它是如何把磁盘中所有的空闲盘块都记录起来,又不耗费太多的内存空间。
请看下图:

下面的文字来自汤氏的操作系统教材:
1、空闲盘块的组织

(1)空闲盘块号栈:用来存放当前可用的一组空闲盘块的盘块号(最多含100 个号),以及栈中尚有的空闲盘块号数N。顺便指出,N 还兼作栈顶指针用。例如,当N=100 时,它指向S.free(99)。由于栈是临界资源,每次只允许一个进程去访问,故系统为栈设置了一把锁。(只有这个是放在内存中的,其它是在磁盘上。)
(2) 文件区中的所有空闲盘块被分成若干个组,比如,将每100 个盘块作为一组。假定盘上共有10 000 个盘块,每块大小为1 KB,其中第201~7999 号盘块用于存放文件,即作为文件区,这样,该区的最末一组盘块号应为7901~7999;次末组为7801~7900……;第二组的盘块号为301~400;第一组为201~300,如上图右部所示。
(3) 将每一组含有的盘块总数N 和该组所有的盘块号记入其前一组的第一个盘块的
S.free(0)~S.free(99)中。这样,由各组的第一个盘块可链成一条链。
(4) 将第一组的盘块总数和所有的盘块号记入空闲盘块号栈中,作为当前可供分配的空闲盘块号。
(5) 最末一组只有99 个盘块,其盘块号分别记入其前一组的S.free(1) ~S.free(99)中,而在S.free(0)中则存放“0”,作为空闲盘块链的结束标志。(注:最后一组的盘块数应为99,不应是100,因为这是指可供使用的空闲盘块,其编号应为(1~99),0号中放空闲盘块链的结尾标志。)
2、空闲盘块的分配与回收

当系统要为用户分配文件所需的盘块时,须调用盘块分配过程来完成。该过程首先检查空闲盘块号栈是否上锁,如未上锁,便从栈顶取出一空闲盘块号,将与之对应的盘块分配给用户,然后将栈顶指针下移一格。若该盘块号已是栈底,即S.free(0),这是当前栈中最后一个可分配的盘块号。由于在该盘块号所对应的盘块中记有下一组可用的盘块号,因此,须调用磁盘读过程,将栈底盘块号所对应盘块的内容读入栈中,作为新的盘块号栈的内容,并把原栈底对应的盘块分配出去(其中的有用数据已读入栈中)。然后,再分配一相应的缓冲区(作为该盘块的缓冲区)。最后,把栈中的空闲盘块数减1 并返回。
在系统回收空闲盘块时,须调用盘块回收过程进行回收。它是将回收盘块的盘块号记入空闲盘块号栈的顶部,并执行空闲盘块数加1 操作。当栈中空闲盘块号数目已达100 时,表示栈已满,便将现有栈中的100个盘块号记入新回收的盘块中,再将其盘块号作为新栈底。
实例讲解成组链接法

如果对上面的讲解感到迷惑的话,请看下面的例子,这是一个很经典的练习题:
例题.某个系统采用成组链接法来管理磁盘的空闲空间,目前磁盘的状态如图1所示。

(1) 该磁盘中目前还有多少个空闲盘块?

(2) 请简述磁盘块的分配过程。

(3) 在为某个文件分配3个盘块后,系统要删除另一文件,并回收它所占的5个盘块,它们的盘块号依次为700、711、703、788、701,请画出回收后的盘块链接情况。

解答:
(1):301;首先看空闲盘块号栈,此时N=2,表示有两个空闲盘块299、300,而盘块300号上面又写着有100个空闲盘块:301-400,它还有下一个链接的盘块400;在盘块400中,记录有100个空闲盘块401-500;然后又链接到500号盘块,在500号盘块中,虽然N=100,但是第一个是0,它表示空闲盘块链的结尾。因此,总共的空闲盘块有:299、300、301-400、401-500、501-599;即301个空闲盘块。
(2):参考介绍部分。
(3):这个是最重要的部分,也是理解整个成组链接法的关键部分,我看很多博客都没有详细写明分配和回收的过程,因此这也正是我写这篇博客的原因。
步骤1、分配三个空闲盘块:
分配的过程是这样的,首先看空闲盘块号栈,发现N=2,那么到达栈顶即S.free[2-1]=299,即把299号盘块分配出去了,这时磁盘状态如下:

然后分配第二个盘块,这时N=1,如果再分配就会变成空栈了,因为S.free[N-1]=S.free[0]!=0,所以需要将300号盘块的内容拷贝到空闲盘块号栈,并分配300号盘块(如果S.free[0]=0,则表示没有空闲盘块,将会阻塞进程):

回收700、711、703、788、701号盘块:
回收的过程也是从栈顶开始的,首先看N=99,然后回收700,会将700放在S.free[N]的位置,然后将N加1变成100:

然后回收711号盘块,因为此时空闲栈的N=100,已经满了,如果再回收,需要将空闲盘块栈的内容移动到711号盘块上,然后将空闲盘块栈的S.free[0]设置为711,N设置为1:

最后回收703/788/701也是同理:

【操作系统】成组链接法详解相关推荐

  1. 操作系统成组链接法(@王道论坛)

    操作系统成组链接法

  2. 操作系统–––成组链接法

    成组链接法介绍 看不懂打死我 计算机上的文件是记录在磁盘上的,而磁盘空间的分配是以盘块为单位的,那么如何管理磁盘中已经被使用的块和未被使用的块是操作系统必须要考虑的问题.下面将介绍比较实用又有点复杂的 ...

  3. 操作系统:文件系统——空闲块成组链接法的模拟

    题目 文件系统--空闲块成组链接法的模拟 (1)设计合适的数据结构模拟磁盘空闲块的情况. (2)模拟分配空闲块的过程. (3)模拟回收空闲块的过程. (4)模拟对所有空闲块进行分析.凑连续块 的维护过 ...

  4. 操作系统之文件系统:4、文件存储空间管理(空闲表法、空闲链表法、位示图法、成组链接法)

    4.文件存储空间管理 思维导图 文件的初始化和划分 文件存储空间管理方法 1.存储空间管理--空闲表法 2.存储空间管理--空闲链表法 3.存储空间管理--位示图法 4.存储空间管理--成组链接法 思 ...

  5. 操作系统之银行家算法—详解流程及案例数据

    操作系统之进程调度--优先权法和轮转法(附上样例讲解) 操作系统之银行家算法-详解流程及案例数据 操作系统之多线程编程-读者优先/写者优先详解 操作系统之存储管理--FIFO算法和LRU算法 操作系统 ...

  6. linux 的文件软链接隐藏,Linux inode及硬链接软链接详解

    Linux inode及硬链接软链接详解 York • 2020 年 09 月 28 日 Loading... 操作系统的文件数据除了实际内容之外,通常含有非常多的属性,例如 `Linux`操作系统的 ...

  7. 单链表的头尾插法详解

    单链表头尾插法详解 头插法构造单链表 代码实现 头插法过程 尾插法构造单链表 代码实现 尾插法过程 单链表头尾插法对比 #include "stdio.h" #include &q ...

  8. 文件系统——空闲块成组链接法的模拟

    文件系统--空闲块成组链接法的模拟 文章目录 文件系统--空闲块成组链接法的模拟 内容 思路 代码 结果与分析 1. 创建成组链表 2. 分配 //申请的盘块数不合理 //申请的盘块数不大于超级栈的最 ...

  9. Rt-thread [三] link.lds链接脚本详解

    Rt-thread [三] link.lds文件详解 前言 程序编译流程 什么是链接 基本概念 RT-thread stm32f407 link.lds链接脚本详解 资料 前言   开一个专题,记录自 ...

最新文章

  1. 不知道什么时间收集的code
  2. What’s new: Windows Phone 7 与 Windows Phone 6.5功能对比
  3. Doxygen简单经验谈。。。
  4. 这样的烂代码,我实习的时候都写不出来!
  5. Jquery源码分析之匿名函数的自执行
  6. dataGridView 数据绑定
  7. mac hdmi 不能调整音量_搭配这几个软件,你的 AirPods 在安卓、Mac 上会更好用
  8. axure 内部框架内容下滑_Axure教程:转盘抽奖交互原型
  9. Python之网络编程(TCP套接字与UDP套接字)
  10. Linux系统编程 -- volatile关键字
  11. 网络计算机应急处理,网络安全应急响应
  12. XMind 8 Pro
  13. Pytorch(一) —— 相关库和函数
  14. python中的IO操作
  15. 如何让溢出的文字省略号显示
  16. html mui模板使用,mui + vue 模板
  17. A Monocular SLAM System Leveraging Structural Regularity in Manhattan World
  18. 任何事,尽量从正面、善意的角度去解读,运气都不会太差
  19. java git_Java 实战开发之git环境安装(三)
  20. JSP Taglib指令具有什么功能呢?

热门文章

  1. photoshop 2019 mac版 可支持最新M1芯片处理器
  2. 孩子升年级难适应?猿辅导语文金牌教研来支招
  3. 安装Linux时grub2安装失败,尝试安装Ubuntu作为计算机唯一的操作系统时,我收到错误'grub-install/dev/sda failed'。 - Ubuntu问答...
  4. 游戏运营的十二大组成
  5. SpringBoot最佳实践,它来了,它来了
  6. win10鼠标不受控制乱动_win10 控制面板在哪里?
  7. 分享查看手机微信IP地址归属地方法
  8. bootstrap 表头组合
  9. 教你找回直接打开outlook附件文件编辑后保存但未另存为的附件文件?
  10. linux驱动(一):linux驱动框架