tcmalloc簡單介紹

github 地址
thread-caching malloc
與標準庫glibc的malloc相比,tcmalloc的分配速度和效率都要高,在併發情況下性能上有提升。
實現原理的簡單介紹:
(1)每個線程分配一個單獨的cache,小對象可直接在線程cache上進行分配,避免使用鎖
(2)大對象直接在堆上進行分配
具體介紹見TCMalloc : Thread-Caching Malloc
基本意思如下:
TcMalloc比glibc 2.3 malloc(或者ptmalloc2)以及其他的一些內存分配器要快。
在分配小對象時,ptmalloc2執行一次分配和回收大概花費300ns(2.8 GHz P4機器)。執行同樣的操作,tcmalloc大概只需要50ns。
對於多線程程序來說,tcmalloc減少了鎖的爭用。對於小對象,幾乎是零競爭。對於大對象的分配來說,tcmalloc會嘗試採用細粒度的自旋鎖。ptmalloc2也是通過對每個線程分配arena來減少競爭,但是ptmalloc2存在arena不能移動的問題,有時候會導致比較大的內存浪費。
tcmalloc對每個線程分配本地cache,當滿足分配條件時,小對象直接在本地cache上進行分配。當本地cache空間不足時,可從central中分配內存到本地cache,週期gc會將空閒的本地cache空間返還給central。
小於等於32K的對象爲小對象,大於32K的爲大對象。大對象直接在堆上分配,以page爲單位,每個page大小爲4K。多個page可用於分配多個小對象。例如一個page(4K),可以用於分配32個128字節大小的對象。
小對象的分配:
按照class-size,劃分了大概170種小對象。每個thread cache按照class-size,都保存了一條空閒對象的單向鏈表。
當分配小對象時,首先根據要分配的大小找到合適的class-size,然後在thread cache對應class-size的鏈表上尋找合適的分配對象。如果鏈表不空,返回第一個空閒對象即可。在這種情況下,不會出現鎖競爭的情況,加速分配速度。因爲加鎖/解鎖大概會花費100ns的時間。
如果鏈表爲空,從central對應class-size的free list獲取一些空閒對象給thread cache,然後返回一個空閒對象。central是線程共享的。
如果centra free list也爲空,則從central page中獲取一些pages,根據class-size進行劃分,分給central free list,同樣也分配一些對象給thread cache。
大對象的分配:
central page是按照page的數量進行劃分的,page的數量從1個到255個,大於等於256個page由一個free list進行管理。
在對應的page free list尋找空閒對象時,如果沒有空閒對象,如下一個page free list尋找,直到找到爲止。如果找遍page free list都沒有,則向系統申請。
連續的pages稱爲span,span可以分配和釋放。
。。。

分配思路和go的分配基本一致。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章