


廈門IT培訓
美國上市IT培訓機構
13429669395
雖然當今的嵌入式系統的內存比之以K計數的時代已經有了很大的提高,但是隨著軟件規模的增長,內存不足的問題依然時時困擾著系統架構師。有一些原則,架構師在進行設計決策的時候可以參考:
1、虛擬內存技術
有一些嵌入式設備需要處理巨大的數據量,而這些數據不可能全部裝入內存中。一些嵌入式操作系統不提供虛擬內存技術,比如WinCE4.2每個程序最多只能使用32M內存。對這樣的應用,架構師應該特別設計自己的虛擬內存技術。所謂的虛擬內存技術的核心是,將暫時不太可能使用的數據移出內存。
這涉及到一些技術點:
引用計數,正在使用的數據不能移出。
使用預測,預測下一個階段某個數據的使用可能性。基于預測移出數據或者提前裝入數據。
占位數據/對象。
高速緩存。在復雜數據結果下緩存高頻率使用的數據,直接訪問。
快速的持久化和裝載。
2、兩段式構造
在內存有限的系統里,對象構造失敗是必須要處理的問題,失敗的原因中最常見的則是內存不足(實際上這也是對PC平臺的要求,但是在實際中往往忽略,因為內存實在便宜)。兩段式構造就是一種常用而有效的設計。舉例來說:
CMySimpleClass:
class CMySimpleClass
{
public:
CMySimpleClass();
~CMySimpleClass();
...
private:
int SomeData;
};
CMyCompoundClass:
class CMyCompoundClass
{
public:
CMyCompoundClass();
~CMyCompoundClass();
...
private:
CMySimpleClass* iSimpleClass;
};
在CMyCompoundClass的構造函數里初始化iSimpleClass對象。
CMyCompoundClass::CMyCompoundClass()
{
iSimpleClass = new CMySimpleClass;
}
當創建CMyCompoundClass的時候會發生什么呢?
CMyCompoundClass* myCompoundClass = new CMyCompoundClass;
為CMyCompoundClass的對象分配內存
調用CMyCompoundClass對象的構造函數
在構造函數中創建一個CMySimpleClass的實例
構造函數結束返回
一切看起來都很簡單,但是如果第三步創建CMySimpleClass對象的時候發生內存不足的錯誤怎么辦呢?構造函數無法返回任何錯誤信息以提示調用者構造沒有成功。調用者于是獲得了一個指向CMyCompoundClass的指針,但是這個對象并沒有構造完整。
如果在構造函數中拋出異常會怎么樣呢?這是個著名的噩夢,因為析構函數不會被調用,在創建CMySimpleClass對象之前如果分配了資源就會泄露。關于在構造函數中拋出異常可以單講一個小時,但是有一個建議是:盡量避免在構造函數中拋出異常。
所以,使用兩段式構造法是一個更好的選擇。簡單的說,就是在構造函數避免任何可能產生錯誤的動作,比如分配內存,而把這些動作放在構造完成之后,調用另一個函數。比如:
AddressBook* book = new AddressBook()
If(!book->Construct())
{
delete book;
book = NULL;
}
這樣可以保證當Construct不成功的時候釋放已經分配的資源。
在最重要的手機操作系統Symbian上,二段式構造法普遍使用。
3、內存分配器
不同的系統有著不同的內存分配的特點。有些要求分配很多小內存,有的則需要經常增長已經分配的內存。一個好的內存分配器對嵌入式的軟件的性能有時具有重大的意義。應該在系統設計時保證整個系統使用統一的內存分配器,并且可以隨時更換。
4、內存泄漏
內存泄漏對嵌入式系統有限的內存是非常嚴重的。通過使用自己的內存分配器,可以很容易的跟蹤內存的分配釋放情況,從而檢測出內存泄漏的情況。
版權聲明:轉載文章來自公開網絡,版權歸作者本人所有,推送文章除非無法確認,我們都會注明作者和來源。如果出處有誤或侵犯到原作者權益,請與我們聯系刪除或授權事宜。