什么是内存碎片???
内存碎片分为
- 内部碎片
- 外部碎片
内部碎片:是由于采用固定大小的内存分区,当一个进程不能完全使用分给它的固定内存区域就产生了内部碎片,通常内部碎片难以完全避免;
外部碎片:是由于某些未分配的连续内存区域太小,以至于不能满足任意进程的内存分配请求,从而不能被进程利用的内存区域;
什么情况下会产生内存碎片???
- 对于malloc()等函数,每次申请完内存后都会释放,但每次释放的内存大小及释放时间的不同就会产生内存碎片。
比如:在内存单元100的起始地址到内存单元200之间,共申请了100个1字节的空间。在free()时,释放了内存地址为奇数的内存单元(如101,103,105……)而偶数单元不释放,释放了50个1字节空间,虽然总空间数为50字节,但由于这50个1字节空间不连续。当下次要申请2字节的内存单元时,却无法在100到200的内存地址单元中申请到空间,于是就产生内存碎片问题。
内存分配有哪些方法???
- 连续地址分配
固定分区分配会产生内部碎片问题,动态分配会产生外部碎片问题 - 分段式内存管理
- 分页式内存管理
- 段页式内存管理
怎样避免内存碎片???
- 伙伴算法
- slab算法
具体思路可参考该网址
https://blog.csdn.net/u013009575/article/details/17751147