ARTICLE · 1062163
手写内存池!原理到源码,搞懂内存管理
手写内存池!原理到源码,搞懂内存管理
手写内存池!原理到源码,搞懂内存管理
整理了手写内存池几个核心要点。
首先要知道内存池存在的原因!
开发用的都是虚拟内存,物理内存是底层的,只有底层程序可以接触到。能管理的内存主要是堆和共享内存(mmap)。内存管理主要是对堆上的内存池进行管理。
频繁malloc/free会产生大量内存碎片。总内存还有剩,但就是分配不出连续的大块。内存池就是解决这个问题的。
C++ new是关键字,内部调用的是malloc/callol,delete和free一样!
内存有三种管理方式:
(1)不管需要的内存大小,每次分配固定大小的内存。没有碎片但利用率低。
(2)以2的n次方累积内存池。可以提升内存的利用率,但是回收是一个很大的工程,没办法做到两块相邻的内存合在一起。
(3)大、小块。申请内存大小大于阈值就定为大块、否则是小块,内部用链表串联。
要用到的知识点:posix_memalign。
malloc / alloc分配内存是有限制的,可不能分配超过4k的内存的,为了分配大内存,就要用posix_memalign函数。
要分配一个以指定大小对齐的内存,用的对齐计算公式是:(n+(x-1)) & ~(x-1)。
内存池最核心的结构是node链表 + large链表。
内存池的实现包括:内存池的定义、内存池的创建、内存池的销毁、内存池的重置、内存池分配小块、内存池分配大块、申请内存、释放内存等等。
nginx就是用的大小块方式管理内存;为每个IO建立自己的内存池,IO生命周期结束再释放内存。
收录于C++技术干货
广东,1小时前,