内存管理——动态分区时的分配与回收

1 动态分区时的分配与回收主要解决三个问题:  
(1)对于请求表中的要求内存长度,分配程序从可用表或自由链中寻找出合适的空闲区。
(2)分配空闲区之后,更新可用表或自由链。
(3)进程或作业释放内存资源时,和相邻的空闲区进行链接合并,更新可用表或自由链。

2 动态分区时的分配方法从可用表或自由链中寻找空闲区的常用方法有三种:
最先适应法(first fit algorithm):最先适应法要求可用表或自由链按起始地址递增的次序排列。该算法的最大特点是一旦找到大于或等于所要求内存长度的分区,则结束探索。然后,该算法从所找到的分区中划出所要求的内存长度分配给用户,并把余下的部分进行合并(如果有相邻空闲区存在)后留在可用表中,但要修改其相应的表项。 

最佳适应算法(best fit algorithm):要求按空闲区大小从小到大的次序组成空闲区可用表或自由链。当用户作业或进程申请一个空闲区时,存储管理程序从表头开始查找,当找到第一个满足要求的空闲区时,停止查找。如果该空闲区大于请求表中的请求长度,则与最先适应法时相同。将减去请求长度后的剩余空闲区部分留在可用表中。 

最坏适应算法(worst fit algorithm):要求空闲区按其大小递减的顺序组成空闲区可用表或自由链。当用户作业或进程申请一个空闲区时,先检查空闲区可用表或自由链的第一个空闲可用区的大小是否大于或等于所要求的内存长度,若可用表或自由链的第一个项所示空闲区长度小于所要求的,则分配失败,否则从空闲区可用表或自由链中分配相应的存储空间给用户,然后修改和调整空闲区可用表或自由链。  

3 动态分区时的回收与拼接
当用户作业或进程执行结束时,存储管理程序要收回已使用完毕的空闲区,并将其插入空闲区可用表或自由链。
在将一个新空闲可用区插入可用表或队列时,该空闲区和上下相邻区的关系是下述4种关系之一: 

a)该空闲区的上下两相邻分区都是空闲区:将三个空闲区合并为一个空闲区。新空闲区的起始地址为上空闲区的起始地址,大小为三个空闲区之和。空闲区合并后,取消可用表或自由链中下空闲区的表目项或链指针,修改上空闲区的对应项。

b)该空闲区的上相邻区是空闲区:将释放区与上空闲区合并为一个空闲区,其起始地址为上空闲区的起始地址,大小为上空闲区与释放区之和。合并后,修改上空闲区对应的可用表的表目项或自由链指针。

c)该空闲区的下相邻区是空闲区:将释放区与下空闲区合并,并将释放区的起始地址作为合并区的起始地址。合并区的长度为释放区与下空闲区之和。同理,合并后修改可用表或自由链中相应的表目项或链指针。 

d)两相邻区都不是空闲区:释放区作为一个新空闲可用区插入可用表或自由链。

4 三种算法的比较: 
      从搜索速度上看:最先适应算法具有最佳性能。尽管最佳适应算法或最坏适应算法看上去能很快地找到一个最适合的或最大的空闲区,但后两种算法都要求首先把不同大小的空闲区按其大小进行排队,这实际上是对所有空闲区进行一次搜索。 

      从释放速度来看:最先适应算法也是最佳的。因为使用最先适应算法回收某一空闲区时,无论被释放区是否与空闲区相邻,都不用改变该区在可用表或自由链中的位置,只需修改其大小或起始地址。 

      从空间利用率来看:最佳适应法找到的空闲区是最佳的,也就是说,用最佳适应法找到的空闲区或者是正好等于用户请求的大小或者是能满足用户要求的最小空闲区。最坏适应算法正是基于不留下碎片空闲区这一出发点的。它选择最大的空闲区来满足用户要求,以期分配后的剩余部分仍能进行再分配。

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值