內存池技術

內存池技術是一種飽受爭議的技術
爭議熱點在於到底有沒有必要本身實現。
1.內存池技術出如今libc尚不成熟的時候,當時程序常常在運行一段時間後性能降低,當時維護內存池頗有必要
2.如今64位服務器常常是32G以上的內存,管理內存碎片意義不打
3.寫malloc的各位都是大神,本身寫有99%的可能會更差,更況且如今還有tmalloc、jmalloc等與時俱進的內存管理庫。
4.內存數據庫等之內存爲主的服務器程序能夠本身管理內存來達到某些特殊的公平,好比性能纔是咱們認爲的供公平,浪費內存是能夠接受的,諸如此類有特殊公平需求的。

 

內存池的實現方案
1.FreeList
STL的二級內存配置器就是FreeList
2.slab
memcached的內存管理方案

 

FreeList實現方案
一句話描述:用鏈表把待釋放的內存保存起來重複利用。
STL的二級配置器實現的部份內容:

 

free_list
保存已釋放內存的數據,每個項都包含一個指向固定大小的區塊的單鏈表指針,指針指向可重複利用內存list,區塊的大小是隨着下標遞增的:八、1六、2四、3二、40、4八、5六、6四、7二、80、8八、9六、10四、1十二、120、128。
memory pool
內存池,當free_list找不到可重複利用的內存時就向memory pool申請,經過內存池申請內存時會申請20*size的內存,返回第一塊size內存給客戶,其餘的19個size內存添加到free_list對應下標的可回收利用區塊鏈表。
memory pool的內存來源
維護start和end兩個指針表示當前的水位,水位充足時直接分配內存給客戶。
水位不足時malloc2*20*size+fixed_size的長度,20*size用於返回客戶和加入free_list,其餘的留在內存池中。
STL的二級內存配置器目的
回收利用小於等於128字節的小內存,避免內存碎片。

 

slab實現方案
memcached的實現方案  
slabclass是一個全局數組

 

slabclass中的slab的size按照配置的factor因子遞增
slabclass的slab_list包含的slab大小都是同樣的
回收的slab加入slots
申請新的slat的時候優先利用slots中的可回收內存。

 

以上slab的設計能夠在源碼slabs.c中查看詳細,從 slabs_init開始是一個不錯的主意。
item和這裏的關係並不大,是申請內存的客戶用的。
相關文章
相關標籤/搜索