亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種嵌入式實(shí)時(shí)操作系統(tǒng)中內(nèi)存分配的方法

文檔序號(hào):6401735閱讀:140來源:國(guó)知局
專利名稱:一種嵌入式實(shí)時(shí)操作系統(tǒng)中內(nèi)存分配的方法
技術(shù)領(lǐng)域
本發(fā)明涉及計(jì)算機(jī)領(lǐng)域,具體地說,涉及計(jì)算機(jī)領(lǐng)域中嵌入式實(shí)時(shí)多任務(wù)操作系統(tǒng)中的內(nèi)存分配。
背景技術(shù)
嵌入式實(shí)時(shí)操作系統(tǒng)中的內(nèi)存管理是保障應(yīng)用實(shí)時(shí)性的重要因素。在通信領(lǐng)域的應(yīng)用中,內(nèi)存申請(qǐng)往往呈現(xiàn)各種相同數(shù)據(jù)結(jié)構(gòu)(即相同大小內(nèi)存塊)的大量申請(qǐng)現(xiàn)象。為了提高實(shí)時(shí)性能,一般在實(shí)時(shí)操作系統(tǒng)提供的簡(jiǎn)單內(nèi)存分配機(jī)制上做如下再“封裝”步驟一預(yù)先向操作系統(tǒng)申請(qǐng)一塊大的內(nèi)存區(qū)。
步驟二將該內(nèi)存區(qū)分為若干子區(qū)(本文稱為內(nèi)存池),同一內(nèi)存池由若干大小相同的內(nèi)存塊組成。各內(nèi)存池中內(nèi)存塊數(shù)量一般根據(jù)該領(lǐng)域應(yīng)用的統(tǒng)計(jì)和大量經(jīng)驗(yàn)估算而得。如通信領(lǐng)域中的一種劃分方法(64,1200),(128,1000),(256,800),(512,500),(1024,20),(2048,10),(4096,5),(8192,2),(16384,1),括號(hào)中前面數(shù)字表示以字節(jié)為單位的內(nèi)存塊尺寸,后面數(shù)字表示該內(nèi)存池中內(nèi)存塊總數(shù),相鄰內(nèi)存池中內(nèi)存塊大小關(guān)系一般為2倍關(guān)系。每種內(nèi)存池內(nèi)的內(nèi)存塊可通過靜態(tài)或動(dòng)態(tài)鏈表組織成隊(duì)列,申請(qǐng)時(shí)從隊(duì)列頭取一空閑塊,歸還時(shí)歸還到隊(duì)列尾。
為了便于管理,每一種內(nèi)存池有一控制管理頭(本文稱為內(nèi)存池控制頭),所包含的信息一般有該池內(nèi)存塊的大小,內(nèi)存塊總量,空閑內(nèi)存塊數(shù),該池中空閑塊隊(duì)列首指針(隊(duì)列首指針是指隊(duì)列中第一個(gè)元素結(jié)點(diǎn)地址),該池中空閑子隊(duì)列尾指針(隊(duì)列尾指針是指隊(duì)列中最后一個(gè)元素結(jié)點(diǎn)地址),用于互斥操作該內(nèi)存池結(jié)構(gòu)的信號(hào)量(信號(hào)量是由操作系統(tǒng)提供的一種互斥訪問共享資源的機(jī)制)等等。
該現(xiàn)有技術(shù)的不足主要有兩點(diǎn)1、各內(nèi)存池中內(nèi)存塊的個(gè)數(shù)是靜態(tài)確定的,往往得根據(jù)先前積累的統(tǒng)計(jì)及經(jīng)驗(yàn)值而定,不能在應(yīng)用任務(wù)的運(yùn)行過程中動(dòng)態(tài)調(diào)整;2、實(shí)時(shí)系統(tǒng)通常得想辦法盡量保障高優(yōu)先級(jí)任務(wù)的實(shí)時(shí)性,該內(nèi)存分配方法未予考慮。

