動(dòng)態(tài)內存管理在面向嵌入式實(shí)時(shí)系統中的研究
動(dòng)態(tài)內存管理的基本任務(wù)就是有效地對動(dòng)態(tài)內存進(jìn)行分配、回收,并同時(shí)保證系統的快速性、可靠性和穩定性。當系統請求分配內存時(shí),系統需要從所有空閑塊中找到一個(gè)合適的空閑塊進(jìn)行分配;當用戶(hù)不再使用而將某塊內存釋放時(shí),系統需要回收這一內存塊,以備在新的請求產(chǎn)生時(shí)重新進(jìn)行分配。為此,系統需要建立一個(gè)與內存當前使用情況相對應的內存描述,用來(lái)記錄所有與內存分配、回收相關(guān)的信息。而如何記錄這些信息并進(jìn)行分配與回收,便成為各種算法的最根本區別。
本文引用地址:http://dyxdggzs.com/article/150432.htm實(shí)時(shí)系統分為硬實(shí)時(shí)系統和軟實(shí)時(shí)系統。硬實(shí)時(shí)系統是指系統中各任務(wù)不僅要執行無(wú)誤而且要做到準時(shí);軟實(shí)時(shí)系統是指系統中各任務(wù)運行的越快越好,并不要求限定某一任務(wù)必須在多長(cháng)時(shí)間內完成??梢钥闯?a class="contentlabel" href="http://dyxdggzs.com/news/listbylabel/label/動(dòng)態(tài)">動(dòng)態(tài)內存分配是絕對不能用于硬實(shí)時(shí)系統的,因為動(dòng)態(tài)分配具有時(shí)間不確定性(分配時(shí)間與內存塊數量有關(guān)),而且動(dòng)態(tài)分配可能產(chǎn)生分配不成功的情況。所以對于硬實(shí)時(shí)系統,只能采用靜態(tài)內存分配方式。靜態(tài)分配是指在編譯或鏈接時(shí)將程序所需的內存空間分配好,這樣不會(huì )出現分配失敗的情況。
1.1 靜態(tài)分配與動(dòng)態(tài)分配
靜態(tài)分配為系統提供了最好的可靠性與實(shí)時(shí)性。對于那些對實(shí)時(shí)性和可靠性要求極高的需求,就只能采用靜態(tài)分配方式。但采用靜態(tài)分配就必然會(huì )使系統失去靈活性。因此必須在設計階段考慮所有可能的情況,并對所有的需求做出相應的空間分配。一旦出現沒(méi)有考慮到的情況,系統就無(wú)法處理。此外靜態(tài)分配方式也必然導致很大的浪費,因為必須按照最壞情況進(jìn)行最大的配置,而在實(shí)際運行中可能只用到其中的一小部分。
動(dòng)態(tài)分配為系統提供了很大的靈活性,而且在內存的利用率和系統功能擴展等方面也都明顯地優(yōu)于靜態(tài)分配。
大多數系統采用靜態(tài)分配和動(dòng)態(tài)分配相結合的方式。由于嵌入式系統本身各個(gè)任務(wù)的可靠性、實(shí)時(shí)性要求不盡相同,通常會(huì )有一部分任務(wù)對可靠性與實(shí)時(shí)性沒(méi)有特別嚴格的要求。這些任務(wù)對一定的延時(shí)與失敗是可以接受的。因此對于這樣的一部分任務(wù),就可以采用動(dòng)態(tài)分配方式來(lái)滿(mǎn)足它們部分或全部的內存需求。而對于那些有嚴格時(shí)限要求的任務(wù),為了保證任務(wù)的可靠性和實(shí)時(shí)性,就應采用靜態(tài)分配方式。
1.2 動(dòng)態(tài)分配的技術(shù)要求
?。?)快速性:由于嵌入式系統對實(shí)時(shí)性要求較高,所以?xún)却娣峙溥^(guò)程要盡可能地快。在嵌入式系統中,由于還不能采用通用操作系統中復雜而完善的內存分配策略,所以一般都采用簡(jiǎn)單、快速的內存分配方案。
?。?)可靠性:由于嵌入式系統對可靠性的要求較高,所以?xún)却娣峙溥^(guò)程也要具備高可靠性。但由于各個(gè)嵌入式系統之間對可靠性的要求不盡相同,對內存分配的可靠性要求也就各不相同。通常,可靠性要求極高的系統不采用動(dòng)態(tài)分配。
?。?)高效性:由于在嵌入式系統中內存資源都相對有限,所以為了保證程序的正常運行,內存管理系統要盡可能高效地使用內存,減少不必要的浪費。
2 伙伴系統
2.1 伙伴系統原理
伙伴(buddy)系統的基本原理就是按照2的冪次方大小對內存進(jìn)行分配,以此得到很高的分配速度和回收速度。例如:對于10KB的空間請求,伙伴系統會(huì )分配16KB的空間來(lái)滿(mǎn)足。因為內存空閑塊大小均為2的冪次方,所以需要16KB,這是滿(mǎn)足10KB的最小空間;同樣對于70KB的空間請求,伙伴系統會(huì )分配128KB的空間來(lái)滿(mǎn)足。
2.2 伙伴系統存在的問(wèn)題
伙伴系統比那些按大小而不按塊的整數倍地址分配的算法有更多的優(yōu)點(diǎn)。其優(yōu)點(diǎn)為當一個(gè)大小為2的K次冪的塊被釋放后,存儲管理只需要搜索2的K次冪字節大小的塊以判定是否需要合并。那些允許內存塊以任意形式分割的策略需要搜索所有的空閑塊表。相比之下,伙伴系統更快。
但是對于內存利用率來(lái)說(shuō),伙伴系統是極其低效的。問(wèn)題出自所有的內存請求都必須以2的冪次方大小的空間來(lái)滿(mǎn)足,一個(gè)35KB的請求需要分配64KB的空間,其余的29KB被浪費了。在極端情況下內存資源有近50%被浪費。
3 連續的內存分配
3.1 問(wèn)題提出
伙伴系統的內存管理方式對空間的使用存在極大的浪費。在某些情況下還會(huì )由于資源的浪費,導致后繼的內存請求得不到滿(mǎn)足,進(jìn)而嚴重地影響程序的正常功能。
試考慮:系統共有1MB內存空間可用,采用伙伴系統進(jìn)行管理。有如下請求:請求A,300KB;請求B,300KB;請求C,50KB.結果如表1所示。
由表1中可以看出:伙伴系統對空間的浪費是極其嚴重的,即使在物理內存充足(1MB)的情況下,也會(huì )產(chǎn)生請求(650KB)無(wú)法滿(mǎn)足的情況。
由于在嵌入式系統中,一般都沒(méi)有虛擬內存的支持,所以當內存請求無(wú)法得到滿(mǎn)足時(shí),將嚴重影響程序的正常功能。因此為了保證程序的正常功能,就要提高內存的利用率,盡可能地滿(mǎn)足程序的內存請求。所以在對伙伴系統進(jìn)行分析的基礎上,提出了連續的內存分配方式。
3.2 連續的內存分配原理
從上例不難看出,只要采用連續的內存分配方式(即分配與請求大小相等的空間來(lái)滿(mǎn)足請求),便不難使請求C得到滿(mǎn)足,而且還會(huì )有很大的剩余空間繼續用來(lái)滿(mǎn)足其他的內存請求。結果如表2所示。
連續的內存分配方式明顯不同于其他以塊為單位進(jìn)行分配的內存管理方法。它采用連續分配的方式,按照請求空間的實(shí)際大小來(lái)進(jìn)行空間分配。
評論