操作系统 ---成组链接法(盘块的分配和回收)

成组链接法介绍

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

这里写图片描述
下面的文字来自汤氏的操作系统教材:

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:当前磁盘状态
1
解答: 
(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,则表示没有空闲盘块,将会阻塞进程): 

这里写图片描述

接下来分配301号盘块你也会做啦: 

这里写图片描述


回收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也是同理:

这里写图片描述
--------------------- 
原文:https://blog.csdn.net/ajay666/article/details/73569654 

  • 43
    点赞
  • 120
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
### 回答1: android10-libart.so是安卓系统中的一个重要文件,它属于ART(Android Runtime)虚拟机的一部分。ART是安卓系统中替代旧版Dalvik虚拟机的新一代运行时环境,主要用于执行和管理应用程序的代码运行。 android10-libart.so文件是ART虚拟机的核心动态链接库,包含了ART运行时所需的各种函数和库文件。它负责将应用程序的字节码转换为机器码,并在运行时执行这些机器码。通过优化编译和执行等方式,android10-libart.so可以提高应用程序的性能和响应速度。 除此之外,android10-libart.so还承担着其他重要的功能。它与系统其他模块进行交互,保证应用程序的正确运行。同时,它还与安卓系统的其他版本相关联,以确保应用程序在不同的设备上都能够正常运行。 尽管android10-libart.so是安卓系统的核心文件,但对于普通用户而言,了解这个文件并不是很重要。我们只需要知道它是为了提升应用程序性能而存在的,并且能够自动在系统中工作。在正常使用安卓设备时,我们不需要主动对这个文件进行操作或修改。 总之,android10-libart.so是安卓系统中ART虚拟机的关键部分,它负责执行应用程序的代码并提升其性能。虽然对于普通用户而言,了解这个文件并不是必需的,但了解它的存在对于理解安卓系统的工作原理是有益的。 ### 回答2: android10-libart.so是Android操作系统中的一个动态链接库文件,它是ART(Android Runtime)的一部分。ART是一种基于AOT(Ahead-of-Time)编译的运行时环境,用于解释和执行Android应用程序。 android10-libart.so是ART的其中一个库文件,它实现了一些核心的功能,包括代码编译、垃圾回收、对象分配和线程管理等。通过加载和链接android10-libart.so库文件,Android系统可以在运行时对应用程序的代码进行编译和优化,从而提高应用程序的执行效率和性能。 在Android 10及之后的版本中,ART引入了一些新的特性和优化,通过改进libart库的实现,进一步提升了Android系统的运行效率和应用程序的响应速度。android10-libart.so库文件中可能包含一些针对Android 10版本的特定改进和修复,以解决在此版本中出现的一些问题和bug。 总而言之,android10-libart.so是Android 10中ART运行时环境的一部分,通过提供核心功能和优化,它对Android系统的运行效率和应用程序的性能有着重要的影响。 ### 回答3: android10-libart.so 是 Android 10 系统中的一个库文件,它是用于支持 Android 虚拟机(ART)的关键组件之一。 在 Android 10 中,Google 对 ART 进行了一系列的改进和升级。ART 是 Android 系统中的运行时环境,它负责将 Android 应用程序的字节码转换为本地机器码,并执行应用程序。android10-libart.so 就是其中一个关键的库文件,它包含了 ART 运行时所需的函数和资源。 android10-libart.so 的存在使得 ART 在 Android 10 中能够更加高效地执行应用程序。它通过优化代码执行、垃圾回收、内存管理等方面的算法和机制,提升了应用程序的性能和稳定性。 另外,android10-libart.so 还包含了一些与安全相关的功能,例如防止应用程序之间的信息泄露,提供代码签名验证等。 总之,android10-libart.so 是 Android 10 系统中的一个重要库文件,它为 Android 虚拟机(ART)的运行提供了关键的支持和优化。它的存在使得 Android 10 能够更加高效地执行应用程序,并提供了一定程度的安全保障。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值