欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

內(nèi)存管理方法

文檔序號:6483973閱讀:172來源:國知局
專利名稱:內(nèi)存管理方法
技術(shù)領域
本發(fā)明涉及一種內(nèi)存管理方法,尤其是一種可用于嵌入式系統(tǒng)使用的內(nèi)存 管理方法。
背景技術(shù)
隨著計算機微處理器的技術(shù)發(fā)展以及計算機網(wǎng)絡技術(shù)的發(fā)展,使得嵌入式
系統(tǒng)的功能越來越強大同時應用范圍越來越廣泛。而基于網(wǎng)絡的^L頻監(jiān)控系統(tǒng) 為了提高其自身的系統(tǒng)性能,便使用了嵌入式系統(tǒng)于其中。
進一步的,嵌入式應用系統(tǒng)為了更好的運行其設定功能,其對內(nèi)存管理 就有以下要求。
實時性。從實時性的角度出發(fā),要求內(nèi)存分配過程要盡可能地快。因此, 在嵌入式系統(tǒng)中,不會釆用通用操作系統(tǒng)的一些復雜而完善的內(nèi)存分配策略, 一般沒有段頁式的虛存管理機制。而是采用簡單、快速的內(nèi)存分配方案,其 分配方案也因程序?qū)崟r性的要求而異。
可靠性。嵌入式系統(tǒng)應用的環(huán)境千變?nèi)f化,在有些特定情況下,對系統(tǒng) 的可靠性要求極高,內(nèi)存分配的請求必須得到滿足,如果分配失敗則可能會 帶來災難性的后果。
高效性。內(nèi)存分配要盡可能地減少浪費,不能為了保證滿足所有的內(nèi)存 分配請求而將內(nèi)存配置的很大。這是因為, 一方面,嵌入式系統(tǒng)對成本的要 求使得內(nèi)存只是它的一種很有限的資源;另一方面,即使不考慮成本的因素, 系統(tǒng)硬件環(huán)境有限的空間和有限的板面積決定了可配置的內(nèi)存容量是很有限 的。因此,業(yè)界巫待提出一種新的用于嵌入式系統(tǒng)的內(nèi)存管理方法,《吏得其可 有效的實現(xiàn)上迷要求。

