內存池的使用是爲了解決如下兩個問題:html
1 內存碎片(Fragment),內存碎片會致使分配大塊內存失敗git
2 malloc和free比較慢github
至於爲何會有這兩個問題,或者,這兩個問題真的存在嗎?之後再探討,咱們先關注內存池memcached
在網上google一番,wiki告訴咱們,內存池包括"simple memory pool"和"Region-based_memory_management",wiki還告訴咱們Nigix就是用的"Region-based_memory_management",至於"simple memory pool",wiki沒告訴咱們去哪找代碼,沒事,無論了,咱們直接看項目性能
memcached的內存池稱爲slabs,在slabs.h中聲明測試
slabs內存池的主要思路:google
1 按內存字節大小分chunk處理,好比增量因子爲2,chunk分爲8,16,32,64,若是要分配30字節的內存,則直接分配32字節的chunk.net
2 一類chunk稱爲slabclass,每一個slabclass包含一個free_list,free_list包含了當前未被使用的chunkcode
3 free_list是一個鏈表,鏈表的next保存在chunk中,分配內存只須要從free_list中取一個,釋放內存只須要把chunk添加到free_list中就行了htm
這樣使得分配和釋放chunk的速度很是快
可是有一個很蛋疼的事
一旦分配內存後,slab就不會真正調用free()釋放內存了,這樣若是分配內存的請求在時間上不是均勻分佈的話,那麼有可能某個chunk類別下分配的內存永遠不會被釋放,這樣
可能出現內存不足的問題
不過memcached也是久經考驗的軟件了,這個問題彷佛不是很嚴重
個人山寨實現:
https://gist.github.com/mightofcode/9993607
Nginx更霸氣了,大內存直接分配,小內存的申請是在一個連續regin上進行,內存不夠了就再來個region
可是釋放內存怎麼辦?
Nginx爲每一個場景(以單個request爲例)建立一個內存池,request完成以後銷燬內存池,釋放全部內存,因此Nginx的內存池在銷燬整個內存池以前並不釋聽任何小內存
Nginx這樣作依賴一個前提:
單個場景須要的小塊內存總數不大,並且持續時間有限
Nginx用這種辦法得到了極大的提升了內存操做的速度,在vc上測試提升了100倍以上
可見,這種實現若是要應用到本身的項目中,須要大量測試和分析
個人山寨實現:
https://gist.github.com/mightofcode/10002927
內存池是個好東西,對於小塊內存的分配和釋放有巨大的性能提高
http://www.cnblogs.com/Creator/archive/2012/04/11/2430592.html
http://blog.csdn.net/v_july_v/article/details/7040425