tcmalloc:线程缓存的malloc

tcmalloc:线程缓存的malloc

ID:31613970

大小:102.74 KB

页数:8页

时间:2019-01-16

tcmalloc:线程缓存的malloc_第1页
tcmalloc:线程缓存的malloc_第2页
tcmalloc:线程缓存的malloc_第3页
tcmalloc:线程缓存的malloc_第4页
tcmalloc:线程缓存的malloc_第5页
资源描述:

《tcmalloc:线程缓存的malloc》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、TCMalloc:线程缓存的Malloc作者:SanjayGhemawat,PaulMenage原文翻译:ShiningRay动机TCMalloc要比glibc2.3的malloc(可以从一个叫作ptmalloc2的独立库获得)和其他我测试过的malloc都快。ptmalloc在一台2.8GHz的P4机器上(对于小对象)执行一次malloc及free大约需要300纳秒。而TCMalloc的版本同样的操作大约只需要50纳秒。malloc版本的速度是至关重要的,因为如果malloc不够快,应用程序的作者就很有可能在malloc之上写一个自己的自由列

2、表。这就可能导致额外的代码复杂度,以及更多的内存占用――除非作者本身非常仔细地划分自由列表的大小并经常从自由列表中清除空闲的对象。TCMalloc也减少了多线程程序中的锁争用情况。对于小对象,几乎已经达到了零争用。对于大对象,TCMalloc尝试使用粒度较好和有效的自旋锁。ptmalloc同样是通过使用每线程各自的场地来减少锁争用,但是ptmalloc2使用每线程场地有一个很大的问题。在ptmalloc2中,内存可能会从一个场地移动到另一个。这有可能导致大量空间被浪费。例如,在一个Google的应用中,第一阶段可能会为其URL标准化的数据结构分

3、配大约300MB内存。当第一阶段结束后,第二阶段将从同样的地址空间开始。如果第二个阶段被安排到了一个与第一阶段什?用的场地不同的场地,这个阶段不会复用任何第一阶段留下的的内存,并会给地址空间添加另外一个300MB。类似的内存爆炸问题也可以在其他的应用中看到。TCMalloc的另一个好处是小对象的空间最优表现形式。例如,分配N个8字节对象可能要使用大约8N*1.01字节的空间。即,多用百分之一的空间。而ptmalloc2中每个对象都使用了一个四字节的头,(我认为)并将最终的尺寸规整为8字节的倍数,最后使用了16N字节。使用要使用TCMalloc,

4、只要将tcmalloc通过“-ltcmalloc”链接器标志接入你的应用即可。你也可以通过使用LD_PRELOAD在不是你自己编译的应用中使用tcmalloc:$LD_PRELOAD="/usr/lib/libtcmalloc.so"LD_PRELOAD比较讨巧,我们也不十分推荐这种用法。TCMalloc还包含了一个堆检查器以及一个堆测量器。如果你更想链接不包含堆测量器和检查器的TCMalloc版本(比如可能为了减少静态二进制文件的大小),你可以接入libtcmalloc_minimal。概览TCMalloc给每个线程分配了一个线程局部缓存。小

5、分配可以直接由线程局部缓存来满足。需要的话,会将对象从中央数据结构移动到线程局部缓存中,同时定期的垃圾收集将用于把内存从线程局部缓存迁移回中央数据结构中。TCMalloc将尺寸小于<=32K的对象(“小”对象)和大对象区分开来。大对象直接使用页级分配器(一个页是一个4K的对齐内存区域)从中央堆直接分配。即,一个大对象总是页对齐的并占据了整数个数的页。连续的一些页面可以被分割为一系列小对象,而他们的大小都相同。例如,一个连续的页面(4K)可以被划分为32个128字节的对象。小对象的分配每个小对象的大小都会被映射到170个可分配的尺寸类别中的一个。

6、例如,在分配961到1024字节时,都会归整为1024字节。尺寸类别这样隔开:较小的尺寸相差8字节,较大的尺寸相差16字节,再大一点的尺寸差32字节,如此类推。最大的间隔(对于尺寸>=~2K的)是256字节。一个线程缓存对每个尺寸类都包含了一个自由对象的单向链表。当分配一个小对象时:·我们将其大小映射到对应的尺寸类中。·查找当前线程的线程缓存中相应的自由列表。·如果自由列表不空,那么从移除列表的第一个对象并返回它。当按照这个快速通道时,TCMalloc不会获取任何锁。这就可以极大提高分配的速度,因为锁/解锁操作在一个2.8GHzXeon上大约需

7、要100纳秒的时间。如果自由列表为空:·从该尺寸类别的中央自由列表(中央自由列表是被所有线程共享的)取得一连串对象。·将他们放入线程局部的自由列表。·将新获取的对象中的一个返回给应用程序。如果中央自由列表也为空:(1)我们从中央页分配器分配了一连串页面。(2)将他们分割成该尺寸类的一系列对象。(4)像前面一样,将部分对象移入线程局部的自由列表中。大对象的分配一个大对象的尺寸(>32K)会被除以一个页面尺寸(4K)并取整(大于结果的最小整数),同时是由中央页面堆来处理的。中央页面堆又是一个自由列表的阵列。对于i<256而言,第k个条目是一个由k个

8、页面组成的自由列表。第256个条目则是一个包含了长度>=256个页面的自由列表:k个页面的一次分配通过在第k个自由列表中查找来完成。如果该自由列表为空

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。