RTOS動態分割槽記憶體管理機制的優化設計

2021-05-28 17:20:05 字數 3083 閱讀 8981

引 言   在嵌入式領域中,嵌入式實時作業系統(rtos)正得到越來越廣泛的應用。採用嵌入式實時作業系統可以更合理、更有效地利用cpu的資源,簡化應用軟體的設計,縮短系統開發時間,更好地保證系統的實時性和可靠性。記憶體資源作為嵌入式系統中極為重要的資源之一,其管理機制歷來是嵌入式系統設計的重點和難點。記憶體管理機制的優劣程度極大地影響著嵌入式系統的整體效能,因此在嵌入式rtos的記憶體管理機制中必須滿足以下3個要求:   ①實時性。在嵌入式rtos中不僅要求排程機制的實時性,資源的分配和**的實時性也十分重要。

②可靠性。嵌入式系統的應用領域決定了嵌入式rtos必須具有高可靠性,而記憶體管理的可靠程度直接影響rtos的可靠性,因此記憶體管理的可靠性也必不可少。

③高效性。由於嵌入式系統資源的稀缺性,因而高效的資源管理機制也同等重要。

1 動態分割槽記憶體管理機制   1.1 動態分割槽記憶體管理概述   在許多小型嵌入式系統中並未實現虛擬記憶體機制,動態分割槽記憶體管理機制仍然是首選。分割槽儲存管理是滿足多道程式設計的最簡單的儲存管理方法,它允許多個使用者程式同時存在系統記憶體中,即共享記憶體空間。早期的分割槽儲存管理採用固定分割槽的方法,把記憶體空間分成若干個大小不等的區域,稱為分割槽。每個使用者程式(作業、程序)調入記憶體後,占用其中1個分割槽,程式執行完成後釋放該分割槽。這種儲存管理方法的主要問題是記憶體使用效率極低,很快就被淘汰了。取而代之的是動態分割槽儲存管理技術。圖1顯示的是動態記憶體管理的資料結構。

1.2 動態分割槽記憶體分收演算法及其效能分析   在動態記憶體分配機制中一般採用兩種設計方案:最佳適應演算法和首次適應演算法。最佳適應演算法要求所有的空閒記憶體塊按照記憶體塊的大小,由小到大鏈結在一起。首次適應演算法中所有的空閒記憶體塊都是按位址由小到大鏈結的。圖2顯示了這2種演算法的流程(假設系統申請的記憶體塊大小為n)。

最佳適應演算法和首次適應演算法在分配記憶體的流程上是一致的,然而由於空閒記憶體塊的組織形式不同,其分配的效能也不盡相同。最佳適應演算法由於每次分配都是首先分配與所要求的記憶體塊大小最接近的空閒記憶體塊,因而其記憶體利用率相對較高。然而由於在記憶體**過程中需要合併那些位址相鄰的空閒塊,最佳適應演算法往往需要遍歷整個空閒區煉表以尋找符合條件的記憶體塊。而首次適應演算法由於是按照位址的順序相連,因而在記憶體**方面有著最佳適應演算法無法比擬的效能。

圖3顯示了在幾種不同情況下,動態分割槽記憶體**機制所採取的策略。

在a中,釋放區**後合併成新記憶體塊f,其首位址為f1記憶體塊的首位址,大小為f1和r記憶體塊的大小之和。在b中,釋放區**後合併成新記憶體塊f,其首位址為r記憶體塊的首位址,大小為f1和r記憶體塊的大小之和。在c中,釋放區**後合併成新記憶體塊f,其首位址為f1記憶體塊的首位址,大小為f1和r以及f2記憶體塊的大小之和。在d中,釋放區**後不進行合併,直接插入空閒區鍊錶並返回。

動態分割槽記憶體的分配機制有效地避免了記憶體內部碎片的存在,同時在記憶體**策略中使用合併演算法也極大地減少了記憶體外部碎片存在的可能性。然而,當系統需要分配大量的小塊記憶體時,動態分割槽記憶體管理機制的效能卻並不令人滿意。其不足之處主要存在以下2個方面:   ①當系統分配大量的小塊記憶體後,其空閒區表或空閒區佇列將會變得異常龐大。無論是首次適配演算法還是最佳適應演算法都需要遍歷空閒區搜尋合適的記憶體塊,因此過於龐大的空閒區結構使搜尋演算法變得低效。

②系統在某些特定的時刻往往會對大量的小塊記憶體進行頻繁分配和**。頻繁地對小塊記憶體進行分割分配和合併**,其實時性表現得並不令人滿意。

基於以上2點,如何在動態分割槽記憶體管理機制的基礎上優化小塊記憶體的管理機制,成為提高動態分割槽記憶體管理效能的關鍵因素之一。

