TCmalloc

七块蛋糕發表於2024-05-26

什麼是TCMalloc?它與標準記憶體分配器有何不同?

傳統的記憶體分配器:

  • 使用全域性堆管理,如glibc,malloc
  • 所有記憶體分配和釋放都需要用到全域性鎖,導致高併發下鎖競爭嚴重
  • 記憶體碎片管理: 碎片化問題嚴重
  • 每次操作都需要經過經過全域性堆

image

結構

對於memory cache和CentralCach,內部都是維護了不同型別的FreeList
image

image

image

TCMalloc是如何管理記憶體的?其演算法的時間和空間複雜度是多少?

  1. 執行緒本地快取
  2. Central free list
    用於管理大塊記憶體以及當執行緒本地快取不足時提供記憶體
  3. page allocator
    管理實際記憶體頁,page allocator從作業系統請求大塊記憶體,然後將其分配給central cache和本地線性快取
  4. 批次分配
    本地執行緒需要記憶體時,它會從central free list一次性獲取多塊記憶體,而不是每次只獲取一塊--->減少鎖競爭,提高記憶體利用率
  5. 回收機制
    當本地執行緒快取的某種大小記憶體塊數量超過一定閾值時,多餘的記憶體塊會被返回到central free list
  • 分配和釋放小塊記憶體時間複雜度O(1),空間複雜度:O(T*S),S是每個執行緒本地快取的最大空間
  • 分配和釋放大塊記憶體涉及到Page allocator,時間複雜度是O(1),空間複雜度是O(N),其中N是程式所需的總記憶體

thread cashing

每個執行緒都維護一個本地的記憶體快取,稱為執行緒本地快取(Thread Local Cache)。用於儲存小塊記憶體,以便執行緒能快速分配和釋放,其效果是減少各執行緒對全域性記憶體池訪問的頻率,從而降低了執行緒間的鎖競爭激烈程度。

image