C語言實現記憶體池

2021-05-25 01:48:39 字數 839 閱讀 5238

什麼是記憶體池,這裡簡單介紹一下(不做詳細說明),記憶體池技術是一種用於分配大量大小相同的小物件的技術,通過該技術可以極大加快記憶體分配/釋放過 程。其原理是先申請一大塊記憶體,然後分成若干個大小相等的小塊,用鍊錶的方式將這些小塊鏈在一起,當開發人員需要使用記憶體時(分配),從煉表頭取下一塊返 回給開發人員使用;當開發人員使用完畢後(釋放),再將這塊記憶體重新掛回鍊錶尾。這樣操作的好處有如下三點:1、提高分配和釋放的效率;2、避免開發人員 忘記釋放記憶體造成記憶體洩露;3、減少記憶體占用(頻繁的malloc是很佔記憶體空間的,至於為什麼我就不說了,可以到網上搜尋記憶體管理相關的內容);

關於記憶體池技術的**在網上也有不少,我也看過一些,有基於c現實的,也有c++實現的,但在這些文章裡都發現兩個問題,1、當開發人員使用完記憶體 後,如果不釋放,那麼還是會有記憶體洩露的情況;2、在開發人員使用完記憶體後,釋放的時候總會去迴圈判斷該位址是否存在,在這種情況下,釋放的效率並有沒有 得到提公升。

那麼如何解決這兩個問題呢,我先簡單介紹一下我這個記憶體池,先看段結構體:

這裡面描述了詳細存放資訊,當池初始化時,所有塊都存在空閒塊中,已使用塊為空,當申請一塊空間時,從空閒塊的頭取下來放到已使用的塊中,基本過程 就是這樣子的。下面來解決上面提到的兩個問題,1、在記憶體洩露方面,先申請兩大塊的連續空間,一塊用於存放塊的基本資訊(塊鍊錶),另一塊返回給開發人員 使用(資料區域),然後用指標儲存兩塊記憶體位址,這樣一來,不管你是否釋放,在程式需要清理記憶體的時候,我只需要free兩次;2、在釋放效率方面,我們 不使用迴圈方式來處理,而是在返回給開發人員使用的記憶體塊前面加4個位元組存放與他關聯的塊資訊塊位址,在釋放的時候,我們只需要(memoryblock *)((char *)ptr – 4)就能得到塊位址,這樣就很方便的掛回空閒塊。具體現實**如下:

c語言實現執行緒池

ifndef threadpool h included define threadpool h included include typedef struct threadpool job void routine void void arg struct threadpool job next ...

固定記憶體分割槽(c語言實現)

記憶體是計算機的重要組成部分,它主要配合cpu的告訴運轉,提高計算機的執行速度。在計算機內部執行的都是一道道程式,而程式是儲存在外存 硬碟 中的,但外存的讀取速度非常緩慢,如果直接與cpu進行資料傳輸,會大大的降低cpu的效率。這時候能夠提供高速訪問的記憶體就很適合與cpu直接進行資料傳輸,但提供了...

go語言實現執行緒池

話說真的好久沒有寫部落格了,最近趕新專案,工作太忙了。這一周任務比較少,又可以隨便敲敲了。逛論壇的時候突發奇想,想用go語言實現乙個執行緒池,主要功能是 新增total個任務到執行緒池中,執行緒池開啟number個執行緒,每個執行緒從任務佇列中取出乙個任務執行,執行完成後取下乙個任務,全部執行完成後...