现在的位置: 首页 > 综合 > 正文

jemalloc源码解读(三)内存页的管理的另解

2013年10月01日 ⁄ 综合 ⁄ 共 668字 ⁄ 字号 评论关闭

    在前两章,研究了jemalloc和tcmalloc的释放原理,可以看到他们都是通过内存地址addr,直接右移,得到PageID;然后,根据PageID,查找基数树,得到Page的描述对象。

这种方法,根据内存地址Addr 推导出该地址所在的内存页,依然无法避免基数树的查找。唯一的好处是,PageID是可以直接计算的,但劣势就是,每个页分配的时候,必须首地

址对齐。为了满足这个要求,需要做很多的操作。

    我们研究下实际情况,对于任何一个页来说,即使没有首地址对齐,那么他最多也只会跨2个对齐的区域。比如页的大小为4K,那么对齐约束的情况下,导致首地址总是为0K、4K、8K、12K...。如果有页PAGEx没有对齐,他的首地址为4.2K,那么他的地址空间就分布在[4k , 8k) 和 [8k , 12K)。但是,对于PAGEx来说,他相邻的PAGEy,PAGEy - PAGEx一定大于4K。

    既然基数树查找是避免不了的,那么放弃PAGE的对齐,也能够在基数树上,唯一管理首地址。唯一的差别,是在叶子节点需要做处理。比如Addr = 8.1K。实际上应该落在PAGEx上。我们按照精确查找的话,是无法得到PAGEx的。但在叶子节点的时候,我们根据8.1K会得到8K这个值,而在这个值的左右,却只会有4.2k和8.2k两个数值,因此,很容易得到Pagex这个地址。

    和原有的算法差异,就在于addr的右移操作,和区间判断的操作,Pagex <= Addr < Pagex + PageSize 。从性能上,基本没有什么差异。但从系统的约束上看,要简单很多。

 

抱歉!评论已关闭.