分箱式内存管理
对于空闲的chunk,ptmalloc采用分箱式的内存管理方式,根据空闲chunk的大小和处于的状态将其放在四个不同的bin中,这四个空闲chunk的容器包括fastbins,unsorted bin,small bins和large bins。fast bins是小内存块的高速缓存,当一些大小小于64字节的chunk被回收时,首先会放入fast bins中,在分配小内存时,首先会查看fast bins中是否有合适的内存块,如果存在,则直接返回fast bins中的内存块,以加快分配速度。Unszhiyouorted bin只有一个,回收的chunk块必须先放到unsorted bin中,分配内存时会查看unsorted bin 中是否偶合适的chunk,如果找到满足条件的chunk,则直接返回给用户,否则将unsorted bin的所有chunk放入small bins或是large bins的所有chunk放入small bins或是large bins中。small bins用于存放固定大小的chunk,共64个bin,最小的chunk大小为16字节或32字节,每个bin的大小相差8字节或是16字节,当分配小内存块时,采用精确匹配的方式从small bin中查找合适的chunk。Large bins用于存储大于等于512或1024B的空闲chunk,这些chunk使用双向链表的形式按大小顺序排序,分配内存时按最近匹配方式从large bins中分配chunk。
Small bins
ptmalloc使用small bins管理空闲小chunk,每个small bin中的chunk的大小与bin的index有如下关系:
Chunk_size=2SIZE_SZindex
在SIZE_SZ为4B的平台上,small bins中的chunk大小是以8B为公差的等差数列,最大的chunk大小为504B,最小的chunk大小为16B,所以实际共62个bin。分别为16B、24B、32B,……,504B。在SIZE_SZ为8B的平台上,small bins中的chunk大小是以16B为公差的等差数列,最大的chunk大小为1008B,最小的chunk大小为32B,所以实际共62个bin。分别为32B、48B、64B,……,1008B。
ptmalloc维护了62个双向环形链表(每个链表都具有链表头节点,加头结点的最大作用就是便于对链表内节点的统一处理,即简化编程),每一个链表内的各空闲chunk的大小一直,因此当应用程序需要分配某个字节大小的内存空间时直接在对应的链表内取就可以了,这样既可以很好的满足应用程序的内存空间申请请求而又不会出现太多的内存碎片。我们可以用下图来表示在SIZE_SZ位4B的平台上ptmalloc对512B字节一下的空闲chunk组织方式(所谓分箱机制)。
Large bins
Unsorted bin
Fast bins
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!