jemalloc源码解读(一)内存页的地址


    很好奇jemalloc的分配性能,除了老生常谈的arena和thread cache外。我对他的释放效率有点好奇。在我自己做的分配器里面,总是很头疼,如果定位一个地址addr所在的block。

    看到jemalloc只是很简单的chunk = addr & (~chunksize_mask) 【ADDR2BASE】,心想怎么可能会这么巧的。继续深入跟踪看到,chunk_alloc_mmap和chunk_alloc_mmap_slow的代码,有想骂人的冲动。


    如果page_map得到的地址chunk的值不是满足ADDR2BASE,那么就重新分配alloc_size = size +  alignment -PAGE大小,然后去掉头部,保证chunk的地址满足ADDR2BASE。    在性能上,这个措施保证释放的时候,O(1)就能完成。


     从代码上,如果是windows操作系统,就用VirtualAlloc,如果linux就用mmap。如果系统分配的地址addr不满足ADDR2BASE怎么办?

如果是windows系统,计算addr后,最近的满足ADDR2BASE的地址,然后释放原来的addr,强制要求系统分配addr后,满足该条件的地址。

如果是linux系统就方便了,使用munmap将多余的内存还给系统。


    为了free的效率,内存页的首地址真是讲究啊。



    仔细研究了VirtualAlloc和mmap,发现,这两个函数,的确能够做到返回的地址满足PAGE_SIZE的对齐。这个PAGE_SIZE可以通过操作系统的参数得到。

这个结论,让我对jemalloc和tcmalloc有个新的认识。为了管理方便,PAGE_SIZE会大于系统的PAGE_SIZE,但只要保证是系统参数的2^N倍,那么首地址对齐还是可以做到的。



你可能感兴趣的:(jemalloc源码解读(一)内存页的地址)