發(fā)明內(nèi)容
有鑒于此,本發(fā)明的一個目的在于提供一種內(nèi)存管理方法,其可被用于 嵌入式系統(tǒng)使用。該方法可以在嵌入式系統(tǒng)的程序啟動時分配并初始化程序 要用到的內(nèi)存空間,通過相應的算法可以高效地完成內(nèi)存的分配、回收工作。
為了達到上述目的,本發(fā)明的一個實施方式提供了一種內(nèi)存管理方法, 其中涉及的內(nèi)存區(qū)域被劃分為若干個內(nèi)存分區(qū),每個內(nèi)存分區(qū)被劃分為若千 個單元內(nèi)存塊,每個內(nèi)存分區(qū)內(nèi)的單元內(nèi)存塊的容量相同,而各內(nèi)存分區(qū)中 的單元內(nèi)存塊的容量不同。該方法包括有以下步驟。接收包括有內(nèi)存需求容 量的內(nèi)存分配請求。找到其內(nèi)的單元內(nèi)存塊的容量大于該內(nèi)存需求容量且最 小的內(nèi)存分區(qū)。在該找到的內(nèi)存分區(qū)內(nèi)找到使用狀態(tài)為未使用的單元內(nèi)存塊, 并將該找到的未使用的單元內(nèi)存塊分配給此次內(nèi)存分配請求,將被分配出的 單元內(nèi)存塊的使用狀態(tài)修改為已使用。接收用于釋放指定單元內(nèi)存塊的內(nèi)存 釋放請求。找到該需要釋放指定單元內(nèi)存塊所在的內(nèi)存分區(qū)。在該找到的內(nèi) 存分區(qū)內(nèi)找到該需要釋放的指定單元內(nèi)存塊,釋放該指定單元內(nèi)存塊,將被 釋放的單元內(nèi)存塊的使用狀態(tài)修改為未使用。
進一步的,在不同實施方式中,各內(nèi)存分區(qū)都有各自的內(nèi)存管理參數(shù), 其包括可用內(nèi)存塊數(shù)量索引、未使用內(nèi)存塊索引、釋放內(nèi)存塊索引以及釋放 內(nèi)存塊存儲棧。其中可用內(nèi)存塊數(shù)量索引用于表明本內(nèi)存分區(qū)內(nèi)使用狀態(tài)為 未使用的可用于分配的單元內(nèi)存塊數(shù)量。未使用內(nèi)存塊索引則是用于存儲本 內(nèi)存分區(qū)內(nèi)未使用的單元內(nèi)存塊編號。釋放內(nèi)存塊索引以及釋放內(nèi)存塊存儲 棧則都是用于存儲本內(nèi)存分區(qū)內(nèi)釋放的單元內(nèi)存塊編號,其中釋放內(nèi)存塊存 儲棧則是在釋放內(nèi)存塊索引存儲了 一個釋放單元內(nèi)存塊之后,再進行其它的 釋放單元內(nèi)存塊編號的存儲。
7進一步的,在不同實施方式中,在步驟B后,根據(jù)找到的內(nèi)存分區(qū)的可 用內(nèi)存塊數(shù)量索引判斷找到的內(nèi)存分區(qū)內(nèi)是否還有可用單元內(nèi)存塊,如果有, 則進入步驟C;如果否,則找到相鄰的下一個內(nèi)存分區(qū),并再次根據(jù)找到的 內(nèi)存分區(qū)的可用內(nèi)存塊數(shù)量索引判斷該內(nèi)存分區(qū)內(nèi)是否有可用單元內(nèi)存塊, 如果有,則進入步驟C;否則繼續(xù)重復上述步驟直到找到具有可用單元內(nèi)存 塊的內(nèi)存分區(qū)并進入步驟C;
步驟C包括查看找到的內(nèi)存分區(qū)的釋放內(nèi)存塊索引是否為空,如果不 為空,則將其內(nèi)存儲的釋放單元內(nèi)存塊編號對應的單元內(nèi)存塊分配給該內(nèi)存 分配請求,將分配出的單元內(nèi)存塊的狀態(tài)修改為使用,查看釋放內(nèi)存塊存儲 棧內(nèi)是否存儲有釋放單元內(nèi)存塊編號,如果有,則將釋放內(nèi)存塊存儲棧中存
儲的一個釋放單元內(nèi)存塊的編號賦值給釋放內(nèi)存塊索引;如果沒有,則將釋
放內(nèi)存塊索引的值修改為空值,并將分區(qū)內(nèi)可用內(nèi)存塊數(shù)量索引的數(shù)值減1。 如果釋放內(nèi)存塊索引為空值,則將未使用內(nèi)存塊索引內(nèi)存儲的從未使用的單 元內(nèi)存塊的編號所對應的單元內(nèi)存塊分配給內(nèi)存分配請求,然后將分區(qū)內(nèi)下 一個從未使用的單元內(nèi)存塊編號賦值給未使用內(nèi)存塊索引,將被分配出的單 元內(nèi)存塊的使用狀態(tài)修改為已使用。最后將可用內(nèi)存塊數(shù)量索引的數(shù)值減1。
步驟F包括在找到的內(nèi)存分區(qū)內(nèi)找到需要釋放指定單元內(nèi)存塊,釋放 該指定單元內(nèi)存塊,將被釋放的單元內(nèi)存塊的使用狀態(tài)修改為未使用,在釋
放內(nèi)存塊索引為空值時,將被釋放的單元內(nèi)存塊的編號賦值給釋放內(nèi)存塊索 引。在釋放內(nèi)存塊索引不為空值時,將被釋放的單元內(nèi)存塊的編號存入釋放 內(nèi)存塊存儲棧中。最后將內(nèi)存分區(qū)內(nèi)可用內(nèi)存塊數(shù)量索引數(shù)值加1。
進一步的,在不同實施方式中,提供的內(nèi)存區(qū)域的大小是根據(jù)預定運行 的若干系統(tǒng)程序所需內(nèi)存的總需求大小計算得出,其為根據(jù)各程序的內(nèi)存需 求的數(shù)值,將其分在至少兩個數(shù)值范圍內(nèi),以各數(shù)值范圍的最大值為單元值 以及落于其內(nèi)的數(shù)值的數(shù)量兩者的乘積,計算出系統(tǒng)程序的內(nèi)存總需求的最 大值,然后根據(jù)這個最大值提供相應數(shù)值的內(nèi)存區(qū)域。進一步的,在不同實施方式中,提供的內(nèi)存區(qū)域的各分區(qū)的排列方式為 按各內(nèi)存分區(qū)的單元內(nèi)存塊的大小進行順序排列。
進一步的,在不同實施方式中,步驟B包括,根據(jù)二分法進行內(nèi)存請求 數(shù)值與提供的內(nèi)存區(qū)域包括的單元內(nèi)存塊數(shù)值間的比較,其為在初始時,選 擇最小的單元內(nèi)存塊的值為起始值,最大單元內(nèi)存塊的值為終點值,然后選 擇處于兩者之間的初始中間值與其進行比較;當其大于初始中間值時,則選 擇初始中間值為起始值,原終點值為終點值,然后與這兩者之間的中間值進 行比較;若其小于初始中間值時,則選擇初始中間值為終點值,原起始值為 起始值,然后與這兩者間的中間值進行比較,依次類推,直到最終起始值和 最終終點值之間只有一個數(shù)值為止,其為最終中間值,這時,若請求數(shù)值大 于最終中間值,則選擇數(shù)值為最終終點值的單元內(nèi)存塊所在的內(nèi)存分區(qū);若 其小于,則選擇數(shù)值為最終中間值的單元內(nèi)存塊所在的內(nèi)存分區(qū)。
進一步的,在不同實施方式中,其還包括記錄各內(nèi)存分區(qū)及其下各內(nèi)存 單元塊的地址信息。步驟E包括,檢查釋放單元內(nèi)存塊的地址信息,將其起 始地址信息與各內(nèi)存分區(qū)的起始地址進行比較,當兩者比較一致時,則找到 其所屬內(nèi)存分區(qū)。
進一步的,在不同實施方式中,其還包括有以下步驟,在各內(nèi)存分區(qū)內(nèi) 定義未使用內(nèi)存塊索引,其用于存儲分區(qū)內(nèi)第一個從未使用過的單元內(nèi)存塊 的編號。當對應于其內(nèi)存儲的單元內(nèi)存塊編號的單元內(nèi)存塊被分配出去之后, 其會存儲分區(qū)內(nèi)下一個未使用單元內(nèi)存塊的編號。
進一步的,在不同實施方式中,其還包括有以下步驟,在各內(nèi)存分區(qū)內(nèi) 定義釋放內(nèi)存塊索引,用于存儲屬于該內(nèi)存分區(qū)的,因系統(tǒng)程序終止而釋放 出的單元內(nèi)存塊的編號。當需要分配單元內(nèi)存塊時,會先檢查釋放內(nèi)存塊索 引內(nèi)是否存儲有釋放的的單元內(nèi)存塊編號,若有,則將其對應的單元內(nèi)存塊 分配給內(nèi)存需求,然后將釋放內(nèi)存塊索引的附值修改為空值。進一步的,在不同實施方式中,其還包括有以下步驟,在各內(nèi)存分區(qū)內(nèi) 定義分區(qū)內(nèi)可用內(nèi)存塊數(shù)量索引,用于記錄該內(nèi)存分區(qū)內(nèi)的全部可用于分配 出的單元內(nèi)存塊的數(shù)量,并在該分區(qū)內(nèi)有內(nèi)存塊被分配出去之后,將該數(shù)值
減1;在進行內(nèi)存分區(qū)內(nèi)單元存塊分配時,當發(fā)現(xiàn)該分區(qū)內(nèi)的用于記錄該分 區(qū)可用內(nèi)存塊數(shù)量的索引的數(shù)值為空值時,則選擇其下一個內(nèi)存分區(qū)進行內(nèi) 存塊的分配。
相對于現(xiàn)有技術(shù),本發(fā)明涉及的可用于嵌入式系統(tǒng)的內(nèi)存管理方法,可 有效的實現(xiàn)系統(tǒng)對于內(nèi)存實時性、可靠性及高效性方面的要求,進而提高了 系統(tǒng)的運行效率。同時采用針對程序特點的內(nèi)存布局,通過筒單的算法高效 的對內(nèi)存進行分配和回收,并可以檢測是否發(fā)生內(nèi)存錯誤。
附困說明