發(fā)明內(nèi)容
本發(fā)明要解決的技術(shù)問題是,克服現(xiàn)有技術(shù)的不足,提出一種新的內(nèi)存調(diào)整分配方法,它能動(dòng)態(tài)調(diào)整,保障高優(yōu)先級(jí)任務(wù)實(shí)時(shí)性。
本發(fā)明的技術(shù)方案,包括1.1預(yù)先向操作系統(tǒng)中申請(qǐng)一塊大內(nèi)存區(qū);1.2將所申請(qǐng)的大內(nèi)存區(qū)劃分為大小不同的內(nèi)存池,同一內(nèi)存池包含若干大小相同的內(nèi)存塊;初始化各內(nèi)存池控制頭;1.3當(dāng)需要內(nèi)存塊時(shí),根據(jù)需要的內(nèi)存塊大小找到對(duì)應(yīng)的內(nèi)存池,判斷該內(nèi)存池是否有空閑塊,若有,從隊(duì)頭取下一塊,修改內(nèi)存池控制頭的相關(guān)信息,分配結(jié)束;若沒有,對(duì)內(nèi)存池動(dòng)態(tài)調(diào)整;1.4在釋放內(nèi)存的時(shí)候,根據(jù)要釋放的內(nèi)存大小找到相應(yīng)的內(nèi)存池歸還到隊(duì)尾,改寫內(nèi)存池控制頭的相關(guān)信息。
所述內(nèi)存池控制頭包括的信息有該池中內(nèi)存塊大小(bs),當(dāng)前內(nèi)存塊總量(cbcnt),空閑內(nèi)存塊數(shù)(fbcnt),空閑塊隊(duì)列首指針(pfbhead),空閑塊隊(duì)列尾指針(pfbrear),最近在該池上申請(qǐng)分配失敗的次數(shù)(failcnt),申請(qǐng)分配失敗任務(wù)的最高優(yōu)先級(jí)(mprior),該內(nèi)存池最近是否未訪問標(biāo)識(shí)(lrna),最少內(nèi)存塊數(shù)閾值(min),該內(nèi)存池是否從未訪問標(biāo)識(shí)(never)。
在本發(fā)明中,對(duì)分配內(nèi)存時(shí)找到的內(nèi)存池,將其控制頭的最近未訪問標(biāo)識(shí)和從未訪問標(biāo)識(shí)置為否;對(duì)無(wú)法從該池分配的,比較申請(qǐng)任務(wù)與該池控制結(jié)構(gòu)中的原有的申請(qǐng)分配失敗任務(wù)最高優(yōu)級(jí),確保記錄下的是所有最近分配失敗進(jìn)程的最高優(yōu)先級(jí),增加最近分配失敗次數(shù)。
步驟1.4中的改寫內(nèi)存控制頭信息包括將申請(qǐng)分配失敗任務(wù)最高優(yōu)級(jí)域賦為最低優(yōu)先級(jí),最近分配失敗次數(shù)清0,進(jìn)程最近未訪問標(biāo)識(shí)置為真等等。
對(duì)內(nèi)存池進(jìn)行動(dòng)態(tài)調(diào)整,是本發(fā)明的核心內(nèi)容,是指遍歷各內(nèi)存池控制頭,查找是否有空閑塊數(shù)為0且其申請(qǐng)分配失敗任務(wù)最高優(yōu)先級(jí)域值最大(即內(nèi)存池控制頭的mprior域值最大)的內(nèi)存池,如不存在這樣的內(nèi)存池,動(dòng)態(tài)調(diào)整任務(wù)進(jìn)入睡眠狀態(tài)(在本發(fā)明中,睡眠,睡眠狀態(tài),喚醒等術(shù)語(yǔ)是專業(yè)術(shù)語(yǔ)。動(dòng)態(tài)調(diào)整任務(wù)與許多應(yīng)用任務(wù)一樣共同運(yùn)行在計(jì)算機(jī)上,調(diào)整任務(wù)有三種狀態(tài)睡眠狀態(tài)、就緒狀態(tài)及執(zhí)行狀態(tài),當(dāng)調(diào)整任務(wù)處于執(zhí)行態(tài)時(shí)才能進(jìn)行動(dòng)態(tài)調(diào)整,調(diào)整完畢,進(jìn)入睡眠狀態(tài),讓其它任務(wù)運(yùn)行。當(dāng)被喚醒時(shí)或睡眠時(shí)間到點(diǎn)時(shí),有可能繼續(xù)運(yùn)行,進(jìn)行新一輪的動(dòng)態(tài)調(diào)整)。如存在,嘗試按下面的步驟對(duì)該內(nèi)存池進(jìn)行擴(kuò)容5.1對(duì)塊尺寸大于待擴(kuò)容內(nèi)存池塊尺寸的所有內(nèi)存池依次查找,直到遇到一內(nèi)存池滿足1)內(nèi)存池從未有進(jìn)程申請(qǐng)過;2)空閑塊數(shù)大于其最少內(nèi)存塊數(shù)閾值;若存在這樣的內(nèi)存池,從該池空閑塊隊(duì)列頭摘下一塊,轉(zhuǎn)到5.4;否則,轉(zhuǎn)到5.2;5.2對(duì)塊尺寸大于待擴(kuò)容內(nèi)存池塊尺寸的所有內(nèi)存池依次查找,直到遇到一內(nèi)存池滿足1)該內(nèi)存池最近無(wú)用戶任務(wù)訪問過;2)該池中內(nèi)存空閑塊數(shù)大于其內(nèi)存塊總數(shù)的一定比例值(該比例值一般的取值范圍為3/5至1之間);3)空閑塊數(shù)大于其最少內(nèi)存塊數(shù)閾值;若存在這樣的內(nèi)存池,從該池空閑塊隊(duì)列頭摘下一塊,轉(zhuǎn)到5.4;否則,轉(zhuǎn)到5.3;5.3對(duì)塊尺寸大于待擴(kuò)容內(nèi)存池塊尺寸的所有內(nèi)存池依次查找,直到遇到一內(nèi)存池滿足1)該池中內(nèi)存空閑塊數(shù)大于其內(nèi)存塊總數(shù)的一定比例值(該比例值的取值一般大于5.2中的比例值);2)空閑塊數(shù)大于最少內(nèi)存塊數(shù)閾值;若存在這樣的內(nèi)存池,從該池空閑塊隊(duì)列頭摘下一塊;否則,轉(zhuǎn)到5.7;5.4如果該內(nèi)存塊能滿足條件能分拆成待擴(kuò)容內(nèi)存池的內(nèi)存塊數(shù)量超過某個(gè)閾值(通常選取一與最近在該池上申請(qǐng)分配失敗次數(shù)有關(guān)的值),則把該塊逐級(jí)分拆到多個(gè)內(nèi)存池即第一次等分成兩部分,一部分加入該塊來源內(nèi)存池鄰接的但塊尺寸較小的內(nèi)存池中,對(duì)之進(jìn)行擴(kuò)容,并參照步驟5.6修改擴(kuò)容內(nèi)存池相關(guān)內(nèi)存控制頭信息;對(duì)另一部分作同樣的判斷,如滿足條件,又等分成兩部分,其中一部分加入與上一次擴(kuò)容內(nèi)存池的緊鄰內(nèi)存池中,一直下去,直到得到不滿足條件的塊。
5.5把5.4中最終得到的內(nèi)存塊擴(kuò)容到待擴(kuò)容內(nèi)存池中;5.6置待擴(kuò)容內(nèi)存池最近用戶任務(wù)訪問標(biāo)識(shí)(lma)為無(wú),清最近分配失敗次數(shù)(failcnt)為0,置該池優(yōu)先級(jí)(mprior)為初始化時(shí)設(shè)定的最低值,并修改內(nèi)存池控制頭其它相關(guān)數(shù)據(jù);5.7調(diào)整任務(wù)進(jìn)入睡眠狀態(tài)。
與傳統(tǒng)的面向通信領(lǐng)域的內(nèi)存分配方法相比,該發(fā)明方法能在應(yīng)用系統(tǒng)的運(yùn)行中動(dòng)態(tài)調(diào)整各內(nèi)存池的容量,同時(shí)能盡量保障高優(yōu)先級(jí)任務(wù)的實(shí)時(shí)性,降低了各內(nèi)存池由于初始容量配置不當(dāng)引起系統(tǒng)性能的下降或系統(tǒng)崩潰的可能性,具有自適應(yīng)的特點(diǎn),大大提高了系統(tǒng)的可靠性和穩(wěn)定性。


