内存碎片及伙伴算法

今天学习到 Linux 内存分配问题,有些不明白,什么是内存碎片问题?以及为什么maloc()等函数每次分配内存后都会用 free()释放资源,为什么还会产生碎片问题?内存碎片问题如何产生 及 如何解决呢?
以下是自己今天学习心得:
内存碎片概念:
内存碎片问题分为内部碎片和外部碎片两种。
   1.内部碎片是由于采用固定大小的内存分区,当一个进程不能完全使用分给它的固定内存区域时,就将该进程分配后剩余的部分称为内碎片。通常内碎片难以避免;
   2.外部碎片是由于某些未分配的连续区域太小,不足以为任意进程分配内存资源的内存块大小,此时称这些不可用的内存块大小为外部碎片


对于malloc()等函数,每次申请完内存后都会释放,但每次释放的内存大小及释放时间的不同就会产生内存碎片。比如:在内存单元100的起始地址到内存单元200之间,共申请了100个1字节的空间。在free()时,释放了内存地址为奇数的内存单元(如101,103,105……)而偶数单元不释放,释放了50个1字节空间,虽然总空间数为50字节,但由于这50个1字节空间不连续。当下次要申请2字节的内存单元时,却无法在100到200的内存地址单元中申请到空间,于是就产生内存碎片问题。


为什么会产生内存碎片?
对于内存的分配方法有:连续地址分配、分页机制和分段机制以及段页式(网上有很多关于内存地址分配的文章,都很不错,可以了解一下)
连续地址分配:固定分区分配会产生内碎片问题,动态分区分配会产生外碎片问题

分页机制:相比较固定分配分区,内碎片问题已经明显减少

分段机制:消除内碎片问题,但会产生外碎片问题



伙伴算法可以解决外碎片问题,其算法思想如下:

无论已经分配的分区还是空闲分区,其大小均为2的k次幂,k为整数,1<=k<=m,其中2^1表示分配的最小分区大小,2^m 表示分配的最大分区的大小。在系统开始运行时,整个内存区是一个大小为2^m的空闲分区,随着系统运行,空闲区的不断划分会形成若干不连续的空闲分区,将这些空闲分区按照分区的大小

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值