記憶體池的坑

2021-10-20 05:26:55 字數 989 閱讀 5110

今天解決乙個記憶體池的bug,忍不住吐槽兩句。

記憶體池的作用主要有兩個:一是減少記憶體反覆申請釋放帶來的耗時以及pagefault,二是讓程式執行耗時更穩定和平滑。

所謂的減少記憶體碎片,我覺得主要是針對windows系統考慮的,linux這一點就好多了,一般不用特意去優化。

在我的網路通訊框架konsannet中,我寫了乙個簡單的記憶體池,用於對自己可能用到的記憶體先提前申請出來,然後持續使用,有利於程式功能執行的穩定和平滑性。

每次從作業系統申請記憶體耗時都有所區別,如果系統記憶體空閒比較多且申請的記憶體大小不大,申請就很快,如果申請的記憶體塊很大或當前系統記憶體使用率很高,那麼申請記憶體耗時自然就長。

而如果程式一開始就把執行中需要的記憶體都申請好,反覆使用。

那麼,除了虛擬記憶體到物理記憶體的對映時的耗時不確定外,其每次申請和釋放的耗時是基本固定的,不會有什麼波動,這就是我寫記憶體池的原因。

不使用其它開源的記憶體池庫的原因也簡單:

越是基礎的模組,盡量不使用開源的。

一是可以作為積累,修改容易。

二是開源庫總會在你不經意的時候觸發一些問題,即時它看起來已經很穩定了,但一旦出問題,你無法做任何改動,因為不是你寫的,而且往往因為通用而寫得太複雜了。

但是,千萬要記住,優點和缺點往往是乙個銀幣的兩面。

記憶體池的最大的乙個缺點就是:無法防止甚至無法檢測寫越界!!

對於乙個記憶體塊,你使用過程中,無論是copy、write、memset等操作都有可能寫越界。

如果是new出來的物件寫越界了,作業系統直接報錯,程式崩潰,可以跟蹤除錯。

而從記憶體池裡面申請出來的記憶體塊一旦寫越界了,通常記憶體池並不能檢測到記憶體顆粒寫邊界的(也許有的記憶體池庫能做到這一點),系統也就無法報錯,且會直接覆蓋掉後面位址中的記憶體資料,然後產生的錯誤現象就千奇百怪,而且錯誤很具有隱秘性,非常難查詢和定位。

所以,對於想要使用記憶體池的同學,一定要有心理準備,而在寫**的時候更加細緻一些,避免寫越界,否則可能會出現匪夷所思且深匿的坑,等你久久去解決!

記憶體池 C 記憶體池

c c 下記憶體管理是讓幾乎每乙個程式設計師頭疼的問題,分配足夠的記憶體 追蹤記憶體的分配 在不需要的時候釋放記憶體 這個任務相當複雜。1.呼叫malloc new,系統需要根據 最先匹配 最優匹配 或其他演算法在記憶體空閒塊表中查詢一塊空閒記憶體,呼叫free delete,系統可能需要合併空閒記...

記憶體池 簡單的記憶體池的實現

當頻繁地用malloc申請記憶體,然後再用free釋放記憶體時,會存在兩個主要問題。第乙個問題是頻繁的分配釋放記憶體可能導致系統記憶體碎片過多 第二個問題是分配釋放記憶體花費的時間可能比較多 這個問題不太明顯 這個時候我們就可以考慮使用記憶體池了。最樸素的記憶體池思想就是,首先你向系統申請一塊很大的...

執行緒池的坑

最近實現執行緒池踩了不少坑 記錄如下 執行緒池建立了兩個執行緒,放兩個任務進去,發現任務沒執行 例如 void task void task2 int i int main 程式執行之後沒有任何列印在終端,但是gdb 和strace都是有輸出的.一共發現兩個問題最終解決之 先看執行緒池的實現 thr...