天天看點

STL中記憶體配置設定問題

STL中記憶體配置時的設計哲學如下:

  • 向system heap要求空間
  • 考慮多線程(multi-threads)的狀态
  • 考慮記憶體不足時的應變措施
  • 考慮過多“小型區塊”可能造成的記憶體碎片(fragment)問題

解決方法如下:

  • SGI以mallco()和free()完成記憶體的配置及釋放
  • 考慮“小型區塊”造成的記憶體破碎問題:SGI設計了雙層級配置器

雙層級配置器:當索取的記憶體塊>128bytes時,移交第一級配置器,當<128bytes時,則以記憶體池(memory pool)管理:SGI第二級配置器會主動将任何小額區塊的記憶體需求量上調至8的整數倍,并維護16個free-list,各自管理大小分别為(8,16,24,32,40…128)

free-list的節點結構如下:

union obj{
    union obj* free_list_link;
    char client_data[1];  //1是舉例值,可以為8,16,...,128
};
           

由類型”union”可知指針free_list_link和數組client_data共享一段大小為sizeof(union obj)=4的記憶體空間。當指針free_list_link指向下一個節點時,client[0]記憶體儲的内容為下一個節點的前一個位元組大小的位址(實際上,現在數組client_data并沒有使用到)。但當客端需要使用小額區塊,即使用client_data數組的時候,free_list_link記憶體儲的下一個節點的位址資料将被覆寫掉,故而free-list也就不再指向他們。

這時就實作了一物兩用的目的。

考慮記憶體不足時的應變措施

當free-list中沒有可用區塊的時候,調用refill()重新為free-list填充空間,新的空間将取自記憶體池(經由chun_alloc完成),取得預設的20個新節點,如果記憶體池空間不足,獲得的新節點數量可能小于20個。

流程如下:

STL中記憶體配置設定問題

繼續閱讀