1. 整體框架

上一篇STL空間配置器—構造和析構講述了第一個部分
由于第二部分比較龐大,所以我決定拆成三次來寫完
本篇主要是簡單介紹一下兩級空間配置器的思路,以及提前說一下new_handler機制
2. 簡單介紹
SGI 設計了雙層級配置器,第一級配置器直接使用 malloc() 和 free(),第二級則視情況采用不同策略,并采用了復雜的記憶體池(memory pool) 整理方式,
2.1 配置器alloc
alloc是我們使用的配置器.
alloc可能被指定為1級空間配置器
也可能被指定為二級空間配置器
alloc的指定
//我們可以指定alloc是幾級空間配置器
#ifdef _USE_MALLOC
...
typedef __malloc_alloc_template<0> malloc_alloc;
typedef malloc_alloc alloc; // 令alloc為第一級配置器
#else
...
// 令alloc為第二級配置器
typedef __default_alloc_template<__NODE_ALLOCATOR_THREADS, 0> alloc;
#endif /* ! _USE_MALLOC*/
從上述代碼可以看出 我們使用的alloc是二級或者一級空間配置器的一個新的名字~
alloc的進一步封裝
無論alloc具體是幾級空間配置器,我們都會對他進行進一步的再度封裝
template<class T, class Alloc>
class simple_alloc {
public:
//配置空間
static T *allocate(size_t n)
{ return 0 == n ? 0 : (T*)Alloc::allocate(n * sizeof(T)); }
static T *allocate(void)
{ return (T*)Alloc::allocate(n * sizeof(T)); }
//釋放空間
static T *deallocate(T *p, size_t n)
{ if( 0 != n ) ? 0 : (T*)Alloc::deallocate(p, n * sizeof(T)); }
static T *allocate(size_t n)
{ Alloc::deallocate(p, sizeof(T)); }
};
2.2 一級空間配置器 :__malloc_alloc_template
當配置區塊超過128bytes時,將使用一級空間配置器
一級空間配置器要點
- allocate() 直接使用 malloc(),deallocate()直接使用free()
- 一級空間配置器內部模擬實作了set_new_handler機制
2.3 二級空間配置器 :__default_alloc_template
當配置區塊小于128btyes時,選擇二級空間配置器
二級級空間配置器要點
- 維護了16個自由鏈表,負責16種小型區塊的次配置能力
- 使用記憶體池分配記憶體,如果記憶體池記憶體不足,就轉呼叫一級空間配置器
- 如果需求的快去大于128bytes就呼叫一級空間配置器

3. 簡述配置器的實作邏輯
3.1 一級空間配置器
一級空間配置器要求
- 基本上就是對4個轉調函式使用malloc 和free 封裝
- 考慮malloc失敗的情況,------>實作new_handler機制
- 注意拋出的例外機制
3.2 二級空間配置器
- 維護一個類似于hash桶的free_list陣列. 每個陣列分別管理不同大小的記憶體塊區
- 需要對用戶申請的空間進行邊界調整
- 需要一個hash函式,來確定申請記憶體從哪個free_list取出
- 知道了從那個free_list里面去自由節點,的話,就去哪里找
- 如果對應的free_list鏈表里面有自由節點,---->萬事大吉,分配出去就好了
- 如果對應的free_list鏈表里面沒有空閑的自由節點的話,就需要去想記憶體池申請
- 向記憶體池申請有多重可能
- 想記憶體池申請空間,會預設的申請20個該型別大小的節點
- 如果記憶體池供大于求---->則直接分配
- 如果記憶體池供不應求,但是有一個以上,----->則將nobjs=byte_left/size 盡可能回傳多個節點
- 如果記憶體池連一個都無法分配,則會通過malloc從堆上申請
malloc可能會失敗!
- 如果malloc成功,則會將新申請的記憶體并入到記憶體池中去,然后遞回的申請
2.如果malloc 失敗,則首先要將則先將手上的自由鏈表陣列(hash桶)從頭到尾遍歷一遍,把所有的空閑節點,全都拿出來,然后從新分配,看看能不能從這些小碎片中拿出來.
3.然后轉調一級空間分配器,看看oom能不能 起點作用
c++ new_handler機制
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/236104.html
標籤:區塊鏈
上一篇:成功解決:curl: (7) Failed connect to github-production-release-asset-2e65be.s3.amazonaws.com:443; 拒絕連接
