在程式設計中使用到了記憶體池,為此先學習一下記憶體池的相關知識吧!
1. 什麼是記憶體池?
所謂記憶體池就是預先分配好的一定數量的大小相等的記憶體塊,當需要使用的時候可以直接從中使用,而不必再申請。2. 為什麼要使用記憶體池?有什麼優點?
使用new 或 malloc進行記憶體分配會使用很多時間,特別是高頻率的小記憶體申請釋放。3. 程式設計實現:兩個重要結構體:
程式設計思想:在程式設計中建立了兩個記憶體池,乙個為讀記憶體池,乙個為寫記憶體池,分別有read_head 和write_head指向,
在初始化中建立了兩個塊,乙個用於寫入資料,乙個用於讀取資料,初始化中,先確定塊的大小,然後使塊的頭結構體中的寫指標和讀指標指向第乙個儲存單元的位置,並更改剩餘空間的大小,以及已經使用單元的個數。 當寫入資料時,將資料拷貝到第乙個儲存單元的後面(並修改單元結構體中資料的長度),將
write
指標指向資料的後面作為單元結構體(第二個單元),第乙個儲存單元的
next
指向該單元,。。。。。。。。。。。。
即單元結構體中儲存儲存到目前位置空閒空間的大小,和當前單元儲存資料的大小(單元大小不同,即資料大小),以及指向下乙個單元的指標,
head結構體中write_sign
指標總是指向下乙個可寫的單元。 當消費者讀取資料時,需要先進行交換,即將
write
塊變為read
塊,將read
塊變為write
塊,(只有
write
塊中有資料,且寫已經完成,才進行交換)。 讀取資料:
read_sign
指標指向存有資料的單元結構體,每次讀取,即根據單元結構體中資料長度,將資料複製到指定
buf中,然後修改
read
指向next。
初始化工作:
初始化中的工作主要有: 指定記憶體塊的大小,並分配內出塊,然後初始化head結構體中的指標。
寫操作:
找到可寫的位置,跳過需要寫入資料的長度,找到head指標下次指向的unit單元,修改新unit單元中剩餘空間大小,修改舊unit中儲存的資料的大小,改變指標的指向,head指標的write_sign指向新的unit ,舊 unit的next 指向新unit,使用memcpy將資料拷貝到舊unit單元的後面。
交換讀寫塊:
在已經完成讀和寫,且寫記憶體塊中已經寫入完資料時,可以進行交換,即調換read_head write_head即可。
讀內出塊:
讀記憶體塊用到head中的read_sign指標,即從read-sign後面拷貝出unit指定的資料長度的資料即可,然後使read_sign指向 unit結構體中的next即可。
記憶體池 C 記憶體池
c c 下記憶體管理是讓幾乎每乙個程式設計師頭疼的問題,分配足夠的記憶體 追蹤記憶體的分配 在不需要的時候釋放記憶體 這個任務相當複雜。1.呼叫malloc new,系統需要根據 最先匹配 最優匹配 或其他演算法在記憶體空閒塊表中查詢一塊空閒記憶體,呼叫free delete,系統可能需要合併空閒記...
記憶體池 簡單的記憶體池的實現
當頻繁地用malloc申請記憶體,然後再用free釋放記憶體時,會存在兩個主要問題。第乙個問題是頻繁的分配釋放記憶體可能導致系統記憶體碎片過多 第二個問題是分配釋放記憶體花費的時間可能比較多 這個問題不太明顯 這個時候我們就可以考慮使用記憶體池了。最樸素的記憶體池思想就是,首先你向系統申請一塊很大的...
記憶體池 執行緒池
1 記憶體池是在真正使用記憶體之前,先申請分配一定數量的 大小相等 一般情況下 的記憶體塊留作備用。當有新的記憶體需求時,就從記憶體池中分出一部分記憶體塊,若記憶體塊不夠再繼續申請新的記憶體。這樣做的乙個顯著優點是,使得記憶體分配效率得到提公升。2 執行緒池是一種多執行緒處理形式,處理過程中將任務新...