边界标识存储管理:双向循环链表实现分配和回收

以前写过模拟首次适应、最佳适应和最坏适应法的代码,正好用到动态存储管理算法上,之所以叫动态存储管理(或叫动态存储分配),指用户请求的分配内存是一个动态变量。对于每次大小不同的内存分配,系统都会分配一个地址连续的空闲内存块,系统一开始的内存区是一整个空闲的内存块,随着用户的不断内存申请,这一整块大的空闲内存区,每次会分配出适合的空闲内存块出去,不停分配的同时,也会因为有的程序运行结束了,内存块被回收...
摘要由CSDN通过智能技术生成

以前写过模拟首次适应、最佳适应和最坏适应法的代码,正好用到动态存储管理算法上,之所以叫动态存储管理(或叫动态存储分配),指用户请求的分配内存是一个动态变量。对于每次大小不同的内存分配,系统都会分配一个地址连续的空闲内存块,系统一开始的内存区是一整个空闲的内存块,随着用户的不断内存申请,这一整块大的空闲内存区,每次会分配出适合的空闲内存块出去,不停分配的同时,也会因为有的程序运行结束了,内存块被回收回来,系统空闲内存区运行一段时间后通常会呈现这种断断续续的形态:

也就是说,系统空闲内存区的内存块个数随着系统运行期间,不断增加,内存块有大有小,十分零碎,直到最后可能会出现内存区中每一块的空闲内存块都无法满足用户申请的内存需求(因为分配的是一块地址连续的内存块)。所以在内存分配和回收的时候,就要采取合适的方法,例如分配方法有首次适应、最佳适应和最差适应

(这三种方法的模拟实现C代码已上传GitHub:

https://github.com/justinzengtm/Dynamic-Memory-Allocation

在回收方法中,一种是一直从内存空闲区中分配空闲内存块出去,直到最后内存空闲区中没有一块空闲块能满足用户的内存分配请求后,再去回收所有用户已释放的内存块,整理成一个大的空闲内存块,继续分配。另一种方法是,分配过程和回收过程同步执行,用户请求分配内存,就从空闲内存区中分配空闲块,当用户释放内存块后,立刻回收内存块到空闲内存区中,以备下一次的请求分配。至于回收的方法,可不只是简单地把内存块直接插入放回到空闲内存区中,因为内存块都是有地址的,是一片地址连续的存储单元,如果只是简单地把空闲内存块“放回空闲内存区”,那么这些零零散散的小空闲块无法满足用户大的内存分配请求,也一样只能堆积在空闲内存区中。所以在回收空闲内存块时,要把地址连续的空闲内存单元合并成一个大的内存空闲块,

      解决分配和回收的问题具体要看管理内存区的算法和数据结构,如果用边界标识法,也就是每个内存空闲块都在首尾标识了该地址连续的存储单元的起始地址和末尾地址,这样做的好处在于,在回收内存块时,可以根据起始和末尾地址,查看系统空闲内存区中与其相邻的内存区是否为空闲块,如果其左邻区或右邻区,又或左右邻区都是空闲块,则可以把它们合并成一个较大的内存空闲块。对于分配方法,上面三种都可以。边界标识法有一个问题是,如果用户请求的内存大小为userMemory,在系统空闲内存区中找到的合适的内存空闲块为Size,那么每次都把内存空闲块的Size – userMemory大小内存空间分配给用户,则系统中会积累越来越多的容量很小的空闲内存块,这些空闲内存块因为

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值