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

實(shí)時(shí)系統(tǒng)中動(dòng)靜結(jié)合的內(nèi)存管理實(shí)現(xiàn)

發(fā)布時(shí)間:2010-10-11 21:48    發(fā)布者:conniede
1. 實(shí)時(shí)系統(tǒng)內(nèi)存分配

實(shí)時(shí)系統(tǒng)分為硬實(shí)時(shí)系統(tǒng)和軟實(shí)時(shí)系統(tǒng)。硬實(shí)時(shí)系統(tǒng)是指系統(tǒng)中各任務(wù)不僅要執(zhí)行無(wú)誤而且要做到準(zhǔn)時(shí);軟實(shí)時(shí)系統(tǒng)是指系統(tǒng)中各任務(wù)運(yùn)行的越快越好,并不要求限定某一任務(wù)必須在多長(zhǎng)時(shí)間內(nèi)完成。

可以看出動(dòng)態(tài)內(nèi)存分配是絕對(duì)不能用于硬實(shí)時(shí)系統(tǒng)的,因?yàn)閯?dòng)態(tài)分配具有時(shí)間不確定性(分配時(shí)間與內(nèi)存塊數(shù)量有關(guān)),而且動(dòng)態(tài)分配可能產(chǎn)生分配不成功的情況。所以對(duì)于硬實(shí)時(shí)系統(tǒng),只能采用靜態(tài)內(nèi)存分配方式。靜態(tài)分配是指在編譯或鏈接時(shí)將程序所需的內(nèi)存空間分配好,這樣不會(huì)出現(xiàn)分配失敗的情況。

其實(shí)對(duì)于大多數(shù)實(shí)時(shí)系統(tǒng)而言,內(nèi)存分配都是采用兩種方式的結(jié)合,即動(dòng)靜結(jié)合的分配方式。

2. 動(dòng)靜結(jié)合內(nèi)存分配的一種實(shí)現(xiàn)

對(duì)于整個(gè)內(nèi)存,把它分為4個(gè)部分,即中斷向量區(qū)、系統(tǒng)映射區(qū)、系統(tǒng)內(nèi)存區(qū)和用戶內(nèi)存區(qū)。如圖1所示。

其中中斷向量表和系統(tǒng)映射區(qū)在編譯時(shí)已經(jīng)設(shè)定好,即采用靜態(tài)分區(qū)的方式。剩下的兩個(gè)部分可以按用戶要求配置。

2.1 系統(tǒng)內(nèi)存區(qū)分區(qū)

對(duì)于整個(gè)系統(tǒng)內(nèi)存區(qū),還需要要進(jìn)行分區(qū)操作,使它產(chǎn)生多個(gè)分區(qū),每個(gè)分區(qū)中內(nèi)存塊的大小相等,各個(gè)分區(qū)之間內(nèi)存塊大小不等。這樣來(lái)滿足多種內(nèi)存申請(qǐng)需求。

2.1.1 系統(tǒng)分區(qū)類結(jié)構(gòu)定義

系統(tǒng)建立了一個(gè)內(nèi)存塊結(jié)構(gòu),它由一個(gè)指向下一個(gè)內(nèi)存塊的指針構(gòu)成,因?yàn)橄到y(tǒng)使用單向鏈表來(lái)管理空閑內(nèi)存塊,所以必須用每個(gè)內(nèi)存塊的這個(gè)指針來(lái)讓所有的空閑內(nèi)存塊連成一個(gè)鏈表。


圖1 內(nèi)存劃分示意圖

結(jié)構(gòu)如下:

struct memblock

{

void * next;

};

對(duì)于內(nèi)存分區(qū),采用面向?qū)ο蟮姆绞,這樣減少了全局變量的使用,同時(shí)提高了可操作性。系統(tǒng)建立了內(nèi)存分區(qū)類結(jié)構(gòu)。它包含了該分區(qū)的信號(hào)量、內(nèi)存區(qū)的起始地址、內(nèi)存塊大小、內(nèi)存塊數(shù)量、空閑內(nèi)存塊數(shù)量、空閑內(nèi)存塊鏈表和鏈表尾部等。類結(jié)構(gòu)定義如下:

class mempartition

{

private:

semphore s; //控制該內(nèi)存分區(qū)的信號(hào)量

public:

long *start; //塊起始位置

void *freeulist; //空閑內(nèi)存塊鏈表

void *tail; //空閑內(nèi)存塊鏈表尾部

int unitsize; //內(nèi)存塊大小

short unitnum; //內(nèi)存塊數(shù)量

short freeunum; //空閑內(nèi)存塊數(shù)量

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

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

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

};

因?yàn)槊總(gè)內(nèi)存分區(qū)都是多任務(wù)共享的,每次只能有一個(gè)任務(wù)或中斷服務(wù)程序進(jìn)入該內(nèi)存分區(qū),所以需要設(shè)置信號(hào)量來(lái)管理它,當(dāng)然也可以采用關(guān)中斷的方式,關(guān)中斷可能導(dǎo)致中斷響應(yīng)延遲等問(wèn)題,所以沒有采用這種方式。


圖2 流程圖

2.1.2 系統(tǒng)分區(qū)的實(shí)現(xiàn)

通過(guò)Partition_Create()函數(shù)創(chuàng)建一個(gè)內(nèi)存分區(qū),函數(shù)定義為

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

mp為創(chuàng)建的內(nèi)存分區(qū),unum為該分區(qū)中內(nèi)存塊數(shù)量,usize為內(nèi)存塊大小。函數(shù)流程圖如圖2所示。

對(duì)于塊內(nèi)存的申請(qǐng),采用c語(yǔ)言提供的malloc函數(shù)從內(nèi)存中申請(qǐng)。這對(duì)于程序設(shè)計(jì)者而言提供了極大的方便,對(duì)于系統(tǒng)分區(qū)不適合嵌入式應(yīng)用(該實(shí)時(shí)系統(tǒng)設(shè)計(jì)應(yīng)用于嵌入式設(shè)備中)需求的情況下,可以刪除該分區(qū)另外再建立。不過(guò)這樣做的情況應(yīng)該盡可能少,因?yàn)槎啻握{(diào)用malloc/free會(huì)產(chǎn)生較多的內(nèi)存碎片。在做設(shè)計(jì)時(shí),應(yīng)該盡可能預(yù)先設(shè)定好分區(qū)數(shù)量和各個(gè)分區(qū)中內(nèi)存塊的數(shù)量和大小,盡管系統(tǒng)提供了重建分區(qū)的功能。

每個(gè)塊內(nèi)存的第一部分存儲(chǔ)該分區(qū)對(duì)象,其后才是各個(gè)內(nèi)存塊。在內(nèi)存塊空閑時(shí),其內(nèi)部存儲(chǔ)了下一個(gè)節(jié)點(diǎn)的的指針。分配以后,該信息丟失,直接分配給申請(qǐng)者,這樣省掉了存儲(chǔ)每個(gè)內(nèi)存塊信息額外的RAM開銷。內(nèi)存釋放時(shí),直接加到該分區(qū)空閑內(nèi)存鏈表的尾部,同時(shí)設(shè)定下一個(gè)節(jié)點(diǎn)內(nèi)存塊信息為NULL。這樣在多次分配與釋放后,內(nèi)存塊的位置會(huì)發(fā)生比較大的變化。

系統(tǒng)設(shè)置了一個(gè)全局鏈表 mempartion **partition_list 來(lái)存儲(chǔ)所有的內(nèi)存分區(qū)指針,該鏈表的長(zhǎng)度可以動(dòng)態(tài)定義。也就是說(shuō)分區(qū)的數(shù)量可以動(dòng)態(tài)定義。鏈表中的分區(qū)需要進(jìn)行排序,排序的標(biāo)準(zhǔn)是每個(gè)分區(qū)中內(nèi)存塊的大小,內(nèi)存塊小的分區(qū)排在前面,內(nèi)存塊大的排在后面。因?yàn)榉謪^(qū)采用首次適配的算法,排序以后可以減少內(nèi)存浪費(fèi)。

同時(shí),系統(tǒng)提供了Mem_Alloc/Mem_Free兩個(gè)函數(shù)來(lái)支持系統(tǒng)分區(qū)的申請(qǐng)和釋放。申請(qǐng)的算法很簡(jiǎn)單,采用首次適配方法從分區(qū)鏈表中找到合適內(nèi)存分區(qū),如果該區(qū)空閑內(nèi)存鏈表不為空,則返回該鏈表第一個(gè)內(nèi)存塊地址,否則查看下一個(gè)分區(qū)。如果找不到合適的內(nèi)存塊,則返回空指針。

釋放算法稍微復(fù)雜一些,它需要先檢查該內(nèi)存塊屬于哪個(gè)分區(qū)。這樣做非常必要,如果把一個(gè)小塊放到大塊的內(nèi)存分區(qū)中,一個(gè)任務(wù)申請(qǐng)了該空間,則該空間的一部分將跨越到另一個(gè)內(nèi)存塊,對(duì)該內(nèi)存塊的操作可能覆蓋另一個(gè)內(nèi)存塊的數(shù)據(jù)。如果把一個(gè)大塊放到了小塊的分區(qū)中,則在分配的時(shí)候?qū)⒎峙淞硕嘤嗟目臻g,造成了內(nèi)存空間的浪費(fèi)。找到所 圖2創(chuàng)建內(nèi)存分區(qū)流程圖屬分區(qū)后,直接把該塊放到該區(qū)空閑內(nèi)存鏈表的尾部。

上述系統(tǒng)分區(qū)的方式其實(shí)是小范圍動(dòng)態(tài)分區(qū)上實(shí)現(xiàn)的靜態(tài)方式。因?yàn)槊總(gè)內(nèi)存塊大小是固定的,這樣不可避免地要浪費(fèi)一部分空間。對(duì)于這個(gè)問(wèn)題的解決,系統(tǒng)還提供了一種純動(dòng)態(tài)的解決辦法,就是調(diào)用malloc/free函數(shù)來(lái)申請(qǐng)內(nèi)存塊。

2.1.3 內(nèi)存用戶區(qū)的動(dòng)態(tài)內(nèi)存分配

從內(nèi)存劃分圖中可以看到有一塊用戶內(nèi)存區(qū),這是一塊內(nèi)核不會(huì)使用的內(nèi)存區(qū)。該區(qū)留給用戶使用,對(duì)于這塊區(qū)域的申請(qǐng)和釋放不調(diào)用系統(tǒng)提供的Mem_Alloc/Mem_Free函數(shù),而是直接調(diào)用c語(yǔ)言提供的malloc/free函數(shù)。malloc具有不確定性,因?yàn)樗膱?zhí)行時(shí)間和空閑內(nèi)存塊的數(shù)量有關(guān),而且多次使用malloc/free調(diào)用和釋放內(nèi)存塊,可能產(chǎn)生大量的內(nèi)存碎片。所以這種方式的調(diào)用要謹(jǐn)慎。由于用戶內(nèi)存區(qū)大小是可配置的,所以用戶可以控制該區(qū)大小以減少碎片產(chǎn)生的問(wèn)題。同時(shí)對(duì)于系統(tǒng)調(diào)用,例如任務(wù)堆棧分配,不會(huì)因?yàn)樗槠喽鴮?dǎo)致分配失敗的問(wèn)題。

3. 小結(jié)

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

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評(píng)論 登錄 | 立即注冊(cè)

廠商推薦

  • Microchip視頻專區(qū)
  • 無(wú)線充電基礎(chǔ)知識(shí)及應(yīng)用培訓(xùn)教程3
  • 5分鐘詳解定時(shí)器/計(jì)數(shù)器E和波形擴(kuò)展!
  • 無(wú)線充電基礎(chǔ)知識(shí)及應(yīng)用培訓(xùn)教程2
  • 了解一下Microchip強(qiáng)大的PIC18-Q24 MCU系列
  • 貿(mào)澤電子(Mouser)專區(qū)

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久免费精品视频 | 成年黄网站在线观看免费 | 四虎永久在线精品国产馆v视影院 | 四虎国产精品免费五月天 | 国产真实伦对白视频全集 | 国产成人亚洲综合无 | 日本欧美韩国一区二区三区 | 欧美在线观看一区二区三 | 精品欧美日韩一区二区 | 亚洲区精选网址 | 天堂素人约啪 | 69色堂 | 青青草国拍 | 国产一区二区三区在线观看视频 | 欧美精品v欧洲精品 | 人间正道是沧桑全集免费下载高清 | 碰91精品国产91久久婷婷 | 日本在线国产 | 亚洲综合久 | 国产三级成人 | 青青青青久久久久国产 | 成人四虎影院 | 91视频麻豆视频 | 国产高清大尺度一区二区不卡 | 亚洲天天综合网 | 国产色拍| 香蕉成人网| 久久r8这里只精品99re66 | 国产欧美日韩综合精品无毒 | 亚洲男女在线 | 国产专区第一页 | 日本国产成人精品视频 | 精品一区二区三区高清免费观看 | 日本高清视频www | 日韩高清一区二区三区不卡 | 国产91蝌蚪| 上海麻豆文化传媒网站入口 | 国产99视频精品免视看9 | 香蕉欧美 | www.4虎影院| 日韩欧美国产高清 |