圖1是本發(fā)明的一個實施方式涉及的內(nèi)存管理方法的流程圖2是使用本發(fā)明涉及的內(nèi)存管理方法進行內(nèi)存分區(qū)劃分結(jié)構(gòu)的示意圖。
具體實施例方式
在一個實施方式中,請參閱圖1所示,本發(fā)明涉及的內(nèi)存管理方法100, 其包括有以下步驟,初始化內(nèi)存過程102 (以下簡稱步驟102)、判斷是分配 內(nèi)存塊請求還是釋放內(nèi)存塊請求104(以下簡稱步驟104),若是分配單元內(nèi) 存塊請求,則接下來包括以下步驟定位內(nèi)存分區(qū)106(以下筒稱步驟106)、 在定位的內(nèi)存分區(qū)內(nèi)定位內(nèi)存分塊108(以下筒稱步驟108)、返回定位的內(nèi) 存分塊的地址,并記錄相應參數(shù)IIO(以下簡稱步驟110);若是釋放內(nèi)存塊 請求,則接下來包括定位到內(nèi)存分區(qū)的相應單元內(nèi)存塊112(以下筒稱步驟 112)以及釋放相應的內(nèi)存分塊,并記錄相關(guān)信息114 (以下筒稱步驟114)。
其中在步驟102中,其包括有一個提供內(nèi)存區(qū)域并將內(nèi)存區(qū)域劃分成若
10干個內(nèi)存分區(qū)以及將每個內(nèi)存分區(qū)劃分為若干單元內(nèi)存塊的過程,以及記錄 提供的內(nèi)存區(qū)域的地址并為每個內(nèi)存分區(qū)設定內(nèi)存管理參數(shù)的過程。
提供的具有一定容量的內(nèi)存區(qū)域的數(shù)值可以是根據(jù)一定的計算方式得出 的。例如,在一個實施方式中,其可以是通過使用其的系統(tǒng),在分析系統(tǒng)程 序的使用需求后計算得出。具體可以是,首先采用操作系統(tǒng)自身的內(nèi)存分配 及釋放接口或是其它內(nèi)存管理接口運行程序,記錄各個程序所需的動態(tài)內(nèi)存 的值。然后根據(jù)各程序所需動態(tài)內(nèi)存的值得到這些程序在不同數(shù)值范閨內(nèi)的 數(shù)值分布。然后根據(jù)以上劃分出的數(shù)值范圍,以各數(shù)值范圍的最大值為一個
可分配出的單元內(nèi)存塊的值,例如,分別為MBS1、 MBS2......MBSn,若各
數(shù)值范圍內(nèi)所包括的程序的數(shù)量分別為Mi、 M2......Mn。則內(nèi)存總體需求量
的最大值可依照公式MaxMem = MBS1*M1+ MBS2*M2+..... MBSn*Mn計算 出。如此,提供的內(nèi)存區(qū)域的數(shù)值大小及劃分出的分區(qū)數(shù)量及大小,以及各 分區(qū)內(nèi)包括的單元內(nèi)存塊的大小及數(shù)量都可以通過上述計算式得出。劃分出 的內(nèi)存分區(qū)通常是按分區(qū)單元內(nèi)存塊的大小,按大小數(shù)序排列,也就是說具 有最小數(shù)值單元內(nèi)存塊的內(nèi)存分區(qū)會在各分區(qū)的最前面,而具有最大數(shù)值單 元內(nèi)存塊的分區(qū)會在各分區(qū)的最后面,其他分區(qū)按照其單元內(nèi)存塊數(shù)值的大 小依次排在這兩者之間。提供的內(nèi)存區(qū)域的劃分結(jié)構(gòu)示意圖,具體請參閱圖 2所示。
在一個優(yōu)選的實施例中,為了確保運行程序的內(nèi)存足夠,應該使各分配 內(nèi)存塊的數(shù)值比程序運行時需要的大一些。也就是說,各數(shù)值范圍取的最大 值最好大于落于該數(shù)值范圍內(nèi)的最大的程序所需內(nèi)存的數(shù)值。
進一步的,還要記錄提供的內(nèi)存區(qū)域的起始地址,這是為了在后續(xù)分配 各分區(qū)單元內(nèi)存塊時,提供便利。例如,設其為pMemBase。那么該地址同 時也是分配內(nèi)存塊MBS所在內(nèi)存分區(qū)的起始地址pMemBasel。那么可計算 得出內(nèi)存塊MBS2所在內(nèi)存分區(qū)起始地址為pMemBase2 = pMemBasel +
iiMBSPM1。其它分配內(nèi)存塊所在的內(nèi)存分區(qū)的起始地址可依此方式分別計算 出,并可進而得出各分區(qū)內(nèi)各單元內(nèi)存塊的地址。
在劃分出的各內(nèi)存分區(qū)內(nèi)定義的內(nèi)存管理參數(shù),其包括有從未使用內(nèi)存 塊索引、釋放內(nèi)存塊索引、釋放內(nèi)存塊存儲棧以及可用內(nèi)存塊數(shù)量索引。
其中從未使用內(nèi)存塊索引,在初始時,其內(nèi)會存儲本分區(qū)內(nèi)第一個從未 使用的單元內(nèi)存塊的編號。在分配過程中,當對應其所存儲編號的單元內(nèi)存 塊被分配出去后,其會存儲本分區(qū)內(nèi)下一個從未使用單元內(nèi)存塊的編號,直 到本分區(qū)內(nèi)不在有從未使用過的單元內(nèi)存塊為止。例如,在一個實施方式中, 從未使用內(nèi)存塊索引的初始值為0,每次分配出其所指向的單元內(nèi)存塊后, 其數(shù)值加1,直到本內(nèi)存分區(qū)內(nèi)全部從未使用的單元內(nèi)存塊被分配完畢后, 其數(shù)值變?yōu)樵摲謪^(qū)包括的全部單元內(nèi)存塊的數(shù)量值,表示此分區(qū)內(nèi)已沒有從 未使用過的內(nèi)存塊。同時,也就不能在使用其進行分區(qū)內(nèi)單元內(nèi)存塊的分配。
定義釋放內(nèi)存塊索引是固為,系統(tǒng)為使用程序而分配內(nèi)存塊,同樣會因 為終止程序而釋放出其所占用的內(nèi)存塊。為提高系統(tǒng)內(nèi)存的利用率,也需要 有效的利用這些因程序終止而釋放出的內(nèi)存容量。其內(nèi)可存儲有一個釋放單 元內(nèi)存塊的編號。在一個實施方式中,存儲的釋放單元內(nèi)存塊編號可以是其 地址信息。其初始值可以為-i,但不限于。
定義釋放內(nèi)存塊存儲棧是因為, 一個內(nèi)存分區(qū)一般會包括有若干個單元 內(nèi)存塊。在同一個分區(qū)內(nèi)的多個單元內(nèi)存塊被分配出去^吏用后,當使用這些 單元內(nèi)存塊的程序終止時,就會釋放出多個單元內(nèi)存塊,而釋放內(nèi)存塊索引 只能存儲一個釋放的單元內(nèi)存塊的編號,為了有效管理這些釋放出的內(nèi)存塊 編號,也就需要在各內(nèi)存分區(qū)內(nèi)設置一個釋放內(nèi)存塊存儲棧,用來存儲屬于 該內(nèi)存分區(qū)的被釋放出的多個單元內(nèi)存塊的編號。進一步的,各分區(qū)內(nèi)用于 存儲釋放內(nèi)存塊編號的棧,可以是在該分區(qū)內(nèi)的釋放內(nèi)存塊索引內(nèi)存儲有釋 放單元內(nèi)存塊編號時,才可以進行釋放單元內(nèi)存塊編號的存儲。定義分區(qū)內(nèi)可用內(nèi)存塊數(shù)量索引,是為了管理各分區(qū)內(nèi)可用于分配出去 的內(nèi)存塊(包括從未分配出的內(nèi)存塊的數(shù)量及釋放出的內(nèi)存塊的數(shù)量)的數(shù) 量,其起始數(shù)值,也就是該內(nèi)存分區(qū)所包括的4^內(nèi)存塊的數(shù)量。當其在使 用過程中,其數(shù)量會因為本分區(qū)內(nèi)單元內(nèi)存塊的分配使用而減少,例如,每 分配出去一個單元內(nèi)存塊,其數(shù)值會減1。當分區(qū)內(nèi)有被占用的單元內(nèi)存塊 被釋放時,其數(shù)值也會加1。當其為空值時,則表明本分區(qū)內(nèi)全部內(nèi)存塊均 被使用,而不能在提供單元內(nèi)存塊供使用,
當內(nèi)存初始化過程之后,會接到分配內(nèi)存塊的請求,以及在運行一段時 間后,會接到因程序中止而釋放其所占用的單元內(nèi)存塊的請求,也就是步驟
104。以下將分別對這兩種情況加以i^明。
當接到的是內(nèi)存塊分配請求時,則在步驟106中,其會先將內(nèi)存需求的 數(shù)值與各分區(qū)內(nèi)存塊的數(shù)值大小進行比較,按照最小滿足原則,選擇最小的
大于該內(nèi)存需求的單元內(nèi)存塊所在的內(nèi)存分區(qū)進行單元內(nèi)存塊分配。在比較 過程中,若提供的內(nèi)存區(qū)域劃分出的內(nèi)存分區(qū)的數(shù)量較大,可采用二分法進 行查找。例如,在一個實施方式中,若提供的內(nèi)存區(qū)域包括有N個內(nèi)存分區(qū)。
每個分區(qū)的單元內(nèi)存塊的數(shù)值按大小排序分別為Ml、 M2、 M3......Mn,這
時,接到一個分配內(nèi)存請求分配K值內(nèi)存塊。由于分區(qū)數(shù)量較多,若—— 比對,比較浪費時間,則采用二分法進行分區(qū)查找。先將K值與全部分區(qū)中 的中間分區(qū)的單元內(nèi)存塊的數(shù)值進行比較,若N為偶數(shù),則是N/2這一分區(qū) 的單元內(nèi)存塊進行比較,脅i設N/2這一分區(qū)的單元內(nèi)存塊的值為Mm;若N 是奇數(shù),則是(N+l )/2或(N-l )/2這一分區(qū)的單元內(nèi)存塊進行比較。由于 兩種情況,方法類似,以下以N為偶數(shù)為例進行說明。每次比較過程中,涉 及的數(shù)值為三個,起始值、中間值和終點值,例如,在此次比較中,涉及的 起始值為Ml、中間值為Mm,終點值為Mn。當K值大于Mm時,則選擇 Mm為起始值,以Mn為終點值,選擇處于兩者之間的中間值繼續(xù)與K值進 行比較;若是Mm大于K值,則選擇Mm為終點值,以Ml為起始值,選擇處于兩者之間的中間數(shù)繼續(xù)比較,依次類推,直到最后,起始值、中間值和
終點值為三個連續(xù)的數(shù)值為止,這時比較值K值要么處于初始值與中間值之 間,要么處于中間值與終點值之間,若其大于中間值,則選擇容量為終點值 數(shù)值的單元內(nèi)存塊所在的內(nèi)存分區(qū);若其小于中間值,則選擇容量為中間值 數(shù)值的單元內(nèi)存塊所在的內(nèi)存分區(qū),如此,使用二分法進行數(shù)值比較,每次
比較的數(shù)值都是選擇范圍內(nèi)的中間值,相對于--比較的方式,可在一定程
度上減少了比較的次數(shù),提高了效率。而如果發(fā)現(xiàn)需求的內(nèi)存大小比劃分出 的最大單元內(nèi)存塊的數(shù)值還大,則說明內(nèi)存管理出現(xiàn)錯誤,報告該錯誤。
在定位內(nèi)存分區(qū)后,并不意味就一定要在這個內(nèi)存分區(qū)進行單元內(nèi)存塊 的分配,這時需要先檢查該分區(qū)內(nèi)可用內(nèi)存塊數(shù)量索引,當發(fā)現(xiàn)其不為空值 時,才可確定可以從這個分區(qū)進行單元內(nèi)存塊的分配。當發(fā)現(xiàn)其為空值時, 則要選擇下一個內(nèi)存分區(qū)進行單元內(nèi)存塊分配,如此類推,直到找到分區(qū)內(nèi) 可用內(nèi)存塊數(shù)量索引數(shù)值不為空值的分區(qū)為止。
在確定內(nèi)存分區(qū)后,則可進行步驟108,定位分區(qū)內(nèi)可分配的單元內(nèi)存 塊。檢查分區(qū)內(nèi)釋放內(nèi)存塊索引的值是否為預設的空值,例如-1,如果不等 于-1,則表明其內(nèi)存有一個釋放出的單元內(nèi)存塊的編號(這個編號可以是其 地址信息,以下同,但不限于),那么就將該編號所指向的單元內(nèi)存塊分配 給這次內(nèi)存請求,并將其狀態(tài)修改為使用。然后檢查分區(qū)內(nèi)釋放內(nèi)存塊存儲 棧是否為空,若其不為空,則就從該棧中選擇(在一個實施方式中,可按存 儲的先后順序依次選擇,但不限于) 一個存儲的釋放內(nèi)存塊的編號給釋放內(nèi) 存塊索引。然后將分區(qū)內(nèi)可用內(nèi)存塊數(shù)量索引的數(shù)值減1,也就是完成步驟 110。而若釋放內(nèi)存塊索引為空值,則檢查分區(qū)內(nèi)未使用內(nèi)存塊索引,將其內(nèi) 所存有的從未使用單元內(nèi)存塊編號所對應的單元內(nèi)存塊分配給這次請求,并 將其狀態(tài)修改為使用。然后將其下一個從未使用的單元內(nèi)存塊的編號存儲到 其內(nèi),以備下次使用。然后將分區(qū)內(nèi)可用內(nèi)存塊數(shù)量索引的數(shù)值減1,完成 步驟110。如此,處理結(jié)束。以上兩種定位分區(qū)內(nèi)單元內(nèi)存塊的方式,也可單獨使用,并不限于。
如上所述,當系統(tǒng)運行一段時間后,其會因程序中止而釋放使用的單元
內(nèi)存塊。這樣在104步驟中,當其接到的是釋放單元內(nèi)存塊的請求時,則進 行其后續(xù)的步驟112和114。
在步驟112中,根據(jù)上述內(nèi)容可知,每個單元內(nèi)存塊都有一個地址。假 設這個釋放出的單元內(nèi)存塊的起始地址為p Release Addr。通過將這個起始地 址與各內(nèi)存分區(qū)的起始地址進行比較,即可確定其所在的內(nèi)存分區(qū)。若內(nèi)存
分區(qū)過多,可采用二分法進行查找。通過比較地址的方式,可確定其所屬分 區(qū)。當定位出釋放出的內(nèi)存塊屬于某個內(nèi)存分區(qū)內(nèi)時,則可根據(jù)公式 (pReleaseAddr — pMemBaseN)/MBSn確定其編號。若發(fā)現(xiàn)該地址信息并不在 劃分出的內(nèi)存區(qū)域內(nèi),則說明系統(tǒng)程序錯誤,并報告錯誤。
在步驟U4中,如果發(fā)現(xiàn)該分區(qū)內(nèi)釋放內(nèi)存塊索引的值為空值-1,則將 該編號賦值給釋放內(nèi)存塊索引存儲,以便下次使用,并將釋放內(nèi)存塊索引的 空值變更。另外,還要將該釋放的單元內(nèi)存塊的狀態(tài)修改為未使用,以及將 表示分區(qū)內(nèi)可分配內(nèi)存塊數(shù)量索引的值加1。而若釋放內(nèi)存塊索引的值不為 空值-l時,則表明其內(nèi)存儲有可用的釋放單元內(nèi)存塊的編號,那么就將該編 號存儲到釋放內(nèi)存塊存儲棧中,并同樣將該釋放單元內(nèi)存塊的狀態(tài)修改為未 使用以及表示分區(qū)內(nèi)可分配內(nèi)存塊數(shù)量的數(shù)值加1。
進一步的,隨著系統(tǒng)的運行,系統(tǒng)程序的運行及終止,單元內(nèi)存塊的分 配流程和釋放流程將會隨需要不斷被重復。
進一步的,在一個綜合上述涉及的全部流程的實施方式中,首先進行系 統(tǒng)內(nèi)存初始化過程,也就是利用本發(fā)明涉及的內(nèi)存管理方法對系統(tǒng)內(nèi)存進行 劃分。
假設系統(tǒng)需要運行的系統(tǒng)程序為8個,首先采用操作系統(tǒng)自身的內(nèi)存分 配及釋放接口或是其它內(nèi)存管理接口運行程序,得到系統(tǒng)各個程序所需的動
15態(tài)內(nèi)存的值分別為5K、 6K、 13K、 22K、 28K、 33K、 8K以及18K
將這些數(shù)值分在三個數(shù)值范圍內(nèi),分別是小于10K、 10~25 K以及25~35 K。根據(jù)這些數(shù)值范圍的最大值,確定該數(shù)值范圍的單元值分別為IOK、 25K 和35K。進一步的,處于第一數(shù)值范圍中的需求有3個分別是5K、 6K和8 K;處于第二數(shù)值范圍中的需求有3個,分別是13K、 18K和22K;處于笫 三數(shù)值范圍中的需求有2個分別是28K和33K。因此系統(tǒng)程序所需的內(nèi)存 最大值Max Mem可以是10K*3 + 25K*3 + 35K*2=175K。
劃分175K的系統(tǒng)內(nèi)存出來,按照上迷數(shù)值范圍的數(shù)量相應劃分為三個 內(nèi)存分區(qū),各內(nèi)存分區(qū)的單元內(nèi)存塊的值和數(shù)量則分別對應為10K*3 、 25K*3以及35K承2。
進一步的,記錄分配的內(nèi)存的地址,其也是分區(qū)l的首地址,進而獲得 各分區(qū)的首地址。定義各分區(qū)的起始未使用內(nèi)存塊的編號為未使用內(nèi)存塊索 引,其初始值為O,其指向該分區(qū)內(nèi)的第一個單元內(nèi)存塊。定義釋放內(nèi)存塊 索引,其初始值為-1,用于存儲因系統(tǒng)程序終止而釋放出的本分區(qū)內(nèi)的單元 內(nèi)存塊編號。記錄各分區(qū)可用內(nèi)存塊數(shù)量索引分別為3、 3及2。
系統(tǒng)內(nèi)存初始化完成后,開始進行分配操作流程。
當系統(tǒng)第一次要求的分配內(nèi)存為28K時,因為分區(qū)數(shù)量較少,尋找相應 分區(qū)的方式可以是依次比較,直到發(fā)現(xiàn)其值是小于分區(qū)3的單元值。當然在 分區(qū)較多的時候,可以采用二分法,先將其與中間分區(qū)的單元值進行比較, 在這個實施方式中,即為第二分區(qū)的單元值25K進行比較,其大于它,則將 其與第三分區(qū)的單元值35進行比較,發(fā)現(xiàn)其小于它,則選擇第三分區(qū)進行單 元內(nèi)存塊的分配。
由于是第 一次分配內(nèi)存,則可以是直接通過未使用內(nèi)存塊索引將其所指 向的分區(qū)內(nèi)第一個內(nèi)存塊分配給該程序。并將未使用內(nèi)存塊索引的數(shù)值加1, 使其指向分區(qū)內(nèi)第二個未使用的單元內(nèi)存塊,以便下次使用時分配。并將分
16區(qū)內(nèi)表示可用內(nèi)存塊數(shù)量索引的數(shù)值減l,也就是由2變?yōu)長
進一步的,在使用單元內(nèi)存塊的釋放流程中,當分配出的占用第三分區(qū) 第一個單元內(nèi)存塊的程序終止時,其將釋放出其所占用的單元內(nèi)存塊。先確 定該釋放出的單元內(nèi)存塊的地址,然后將該地址依次與各分區(qū)的首地址進行 比較,發(fā)現(xiàn)其位于第三分區(qū)內(nèi),并為第一內(nèi)存塊.檢查釋放內(nèi)存塊索引,發(fā) 現(xiàn)其為初始值-1,則將此地址編號附值給它,并變更其初始值。然后將分區(qū) 內(nèi)表示可用內(nèi)存塊數(shù)量索引的數(shù)值加1,也就是由1變?yōu)?。
本發(fā)明涉及的可用于嵌入式系統(tǒng)的內(nèi)存管理方法,可有效的實現(xiàn)系統(tǒng)對 于內(nèi)存實時性、可靠性及高效性方面的要求,進而提高了系統(tǒng)的運行效率。 同時采用針對程序特點的內(nèi)存布局,通過簡單的算法高效的對內(nèi)存進行分配 和回收,并可以4全測是否發(fā)生內(nèi)存錯誤。
權(quán)利要求
1. 一種內(nèi)存管理方法,所述內(nèi)存被劃分為若干個內(nèi)存分區(qū),每個內(nèi)存分區(qū)被劃分為若干個單元內(nèi)存塊,每個內(nèi)存分區(qū)內(nèi)的單元內(nèi)存塊的容量相同,而不同內(nèi)存分區(qū)中的單元內(nèi)存塊的容量不同,其特征在于,所述方法包括步驟A、接收包括有內(nèi)存需求容量的內(nèi)存分配請求;步驟B、找到其內(nèi)的單元內(nèi)存塊的容量等于所述內(nèi)存需求容量或大于所述內(nèi)存需求容量且最小的內(nèi)存分區(qū);步驟C、在所述找到的內(nèi)存分區(qū)內(nèi)找到使用狀態(tài)為未使用的單元內(nèi)存塊,并將所述找到的未使用的單元內(nèi)存塊分配給所述內(nèi)存分配請求,將被分配出的單元內(nèi)存塊的使用狀態(tài)修改為已使用;步驟D、接收用于釋放指定單元內(nèi)存塊的內(nèi)存釋放請求;步驟E、找到所述需要釋放指定單元內(nèi)存塊所在的內(nèi)存分區(qū);步驟F、在所述找到的內(nèi)存分區(qū)內(nèi)找到所述需要釋放指定單元內(nèi)存塊,釋放所述指定單元內(nèi)存塊,將被釋放的單元內(nèi)存塊的使用狀態(tài)修改為未使用。
2. 根據(jù)權(quán)利要求1所述內(nèi)存管理方法,其特征為所述各內(nèi)存分區(qū)都 有各自的內(nèi)存管理參數(shù),所述內(nèi)存管理參數(shù)包括可用內(nèi)存塊數(shù)量索引、未使 用內(nèi)存塊索引、釋放內(nèi)存塊索引以及釋放內(nèi)存塊存儲棧;其中可用內(nèi)存塊數(shù) 量索引用于表明本內(nèi)存分區(qū)內(nèi)使用狀態(tài)為未使用的可用于分配的單元內(nèi)存 塊數(shù)量;未使用內(nèi)存塊索引則是用于存儲本內(nèi)存分區(qū)內(nèi)從未使用的單元內(nèi)存 塊編號;釋放內(nèi)存塊索引以及釋放內(nèi)存塊存儲棧則都是用于存儲本內(nèi)存分區(qū) 內(nèi)釋放的單元內(nèi)存塊編號,其中釋放內(nèi)存塊存儲棧則是在釋放內(nèi)存塊索引存 儲了一個釋放單元內(nèi)存塊之后,再進行其它的釋放單元內(nèi)存塊編號的存儲。
3. 根據(jù)權(quán)利要求2所述內(nèi)存管理方法,其特征為在步驟B后,根據(jù)所述找到的內(nèi)存分區(qū)的可用內(nèi)存塊數(shù)量索引判斷所述找到的內(nèi)存分區(qū)內(nèi)是否還有可用單元內(nèi)存塊,如果有,則進入步驟C;如果否,則找到相鄰的下 一個內(nèi)存分區(qū),并再次根據(jù)找到的內(nèi)存分區(qū)的可用內(nèi)存塊數(shù)量索引判斷該內(nèi) 存分區(qū)內(nèi)是否有可用單元內(nèi)存塊,如果有,則進入步驟C;否則繼續(xù)重復上 述步驟直到找到具有可用單元內(nèi)存塊的內(nèi)存分區(qū)并進入步驟C;所述步驟C包括查看所述找到的內(nèi)存分區(qū)的釋放內(nèi)存塊索引是否為 空,如果不為空,則將其內(nèi)存儲的釋放單元內(nèi)存塊編號對應的單元內(nèi)存塊分 配給所述內(nèi)存分配請求,將分配出的單元內(nèi)存塊的狀態(tài)修改為已使用,查看 釋放內(nèi)存塊存儲棧內(nèi)是否存儲有釋放單元內(nèi)存塊編號,如果有,則將釋放內(nèi) 存塊存儲棧中存儲的一個釋放單元內(nèi)存塊的編號賦值給釋放內(nèi)存塊索引,如 果沒有,則將釋放內(nèi)存塊索引的值修改為空值,并將分區(qū)內(nèi)可用內(nèi)存塊數(shù)量 索引的數(shù)值減l;如果釋放內(nèi)存塊索引為空值,則將未使用內(nèi)存塊索引內(nèi)存 儲的從未使用的單元內(nèi)存塊的編號所對應的單元內(nèi)存塊分配給所述內(nèi)存分 配請求,然后將分區(qū)內(nèi)下一個從未使用的單元內(nèi)存塊編號賦值給未使用內(nèi)存 塊索引,將分配出的單元內(nèi)存塊的使用狀態(tài)修改為已使用,并將可用內(nèi)存塊 數(shù)量索引的數(shù)值減i;所述步驟F包括在所述找到的內(nèi)存分區(qū)內(nèi)找到所述需要釋放的指定單 元內(nèi)存塊,釋放所迷指定單元內(nèi)存塊,將被釋放的單元內(nèi)存塊的使用狀態(tài)修 改為未使用,在釋放內(nèi)存塊索引為空值時,將被釋放的單元內(nèi)存塊的編號賦 值給釋放內(nèi)存塊索引;在釋放內(nèi)存塊索引不為空值時,將被釋放的單元內(nèi)存 塊的編號存入釋放內(nèi)存塊存儲棧中,將所述內(nèi)存分區(qū)內(nèi)可用內(nèi)存塊數(shù)量索引 數(shù)值力口。
4.根據(jù)權(quán)利要求1所述內(nèi)存管理方法,其特征為所述被劃分為若干 內(nèi)存分區(qū)的內(nèi)存的大小是根據(jù)預定運行的若干系統(tǒng)程序所需內(nèi)存的總需求 大小計算得出,其為根椐所述各程序的內(nèi)存需求的值,將其分在至少兩個數(shù) 值范圍內(nèi),以各數(shù)值范圍的最大值為單元值以及落于其內(nèi)的數(shù)值的數(shù)量兩者的乘積,計算出系統(tǒng)程序的內(nèi)存總需求的最大值,然后根據(jù)這個最大值提供 相應數(shù)值的內(nèi)存區(qū)域。
5. 根據(jù)權(quán)利要求1所述內(nèi)存管理方法,其特征為所迷各內(nèi)存分區(qū)的 排列方式為按各內(nèi)存分區(qū)的單元內(nèi)存塊的大小進行順序排列。
6. 根據(jù)權(quán)利要求1所迷內(nèi)存管理方法,其特征為所述步驟B包括, 根據(jù)二分法進行內(nèi)存需求容量與所述各內(nèi)存分區(qū)的單元內(nèi)存塊容量間的比 較,其為在初始時,選擇最小的單元內(nèi)存塊的值為起始值,最大單元內(nèi)存塊 的值為終點值,然后選擇處于兩者之間的初始中間值與其進行比較;當其大 于初始中間值時,則選擇所迷初始中間值為起始值,原所述終點值為終點值, 然后與這兩者之間的中間值進行比較;若其小于初始中間值時,則選擇初始 中間值為終點值,原所述起始值為起始值,然后與這兩者間的中間值進行比 較,依次類推,直到最終起始值和最終終點值之間只有一個數(shù)值為止,其為 最終中間值,這時,若請求數(shù)值大于最終中間值,則選擇數(shù)值為最終終點值 的單元內(nèi)存塊所在的內(nèi)存分區(qū);若其小于,則選擇數(shù)值為最終中間值的單元 內(nèi)存塊所在的內(nèi)存分區(qū)。
7. 根據(jù)權(quán)利要求1所述內(nèi)存管理方法,其特征為其還包括記錄所述 各內(nèi)存分區(qū)及其下各內(nèi)存單元塊的地址信息;所述步驟E包括,檢查釋放單 元內(nèi)存塊的地址信息,將其起始地址信息與所述內(nèi)存分區(qū)的起始地址進行比 較,當兩者比較一致時,則找到其所屬內(nèi)存分區(qū)。
8. 根據(jù)權(quán)利要求1所述內(nèi)存管理方法,其特征為其還包括有以下步 驟,在各內(nèi)存分區(qū)內(nèi)定義未使用內(nèi)存塊索引,其用于存儲分區(qū)內(nèi)第一個從未 使用過的單元內(nèi)存塊的編號,當對應于其內(nèi)存儲的單元內(nèi)存塊編號的單元內(nèi) 存塊被分配出去之后,其會存儲分區(qū)內(nèi)下一個未使用單元內(nèi)存塊的編號。
9. 根據(jù)權(quán)利要求1所述內(nèi)存管理方法,其特征為其還包括有以下步 驟,在各內(nèi)存分區(qū)內(nèi)定義釋放內(nèi)存塊索引,用于存儲屬于該內(nèi)存分區(qū)的,因系統(tǒng)程序終止而釋放出的單元內(nèi)存塊的編號;當需要分配單元內(nèi)存塊時,會 先檢查釋放內(nèi)存塊索引內(nèi)是否存儲有釋放的的單元內(nèi)存塊編號,若有,則將 其對應的單元內(nèi)存塊分配給內(nèi)存需求,然后將釋放內(nèi)存塊索引的附值修改為 空值。
10.根據(jù)權(quán)利要求1所迷內(nèi)存管理方法,其特征為其還包括有以下步 驟,在各內(nèi)存分區(qū)內(nèi)定義分區(qū)內(nèi)可用內(nèi)存塊數(shù)量索引,用于記錄該內(nèi)存分區(qū) 內(nèi)的全部可用于分配出的單元內(nèi)存塊的數(shù)量,并在該分區(qū)內(nèi)有內(nèi)存塊被分配 出去之后,將該數(shù)值減l;在進行內(nèi)存分區(qū)內(nèi)單元存塊分配時,當發(fā)現(xiàn)該分 區(qū)內(nèi)的用于記錄該分區(qū)可用內(nèi)存塊數(shù)量的索引的數(shù)值為空值時,則選擇其下 一個內(nèi)存分區(qū)進行內(nèi)存塊的分配。
全文摘要
本發(fā)明公開了一種內(nèi)存管理方法,其可適用于嵌入式系統(tǒng)使用。其包括有以下步驟,提供一定容量的內(nèi)存區(qū)域。對內(nèi)存區(qū)域進行劃分使其包括有若干內(nèi)存分區(qū)及其下屬的若干單元內(nèi)存塊。當需要提供內(nèi)存需求時,分配與所需內(nèi)存需求稍大的單元內(nèi)存塊供其使用。本發(fā)明涉及的內(nèi)存管理方法采用針對嵌入式系統(tǒng)特點的內(nèi)存布局,通過簡單的算法高效的對內(nèi)存進行分配,并可以檢測是否發(fā)生內(nèi)存錯誤。
文檔編號G06F12/02GK101499034SQ20091007905
公開日2009年8月5日 申請日期2009年3月5日 優(yōu)先權(quán)日2009年3月5日
發(fā)明者王世初, 陳紹新 申請人:北京中星微電子有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
石城县| 本溪市| 彭山县| 佛学| 大足县| 获嘉县| 高阳县| 盘锦市| 桐庐县| 平南县| 黄浦区| 绥滨县| 延津县| 叶城县| 昆明市| 华亭县| 盐源县| 汝州市| 揭东县| 太仆寺旗| 亚东县| 罗定市| 蛟河市| 九龙城区| 湘潭市| 辽阳县| 阿城市| 蓝山县| 高尔夫| 永春县| 保靖县| 昌江| 辉县市| 嘉善县| 佛坪县| 武胜县| 扎囊县| 剑川县| 麻城市| 鄱阳县| 巍山|