(memory pool)是一種記憶體分配方式。通常我們習慣直接使用new、malloc等api申請分配記憶體,這樣做的缺點在於:由於所申請記憶體塊的大小不定,當頻繁使用時會造成大量的記憶體碎片並進而降低效能。
記憶體池則是在真正使用記憶體之前,先申請分配一定數量的、大小相等(一般情況下)的記憶體塊留作備用。當有新的記憶體需求時,就從記憶體池中分出一部分記憶體塊,若記憶體塊不夠再繼續申請新的記憶體。這樣做的乙個顯著優點是,使得記憶體分配效率得到提公升。
一、使用記憶體池技術的主要原因
1.提高效率
c語言中使用malloc/free來分配記憶體,c++中使用new/delete來分配記憶體,他們的記憶體申請與釋放都是與作業系統進行互動的。具體的內容在嚴蔚敏資料結構的第八章有相關講述,主要就是系統要維護乙個記憶體鍊錶,當有乙個記憶體申請過來時,根據相應的分配演算法在鍊錶中找個乙個合適的記憶體分配給它。這些演算法有的是分配最先找到的不小於申請記憶體的記憶體塊,有的是分配最大的記憶體塊,有的是分配最接近申請記憶體大小的記憶體塊。分配的記憶體塊可能會大於所申請的記憶體大小,這樣還有進行切割,將剩餘的記憶體插入到空閒鍊錶中。當釋放的時候,系統可能要對記憶體進行整理,判斷free的記憶體塊的前後是否有空閒,若有的話還要進行合併。此外,new/delete還要考慮多執行緒的情況。總之一句話,呼叫庫中的記憶體分配函式,十分的耗時。
2.記憶體碎片
記憶體碎片是記憶體不再是一整塊的了,而是碎了。因為連續的這種new/delete操作,一大塊記憶體肯能就被分割成小的記憶體分配出去了,這些小的記憶體都是不連續的。當你再去分配大的連續記憶體的時候,儘管剩餘記憶體的總和可能大於所要分配的記憶體大小,但系統就找不到連續的記憶體了,所以導致分配錯誤。malloc的時候會導致返回null,而new的時候再vc6.0中返回null,vs2003以上則是丟擲異常。
二、記憶體池技術
要解決上述兩個問題,最好的方法就是記憶體池技術。具體方法就是大小固定、提前申請、重複利用。因為記憶體的申請和釋放是很低效的,所以我們只在開始時申請一塊大的記憶體(在該塊記憶體不夠用時在二次分配),然後每次需要時都從這塊記憶體中取出,並標記下這塊記憶體被用了,釋放時標記此記憶體被釋放了。釋放時,並不真的把記憶體釋放給作業系統,只要在一大塊記憶體都空閒的時候,才釋放給作業系統。這樣,就減少了new/delete的操作次數,從而提高了效率。
在呼叫記憶體分配函式的時候,大部分時間所分配的記憶體大小都是一定的,所以可以採用每次都分配固定大小的記憶體塊,這樣就避免了記憶體碎片產生的可能。
記憶體池 C 記憶體池
c c 下記憶體管理是讓幾乎每乙個程式設計師頭疼的問題,分配足夠的記憶體 追蹤記憶體的分配 在不需要的時候釋放記憶體 這個任務相當複雜。1.呼叫malloc new,系統需要根據 最先匹配 最優匹配 或其他演算法在記憶體空閒塊表中查詢一塊空閒記憶體,呼叫free delete,系統可能需要合併空閒記...
記憶體池 執行緒池
1 記憶體池是在真正使用記憶體之前,先申請分配一定數量的 大小相等 一般情況下 的記憶體塊留作備用。當有新的記憶體需求時,就從記憶體池中分出一部分記憶體塊,若記憶體塊不夠再繼續申請新的記憶體。這樣做的乙個顯著優點是,使得記憶體分配效率得到提公升。2 執行緒池是一種多執行緒處理形式,處理過程中將任務新...
記憶體池,程序池,執行緒池
在使用new malloc在堆區申請一塊記憶體的時候,由於每次申請的記憶體大小不一樣就會產生很多記憶體碎片,不好管理和浪費。記憶體池則是在真正使用記憶體之前,先申請分配一定數量的 大小相等的記憶體塊留作備用。當有新的記憶體需求時,就從記憶體池中分出一部分記憶體塊,若記憶體塊不夠用再 繼續申請新的記憶...