今天学习到 Linux 内存分配问题,有些不明白,什么是内存碎片问题?以及为什么maloc()等函数每次分配内存后都会用 free()释放资源,为什么还会产生碎片问题?内存碎片问题如何产生 及 如何解决呢?
以下是自己今天学习心得:
内存碎片概念:
内存碎片问题分为内部碎片和外部碎片两种。
1.内部碎片是由于采用固定大小的内存分区,当一个进程不能完全使用分给它的固定内存区域时,就将该进程分配后剩余的部分称为内碎片。通常内碎片难以避免;
2.外部碎片是由于某些未分配的连续区域太小,不足以为任意进程分配内存资源的内存块大小,此时称这些不可用的内存块大小为外部碎片
对于malloc()等函数,每次申请完内存后都会释放,但每次释放的内存大小及释放时间的不同就会产生内存碎片。比如:在内存单元100的起始地址到内存单元200之间,共申请了100个1字节的空间。在free()时,释放了内存地址为奇数的内存单元(如101,103,105……)而偶数单元不释放,释放了50个1字节空间,虽然总空间数为50字节,但由于这50个1字节空间不连续。当下次要申请2字节的内存单元时,却无法在100到200的内存地址单元中申请到空间,于是就产生内存碎片问题。
为什么会产生内存碎片?
对于内存的分配方法有:连续地址分配、分页机制和分段机制以及段页式(网上有很多关于内存地址分配的文章,都很不错,可以了解一下)
连续地址分配:固定分区分配会产生内碎片问题,动态分区分配会产生外碎片问题
以下是自己今天学习心得:
内存碎片概念:
内存碎片问题分为内部碎片和外部碎片两种。
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的空闲分区,随着系统运行,空闲区的不断划分会形成若干不连续的空闲分区,将这些空闲分区按照分区的大小