今天就自己的课设题目来介绍一下动态分区分配里面的首次适应算法和最佳适应算法。
首先大家要了解什么是动态分区分配?所谓动态分区分配 就是在处理作业的过程中,建立分区,依用户请求的大小分配分区。在分区回收的过程中会涉及一个空间利用效率相关的放置策略,即选择空闲区的策略。
常用的放置策略——首次匹配(首次适应算法)
最佳匹配(最佳适应算法)
最坏匹配(最坏适应算法)
一、首次适应算法(First Fit):该算法从空闲分区链首开始查找,直至找到一个能满足其大小要求的空闲分区为止。然后再按照作业的大小,从该分区中划出一块内存分配给请求者,余下的空闲分区仍留在空闲分区链 中。
特点: 该算法倾向于使用内存中低地址部分的空闲区,在高地址部分的空闲区很少被利用,从而保留了高地址部分的大空闲区。显然为以后到达的大作业分配大的内存空间创造了条件。
算法实现过程举例
Question 3: Segment Allocation Algorithms
Given five memory partitions of 100 KB, 500 KB, 200 KB, 300 KB, and 600 KB (in order), how would the first-fit algorithms place processes of 212 KB, 417 KB, 112 KB, and 426 KB (in order)? [1]
对于上述问题,该算法将实现以下操作
为212k分配空间:
依次找寻,找到第一个大于212k的空闲区;
找到第二个空闲区500k>212k,分配给212k,剩余288k空闲区;
为417k分配空间:
依次找寻,找到第一个大于417k的空闲区;
找到第五个空闲区600k>417k,分配给417k,剩余183k空闲区
为112k分配空间:
依次找寻,找到第一个大于112k的空闲区;
找到第二个空闲区288k>112k,分配给112k,剩余176k空闲区
为426k分配空间:
依次找寻,找到第一个大于426k的空闲区;
未找到,此作业将等待释放空间
缺点:低地址部分不断被划分,留下许多难以利用、很小的空闲区,而每次查找又都从低地址部分开始,会增加查找的开销。
二、最佳适应算法(Best Fit):该算法总是把既能满足要求,又是最小的空闲分区分配给作业。为了加速查找,该算法要求将所有的空闲区按其大小排序后,以递增顺序形成一个空白链。这样每次找到的第一个满足要求的空闲区,必然是最优的。孤立地看,该算法似乎是最优的,但事实上并不一定。因为每次分配后剩余的空间一定是最小的,在存储器中将留下许多难以利用的小空闲区。同时每次分配后必须重新排序,这也带来了一定的开销。
特点:每次分配给文件的都是最合适该文件大小的分区。
缺点:内存中留下许多难以利用的小的空闲区。
Best fit算法等价于装箱问题,举例如下:
装箱问题:有体积为V的箱子N个,体积为Vi的物品M个,求使得物品全部能够装入箱子,箱子数量的最小值。
假设 V=6 N=10,V1,V2,...,V10分别为:3 4 4 3 5 1 2 5 3 1。计算过程如下:
第一步按物品体积降序排序:5 5 4 4 3 3 3 2 1 1
第二步:取未装箱的最大值5装入第一个箱子。
第三步:判断第一个箱子是否已满,不满且剩余空间为1,搜寻剩下体积小于等于1的物品填入箱子1,箱子1填满。
第四步:重复第二,第三步,直到所有物品装入箱子为止,得到箱子数量为6.
6即时本例N的最小值。
三、最坏适应算法(Worst Fit):最坏适应算法是将输入的作业放置到主存中与它所需大小差距最大的空闲区中。空闲区大小由大到小排序。
特点:尽可能地利用存储器中大的空闲区。
缺点:绝大多数时候都会造成资源的严重浪费甚至是完全无法实现分配。
关于三种放置策略的讨论:首次适应算法、最佳适应算法、最坏适应算法的队列结构。
介绍了这么多,下面具体说说代码实现空闲区动态分配回收的具体过程。
---------------------
作者:莫顾尔在
来源:优快云
原文:https://blog.youkuaiyun.com/weixin_39282491/article/details/81045441
版权声明:本文为博主原创文章,转载请附上博文链接!