本發(fā)明涉及嵌入式系統(tǒng)技術(shù)領(lǐng)域,尤其涉及一種動態(tài)堆棧內(nèi)存管理方法和裝置。
背景技術(shù):
堆棧是高級編程語言的基礎(chǔ)設(shè)施,是函數(shù)運(yùn)行的基礎(chǔ)。
當(dāng)今的CPU(Central Processing Unit,中央處理器)設(shè)計(jì)都提供了對堆棧的支持,比如,intel處理器就是通過sp(stack pointer,堆棧指針)寄存器來實(shí)現(xiàn)堆棧功能的。CPU一般可同時支持多個任務(wù)進(jìn)程,每個任務(wù)進(jìn)程各自獨(dú)立運(yùn)行,需提供相應(yīng)的堆棧用于該任務(wù)進(jìn)程存儲數(shù)據(jù)。對于每個任務(wù)進(jìn)程,在執(zhí)行過程中,通常都會涉及到多個函數(shù)的調(diào)用關(guān)系。例如常見的APP客戶端軟件,主界面函數(shù)首先被啟動運(yùn)行,當(dāng)用戶操作進(jìn)行某個子功能界面時就由主界面函數(shù)調(diào)用對應(yīng)的子功能界面的函數(shù)運(yùn)行。在用戶退出子功能界面而返回主界面時,其對應(yīng)函數(shù)也退出。
函數(shù)調(diào)用過程對堆棧的使用方式如下,如圖5所示,以intel平臺下,函數(shù)a調(diào)用函數(shù)b,函數(shù)b又調(diào)用函數(shù)c的情形,來說明堆棧的變化過程:函數(shù)a運(yùn)行時堆棧指針sp處在位置a;函數(shù)a調(diào)用函數(shù)b之后,堆棧指針sp向下移動到了位置b;函數(shù)b調(diào)用函數(shù)c之后,堆棧指針sp向下移動到了位置c;函數(shù)c退出后,堆棧指針sp向上移動到了位置b;函數(shù)b退出后,堆棧指針sp向上移動到了位置a。
由圖5可知,隨著函數(shù)調(diào)用層次的加深,堆棧指針sp不斷向下移動,即堆??臻g也隨著增大;隨著函數(shù)不斷地退出,堆棧指針sp不斷向上移動。雖然函數(shù)已經(jīng)不再運(yùn)行,但曾經(jīng)分配給該函數(shù)的堆??臻g并沒有釋放。也就是說,堆??臻g只增不減,堆??臻g與堆棧指針并不同步,不能真實(shí)地反映程序?qū)嶋H使用的堆棧大小,這就導(dǎo)致在沒有交換功能、不能把內(nèi)存?zhèn)浞莸接脖P的嵌入式系統(tǒng)中,堆棧空間中無效的內(nèi)存被浪費(fèi)。
技術(shù)實(shí)現(xiàn)要素:
為解決相關(guān)技術(shù)問題,本發(fā)明提供一種動態(tài)堆棧內(nèi)存管理方法和裝置,以及時釋放被浪費(fèi)的內(nèi)存,提高嵌入式系統(tǒng)內(nèi)存利用率。
為實(shí)現(xiàn)上述目的,本發(fā)明實(shí)施例采用如下技術(shù)方案:
第一方面,本發(fā)明實(shí)施例提供了一種動態(tài)堆棧內(nèi)存管理方法,所述方法包括:
確定當(dāng)前任務(wù)的堆??臻g的堆棧指針位置至堆棧空間頂部位置之間的空閑內(nèi)存;
如果所述空閑內(nèi)存大于預(yù)置閾值,則釋放所述堆棧指針位置至所述堆??臻g頂部位置之間的內(nèi)存頁;
將所述堆棧指針位置所在內(nèi)存頁的起始位置重置為堆??臻g頂部位置。
第二方面,本發(fā)明實(shí)施例還對應(yīng)提供了一種動態(tài)堆棧內(nèi)存管理裝置,所述裝置包括:
空閑內(nèi)存確定模塊,用于確定當(dāng)前任務(wù)的堆??臻g的堆棧指針位置至堆棧空間頂部位置之間的空閑內(nèi)存;
內(nèi)存頁釋放模塊,用于如果所述空閑內(nèi)存大于預(yù)置閾值,則釋放所述堆棧指針位置至所述堆棧空間頂部位置之間的內(nèi)存頁;
重置模塊,用于將所述堆棧指針位置所在內(nèi)存頁的起始位置重置為堆??臻g頂部位置。
本發(fā)明實(shí)施例提供的技術(shù)方案帶來的有益效果:
本技術(shù)方案中,確定當(dāng)前任務(wù)的堆棧空間的堆棧指針位置至堆??臻g頂部位置之間的空閑內(nèi)存;如果空閑內(nèi)存大于預(yù)置閾值,則釋放堆棧指針位置至堆??臻g頂部位置之間的內(nèi)存頁;將堆棧指針位置所在內(nèi)存頁的起始位置重置為堆??臻g頂部位置。本技術(shù)方案中,通過釋放堆棧指針位置至堆棧空間頂部位置之間的內(nèi)存頁,來達(dá)到堆棧指針和堆??臻g的同步,可以及時釋放浪費(fèi)的內(nèi)存,提高嵌入式系統(tǒng)內(nèi)存的利用率。
附圖說明
為了更清楚地說明本發(fā)明實(shí)施例中的技術(shù)方案,下面將對本發(fā)明實(shí)施例描述中所需要使用的附圖作簡單的介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)本發(fā)明實(shí)施例的內(nèi)容和這些附圖獲得其他的附圖。
圖1是本發(fā)明實(shí)施例一提供的一種動態(tài)堆棧內(nèi)存管理方法的流程示意圖;
圖2A是本發(fā)明實(shí)施例二提供的一種動態(tài)堆棧內(nèi)存管理方法的流程示意圖;
圖2B是圖2A中S220的可選實(shí)施方式的流程示意圖;
圖3是本發(fā)明實(shí)施例三提供的一種動態(tài)堆棧內(nèi)存管理裝置的架構(gòu)示意圖;
圖4A是本發(fā)明實(shí)施例四提供的一種動態(tài)堆棧內(nèi)存管理裝置的架構(gòu)示意圖;
圖4B是圖4A中空閑內(nèi)存確定模塊420的可選實(shí)施方式的架構(gòu)示意圖;
圖5是現(xiàn)有技術(shù)中系統(tǒng)調(diào)用函數(shù)時,堆棧的變化示意圖。
具體實(shí)施方式
為使本發(fā)明解決的技術(shù)問題、采用的技術(shù)方案和達(dá)到的技術(shù)效果更加清楚,下面將結(jié)合附圖對本發(fā)明實(shí)施例的技術(shù)方案作進(jìn)一步的詳細(xì)描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域技術(shù)人員在沒有作出創(chuàng)造性勞動前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
實(shí)施例一
請參考圖1,其是本發(fā)明實(shí)施例一提供的一種動態(tài)堆棧內(nèi)存管理方法的流程示意圖。本實(shí)施例的方法可以由路由器、交換機(jī)等裝有嵌入式操作系統(tǒng)的設(shè)備來執(zhí)行,適用于系統(tǒng)為任務(wù)進(jìn)程的分配堆棧進(jìn)行內(nèi)存管理的場景。
本實(shí)施例的動態(tài)堆棧內(nèi)存管理方法,可以包括如下內(nèi)容:
S110:確定當(dāng)前任務(wù)的堆??臻g的堆棧指針位置至堆??臻g頂部位置之間的空閑內(nèi)存。
示例性的,堆棧是一個用戶空間的內(nèi)存區(qū)域,系統(tǒng)為各任務(wù)進(jìn)程分配對應(yīng)的堆棧空間進(jìn)行數(shù)據(jù)的臨時存儲。隨著任務(wù)程序的運(yùn)行,堆棧指針是動態(tài)變化的。在某個檢測時刻,獲取當(dāng)前正在運(yùn)行的任務(wù)的堆??臻g的堆棧指針位置和堆??臻g頂部位置,根據(jù)這兩個位置對應(yīng)的地址值即可確定兩個位置之間的空閑內(nèi)存的大小。
S120:如果空閑內(nèi)存大于預(yù)置閾值,則釋放堆棧指針位置至堆??臻g頂部位置之間的內(nèi)存頁。
示例性的,為便于管理內(nèi)存,系統(tǒng)是以內(nèi)存頁為單位對內(nèi)存進(jìn)行管理的,系統(tǒng)中單個內(nèi)存頁的大小是固定的,例如,一個內(nèi)存頁的大小可以為4kb。判斷S110中確定的空閑內(nèi)存的大小是否大于預(yù)置閾值,如果大于則認(rèn)為堆棧指針位置至堆棧空間頂部位置之間的空閑內(nèi)存過大,例如,取預(yù)置閾值為1個內(nèi)存頁的大小4kb,即堆棧指針位置至堆??臻g頂部位置之間的空閑內(nèi)存超過一個內(nèi)存頁的大小,則將堆棧指針位置至堆棧空間頂部位置之間的內(nèi)存頁釋放。
需要說明的是,由于系統(tǒng)是以內(nèi)存頁為單位來管理內(nèi)存,因此不能實(shí)現(xiàn)將兩個位置間的全部空閑內(nèi)存釋放,僅能釋放兩個位置之間的內(nèi)存頁。例如,如果確定兩個位置之間的空閑內(nèi)存的大小為7kb,則只能釋放兩個位置之間的1個內(nèi)存頁,即釋放4kb的內(nèi)存;再例如,如果確定兩個位置之間的空閑內(nèi)存的大小為15kb,則只能釋放兩個位置之間的3個內(nèi)存頁,即釋放12kb的內(nèi)存。當(dāng)然,在其他實(shí)施例中,也可以將上述預(yù)置閾值設(shè)置為2個內(nèi)存頁的大小,或其他大小的值。
S130:將堆棧指針位置所在內(nèi)存頁的起始位置重置為堆??臻g頂部位置。
示例性的,在釋放掉堆棧指針位置至堆棧空間頂部位置之間的內(nèi)存頁后,為使得堆棧指針與堆??臻g保持同步,需要將堆棧指針位置所處內(nèi)存頁的起始位置重置為堆??臻g頂部位置。
綜上,在本技術(shù)方案中,確定當(dāng)前任務(wù)的堆??臻g的堆棧指針位置至堆??臻g頂部位置之間的空閑內(nèi)存,如果空閑內(nèi)存大于預(yù)置閾值,則釋放堆棧指針位置至堆棧空間頂部位置之間的內(nèi)存頁,將堆棧指針位置所在內(nèi)存頁的起始位置重置為堆??臻g頂部位置。通過釋放堆棧指針位置至堆??臻g頂部位置之間的內(nèi)存頁,來達(dá)到堆棧指針和堆??臻g的同步,可以及時釋放浪費(fèi)的內(nèi)存,提高嵌入式系統(tǒng)內(nèi)存的利用率。
實(shí)施例二
請參考圖2A,其是本發(fā)明實(shí)施例二提供的一種動態(tài)堆棧內(nèi)存管理方法的流程示意圖。本實(shí)施例與實(shí)施例一的主要區(qū)別在于,增加了為正在運(yùn)行的所有任務(wù)建立任務(wù)鏈表,并設(shè)置任務(wù)指針,指向至少一個任務(wù),作為當(dāng)前任務(wù)的內(nèi)容,增加了S220確定的空閑內(nèi)存不大于預(yù)置閾值時的內(nèi)容,增加了循環(huán)遍歷檢測的內(nèi)容,并進(jìn)一步提供了圖2A中S220的可選實(shí)施方式。
本實(shí)施例的動態(tài)堆棧內(nèi)存管理方法,可以包括如下內(nèi)容:
S210:為正在運(yùn)行的所有任務(wù)建立任務(wù)鏈表,并設(shè)置任務(wù)指針,指向至少一個任務(wù),作為當(dāng)前任務(wù)。
示例性的,一般的,系統(tǒng)是在多個任務(wù)進(jìn)程之間交替選擇運(yùn)行,因此有必要為多個正在運(yùn)行的任務(wù)進(jìn)程建立任務(wù)鏈表,并設(shè)置任務(wù)指針,通過指針指向鏈表中的任務(wù),以此識別出當(dāng)前需要運(yùn)行的任務(wù),即指定當(dāng)前任務(wù)。
S220:確定當(dāng)前任務(wù)的堆??臻g的堆棧指針位置至堆棧空間頂部位置之間的空閑內(nèi)存。
可選的,如圖2B所示,S220可以包括S221和S222兩個步驟,其中:
S221:每隔預(yù)置時長獲取當(dāng)前任務(wù)的堆??臻g的堆棧指針位置和堆棧空間頂部位置。
示例性的,隨著系統(tǒng)不斷地運(yùn)行任務(wù)程序,堆棧空間也是動態(tài)變化,因此需要定時執(zhí)行檢測操作。由于系統(tǒng)自帶有中斷模塊,例如,系統(tǒng)中每隔0.1秒執(zhí)行中斷操作,變更當(dāng)前執(zhí)行的任務(wù)程序。對于檢測動態(tài)堆棧空間的空閑內(nèi)存,無需像系統(tǒng)執(zhí)行中斷操作那么頻繁,因此可以每隔合理的預(yù)置時長進(jìn)行檢測,例如,以中斷周期的16倍也即1.6秒作為上述預(yù)置時長,即在當(dāng)前任務(wù)結(jié)束之前,每隔1.6秒周期性地獲取當(dāng)前任務(wù)的堆??臻g的堆棧指針位置和堆棧空間頂部位置。
S222:計(jì)算堆棧指針位置至堆??臻g頂部位置之間的空閑內(nèi)存。
示例性的,根據(jù)獲得的棧指針位置和堆??臻g頂部位置所對應(yīng)的兩個地址值,即可計(jì)算出兩個位置之間的空閑內(nèi)存。
S230:判斷空閑內(nèi)存是否大于預(yù)置閾值。
示例性的,根據(jù)不同的判斷結(jié)果,相應(yīng)地跳轉(zhuǎn)至下述S240a或S240b。
S240a:如果空閑內(nèi)存大于預(yù)置閾值,則釋放堆棧指針位置至堆??臻g頂部位置之間的內(nèi)存頁。
S250:將堆棧指針位置所在內(nèi)存頁的起始位置重置為堆??臻g頂部位置。
S260:將任務(wù)指針設(shè)置為任務(wù)鏈表中的下一個任務(wù),以將下一個任務(wù)更新為當(dāng)前任務(wù)。
示例性的,重置堆??臻g頂部位置表示系統(tǒng)對當(dāng)前任務(wù)的檢測已經(jīng)暫時結(jié)束,接下來系統(tǒng)將針對其他要運(yùn)行的任務(wù)程序進(jìn)行檢測。將任務(wù)指針設(shè)置為任務(wù)鏈表中的下一個任務(wù),表示將下一個任務(wù)更新為當(dāng)前任務(wù),并跳轉(zhuǎn)至S220,執(zhí)行空閑內(nèi)存的確定操作,如此可遍歷檢測任務(wù)鏈表中全部任務(wù)程序,保證系統(tǒng)中所有任務(wù)都會被執(zhí)行堆棧指針和堆??臻g同步。
S240b:如果空閑內(nèi)存不大于預(yù)置閾值,則將任務(wù)指針設(shè)置為任務(wù)鏈表中的下一個任務(wù),以將下一個任務(wù)更新為當(dāng)前任務(wù)。
示例性的,如果空閑內(nèi)存不大于預(yù)置閾值,則說明當(dāng)前任務(wù)的堆棧空間沒有浪費(fèi)內(nèi)存,因此將任務(wù)指針指向任務(wù)鏈表中的下一個任務(wù)作為當(dāng)前任務(wù),系統(tǒng)針對更新后的當(dāng)前任務(wù)進(jìn)行檢測,即再跳轉(zhuǎn)至上S220,執(zhí)行空閑內(nèi)存的確定操作。
綜上,在本技術(shù)方案中,通過建立任務(wù)鏈表,設(shè)置任務(wù)指針,以任務(wù)指針的指向來確定當(dāng)前任務(wù);通過釋放堆棧指針位置至堆??臻g頂部位置之間的內(nèi)存頁,來達(dá)到當(dāng)前任務(wù)的堆棧指針和堆??臻g的同步,可以及時釋放浪費(fèi)的內(nèi)存,提高嵌入式系統(tǒng)內(nèi)存的利用率;通過改變?nèi)蝿?wù)指針的指向,來更新需要檢測的當(dāng)前任務(wù),實(shí)現(xiàn)對系統(tǒng)的全部任務(wù)進(jìn)行遍歷檢測,盡可能地提高嵌入式系統(tǒng)內(nèi)存的利用率。
以下是本發(fā)明實(shí)施例提供的一種動態(tài)堆棧內(nèi)存管理裝置的實(shí)施例,動態(tài)堆棧內(nèi)存管理裝置與上述動態(tài)堆棧內(nèi)存管理方法屬于同一個發(fā)明構(gòu)思,在動態(tài)堆棧內(nèi)存管理裝置實(shí)施例中未詳盡描述的細(xì)節(jié)內(nèi)容,請參考上述動態(tài)堆棧內(nèi)存管理方法的實(shí)施例。
實(shí)施例三
請參考圖3,其是本發(fā)明實(shí)施例三提供的一種動態(tài)堆棧內(nèi)存管理裝置的架構(gòu)示意圖。
本實(shí)施例的,動態(tài)堆棧內(nèi)存管理裝置300,可以包括如下內(nèi)容:
空閑內(nèi)存確定模塊310,用于確定當(dāng)前任務(wù)的堆棧空間的堆棧指針位置至堆??臻g頂部位置之間的空閑內(nèi)存。
內(nèi)存頁釋放模塊320,用于如果空閑內(nèi)存大于預(yù)置閾值,則釋放堆棧指針位置至堆棧空間頂部位置之間的內(nèi)存頁。
重置模塊330,用于將堆棧指針位置所在內(nèi)存頁的起始位置重置為堆棧空間頂部位置。
綜上,在本技術(shù)方案中,確定當(dāng)前任務(wù)的堆??臻g的堆棧指針位置至堆??臻g頂部位置之間的空閑內(nèi)存,如果空閑內(nèi)存大于預(yù)置閾值,則釋放堆棧指針位置至堆棧空間頂部位置之間的內(nèi)存頁,將堆棧指針位置所在內(nèi)存頁的起始位置重置為堆棧空間頂部位置。通過釋放堆棧指針位置至堆??臻g頂部位置之間的內(nèi)存頁,來達(dá)到堆棧指針和堆??臻g的同步,可以及時釋放浪費(fèi)的內(nèi)存,提高嵌入式系統(tǒng)內(nèi)存的利用率。
實(shí)施例四
請參考圖4A,其是本發(fā)明實(shí)施例四提供的一種動態(tài)堆棧內(nèi)存管理裝置的架構(gòu)示意圖。本實(shí)施例與實(shí)施例三的主要區(qū)別在于,增加了任務(wù)鏈表建立模塊410、循環(huán)遍歷模塊430b和當(dāng)前任務(wù)更新模塊450。
本實(shí)施例的動態(tài)堆棧內(nèi)存管理裝置400,可以包括如下內(nèi)容:
任務(wù)鏈表建立模塊410,用于為正在運(yùn)行的所有任務(wù)建立任務(wù)鏈表,并設(shè)置任務(wù)指針,指向至少一個任務(wù),作為當(dāng)前任務(wù)。
空閑內(nèi)存確定模塊420,用于確定當(dāng)前任務(wù)的堆??臻g的堆棧指針位置至堆??臻g頂部位置之間的空閑內(nèi)存。
內(nèi)存頁釋放模塊430a,用于如果空閑內(nèi)存大于預(yù)置閾值,則釋放堆棧指針位置至堆??臻g頂部位置之間的內(nèi)存頁。
重置模塊440,用于將堆棧指針位置所在內(nèi)存頁的起始位置重置為堆??臻g頂部位置。
當(dāng)前任務(wù)更新模塊450,用于將任務(wù)指針設(shè)置為任務(wù)鏈表中的下一個任務(wù),以將下一個任務(wù)更新為當(dāng)前任務(wù),并返回空閑內(nèi)存確定模塊420。
循環(huán)遍歷模塊430b,用于如果空閑內(nèi)存不大于預(yù)置閾值,則將任務(wù)指針設(shè)置為任務(wù)鏈表中的下一個任務(wù),以將下一個任務(wù)更新為當(dāng)前任務(wù),并返回空閑內(nèi)存確定模塊420。
可選的,請參考圖4B,其是圖4A中空閑內(nèi)存確定模塊420的可選實(shí)施方式的架構(gòu)示意圖??臻e內(nèi)存確定模塊420可以包括位置獲取單元421和空閑內(nèi)存計(jì)算單元422,其中:
位置獲取單元421,用于每隔預(yù)置時長獲取當(dāng)前任務(wù)的堆??臻g的堆棧指針位置和堆??臻g頂部位置。
空閑內(nèi)存計(jì)算單元422,用于計(jì)算堆棧指針位置至堆??臻g頂部位置之間的空閑內(nèi)存。
綜上,在本技術(shù)方案中,通過建立任務(wù)鏈表,設(shè)置任務(wù)指針,以任務(wù)指針的指向來確定當(dāng)前任務(wù);通過釋放堆棧指針位置至堆??臻g頂部位置之間的內(nèi)存頁,來達(dá)到當(dāng)前任務(wù)的堆棧指針和堆??臻g的同步,可以及時釋放浪費(fèi)的內(nèi)存,提高嵌入式系統(tǒng)內(nèi)存的利用率;通過改變?nèi)蝿?wù)指針的指向,來更新需要檢測的當(dāng)前任務(wù),實(shí)現(xiàn)對系統(tǒng)的全部任務(wù)進(jìn)行遍歷檢測,盡可能地提高嵌入式系統(tǒng)內(nèi)存的利用率。
注意,上述僅為本發(fā)明的較佳實(shí)施例及所運(yùn)用技術(shù)原理。本領(lǐng)域技術(shù)人員會理解,本發(fā)明不限于這里所述的特定實(shí)施例,對本領(lǐng)域技術(shù)人員來說能夠進(jìn)行各種明顯的變化、重新調(diào)整和替代而不會脫離本發(fā)明的保護(hù)范圍。因此,雖然通過以上實(shí)施例對本發(fā)明進(jìn)行了較為詳細(xì)的說明,但是本發(fā)明不僅僅限于以上實(shí)施例,在不脫離本發(fā)明構(gòu)思的情況下,還可以包括更多其他等效實(shí)施例,而本發(fā)明的范圍由所附的權(quán)利要求范圍決定。