圖1描述了內(nèi)存池初始化后的內(nèi)存映象;圖2描述了初始化后的內(nèi)存池控制頭數(shù)組;圖3是本發(fā)明的一個(gè)實(shí)施例的初始流程圖;圖4是本發(fā)明的一個(gè)實(shí)施例的內(nèi)存塊分配流程圖;
圖5是本發(fā)明的一個(gè)實(shí)施例的內(nèi)存塊釋放流程圖。
具體實(shí)施例方式
本發(fā)明的技術(shù)方案,可以分為初始化、內(nèi)存分配和內(nèi)存釋放三個(gè)階段。
第一階 段初始化第一步 預(yù)先向操作系統(tǒng)申請(qǐng)一塊大的內(nèi)存區(qū)。
第二步 從第一步所分配的大內(nèi)存區(qū)中靜態(tài)劃分出各內(nèi)存池并初始化各內(nèi)存池控制頭。為了提高檢索性能,內(nèi)存池控制頭一般由一數(shù)組集中存放,并按各內(nèi)存池控制頭所對(duì)應(yīng)的內(nèi)存塊尺寸有序存放。內(nèi)存池控制頭包括的主要管理信息有該池中內(nèi)存塊大小(bs),當(dāng)前內(nèi)存塊總量(cbcnt),空閑內(nèi)存塊數(shù)(fbcnt),空閑塊隊(duì)列首指針(pfbhead),空閑塊隊(duì)列尾指針(pfbrear),最近在該池上申請(qǐng)分配失敗的次數(shù)(failcnt),申請(qǐng)分配失敗任務(wù)的最高優(yōu)先級(jí)(mprior),該內(nèi)存池最近是否未訪問標(biāo)識(shí)(lrna),最少內(nèi)存塊數(shù)閾值(min),該內(nèi)存池是否從未訪問標(biāo)識(shí)(never)等等。
第三步 產(chǎn)生內(nèi)存池動(dòng)態(tài)調(diào)整任務(wù),并使之處于睡眠狀態(tài)。
第二階 段內(nèi)存分配第一步 當(dāng)需要內(nèi)存塊時(shí),由申請(qǐng)的內(nèi)存塊大小找到對(duì)應(yīng)的內(nèi)存池。
第二步 置該內(nèi)存池控制頭的最近未訪問標(biāo)識(shí)為否和從未訪問標(biāo)識(shí)為否;第三步 判斷該池是否還有空閑塊,若沒有轉(zhuǎn)做第五步。
第四步 從隊(duì)頭取下一塊,修改內(nèi)存池控制頭的其它相關(guān)信息域,轉(zhuǎn)做第七步。
第五步 無(wú)法從該池分配,比較申請(qǐng)任務(wù)與該池控制結(jié)構(gòu)中的原有的申請(qǐng)分配失敗任務(wù)最高優(yōu)級(jí),確保記錄下的是所有最近分配失敗進(jìn)程的最高優(yōu)先級(jí),增加最近分配失敗次數(shù)。
第六步 喚醒內(nèi)存池動(dòng)態(tài)調(diào)整任務(wù)。
第七步 內(nèi)存分配結(jié)束。
上述第六步,動(dòng)態(tài)調(diào)整任務(wù)的功能詳細(xì)描述如下遍歷各內(nèi)存池控制頭,查找是否有空閑塊數(shù)為0且其申請(qǐng)分配失敗任務(wù)最高優(yōu)先級(jí)域值最大(即內(nèi)存池控制頭的mprior域值最大)的內(nèi)存池,如不存在這樣的內(nèi)存池,動(dòng)態(tài)調(diào)整任務(wù)進(jìn)入睡眠狀態(tài);如存在,嘗試按下面的步驟對(duì)該內(nèi)存池進(jìn)行擴(kuò)容5.1對(duì)塊尺寸大于待擴(kuò)容內(nèi)存池塊尺寸的所有內(nèi)存池依次查找,直到遇到一內(nèi)存池滿足1)內(nèi)存池從未有進(jìn)程申請(qǐng)過;2)空閑塊數(shù)大于其最少內(nèi)存塊數(shù)閾值。若存在這樣的內(nèi)存池,從該池空閑塊隊(duì)列頭摘下一塊,轉(zhuǎn)到5.2。否則,轉(zhuǎn)到5.7。
5.2對(duì)塊尺寸大于待擴(kuò)容內(nèi)存池塊尺寸的所有內(nèi)存池依次查找,直到遇到一內(nèi)存池滿足1)該內(nèi)存池最近無(wú)用戶任務(wù)訪問過;2)該池中內(nèi)存空閑塊數(shù)大于其內(nèi)存塊總數(shù)的某個(gè)比例值(該比例值一般的取值范圍為3/5至1之間);3)空閑塊數(shù)大于其最少內(nèi)存塊數(shù)閾值。若存在這樣的內(nèi)存池,從該池空閑塊隊(duì)列頭摘下一塊,轉(zhuǎn)到5.3;否則,轉(zhuǎn)到5.7。
5.3對(duì)塊尺寸大于待擴(kuò)容內(nèi)存池塊尺寸的所有內(nèi)存池依次查找,直到遇到一內(nèi)存池滿足1)該池中內(nèi)存空閑塊數(shù)大于其內(nèi)存塊總數(shù)的某個(gè)比例值(該比例值的取值一般大于第二步中的比例值);2)空閑塊數(shù)大于最少內(nèi)存塊數(shù)閾值。若存在這樣的內(nèi)存池,從該池空閑塊隊(duì)列頭摘下一塊,轉(zhuǎn)到5.4;否則,轉(zhuǎn)到5.7。
5.4如果該內(nèi)存塊能滿足條件能分拆成待擴(kuò)容內(nèi)存池的內(nèi)存塊數(shù)量超過某個(gè)閾值(通常選取一與最近在該池上申請(qǐng)分配失敗次數(shù)有關(guān)的值),則把該塊逐級(jí)分拆到多個(gè)內(nèi)存池即第一次等分成兩部分,一部分加入該塊來源內(nèi)存池鄰接的但塊尺寸較小的內(nèi)存池中,對(duì)之進(jìn)行擴(kuò)容,并參照第六步修改擴(kuò)容內(nèi)存池相關(guān)內(nèi)存控制頭信息;對(duì)另一部分作同樣的判斷,如滿足條件,又等分成兩部分,其中一部分加入與上一次擴(kuò)容內(nèi)存池的緊鄰內(nèi)存池中,一直下去,直到得到不滿足條件的塊。[之所以采取逐級(jí)分拆的方式是因?yàn)槿羟懊嫒街姓业降膬?nèi)存塊遠(yuǎn)遠(yuǎn)大于待擴(kuò)容內(nèi)寸池中的內(nèi)存塊的話,若全部分配給它會(huì)為以后的調(diào)整帶來不便,造成整個(gè)內(nèi)存向低端內(nèi)存池(內(nèi)存塊尺寸較小的內(nèi)存池)聚集現(xiàn)象特別嚴(yán)重,因?yàn)榭紤]到時(shí)間性能的問題,本發(fā)明不調(diào)整低端內(nèi)存池中內(nèi)存到高端內(nèi)存池中]。
5.5把5.4中最終得到的內(nèi)存塊擴(kuò)容到待擴(kuò)容內(nèi)存池中。
5.6置待擴(kuò)容內(nèi)存池最近用戶任務(wù)訪問標(biāo)識(shí)(lrna)為無(wú),清最近分配失敗次數(shù)(failcnt)為0,置該池優(yōu)先級(jí)(mprior)為初始化時(shí)設(shè)定的最低值,并修改內(nèi)存池控制頭其它相關(guān)數(shù)據(jù)。
5.7動(dòng)態(tài)調(diào)整任務(wù)進(jìn)入睡眠狀態(tài)。
第三階 段內(nèi)存釋放第一步 根據(jù)要釋放的內(nèi)寸尺寸找到對(duì)應(yīng)的內(nèi)存池。
第二步 歸還到隊(duì)尾,把內(nèi)存控制頭中改寫相應(yīng)的內(nèi)存控制頭中的申請(qǐng)分配失敗任務(wù)最高優(yōu)級(jí)域賦為最低優(yōu)先級(jí),最近分配失敗次數(shù)清0,進(jìn)程最近未訪問標(biāo)識(shí)置為真。
本發(fā)明對(duì)內(nèi)存池動(dòng)態(tài)調(diào)整時(shí),優(yōu)先級(jí)的設(shè)置主要從內(nèi)存分配對(duì)系統(tǒng)的可靠性與實(shí)時(shí)性的影響方面來考慮。如果應(yīng)用任務(wù)因分配不到內(nèi)存往往會(huì)導(dǎo)致整個(gè)系統(tǒng)的崩潰的話,可把內(nèi)存池動(dòng)態(tài)調(diào)整任務(wù)優(yōu)先級(jí)設(shè)置為最高,讓其周期性地進(jìn)行動(dòng)態(tài)調(diào)整,使得當(dāng)有某內(nèi)存池中的內(nèi)存塊分配完時(shí)能得到及時(shí)補(bǔ)充擴(kuò)容,從而在一定程度上提前預(yù)防內(nèi)存分配失敗事件的發(fā)生。如果內(nèi)存分配失敗只是導(dǎo)致任務(wù)阻塞,則可給內(nèi)存池動(dòng)態(tài)調(diào)整任務(wù)設(shè)置一中間級(jí)別的優(yōu)先級(jí),而且只在分配失敗時(shí)進(jìn)行調(diào)整,以免其頻繁運(yùn)行導(dǎo)致系統(tǒng)性能下降。
下面就以(64,1200),(128,1000),(256,800),(512,500),(1024,20),(2048,10),(4096,5),(8192,2),(16384,1)傳統(tǒng)的統(tǒng)計(jì)預(yù)估內(nèi)存池結(jié)構(gòu)為基礎(chǔ),對(duì)本發(fā)明進(jìn)行更具體詳細(xì)的描述如圖3所示的步驟,首先向操作系統(tǒng)申請(qǐng)的一塊大的內(nèi)存區(qū)(圖1中陰影部分所示)并設(shè)置了64,128,256,512,1024,2048,4096,8192,16384九種內(nèi)存塊大小的內(nèi)存池。所有內(nèi)存池頭組成九個(gè)元素的數(shù)組,整個(gè)數(shù)組中的元素按內(nèi)存塊大小有序存放,該內(nèi)存控制頭數(shù)組的元素的初始化后的內(nèi)容如圖2中的表格內(nèi)容所示。其中表中第一行即(64,1200)對(duì)應(yīng)的內(nèi)存池控制頭,由于不會(huì)被挪用,故該內(nèi)存池頭的當(dāng)前內(nèi)存塊數(shù)(cbcnt)與最少內(nèi)存塊數(shù)閾值(min)都設(shè)定為初始統(tǒng)計(jì)值1200;表中最后一行即(16384,1)對(duì)應(yīng)的內(nèi)存池,由于應(yīng)用系統(tǒng)很少去申請(qǐng),同時(shí)考慮到便于內(nèi)存動(dòng)態(tài)調(diào)整,該池初始化時(shí)給它多分了一內(nèi)存塊,起到后備內(nèi)存的作用。其余的內(nèi)存池最少內(nèi)存塊數(shù)閾值(min)初始化值分別簡(jiǎn)單地設(shè)為其初始當(dāng)前內(nèi)存塊數(shù)(cbcnt)的7/8、6/7、5/6、,4/5、3/4、2/3、1/2,當(dāng)然該值也可根據(jù)統(tǒng)計(jì)經(jīng)驗(yàn)而設(shè)定,分配失敗任務(wù)的最高優(yōu)先級(jí)域(mprior)設(shè)定為1,是基于假定1表示系統(tǒng)的最低優(yōu)先級(jí),當(dāng)然該值最好根據(jù)具體的應(yīng)用系統(tǒng)而設(shè)定。
當(dāng)有任務(wù)申請(qǐng)內(nèi)存時(shí),如圖4所示由任務(wù)的申請(qǐng)內(nèi)存塊大小找到對(duì)應(yīng)的內(nèi)存池;置該內(nèi)存池控制頭的最近未訪問標(biāo)識(shí)為否和從未訪問標(biāo)識(shí)為否,表示已有任務(wù)對(duì)該內(nèi)存池進(jìn)行訪問。然后判斷該池是否還有空閑塊,若有從該池中取下一塊,這次分配成功;如過沒有,該任務(wù)分配內(nèi)存失敗,修改內(nèi)存控制頭相關(guān)數(shù)據(jù),對(duì)內(nèi)存池動(dòng)態(tài)調(diào)整。
圖5描述了有任務(wù)釋放內(nèi)存塊的過程。首先根據(jù)要釋放的內(nèi)寸塊大小找到對(duì)應(yīng)的內(nèi)存池,然后把該塊掛到該內(nèi)存池的空閑隊(duì)列中,并修改內(nèi)存控制頭中相應(yīng)的控制信息。之所以把內(nèi)存控制頭中的申請(qǐng)分配失敗任務(wù)最高優(yōu)級(jí)域賦為低優(yōu)先級(jí)1、最近分配失敗次數(shù)清0,進(jìn)程最近未訪問標(biāo)識(shí)置為真,主要是考慮到現(xiàn)在該內(nèi)存池已經(jīng)有可供分配的內(nèi)存塊了。
動(dòng)態(tài)調(diào)整的具體實(shí)現(xiàn)可描述如下在圖1所示的表中,找出空閑塊數(shù)(fbcnt)為0且申請(qǐng)分配失敗任務(wù)最高優(yōu)先級(jí)值(mprior)最大的表項(xiàng),如沒有這樣的表項(xiàng)存在,表示不需調(diào)整,調(diào)整任務(wù)進(jìn)入睡眠狀態(tài);如存在,不妨假定第i個(gè)表項(xiàng)滿足條件,需對(duì)其代表的內(nèi)存池進(jìn)行擴(kuò)容,其擴(kuò)容方法的步驟描述為第一步 從表項(xiàng)i+1起到表尾依次查找,直到遇到一表項(xiàng)滿足1)never為1(內(nèi)存池從未有進(jìn)程申請(qǐng)過);2)fbcnt大于min(空閑塊數(shù)大于其最少內(nèi)存塊數(shù)閾值)。若存在這樣的表項(xiàng),從該表項(xiàng)對(duì)應(yīng)的內(nèi)存池空閑塊隊(duì)列頭摘下一塊,轉(zhuǎn)第四步。
第二步 從表項(xiàng)i+1起到表尾依次查找,直到遇到一表項(xiàng)滿足1)lrna為1(該內(nèi)存池最近無(wú)用戶任務(wù)訪問過);2)fbcnt大于cbcnt的3/5(該池中內(nèi)存空閑塊數(shù)大于其當(dāng)前內(nèi)存塊總數(shù)的3/5;3)fbcnt大于min(空閑塊數(shù)大于其最少內(nèi)存塊數(shù)閾值)。若存在這樣的表項(xiàng),從該表項(xiàng)對(duì)應(yīng)的內(nèi)存池空閑塊隊(duì)列頭摘下一塊,轉(zhuǎn)第四步。
第三步 從表項(xiàng)i+1起到表尾依次查找,直到遇到一表項(xiàng)滿足1)fbcnt大于cbcnt的4/5(該池中內(nèi)存空閑塊數(shù)大于其當(dāng)前內(nèi)存塊總數(shù)的4/5;2)fbcnt大于min(空閑塊數(shù)大于其最少內(nèi)存塊數(shù)閾值)。若存在這樣的表項(xiàng),從該表項(xiàng)對(duì)應(yīng)的內(nèi)存池空閑塊隊(duì)列頭摘下一塊,轉(zhuǎn)第四步;若不存在,表示調(diào)整失敗,轉(zhuǎn)第七步。
第四步 如果從上面三步中得到的內(nèi)存塊能滿足條件能分拆成待擴(kuò)容內(nèi)存池的內(nèi)存塊數(shù)量超過表項(xiàng)i中的failcnt(申請(qǐng)分配失敗次數(shù))+2,則把該塊逐級(jí)分拆到多個(gè)內(nèi)存池即第一次等分成兩部分,一部分加入該塊來源內(nèi)存池(假定為表項(xiàng)j,由上面的查找步驟可知j>i)鄰接的但塊尺寸較小的內(nèi)存池中(即j-1表項(xiàng)對(duì)應(yīng)的內(nèi)存池中),對(duì)之進(jìn)行擴(kuò)容,并參照第六步修改內(nèi)存控制頭相關(guān)信息域;對(duì)另一部分作同樣的判斷,如滿足條件,又等分成兩部分,其中一部分加入與上一次擴(kuò)容內(nèi)存池的緊鄰內(nèi)存池中(即j-2表項(xiàng)對(duì)應(yīng)的內(nèi)存池),一直下去,直到得到不滿足條件的塊。
第五步 把第四步中最終得到的內(nèi)存塊擴(kuò)容到表項(xiàng)i所代表的待擴(kuò)容內(nèi)存池中。
第六步 置待擴(kuò)容內(nèi)存池最近用戶任務(wù)訪問標(biāo)識(shí)(lrna)為0,清最近分配失敗次數(shù)(failcnt)為0,置該池申請(qǐng)失敗最高優(yōu)先域值(mprior)為1,并修改內(nèi)存池控制頭其它相關(guān)控制信息。
第七步 調(diào)整任務(wù)進(jìn)入睡眠狀態(tài)。
權(quán)利要求
1.一種嵌入式實(shí)時(shí)操作系統(tǒng)中內(nèi)存分配的方法,包括1.1預(yù)先向操作系統(tǒng)中申請(qǐng)一塊大內(nèi)存區(qū);1.2將所申請(qǐng)的大內(nèi)存區(qū)劃分為大小不同的內(nèi)存池,同一內(nèi)存池包含若干大小相同的內(nèi)存塊;初始化各內(nèi)存池控制頭;1.3當(dāng)需要內(nèi)存塊時(shí),根據(jù)需要的內(nèi)存塊大小找到對(duì)應(yīng)的內(nèi)存池,判斷該內(nèi)存池是否有空閑塊,若有,從隊(duì)頭取下一塊,修改內(nèi)存池控制頭的相關(guān)信息,分配結(jié)束;若沒有,對(duì)內(nèi)存池動(dòng)態(tài)調(diào)整;1.4在釋放內(nèi)存的時(shí)候,根據(jù)要釋放的內(nèi)存大小找到相應(yīng)的內(nèi)存池歸還到隊(duì)尾,改寫內(nèi)存控制頭的相關(guān)信息。
2.權(quán)利要求1所述的嵌入式實(shí)時(shí)操作系統(tǒng)中內(nèi)存分配的方法,其特征在于,所述內(nèi)存塊控制頭包括的信息有該池中內(nèi)存塊大小,當(dāng)前內(nèi)存塊總量,空閑內(nèi)存塊數(shù),空閑塊隊(duì)列首指針,空閑塊隊(duì)列尾指針,最近在該池上申請(qǐng)分配失敗的次數(shù),申請(qǐng)分配失敗任務(wù)的最高優(yōu)先級(jí),該內(nèi)存池最近是否無(wú)用戶任務(wù)訪問標(biāo)識(shí),最少內(nèi)存塊數(shù)閾值,該內(nèi)存池是否從未有用戶任務(wù)訪問標(biāo)識(shí)。
3.權(quán)利要求2所述的嵌入式實(shí)時(shí)操作系統(tǒng)中內(nèi)存分配的方法,其特征在于,對(duì)分配內(nèi)存時(shí)找到的內(nèi)存池,將其控制頭的最近訪問標(biāo)識(shí)和從未訪問標(biāo)識(shí)置為否;對(duì)無(wú)法從該池分配的,比較申請(qǐng)任務(wù)與該池控制結(jié)構(gòu)中的原有的申請(qǐng)分配失敗任務(wù)最高優(yōu)級(jí),確保記錄下的是所有最近分配失敗進(jìn)程的最高優(yōu)先級(jí),增加最近分配失敗次數(shù)。
4.權(quán)利要求2所述的嵌入式實(shí)時(shí)操作系統(tǒng)中內(nèi)存分配的方法,其特征在于,所述步驟1.4中的改寫內(nèi)存控制頭信息,是指將申請(qǐng)分配失敗任務(wù)最高優(yōu)級(jí)域賦為最低優(yōu)先級(jí),最近分配失敗次數(shù)清0,進(jìn)程最近未訪問標(biāo)識(shí)置為真。
5.權(quán)利要求1至4任一權(quán)利要求所述的嵌入式實(shí)時(shí)操作系統(tǒng)中內(nèi)存分配的方法,其特征在于,所述對(duì)內(nèi)存池進(jìn)行動(dòng)態(tài)調(diào)整,是指遍歷各內(nèi)存池控制頭,查找是否有空閑塊數(shù)為0且其申請(qǐng)分配失敗任務(wù)最高優(yōu)先級(jí)域值最大的內(nèi)存池,如不存在這樣的內(nèi)存池,動(dòng)態(tài)調(diào)整任務(wù)進(jìn)入睡眠狀態(tài);如存在,嘗試按下面的步驟對(duì)該內(nèi)存池進(jìn)行擴(kuò)容5.1對(duì)塊尺寸大于待擴(kuò)容內(nèi)存池塊尺寸的所有內(nèi)存池依次查找,直到遇到一內(nèi)存池滿足1)內(nèi)存池從未有進(jìn)程申請(qǐng)過;2)空閑塊數(shù)大于其最少內(nèi)存塊數(shù)閾值;若存在這樣的內(nèi)存池,從該池空閑塊隊(duì)列頭摘下一塊,轉(zhuǎn)到5.4;否則,轉(zhuǎn)到5.2;5.2對(duì)塊尺寸大于待擴(kuò)容內(nèi)存池塊尺寸的所有內(nèi)存池依次查找,直到遇到一內(nèi)存池滿足1)該內(nèi)存池最近無(wú)用戶任務(wù)訪問過;2)該池中內(nèi)存空閑塊數(shù)大于其內(nèi)存塊總數(shù)的一定比例值;3)空閑塊數(shù)大于其最少內(nèi)存塊數(shù)閾值;若存在這樣的內(nèi)存池,從該池空閑塊隊(duì)列頭摘下一塊,轉(zhuǎn)到5.4;否則,轉(zhuǎn)到5.3;5.3對(duì)塊尺寸大于待擴(kuò)容內(nèi)存池塊尺寸的所有內(nèi)存池依次查找,直到遇到一內(nèi)存池滿足1)該池中內(nèi)存空閑塊數(shù)大于其內(nèi)存塊總數(shù)的一定比例值;2)空閑塊數(shù)大于最少內(nèi)存塊數(shù)閾值;若存在這樣的內(nèi)存池,從該池空閑塊隊(duì)列頭摘下一塊;否則,轉(zhuǎn)到5.7;5.4如果該內(nèi)存塊能滿足條件能分拆成待擴(kuò)容內(nèi)存池的內(nèi)存塊數(shù)量超過某個(gè)閾值,則把該塊逐級(jí)分拆到多個(gè)內(nèi)存池即第一次等分成兩部分,一部分加入該塊來源內(nèi)存池鄰接的但塊尺寸較小的內(nèi)存池中,對(duì)之進(jìn)行擴(kuò)容,修改擴(kuò)容內(nèi)存池相關(guān)內(nèi)存控制頭信息;對(duì)另一部分作同樣的判斷,如滿足條件,又等分成兩部分,其中一部分加入與上一次擴(kuò)容內(nèi)存池的緊鄰內(nèi)存池中,一直下去,直到得到不滿足條件的塊;5.5把5.4中最終得到的內(nèi)存塊擴(kuò)容到待擴(kuò)容內(nèi)存池中;5.6置待擴(kuò)容內(nèi)存池最近用戶任務(wù)訪問標(biāo)識(shí)為無(wú),清最近分配失敗次數(shù)為0,置該池優(yōu)先級(jí)為初始化時(shí)設(shè)定的最低值,并修改內(nèi)存池控制頭其它相關(guān)數(shù)據(jù);5.7調(diào)整任務(wù)進(jìn)入睡眠狀態(tài)。
6.權(quán)利要求5所述的嵌入式實(shí)時(shí)操作系統(tǒng)中內(nèi)存分配的方法,其特征在于,步驟5.2中比例值一般的取值范圍為3/5至1之間,步驟5.3中的比例值大于該值。
全文摘要
一種嵌入式實(shí)時(shí)操作系統(tǒng)中內(nèi)存分配的方法,包括預(yù)先向操作系統(tǒng)中申請(qǐng)一塊大內(nèi)存區(qū);將大內(nèi)存區(qū)劃分為大小不同的內(nèi)存池,同一內(nèi)存池包含若干大小相同的內(nèi)存塊;初始化各內(nèi)存池控制頭;當(dāng)需要內(nèi)存塊時(shí),根據(jù)需要的內(nèi)存塊大小找到對(duì)應(yīng)的內(nèi)存池,判斷該內(nèi)存池是否有空閑塊,若有,從隊(duì)頭取下一塊,修改內(nèi)存池控制頭的相關(guān)信息,分配結(jié)束;若沒有,對(duì)內(nèi)存池動(dòng)態(tài)調(diào)整;在釋放內(nèi)存的時(shí)候,根據(jù)要釋放的內(nèi)存大小找到相應(yīng)的內(nèi)存池歸還到隊(duì)尾,改寫內(nèi)存池控制頭的相關(guān)信息。本發(fā)明能動(dòng)態(tài)調(diào)整各內(nèi)存池的容量,同時(shí)保障高優(yōu)先級(jí)任務(wù)的實(shí)時(shí)性,提高了系統(tǒng)的可靠性和穩(wěn)定性。
文檔編號(hào)G06F9/46GK1722106SQ200410041459
公開日2006年1月18日 申請(qǐng)日期2004年7月13日 優(yōu)先權(quán)日2004年7月13日
發(fā)明者何先波, 張芝萍, 徐立鋒 申請(qǐng)人:中興通訊股份有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1