溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何理解TCMalloc

發(fā)布時間:2021-11-20 09:41:17 來源:億速云 閱讀:133 作者:柒染 欄目:大數(shù)據(jù)

本篇文章給大家分享的是有關(guān)如何理解TCMalloc,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

TCMalloc作為Go語言內(nèi)存管理的核心算法,是理解和掌握Go的內(nèi)存管理非常重要的一步,主要介紹TCMalloc的是什么樣子的。

TCMalloc的概述

 TCMalloc全稱是Thread-Caching Malloc,是Google 開發(fā)的內(nèi)存分配器,在不少項目中都有使用,例如在 Golang 中就使用了類似的算法進行內(nèi)存分配。它具有現(xiàn)代化內(nèi)存分配器的基本特征:對抗內(nèi)存碎片、在多核處理器能夠 scale。

1. TCMalloc相比glibc 2.3而言內(nèi)存分配更快。

2.TCMalloc對于多線程程序而言,減少了鎖機制,對于小對象而言,可以說沒有鎖的操作,對于大的對象而言的更加高效的自旋鎖(spinlock)。

3.TCMalloc對小對象的處理空間效率更好。

如何理解TCMalloc

1.TCMalloc 會給每一個線程分配一個屬于線程本地的緩存(Thread Cache),這個本地緩存用于小對象(小于32K)的內(nèi)存分配,在必要的時候,對象會從Central Heap(備注:這個是多個線程分享的,操作的時候需要做加鎖、解鎖處理)移動到Thread Cache。

2. 垃圾回收器(garbage collections)會周期性的將存儲從Thread Cache(默認是2M)遷移到Central Heap,以便進行垃圾回收。

3.對于大的對象(大于32K)則是直接從Central Heap按照頁面層次分配方式進行內(nèi)存分配。

小對象的分配

每一個小的對象會對應于已經(jīng)分配好的170類大小簇,而這170個大小簇是按照大小分配的,例如:8、16、32、48...256KB。對于分配的對象與這些類簇的對應關(guān)系是采用取整的方式對應起來的,例如:961 到 1024 bytes都會對應與1024這個類簇。

每一個類簇后面都會跟著一個freelist,freelist其實是一個鏈表,它里面的元素是按照類簇的大小來分配好的,該元素的前8個字節(jié)是作為指針,用于指向后續(xù)的節(jié)點,將整個節(jié)點串起來。如下圖所示:

如何理解TCMalloc

小對象分配的流程如下所示:

step 1: 首先,根據(jù)對象的大小找到對應的類簇,例如是32字節(jié)的位置。

step 2: 從這個線程的類簇中對應的freelist中查找,如果這個freelist中還有沒有被分配的元素,則選擇該元素并返回這個對象(備注:是從頭到尾的順序來查找)。

step 3: 如果這個類簇對應的freelist已經(jīng)都被分配完了,1)先從central Heap中取出一些對象給thread Cache;2) 然后再從這個freelist中按照step 2中的步驟來分配對象。

step 4: 如果central Heap中的freelist也是空的,那么會按照下面的方式來操作:1)先分配一個運行頁給central Heap;  2) 把這個運行頁按照對應的class-size分成一組對象,并且將這些對象放到central Heap的freelist下面;3) 按照step 3的方式進行操作,就會最后分配成功一個對象出去。

大對象的分配

大對象指的是大于32K的對象,它們的分配是在central Heap中完成的。對于大對象來說,是根據(jù)頁面來大小來定義的,一般一個頁面是8K,如果對象是大于一個頁面的,就會被分配幾個頁面來完成數(shù)據(jù)分配。如下圖所示:

如何理解TCMalloc

多個連續(xù)的page會組成一個span,在span中會記錄起始頁編號,以及page的數(shù)量,分配時大對象直接分配span,小對象會從span中分配對象。page 和span的對應關(guān)系如下圖所示,從圖中可以看出span a對應的是2個page, span b對應的是一個page, span c對應的是5個page,span d對應的是3個page。

如何理解TCMalloc

對于大對象而言,是通過pageHeap來進行管理的,結(jié)構(gòu)如下所示:

如何理解TCMalloc

大對象的分配流程如下所示:

step 1: 首先判斷這個大對象需要占幾頁,假設(shè)是n,那么會從n page對應的freelist查找有沒有可以分配的span,有的話直接返回。

step 2: n page 對應的span沒有的話,會從n+1 page對應的span里面查找有沒有合適的,有的話,將對應的span切分成n 和 1 page的span,將n 頁的span返回,將1頁的span放到1 page中的freelist中。

step 3: 如果 從1到128page都找不到的話,從large page中查找,這個操作要復雜些。

step 4: large page還是找不到的話,會向操作系統(tǒng)申請 128 page, 并同時將需要的n page的span返回,剩余的span 給其他的 page,以方便下次使用。

大對象的釋放流程如下:

step 1: 根據(jù)當前要釋放的span去查看它的左右鄰居,如果是空閑的,則將它們從freelist中移除,然后合并為同一個span,然后掛在freelist中。

step 2: 檢查是否需要釋放給操作系統(tǒng),需要的話,就釋放給操作系統(tǒng)。

以上就是如何理解TCMalloc,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI