国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

實時系統中動靜結合的內存管理實現

發布時間:2010-10-11 21:48    發布者:conniede
關鍵詞: 函數 , 內存 , 實時系統
1. 實時系統內存分配

實時系統分為硬實時系統和軟實時系統。硬實時系統是指系統中各任務不僅要執行無誤而且要做到準時;軟實時系統是指系統中各任務運行的越快越好,并不要求限定某一任務必須在多長時間內完成。

可以看出動態內存分配是絕對不能用于硬實時系統的,因為動態分配具有時間不確定性(分配時間與內存塊數量有關),而且動態分配可能產生分配不成功的情況。所以對于硬實時系統,只能采用靜態內存分配方式。靜態分配是指在編譯或鏈接時將程序所需的內存空間分配好,這樣不會出現分配失敗的情況。

其實對于大多數實時系統而言,內存分配都是采用兩種方式的結合,即動靜結合的分配方式。

2. 動靜結合內存分配的一種實現

對于整個內存,把它分為4個部分,即中斷向量區、系統映射區、系統內存區和用戶內存區。如圖1所示。

其中中斷向量表和系統映射區在編譯時已經設定好,即采用靜態分區的方式。剩下的兩個部分可以按用戶要求配置。

2.1 系統內存區分區

對于整個系統內存區,還需要要進行分區操作,使它產生多個分區,每個分區中內存塊的大小相等,各個分區之間內存塊大小不等。這樣來滿足多種內存申請需求。

2.1.1 系統分區類結構定義

系統建立了一個內存塊結構,它由一個指向下一個內存塊的指針構成,因為系統使用單向鏈表來管理空閑內存塊,所以必須用每個內存塊的這個指針來讓所有的空閑內存塊連成一個鏈表。


圖1 內存劃分示意圖

結構如下:

struct memblock

{

void * next;

};

對于內存分區,采用面向對象的方式,這樣減少了全局變量的使用,同時提高了可操作性。系統建立了內存分區類結構。它包含了該分區的信號量、內存區的起始地址、內存塊大小、內存塊數量、空閑內存塊數量、空閑內存塊鏈表和鏈表尾部等。類結構定義如下:

class mempartition

{

private:

semphore s; //控制該內存分區的信號量

public:

long *start; //塊起始位置

void *freeulist; //空閑內存塊鏈表

void *tail; //空閑內存塊鏈表尾部

int unitsize; //內存塊大小

short unitnum; //內存塊數量

short freeunum; //空閑內存塊數量

mempartition(); //初始化鏈表、信號量

void *GetUnit(); //獲取內存塊

void PutUnit(void *); //釋放內存塊

};

因為每個內存分區都是多任務共享的,每次只能有一個任務或中斷服務程序進入該內存分區,所以需要設置信號量來管理它,當然也可以采用關中斷的方式,關中斷可能導致中斷響應延遲等問題,所以沒有采用這種方式。


圖2 流程圖

2.1.2 系統分區的實現

通過Partition_Create()函數創建一個內存分區,函數定義為

int Partition_Create(mempartition *mp,unsigned int unum,unsigned int usize);

mp為創建的內存分區,unum為該分區中內存塊數量,usize為內存塊大小。函數流程圖如圖2所示。

對于塊內存的申請,采用c語言提供的malloc函數從內存中申請。這對于程序設計者而言提供了極大的方便,對于系統分區不適合嵌入式應用(該實時系統設計應用于嵌入式設備中)需求的情況下,可以刪除該分區另外再建立。不過這樣做的情況應該盡可能少,因為多次調用malloc/free會產生較多的內存碎片。在做設計時,應該盡可能預先設定好分區數量和各個分區中內存塊的數量和大小,盡管系統提供了重建分區的功能。

每個塊內存的第一部分存儲該分區對象,其后才是各個內存塊。在內存塊空閑時,其內部存儲了下一個節點的的指針。分配以后,該信息丟失,直接分配給申請者,這樣省掉了存儲每個內存塊信息額外的RAM開銷。內存釋放時,直接加到該分區空閑內存鏈表的尾部,同時設定下一個節點內存塊信息為NULL。這樣在多次分配與釋放后,內存塊的位置會發生比較大的變化。

