溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

內(nèi)存池的實現(xiàn)方式

發(fā)布時間:2021-07-12 13:51:46 來源:億速云 閱讀:121 作者:chen 欄目:編程語言

本篇內(nèi)容介紹了“內(nèi)存池的實現(xiàn)方式”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

這篇文章主要介紹一下內(nèi)存池的實現(xiàn)方式,這里介紹的是一種比較經(jīng)典的內(nèi)存池實現(xiàn)方式,就是鏈表法實現(xiàn),具體原理如下:

1,首先內(nèi)存池?zé)o非是提前申請一大塊內(nèi)存片段,之后把這個片段上的指針分配給用戶,對于分配來說只要記住已經(jīng)分配的偏移量即可,每次分配將指針后移申請的內(nèi)存塊長度即可。

2,主要問題在于釋放內(nèi)存,由于不確定用戶申請和釋放內(nèi)存的順序,必須假定申請和釋放都在交疊進(jìn)行,
對于內(nèi)存池來說,釋放的空間必須要可以復(fù)用,否則內(nèi)存池失去了意義;
但是先申請的內(nèi)存區(qū)域可能先釋放,這樣將出現(xiàn)釋放的區(qū)域位于已分配區(qū)域中間的情形;如何索引這些釋放的內(nèi)存片段是內(nèi)存池要主要解決的問題;

見下圖:

內(nèi)存池的實現(xiàn)方式

未命名文件.jpg

圖中X區(qū)域先申請,當(dāng)申請了Y區(qū)域之后,釋放了X區(qū)域,此時如何能夠復(fù)用X區(qū)域的內(nèi)存,而不是只能使用Y區(qū)域之后的內(nèi)存時要解決的問題;

內(nèi)存池的鏈表法實現(xiàn)見第二幅圖,每個申請的區(qū)域前有一個固定長度的頭部,其中記錄了一些信息,最重要的是兩個指針,一個指向后面的內(nèi)存塊頭部,另一個指向前面的內(nèi)存塊頭部,并且末尾的內(nèi)存塊和首部鏈接起來,構(gòu)成一個雙向環(huán)形鏈表結(jié)構(gòu);
同時還有個標(biāo)記位標(biāo)志這塊內(nèi)存有沒被使用;

當(dāng)申請內(nèi)存時,從鏈表首部開始遍歷找到第一個沒有使用的內(nèi)存塊,判斷其大小是否滿足,如不滿足,繼續(xù)搜索;直到滿足條件,此時分2種情形:
1,可用內(nèi)存塊大小和要申請的大小一樣,則直接標(biāo)記為已使用,并返回即可
2,可用內(nèi)存塊大于要申請的內(nèi)存塊,則把可用內(nèi)存區(qū)間分裂為2部分,前一部分標(biāo)記為已使用,后一部分標(biāo)記為未使用,并繼續(xù)保持它們的鏈表結(jié)構(gòu);

對于釋放內(nèi)存,需要判斷是否前面和后面相鄰的內(nèi)存塊有未使用,如果有,則需要合并,這一步至關(guān)重要,因為如果存在大量相鄰的標(biāo)記未使用內(nèi)存可能會導(dǎo)致無法分配一塊較大區(qū)域,

以上操作始終保持鏈表結(jié)構(gòu),就可以實現(xiàn)一個基礎(chǔ)內(nèi)存池了;
實際上,這個實現(xiàn)思路來自于John Carmack在Quake3中的實現(xiàn)

但是我們可以稍微做一點優(yōu)化(不過要犧牲一些額外的存儲空間)優(yōu)化方法是,額外記錄兩個指針,以環(huán)形形式連接所有未使用的內(nèi)存空間,這樣,查找的效率提高了,幾乎提升到了常數(shù)時間,
同時這個內(nèi)存池還有一個缺陷就是長度固定,不過順著這個思路,我們可以在內(nèi)存不夠時,新分配一塊大的區(qū)域,并且保持原來的鏈表結(jié)構(gòu)即可,

下面附上代碼實現(xiàn),見
https://github.com/wiltchamberian/MemoryPool
這里實現(xiàn)了兩個,第一個是參考Quake3 Carmack的實現(xiàn)
第二個SuperMemoryPool是改良后的實現(xiàn),改良版實現(xiàn)的速度要提高了一些,支持動態(tài)內(nèi)存

“內(nèi)存池的實現(xiàn)方式”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI