內存池的實現


1.內存池要解決什麼問題?

直接用malloc/free進行內存的申請和釋放,有一些弊端,比如開銷比較大,在申請的時候會根據最優匹配算法找到一個空閒的內存,在釋放的時候可能需要合併空閒的內存塊,這些都設計到開銷;第二個會產生大量的內存碎片,影響效率;第三個,可能發生內存泄露。

而用內存池代替malloc/free去分配內存,是在內存池中查找合適的內存塊,而不是直接的向操作系統申請。它有幾個優點

1)比Malloc和free申請和釋放內存塊

2)不會產生或者很難產生內存碎片

3)可以避免內存泄露


2.一個實現

http://blog.csdn.net/chencheng126/article/details/45576203


內存池實現架構

pool

list

block

1)內存跟蹤策略。

多申請12字節的空間,分別存list指針,used指針和一個效驗碼。這樣我們可以很快的得到內存所在的List和block。下圖箭頭指向的纔是內存開真正開始的地方。

結點頭12字節說明

2)內存申請和釋放的策略

申請。

遍歷List,看看是否有匹配的size。

如果有,free是否爲NULL(就是看free鏈表上還有沒有可以分的)。

如果爲NULL,則malloc分配內存,掛到used尾部

如果不爲NULL,將對應free節點取下,放到used尾部

如果沒有,新建一個List,用malloc新分配內存,並且置於該List的used鏈表尾部

釋放。

根據內存跟蹤策略,獲取List和Used指針,將它從used鏈表中刪除,並且放到free鏈表中去


3)這個實現的特點

程序啓動後並沒有分配內存塊,而是在程序運行時按照需求進行分配

對內存大小的申請,並沒有做限制,對每一個size創建一個鏈表進行管理

沒有限定內存池大小的功能


4)應用場景

程序所申請的內存塊大小比較固定(比如只申請/釋放1024bytes或2048bytes的內存),申請和釋放的頻率基本保持一致(因申請多而釋放少會佔用過多內存,最終導致系統崩潰)。


2.Apache服務器的內存池實現

可以參考如下的鏈接

http://blog.csdn.net/chencheng126/article/details/45576227




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章