系統設置了一個全局鏈表 mempartion **partition_list 來存儲所有的內存分區指針,該鏈表的長度可以動態定義。也就是說分區的數量可以動態定義。鏈表中的分區需要進行排序,排序的標準是每個分區中內存塊的大小,內存塊小的分區排在前面,內存塊大的排在后面。因為分區采用首次適配的算法,排序以后可以減少內存浪費。

同時,系統提供了Mem_Alloc/Mem_Free兩個函數來支持系統分區的申請和釋放。申請的算法很簡單,采用首次適配方法從分區鏈表中找到合適內存分區,如果該區空閑內存鏈表不為空,則返回該鏈表第一個內存塊地址,否則查看下一個分區。如果找不到合適的內存塊,則返回空指針。

釋放算法稍微復雜一些,它需要先檢查該內存塊屬于哪個分區。這樣做非常必要,如果把一個小塊放到大塊的內存分區中,一個任務申請了該空間,則該空間的一部分將跨越到另一個內存塊,對該內存塊的操作可能覆蓋另一個內存塊的數據。如果把一個大塊放到了小塊的分區中,則在分配的時候將分配了多余的空間,造成了內存空間的浪費。找到所 圖2創建內存分區流程圖屬分區后,直接把該塊放到該區空閑內存鏈表的尾部。

上述系統分區的方式其實是小范圍動態分區上實現的靜態方式。因為每個內存塊大小是固定的,這樣不可避免地要浪費一部分空間。對于這個問題的解決,系統還提供了一種純動態的解決辦法,就是調用malloc/free函數來申請內存塊。

2.1.3 內存用戶區的動態內存分配

從內存劃分圖中可以看到有一塊用戶內存區,這是一塊內核不會使用的內存區。該區留給用戶使用,對于這塊區域的申請和釋放不調用系統提供的Mem_Alloc/Mem_Free函數,而是直接調用c語言提供的malloc/free函數。malloc具有不確定性,因為它的執行時間和空閑內存塊的數量有關,而且多次使用malloc/free調用和釋放內存塊,可能產生大量的內存碎片。所以這種方式的調用要謹慎。由于用戶內存區大小是可配置的,所以用戶可以控制該區大小以減少碎片產生的問題。同時對于系統調用,例如任務堆棧分配,不會因為碎片太多而導致分配失敗的問題。

3. 小結

動靜結合的方式給用戶提供了比較大的自由度,用戶可以從系統分區中申請內存塊,也可以從用戶內存區申請內存塊。這樣增加了系統的靈活性,同時也限制了大量碎片產生的可能(在不頻繁刪除建立系統內存分區的前提下)。也增加了部分c代碼的可移植性。
本文地址:http://www.qingdxww.cn/thread-31605-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • Dev Tool Bits——使用MPLAB® Discover瀏覽資源
  • Dev Tool Bits——使用條件軟件斷點宏來節省時間和空間
  • Dev Tool Bits——使用DVRT協議查看項目中的數據
  • Dev Tool Bits——使用MPLAB® Data Visualizer進行功率監視
  • 貿澤電子(Mouser)專區

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 黄色成人免费观看 | 中文字幕一区二区在线播放 | 思思久久99热这里只有精品66 | 91精品啪在线观看国产91九色 | 久久久综合香蕉尹人综合网 | 91在线免费观看网站 | 一区视频在线 | 久久久久久久久久免费视频 | 日韩在线a视频免费播放 | 日韩城人网站 | 色婷婷精品大全在线视频 | 亚洲成人一区二区 | 狠狠色成人综合网图片区 | 91精品国产综合成人 | 国产女在线 | 在线免费h | 成年黄网站在线观看免费 | 亚洲区免费| 日本高清高色 | 免看一级a毛片一片成人不卡 | 好吊色青青青国产在线观看 | 日韩在线国产 | 成人影院久久久久久影院 | 国产欧美在线观看精品一区二区 | 日本精品一区二区三区在线观看 | 日本高清视频网站www | 欧美视频免费播放 | 在线免费观看精品 | 蜜桃臀久久伊人福利 | 日韩免费网站 | 久久.com | 亚洲最大福利视频 | 国产开嫩苞视频 | 两个人在线看视频 | 成人在线日韩 | 欧美在线播放一区二区 | 一级片在线观看视频 | 四虎成人影视 | 一级日本高清视频免费观看 | 久久99国产精品视频 | 美国大片在线观看 |