malloc/free和new/delete释放后的内存系统会马上回收吗?

         用户 free 掉的内存并不是都会马上归还给系统,ptmalloc 会统一管理 heap 和 mmap 映射区域中的空闲的 chunk,当用户进行下一次分配请求时,ptmalloc 会首先试图在空闲的chunk 中挑选一块给用户,这样就避免了频繁的系统调用,降低了内存分配的开销。

ptmalloc将相似大小的 chunk 用双向链表链接起来,这样的一个链表被称为一个 bin。Ptmalloc 一共维护了 128 个 bin,并使用一个数组来存储这些 bin(如下图所示)。

       如果每次free掉的内存都还给OS的话,尤其是在小字节的情况下,那么造成的情况,就是一大块的内存被你弄的千疮百孔,也就是说一块内存,里面有很多gap。

   在操作系统的虚拟内存管理中,管理着的都是固定大小的内存,如4K,那你还给我1 Byte或5 Byte, 那么OS显然是很尴尬的。

      于是为了避免这样的问题,那么内存管理一般会有一个free block list,free掉的东西就放在这里来。那么你可能会释放很散乱的内存过来,没关系,我们在这里会尝试合并这些散乱的block,而malloc首先找的也是free block list,而非从OS申请新的内存。

那么此时如果找到了一块儿合适的自然最好,如果找到的是比要的更大,那么一部分malloc,另一部分放回去。

当       然,由于malloc和free是如此普遍,自然会尝试着让它变的更好,所以也有各种优化,如对上图中free block list进行chunk size排序,什么情况下合并,什么时候分割,内存的分配算法等,都有很多机制来管理小内存。

猜你喜欢

转载自blog.csdn.net/ymy_mine/article/details/81180168
今日推荐