專利名稱:在虛擬機中管理棧的設(shè)備和方法
技術(shù)領(lǐng)域:
與本發(fā)明一致的方法和設(shè)備涉及在虛擬機中管理棧。更具體地說,本發(fā)明涉及可在對棧執(zhí)行壓?;蛘叱鰲r通過使用與處理器直接連接的存儲器來減少棧開銷的在虛擬機中管理棧的設(shè)備和方法。
背景技術(shù):
通常,虛擬機提供保證應(yīng)用的移動性的標(biāo)準(zhǔn)應(yīng)用執(zhí)行環(huán)境。這里,這種虛擬機的典型示例是Java虛擬機(JVM)。
Java是一種可以用于產(chǎn)生獨立平臺代碼的面向?qū)ο缶幊陶Z言。Java代碼通過Java編譯器被編譯為Java字節(jié)代碼,并且JVM執(zhí)行所述Java字節(jié)代碼。
圖1A示出了一般JVM的結(jié)構(gòu)。
如所示,JVM包括類加載器11、執(zhí)行引擎12、方法區(qū)13、堆14、Java棧15、個人計算機(PC)寄存器16和本地方法棧17。
類加載器11從網(wǎng)絡(luò)或者文件系統(tǒng)讀取Java類文件,根據(jù)包括在類文件中的內(nèi)部信息將該文件放入存儲器中的適當(dāng)位置,并且初始化內(nèi)部狀態(tài)。
作為用于執(zhí)行類的執(zhí)行代碼的執(zhí)行引擎12識別并執(zhí)行JVM機器命令,并在執(zhí)行的同時將JVM命令轉(zhuǎn)換為中央處理單元(CPU)的機器代碼,以提高速度。
圖1B示出了傳統(tǒng)Java類文件的結(jié)構(gòu)。
如所示,Java類通常以類文件格式被發(fā)送或者被存儲,并且所述類文件格式包括各種關(guān)于類的屬性。這里,所述類文件格式包括指示基本屬性的類頭、管理全部常量的常量池、包括關(guān)于類文件的接口的信息的接口、包括關(guān)于文件的信息的字段和被存儲為字節(jié)代碼的方法。
圖2A示出了用于通過JVM管理Java棧的基本單位。
StackStruct用于管理棧塊(chuck),并且StackStruct包括棧的大小和下一棧的指針信息。
FrameStruct用于管理每當(dāng)調(diào)用函數(shù)時產(chǎn)生的幀,并且FrameStruct包括關(guān)于正在執(zhí)行的方法的信息、前一幀的指針、前一棧的指針、前一程序計數(shù)器、監(jiān)視器對象和屬于當(dāng)前幀的棧塊。
圖2B示出了傳統(tǒng)棧管理結(jié)構(gòu)。這里,對管理JVM 10中的棧的過程進(jìn)行描述。當(dāng)執(zhí)行壓棧和出棧時發(fā)生管理棧的過程。
首先,在通過調(diào)用類中的函數(shù)執(zhí)行對棧的壓棧的情況下,通過檢查棧塊23的空間來檢查是否可以添加幀指針。
隨后,如果棧塊23的空間不充足,則檢查是否存在下一棧塊。在不存在下一棧塊的情況下,從存儲器中的堆區(qū)分配新的棧塊22。
如果棧塊22已經(jīng)在下一定位中被分配,則棧塊22被指定為當(dāng)前棧塊。
隨后,在指定的棧塊22生成幀指針24,并且指定在最高的幀指針中生成的幀指針24。
隨后,當(dāng)前幀指針24的棧塊被指定為分配的區(qū)的棧塊22。
此外,在通過調(diào)用函數(shù)執(zhí)行出棧的情況下,當(dāng)前幀指針24移動到前一幀指針,例如,幀指針25。
隨后,當(dāng)前幀指針25的棧塊被指定為當(dāng)前幀指針25指向的棧塊23。
然而,在以以上所示的方式操作棧的情況下,棧區(qū)存在于通過外部總線連接的通用存儲區(qū)中。
這樣,根據(jù)傳統(tǒng)技術(shù),為了處理存儲器中的數(shù)據(jù),存儲器中的數(shù)據(jù)應(yīng)當(dāng)被讀取到寄存器,但是,由于數(shù)據(jù)是經(jīng)由外部總線讀取的,所以傳輸速率變得較低,這是一個問題。
第2004-111193號韓國未審查專利(Management of Stack-Based MemoryUsage in a Processor)公開了一種技術(shù),即,確定數(shù)據(jù)子系統(tǒng)是作為高速緩沖存儲器還是禁止從外部存儲器的行取(line fetch)的便箋式存儲器操作,并對控制位編程以使該數(shù)據(jù)子系統(tǒng)根據(jù)該確定被操作為高速緩沖存儲器或是便箋式存儲器。然而,該專利沒有涉及當(dāng)讀取棧時從與處理器直接連接的存儲器,即,不是連接到外部總線的通用存儲器中讀取數(shù)據(jù)的技術(shù)。
發(fā)明內(nèi)容
本發(fā)明示例性實施例克服以上缺點和以上沒有描述的其他缺點。此外,不要求本發(fā)明克服上述缺點,并且本發(fā)明示例性實施例可以不克服上述任何問題。
本發(fā)明提供一種在虛擬機中管理棧的設(shè)備和方法,所述設(shè)備和方法可以通過在直接與處理器連接的存儲器中定位虛擬機的棧,縮短訪問棧的時間來提高性能。
根據(jù)本發(fā)明示例性實施例,提供一種用于在虛擬機中管理棧的設(shè)備,所述設(shè)備包括第一存儲器,如果在虛擬機中執(zhí)行壓棧和出棧中的至少一個,則所述第一存儲器檢查棧塊的空間并分配幀指針;和第二存儲器,與外部總線連接,并存儲通過所述外部總線從第一存儲器復(fù)制的幀。
根據(jù)本發(fā)明另一示例性實施例,提供一種在虛擬機中管理棧的方法,所述方法包括如果在預(yù)定棧內(nèi)執(zhí)行壓棧,則檢查第一存儲器中的棧塊的空間;如果所述棧塊的空間不足,則檢查是否存在第二存儲器中分配的棧塊;如果在第二存儲器中存在棧塊,則將第一存儲器中存儲的幀指針復(fù)制到第二存儲器的棧塊;將第一存儲器的棧塊指定為當(dāng)前棧塊,并給指定的棧塊分配新的幀指針;和將幀指針指定為當(dāng)前幀指針。
根據(jù)本發(fā)明另一示例性實施例,提供一種在虛擬機中管理棧的方法,所述方法包括如果在預(yù)定棧內(nèi)執(zhí)行出棧,則將當(dāng)前幀指針移到前一幀指針;將當(dāng)前幀指針指向的棧塊指定為當(dāng)前棧塊;檢查指定的棧塊是否位于第一存儲器;如果所述棧塊不位于第一存儲器,則將所述棧塊復(fù)制到第一存儲器;和將位于第一存儲器的棧塊指定為當(dāng)前棧塊。
通過結(jié)合附圖對本發(fā)明示例性實施例的詳細(xì)描述,本發(fā)明的以上和其他方面將變得更加清楚,其中圖1A示出了一般Java虛擬機(JVM)的結(jié)構(gòu)。
圖1B示出了傳統(tǒng)Java類文件的結(jié)構(gòu)。
圖2A示出了通過JVM管理Java棧的基本單位。
圖2B示出了傳統(tǒng)棧管理結(jié)構(gòu)。
圖3示出了根據(jù)本發(fā)明示例性實施例的在虛擬機中管理棧的設(shè)備的框圖。
圖4A、圖4B和圖4C示出了根據(jù)本發(fā)明另一示例性實施例的用于在虛擬機中管理棧的設(shè)備中管理棧的操作。
圖5是示出根據(jù)本發(fā)明另一示例性實施例的在虛擬機中管理棧的方法中的壓棧操作的流程圖。
圖6是示出根據(jù)本發(fā)明另一示例性實施例的在虛擬機中管理棧的方法中的出棧操作的流程圖。
圖7是示出根據(jù)本發(fā)明另一示例性實施例的通過執(zhí)行在虛擬機中管理棧的方法得來的測量性能結(jié)果的曲線圖。
具體實施例方式
將參照附圖詳細(xì)描述本發(fā)明的示例性實施例。
通過參照以下對示例性實施例和附圖的詳細(xì)描述,本發(fā)明將被更加容易地理解。然而,本發(fā)明可以以很多不同形式被實施,不應(yīng)當(dāng)被理解為限于在此所述的示例性實施例。而是提供了這些實施例,從而本公開將全面和完整,并且本發(fā)明的構(gòu)思將被完全地轉(zhuǎn)達(dá)給本領(lǐng)域技術(shù)人員,并且本發(fā)明僅由權(quán)利要求所限定。貫穿說明書,相同的標(biāo)號指示相同的組件。
以下參照根據(jù)本發(fā)明示例性實施例的用戶接口、方法和計算機程序產(chǎn)品的流程圖例示來描述本發(fā)明。應(yīng)該理解,流程圖例示的每一個方框和在流程圖例示中的方框的組合可由計算機程序指令實現(xiàn)。這些計算機程序指令可被提供給通用計算機、專用計算機、或者其他可編程數(shù)據(jù)處理設(shè)備的處理器以產(chǎn)生設(shè)備,從而經(jīng)計算機或者其他可編程數(shù)據(jù)處理設(shè)備的處理器執(zhí)行的指令創(chuàng)建用于實現(xiàn)在一個流程圖方框或多個流程圖方框中描述的功能的裝置。
這些計算機程序指令也可被存儲在可指導(dǎo)計算機或者其他可編程數(shù)據(jù)處理設(shè)備以特定方式工作的計算機可用或計算機可讀存儲器中,以便存儲在計算機可用或計算機可讀存儲器中的指令生產(chǎn)包括執(zhí)行在一個流程圖方框或多個流程圖方框中描述的功能的指令裝置的產(chǎn)品。
計算機程序指令也可被載入計算機或其他可編程數(shù)據(jù)處理設(shè)備以使得一系列操作步驟在計算機或其他可編程設(shè)備上被執(zhí)行以產(chǎn)生計算機執(zhí)行的過程,從而在計算機或其他可編程設(shè)備上執(zhí)行的指令提供用于實現(xiàn)在一個流程圖方框或多個流程圖方框中描述的功能的步驟。
并且,流程圖例示的每個方框可表示模塊、代碼段或代碼部分,其包括一個或多個用于實現(xiàn)特定邏輯功能的可執(zhí)行指令。還應(yīng)該注意,在一些可選擇的實現(xiàn)中,在方框中提到的功能可不按所述順序發(fā)生。例如,根據(jù)所涉及的功能,連續(xù)顯示的兩個方框?qū)嶋H上可能基本上同時發(fā)生,或者所述方框有時可能以相反的順序被執(zhí)行。
圖3示出了根據(jù)本發(fā)明示例性實施例的用于在虛擬機中管理棧的設(shè)備的框圖。
本發(fā)明示例性實施例不限于特定虛擬機,而可被應(yīng)用于所有類型的虛擬機,諸如,微軟公司的普通語言運行時(CLR)和Smalltalk。此外,為了便于描述,在此描述中使用由ARM有限公司生產(chǎn)的緊密耦合存儲器(TCM)。然而,本發(fā)明的這個示例性實施例不限于TCM,而包括直接與處理器通信的全部類型的存儲器。
如所示,ARM926EJ-S微單元300完全兼容,并且包括32位精簡指令集計算機(RISC)CPU、靈活的指令大小、數(shù)據(jù)高速緩存、TCM接口和存儲器管理單元(MMU)。
此外,ARM926EJ-S微單元300支持單獨指令和數(shù)據(jù)總線,并且與先進(jìn)的微控制器總線體系結(jié)構(gòu)(AMBA)數(shù)據(jù)總線兼容,這與適用于單獨指令和基于多層AHB的系統(tǒng)的AHB接口兼容。
此外,ARM926EJ-S微單元300實現(xiàn)指令集,所述指令集包括改進(jìn)的16×32位多層,并執(zhí)行單周期操作。這里,所述指令集包括16位定點數(shù)字信號處理器(DSP)指令,提高了多信號處理算法和應(yīng)用的性能,并且支持Java字節(jié)代碼的執(zhí)行。
此外,ARM926EJ-S微單元300可執(zhí)行大多數(shù)操作系統(tǒng)和中間件,并且可實現(xiàn)單微控制器單元(MCU)DSP和Java解決方案。此外,提高了Java字節(jié)代碼的執(zhí)行效率,消耗非常少的Java功能,并且提高了Java即時(JIT)編譯器的性能。ARM926EJ-S微單元300被應(yīng)用與下一代智能電話、個人數(shù)字助理(PDA)、第三代基帶、應(yīng)用處理器、基于平臺操作系統(tǒng)的裝置、數(shù)字靜物相機、音頻和視頻解碼器等。
此外,數(shù)據(jù)TCM(DTCM)(第一存儲器)310是用于定位棧塊的空間以便提高虛擬機的性能。DTCM包括一個或者多個棧塊和幀指針。
此外,DTCM 310是當(dāng)執(zhí)行壓棧和出棧時使用的存儲空間,在用于添加新的幀指針的空間不充足的情況下,存儲在DTCM中的幀指針被復(fù)制到第二存儲器320,并隨后分配新的幀指針。
第二存儲器320被連接到外部總線(AHB),并且包括多堆區(qū)。這里,第二存儲器320指的是SDRAM、雙倍數(shù)據(jù)速率SDRAM(DDR SDRAM)或者存儲器總線DRAM(RDRAM)。
此外,第二存儲器320不存儲當(dāng)前棧塊和幀指針,而是存儲從DTCM 310復(fù)制的幀指針。圖4A、圖4B和圖4C顯示了在存在于TCM區(qū)的堆區(qū)和第二存儲器的堆區(qū)中管理棧的過程。
由此,本發(fā)明的示例性實施例管理在ARM926EJ-S的DTCM(第一存儲器310)中使用的棧(或者幀指針),因此,快速執(zhí)行提高性能的虛擬機的操作。
圖4A、圖4B和圖4C示出了根據(jù)本發(fā)明另一示例性實施例的用于在虛擬機中管理棧的設(shè)備中的管理棧的操作。這里,TCM區(qū)包括一個或者多個棧塊和幀指針。
如圖4A中所示,在通過調(diào)用函數(shù)執(zhí)行壓棧的情況下,檢查TCM區(qū)的棧塊,以便確定是否可添加新的幀指針(例如,圖4C中的標(biāo)號450)。
在因為當(dāng)前棧塊的空間不足而不能添加幀指針的情況下,檢查是否存在已經(jīng)在下一堆區(qū)(例如標(biāo)號420)分配的棧塊。這里,在下一堆區(qū)分配的棧塊應(yīng)當(dāng)具有用于存儲已經(jīng)被存儲在TCM 410中的幀指針412到414的充足空間。
在沒有已經(jīng)被分配給下一堆區(qū)(例如標(biāo)號420)的棧塊的情況下,如圖4B所示生成新的堆區(qū)430,并且分配棧塊431。
隨后,已經(jīng)存儲在TCM區(qū)410的幀指針412到414被復(fù)制到分配的堆區(qū)430的棧塊431。
隨后,如圖4C所示,TCM區(qū)410的棧塊411被指定為當(dāng)前棧塊,并且新的幀指針450被分配給當(dāng)前棧塊411。隨后,幀指針450被指定為當(dāng)前幀指針。
此外,在存在已經(jīng)在下一堆區(qū)(例如標(biāo)號420)分配的棧塊421的情況下,已經(jīng)被存儲在TCM區(qū)410中的幀指針412到414被復(fù)制到棧塊421。這里,生成新的堆區(qū)430的過程被省略。
此外,當(dāng)將棧復(fù)制到TCM區(qū)410時,鏈接列表可被改為偏移(offset)類型以優(yōu)化性能,并且可在另一存儲區(qū)中定位下一棧。
例如,如圖4B所示,在測量棧塊411的底端地址和每個幀指針之間的相對距離451到453之后,基于測量的相對距離計算相對距離的差。隨后,如果幀指針被復(fù)制到下一棧塊,則該幀指針可基于相對距離的差被定位。
圖5是示出根據(jù)本發(fā)明另一示例性實施例的在虛擬機中管理棧的方法中的壓棧操作的流程圖。
首先,如果執(zhí)行壓棧(S500),則檢查TCM區(qū)410的棧塊空間(S510)。這里,檢查棧塊空間以為了添加新的幀指針。
在TCM區(qū)410的棧塊空間不足的情況下(S520),檢查是否有分配給堆區(qū)的棧塊(S530)。這里,在堆區(qū)分配的棧塊應(yīng)當(dāng)具有用于存儲存儲在TCM區(qū)410中的幀指針的充足的空間。此外,在分配的堆區(qū)中沒有棧塊的情況下(S540),在新堆區(qū)中分配棧塊(S550),隨后,存儲在TCM區(qū)410中的幀指針被復(fù)制到堆區(qū)的棧塊(S560)。
隨后,TCM區(qū)410的棧塊被指定為當(dāng)前棧塊(S570),并且新的幀指針被分配給指定為當(dāng)前棧塊的棧塊(S580)。
隨后,存儲在TCM區(qū)410的棧塊中的新的幀指針被指定為當(dāng)前幀指針(S590)。
此外,在分配的堆區(qū)中存在棧塊的情況下(S540)。隨后,以相同的方式執(zhí)行操作S560到S590。
此外,在TCM區(qū)410的棧塊空間充足(S520)的情況下,TCM區(qū)410的棧塊被指定為當(dāng)前棧塊(S570)。隨后,以相同的方式執(zhí)行步驟S580和S590。
因此,當(dāng)在棧中寫入數(shù)據(jù)時,因為該數(shù)據(jù)被寫入直接與處理器相連的存儲器(例如,TCM區(qū))中,所以減少了寫入消耗的時間。
圖6是示出根據(jù)本發(fā)明另一示例性實施例的在虛擬機中管理棧的方法中的出棧操作的流程圖。參照圖4B和4C對出棧操作進(jìn)行描述。
首先,如果執(zhí)行出棧,則當(dāng)前幀指針(例如,圖4C中的標(biāo)號450)被移動到前一幀指針(例如標(biāo)號422)(S600和S610)。
隨后,存在當(dāng)前移動的幀指針(例如標(biāo)號422)的棧塊(例如標(biāo)號421)被指定為當(dāng)前棧塊(S620),并且檢查指定的棧塊(例如標(biāo)號421)是否位于TCM區(qū)410。
在當(dāng)前棧塊(例如標(biāo)號421)不位于TCM區(qū)410中的情況下(S630),當(dāng)前棧塊(例如標(biāo)號421)被復(fù)制到TCM區(qū)410(S640),并且當(dāng)前棧塊(例如標(biāo)號421)被指定為TCM區(qū)410的下一棧塊(S650)。
隨后,TCM區(qū)410的棧塊(例如標(biāo)號411)被指定為當(dāng)前棧塊(S660)。
此外,在當(dāng)前棧塊(例如標(biāo)號421)位于TCM區(qū)410(S630)的情況下,棧塊(例如標(biāo)號421)被指定為當(dāng)前棧塊(S660)。
因此,當(dāng)讀取棧中的數(shù)據(jù)時,因為從直接與處理器相連的存儲器(例如,TCM區(qū))中讀取該數(shù)據(jù),所以減少了讀取消耗的時間。
圖7是示出根據(jù)本發(fā)明另一示例性實施例的通過執(zhí)行在虛擬機中管理棧的方法得來的測量性能的結(jié)果的曲線圖。
如所示,Java虛擬機的棧位于TCM 410,并且比較了傳統(tǒng)C解釋器和ASM解釋器的性能。
這樣,通過在TCM 410中而不是外部存儲器中定位所述棧,性能被額外提高了1.6倍,而總體性能被提高了3到4倍。
本領(lǐng)域普通技術(shù)人員應(yīng)當(dāng)理解,在不脫離由權(quán)利要求限定的本發(fā)明示例性實施例的精神和范圍的情況下,可在形式和細(xì)節(jié)上做出各種替換、修改和改變。因此,清楚的是上述示例性實施例僅為示例性目的而不被理解為本發(fā)明的限定。
本發(fā)明示例性實施例的方法和設(shè)備可具有以下優(yōu)點。
首先,當(dāng)執(zhí)行壓?;蛘叱鰲r,使用直接與處理器連接的存儲器(例如,TCM),因此減少了棧開銷,從而提高了虛擬機的性能。
其次,當(dāng)在棧內(nèi)讀取或者寫入數(shù)據(jù)時,數(shù)據(jù)被讀取并寫入到直接與處理器連接的存儲器(例如,TCM)中,而不是通過外部總線,因此減少了讀取或者寫入花費的時間,從而提高了虛擬機的總體性能。
權(quán)利要求
1.一種用于在虛擬機中管理棧的設(shè)備,所述設(shè)備包括第一存儲器,如果在虛擬機中執(zhí)行壓棧和出棧中的至少一個,則所述第一存儲器檢查棧塊的空間并分配幀指針;和第二存儲器,與外部總線連接,并存儲通過所述外部總線從第一存儲器復(fù)制的幀。
2.如權(quán)利要求1所述的設(shè)備,其中,第一存儲器在不使用外部總線的情況下直接與處理器通信。
3.一種在虛擬機中管理棧的方法,所述方法包括如果在棧內(nèi)執(zhí)行壓棧,則檢查第一存儲器中的第一棧塊的空間;如果第一棧塊的空間不足,則檢查是否存在第二存儲器中分配的第二棧塊;如果第二棧塊在第二存儲器中,則將第一存儲器中存儲的幀指針復(fù)制到第二存儲器的第二棧塊;將第一存儲器的第一棧塊指定為當(dāng)前棧塊,并給指定的棧塊分配新的幀指針;和將幀指針指定為當(dāng)前幀指針。
4.如權(quán)利要求3所述的方法,其中,如果第二棧塊不存在于第二存儲器中,則分配新的棧塊。
5.如權(quán)利要求3所述的方法,其中,如果存儲在第一存儲器中的幀指針被復(fù)制到第二存儲器,則棧類型鏈接列表被改為偏移類型。
6.如權(quán)利要求3所述的方法,其中,第一存儲器在不使用外部總線的情況下直接與處理器通信。
7.一種在虛擬機中管理棧的方法,所述方法包括如果在棧內(nèi)執(zhí)行出棧,則將當(dāng)前幀指針移到前一幀指針;將當(dāng)前幀指針指向的棧塊指定為當(dāng)前棧塊;檢查指定的棧塊是否位于第一存儲器;如果所述棧塊不位于第一存儲器,則將所述棧塊復(fù)制到第一存儲器;和將位于第一存儲器的棧塊指定為當(dāng)前棧塊。
8.如權(quán)利要求7所述的方法,其中,如果將棧塊復(fù)制到第一存儲器,則棧類型鏈接列表被改為偏移類型。
9.如權(quán)利要求8所述的方法,其中,第一存儲器在不使用外部總線的情況下直接與處理器通信。
全文摘要
提供一種在虛擬機中管理棧的設(shè)備和方法。所述設(shè)備包括第一存儲器,如果在虛擬機中執(zhí)行壓棧和出棧中的至少一個,則所述第一存儲器檢查棧塊的空間并分配幀指針;和第二存儲器,與外部總線連接,并存儲通過所述外部總線從第一存儲器復(fù)制的幀。
文檔編號G06F12/06GK101034374SQ20071008608
公開日2007年9月12日 申請日期2007年3月9日 優(yōu)先權(quán)日2006年3月10日
發(fā)明者崔永鎬, 宋孝晶, 崔正必 申請人:三星電子株式會社