什麼是TCMalloc?它與標準記憶體分配器有何不同?
傳統的記憶體分配器:
- 使用全域性堆管理,如glibc,malloc
- 所有記憶體分配和釋放都需要用到全域性鎖,導致高併發下鎖競爭嚴重
- 記憶體碎片管理: 碎片化問題嚴重
- 每次操作都需要經過經過全域性堆
結構
對於memory cache和CentralCach,內部都是維護了不同型別的FreeList
TCMalloc是如何管理記憶體的?其演算法的時間和空間複雜度是多少?
- 執行緒本地快取
- Central free list
用於管理大塊記憶體以及當執行緒本地快取不足時提供記憶體 - page allocator
管理實際記憶體頁,page allocator從作業系統請求大塊記憶體,然後將其分配給central cache和本地線性快取 - 批次分配
本地執行緒需要記憶體時,它會從central free list一次性獲取多塊記憶體,而不是每次只獲取一塊--->減少鎖競爭,提高記憶體利用率 - 回收機制
當本地執行緒快取的某種大小記憶體塊數量超過一定閾值時,多餘的記憶體塊會被返回到central free list
- 分配和釋放小塊記憶體時間複雜度O(1),空間複雜度:O(T*S),S是每個執行緒本地快取的最大空間
- 分配和釋放大塊記憶體涉及到Page allocator,時間複雜度是O(1),空間複雜度是O(N),其中N是程式所需的總記憶體
thread cashing
每個執行緒都維護一個本地的記憶體快取,稱為執行緒本地快取(Thread Local Cache)。用於儲存小塊記憶體,以便執行緒能快速分配和釋放,其效果是減少各執行緒對全域性記憶體池訪問的頻率,從而降低了執行緒間的鎖競爭激烈程度。