C语言内存的动态存储管理3-分配算法和回收

对于内存块大小不同的空闲链表,假如有一个大小为N的内存申请,如果空闲链表中大于N的内存只有一块,假如大小为M,就把M的一部分分配给用户,同时把剩余的M-N的部分作为一个节点插入到空闲链表中。

当大于N的内存有多块时,我们该如何分配呢?通常有以下三种方法:

(1)最先适配法。顾名思义,顺序扫描空闲链表,找到第一个大于等于N的空闲块,把其中的N分配给用户。因为链表不按内存的地址有序,也不按大小有序,所以回收内存块放到表头即可。

问题:运行一段时间后,链表中将会出现一些非常小的块,并在这些小块都在链表的前边。

(2)最优适配法。在空闲链表中找到一个不小于N并且最接近N的空闲块分配给用户。分配时需要整表扫描。如果链表按空闲块从小到大有序,分配时只需找到第一个大于N的空闲块,回收时需要插入到链表合适的位置上。

(3)最差适配法。将链表中不小于N且是链表中最大的空闲块的一部分分配给用户。链表可按空闲块从大到小的顺序排列,分配只需判断链表第一个空闲块即可,回收时需要插入到链表合适的位置上。

对于回收,我们考虑的不仅仅是归还节点,还要考虑空闲块的合并问题。这种把物理地址相邻的空闲块的合并以取得更大的空闲块的方法是需要的。空闲链表中的空闲块并不是按物理地址有序的,那又如何快速合并呢?下篇中将讨论一种方法:边界标识法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值