内存碎片

什么是内存碎片???

内存碎片分为

  • 内部碎片
  • 外部碎片

内部碎片:是由于采用固定大小的内存分区,当一个进程不能完全使用分给它的固定内存区域就产生了内部碎片,通常内部碎片难以完全避免;
外部碎片:是由于某些未分配的连续内存区域太小,以至于不能满足任意进程的内存分配请求,从而不能被进程利用的内存区域;

什么情况下会产生内存碎片???

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

内存分配有哪些方法???

  • 连续地址分配
    固定分区分配会产生内部碎片问题,动态分配会产生外部碎片问题
  • 分段式内存管理
    内存碎片
  • 分页式内存管理
    内存碎片
  • 段页式内存管理
    内存碎片

怎样避免内存碎片???

  • 伙伴算法
  • slab算法
    具体思路可参考该网址
    https://blog.****.net/u013009575/article/details/17751147