記憶體模組是作業系統中的重要的模組,也是編碼時運用較多的,本文講述記憶體的實現,分析實時嵌入式作業系統記憶體模組的實現,如常見的
nucleus plus, threadx
。實時嵌入式作業系統,如
nucleus plus, threadx
中一般具有兩種記憶體的分配方式,把它歸納為塊記憶體和池記憶體
:塊記憶體在每個記憶體池中分配的記憶體大小是相同的,由於應用需要不同大小的記憶體塊,所以具有不同大小記憶體塊的記憶體池,如果所需的記憶體大小小於記憶體池中記憶體塊的大小,它也是分配給你該池的大小,容易造成浪費,但是分配的效率較高;對於池記憶體,初始化時是乙個整體的記憶體塊,分配時可以按照需要在該記憶體塊中分配不同大小的記憶體,所以在分配一段時間後該原來乙個整體的記憶體塊變成某些部分分配,某些部分空閒,空閒的大小也不一致,容易造成記憶體碎片。
記憶體的實現可以有多種方法,塊記憶體可以採用鍊錶結構,本文以
nucleus
為例;池記憶體也可以採用不同的演算法,如首次適配法,最佳適配法,最差適配法。
1.2.1
塊記憶體在塊記憶體初始化之前,是一塊完整的記憶體塊區:
塊記憶體初始化完成以後,如下所示:
土黃色部分是鍊錶結構,將整個單獨的記憶體塊連線起來,紅色部分是返回給呼叫者,供使用者
實際使用到的記憶體塊。每個紅色部分的記憶體塊大小相同。
當記憶體分配的時候,從鍊錶中取出乙個節點分配給使用者;當記憶體釋放的時候,該節點又重新掛載到鍊錶上。
1.2.2
池記憶體
池記憶體的分配可以有不同的演算法,不同的演算法對記憶體的分配和記憶體碎片具有不同的效果,如下文闡述有最佳適配法,最差適配法,首次適配法等。
最佳適配法,掃瞄鍊錶,找出大小最接近所需記憶體的記憶體塊進行分配,該種分配方法,系統中存在一些較小的記憶體碎片,也有較大的記憶體塊;
最差適配法,找出鍊錶中最大的記憶體塊,從該塊記憶體中進行分配,該種分配方法使記憶體塊的大小趨於一致;
首次適配法,掃瞄鍊錶,找出第乙個符合要求的記憶體塊(只要比所需的記憶體塊大小大即可),然後分配,該種分配方法記憶體布局介於最佳適配法和最差適配法之間。
以下圖示以首次適配法為例:
1.初始化一塊完整的記憶體區,假設為
1024k;
2.分配100k
3.分配300k
4.分配100k
5.釋放300k
6分配400k
,400k
超出300k
,搜尋到
524k
是從524k
塊中分配
7分配50k
,首先找到
300k
的大小,從中分成
50k和
250k
兩塊記憶體
在記憶體使用過程中容易出現一些問題,如記憶體洩漏和記憶體越界。記憶體洩漏,即該塊記憶體丟失,作業系統無法收回,以後就找不到了。記憶體越界,該塊記憶體比如說分配給他
24個位元組,但是它寫了
26個位元組,多了兩個位元組,有可能是其他記憶體塊的位址;假設是塊記憶體中的越界,它會破壞塊記憶體中的鍊錶結構,導致該記憶體池的鍊錶結構直接崩潰,無法再釋放和分配記憶體。
python 記憶體分析 python 記憶體分析
1 改原始碼重新編譯列印相關資訊 obmalloc.c 檔案中列印 maxarenas,值為當前環境分配 arena 個數 分配 arena 時並沒有馬上分配對應的pools,故對於每乙個 arena,nfreepools 和 ntotalpools 為分配pool的可用pool數和總pool數。i...
Scull字元裝置驅動模組的記憶體使用分析
先看一下每個scull dev的資料結構的定義 struct scull qset struct scull dev 每個scull裝置都有乙個資料指標,每個指標都指向下乙個scull qset資料結構。每個記憶體區成為乙個量子quantum,這個指標陣列即它的長度成為量子集qset,這個兩個值可以...
RTOS動態分割槽記憶體管理機制的優化設計
引 言 在嵌入式領域中,嵌入式實時作業系統 rtos 正得到越來越廣泛的應用。採用嵌入式實時作業系統可以更合理 更有效地利用cpu的資源,簡化應用軟體的設計,縮短系統開發時間,更好地保證系統的實時性和可靠性。記憶體資源作為嵌入式系統中極為重要的資源之一,其管理機制歷來是嵌入式系統設計的重點和難點。記...