2 小塊記憶體動態快取分配機制   大部分實時作業系統記憶體分配機制並未對大塊記憶體和小塊記憶體的分配做出不同的演算法設計,然而在實際分配過程中,很難用一種分配演算法兼顧大小記憶體的高效分配。針對動態分割槽記憶體管理機制中對小塊記憶體分配的侷限性,提出了小塊記憶體動態快取機制。該機制在繼承了動態分割槽管理機制優良效能的同時,優化了小塊記憶體的管理,對記憶體管理的實時性和高效性都有一定提高。系統中同時存在2種記憶體資料結構,分別為小塊記憶體和大塊記憶體設計。大塊記憶體依舊採取動態分割槽記憶體管理機制,而小塊記憶體採取動態快取分配。小塊記憶體資料結構如圖4所示。

假設小塊記憶體最小為1位元組,並以2的指數遞增,最大為512位元組。這也就意味著當系統需要分配或釋放小於或等於512位元組的記憶體時,會執行小塊記憶體操作。圖5和圖6分別是小塊記憶體的分配和**流程(圖中j代表需操作的小塊記憶體對應的快取號,若申請120位元組則j對應為8;min代表小塊記憶體最大的快取號,如圖中min=9)。

圖7是對小塊記憶體操作演算法的簡單模擬。小塊記憶體快取區從上到下依次快取512~64位元組的記憶體塊。有4個操作過程:分配64位元組→分配128位元組→**64位元組→**128位元組。

①分配64位元組。初始狀態小塊記憶體快取區為空,此時將會執行大塊記憶體分配操作並將1 kb記憶體分割快取到小塊記憶體快取區。在分配64位元組記憶體時,系統自動探測到了128位元組、256位元組和512位元組處的快取區已經處於飢餓狀態,因此也將會分配其快取區1塊記憶體。

②分配128位元組。由於系統存在該大小的快取,因此直接獲取並返回。

③**64位元組。由於釋放後,系統中64位元組大小的記憶體塊可以合併,因此合併後鏈入上一級快取區。

④**128位元組。記憶體塊再次進行合併操作,最終呼叫大塊記憶體釋放操作,從而回到原始態。

圖7所示的記憶體操作只是乙個非常簡單的模擬,實際系統記憶體的分配和**是非常複雜和不確定的,而小塊記憶體動態快取分配機制的效能在這種情況下表現得尤為突出。總體而言其具有以下幾點優勢:   ①快速性。因為使用了快取機制,所以在大部分情況下,小塊記憶體釋放後依舊在快取區中,當系統再次分配該大小的記憶體塊時就極為快速。

②自適應性。在分配小塊記憶體的過程中,演算法能檢測出處於飢餓狀態的記憶體塊大小,並依次為它們所在的快取區分配1塊相應大小的記憶體塊。

③動態性。在小塊記憶體的**過程中,該演算法將對記憶體塊進行合併重組。假若某時刻先前從大塊記憶體中分配的1 kb記憶體塊全部被小記憶體塊釋放,其經過重組後必定能重新新增到大記憶體塊儲存區。

3 優化後的系統記憶體管理機制

圖8和圖9分別是優化後系統分配和**記憶體的演算法,圖中的max代表的是小塊記憶體的最大值。當不能得到所需的小塊記憶體,或者釋放小塊記憶體最終合併成大塊記憶體時,分別呼叫大塊記憶體分配和釋放操作,從而保證小塊記憶體和大塊記憶體操作能很好地協作,增強了系統的穩定性。

結 語   儘管在引入小塊記憶體動態快取分配機制後,系統在分配小塊記憶體時會存在一定的記憶體內部碎片,但由於小塊記憶體本身很小以及大塊記憶體的動態分割槽管理機制,很好地降低了系統中由於存在記憶體碎片而帶來的風險。在實際模擬測驗1中,經優化過的動態分割槽記憶體管理機制能在一定程度上提高系統的實時性及可靠性,在嵌入式rtos的設計中具有實際的意義。

記憶體管理機制

記憶體管理 jvm將記憶體分成三大主要區域 堆,棧,方法區,用來儲存資料。堆 堆中主要儲存引用型別物件,給成員變數分配空間。棧 jvm在執行程式時,在棧中會為每乙個方法都提供儲存空間叫棧幀,用來儲存方法中的區域性變數。方法區 用來儲存jvm載入的位元組碼檔案的資訊 類的資訊 包含類的方法,方法只有乙...

記憶體管理機制

記憶體管理是乙個作業系統必不可少 並且 非常重要的一環 linux 的成功 和它優秀的記憶體管理聯絡非常密切 因為乙個系統的高效性慾穩定性往往決定於它的記憶體管理機制 我項很多人吃過 dos 下 640k 的苦吧 前面我們介紹了 386 保護模式 從今天起我們將在此基礎上 分析 linux 的虛擬儲...

iOS 記憶體管理機制

學習要點 1.reference counting 引用計數機制 2.了解mrc apc和gc 3.autoreleasepool 執行機制 4.如何避免 retain cycle reference counting 引用計數機制 cocoa 上基本的記憶體管理機制就是引用計數,通過乙個 refe...