动态分区分配

动态分区分配

动态分区分配是根据进程的实际需要,动态的为之分配内存的空间。总体是按照算法规则找到分配的空闲分区,然后从该分区中再按照作业的大小划出一块内存空间分给作业,该分区余下的空闲分区当做一个新的空闲分区留在空闲链中。

当作业按照算法规则分配好了后,等作业运行完毕释放内存,系统根据回收区的首址,从空闲区链表中找到相应的插入点,此时可能出现以下4种情况之一:

回收区与插入点的前一个空闲分区F1相邻接,此时将两个分区合并;

回收区与插入点的后一个空闲分区F2相邻接,此时将两个分区合并;

回收区与插入点的前,后两个空闲分区相邻接,此时将三个分区合并;

回收区既不与F1相邻接,又不与F2相邻接,此时应为回收区单独建立一个新表项。

 

1)首次适应算法

首次适应算法,要求空闲分区链以地址递增的次序链接,在分配内存时,从链首开始顺序查找,直到找到一个大小能满足要求的空闲分区为止,然后再按照作业的大小,从该分区中划出一块内存空间分给请求者,余下的空闲分区仍停留在空闲链中

 

2)循环首次适应算法

该算法是由首次适应算法演变而成的。在为进程分配内存空间时,不再每次从链首开始查找,而是从上次找到的空闲分区开始查找,直至找到一个能满足需求的空闲分区,并从中划出一块来分给作业。该算法能使空闲中的内存分区分布得更加均匀,但将会缺乏大的空闲分区。

3)最佳适应算法

该算法总是把既能满足需求又是最小的空闲分区分配给作业。

为了加速查找,该算法需要将所有的空闲区按其大小从小到大进行排序后,当有作业要分配的时候,查找满足其内存需求,同时又是最小的空闲块,然后分配给作业。

这样每次找到的第一个满足需求的空闲区,必然是最优的。但该算法容易由于每次是查找到满足作业的最小空闲块,然后从该分区中再按照作业的大小划出一块内存空间分给作业,该分区余下的空闲分区当做一个新的空闲分区留在空闲链中,由于在没分配前该分区(满足作业的最小空闲块)大小一般不会超过该作业太多,就容易会出现在存储器中将留下许多难以利用的小空闲区,同时每次分配后必须重新排序,这也带来了一定的开销。

4)最差适应算法

最差适应算法中,该算法需要将所有的空闲区按其大小从大到小进行排序,分配时直接从空闲区链的第一个空闲分区中分配(不能满足需要则不分配)。非常显然,如果第一个空闲分区不能满足,那么再没有空闲分区能满足需要

这种分配方法初看起来不太合理,但他也有非常强的直观吸引力:在大空闲区中放入程式后,剩下的空闲区常常也非常大,于是还能装下一个较大的新程式。


例题:

在动态分区分配方案中,某一作业完成后,系统收回其主存空间,并与相邻空闲区合并,为此需要修改空闲区表,造成空闲区数减1的情况是()

  • 无上邻空闲区,也无下邻空闲区
  • 有上邻空闲区,但无下邻空闲区
  • 有下邻空闲区,但无下邻空闲区
  • 有上邻空闲区,也有下邻空闲区
解答:D
  • 有上邻空闲区,但无下邻空闲区.只修改上邻空闲区长度(为收回的空闲区长度与原上邻区长度之和),空闲区数不变
  • 无上邻空闲区,但有下邻空闲区.改记录这个下邻空闲区记录的地址为收回空闲区的地址,长度为下邻空闲区的长度和收回空闲区的长度,空闲区数不变
  • 有上邻空闲区,也有下邻空闲区.改记录上邻区记录的长度(为上邻区长度、下邻区长度和收回区长度之和),再把下邻区记录的标志位改为空,即空闲区数-1。
  • 无上邻空闲区,也无下邻空闲区.那么找一个标志位为空的记录,记下该回收区的起始地址和长度,且改写相应的标志位为未分配,表明该登记栏中指示了一个空闲区。空闲区数+1。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值