孫丹
摘要:不同于傳統(tǒng)Java程序,DaMk虛擬機(jī)能夠完成多個獨(dú)立進(jìn)程創(chuàng)建。基于這種認(rèn)識,本文在對Dalvik虛擬機(jī)展開分析的基礎(chǔ)上,對Dalvik虛擬機(jī)進(jìn)程模型進(jìn)行了探討,發(fā)現(xiàn)其能夠在吸收Linux和Java進(jìn)程控制特點(diǎn)基礎(chǔ)上,利用特有進(jìn)程實(shí)現(xiàn)API控制,因此在DaMk虛擬機(jī)應(yīng)用時還要把握這一特征,加強(qiáng)平臺進(jìn)程控制管理。
關(guān)鍵詞:DaMk虛擬機(jī)進(jìn)程模型
引言
Android平臺目前是智能手機(jī)廣泛應(yīng)用的平臺,其采用Dalvik虛擬機(jī)技術(shù)保證手機(jī)多個應(yīng)用程序在運(yùn)行過程中減少資源占用,并保持較高運(yùn)行效率Da Mk虛擬機(jī)之所以能夠?qū)崿F(xiàn)平臺程序兼容優(yōu)化,與其進(jìn)程創(chuàng)建特性有著直接關(guān)系。因此,還要加強(qiáng)Dalvik虛擬機(jī)進(jìn)程模型分析,以便掌握Dalvik虛擬機(jī)進(jìn)程創(chuàng)建優(yōu)缺點(diǎn),達(dá)到合理應(yīng)用虛擬技術(shù)的目標(biāo)。
1 Dalvik虛擬機(jī)概述
Dalvik虛擬機(jī)實(shí)際上就是Google公司為Android平臺設(shè)計(jì)的虛擬機(jī),是Android移動設(shè)備平臺核心組成部分之一。采用Dalvik虛擬機(jī),能夠?yàn)檗D(zhuǎn)換為Dalvik Executable(簡稱,dex)格式的Java程序運(yùn)行提供支持。作為Dalvik專用壓縮格式,.dex能夠在處理速度及內(nèi)存有限的運(yùn)算系統(tǒng)中得到應(yīng)用,可以同時對多個虛擬機(jī)實(shí)例進(jìn)行運(yùn)用,并將每個應(yīng)用當(dāng)成是獨(dú)立Linux進(jìn)程。通過創(chuàng)建獨(dú)立進(jìn)程,能夠避免虛擬機(jī)崩潰時出現(xiàn)所有程序被關(guān)閉問題。但與此同時,創(chuàng)建多個獨(dú)立進(jìn)程,可能導(dǎo)致系統(tǒng)運(yùn)行速度減慢,因此Dalvik虛擬機(jī)被看成是拖慢Android的根本原因。
2 Dalvik虛擬機(jī)進(jìn)程模型分析
2.1虛擬機(jī)進(jìn)程與線程
所謂的Dalvik虛擬機(jī)進(jìn)程,從通俗意義上來講就是Android應(yīng)用程序進(jìn)程,實(shí)際Dalvik虛擬機(jī)在創(chuàng)建進(jìn)程時,將對一個成員函數(shù)進(jìn)行調(diào)用。而一旦發(fā)現(xiàn)函數(shù)為JNI方法,其將直接跳轉(zhuǎn)到相應(yīng)地址執(zhí)行程序,即在本地操作系統(tǒng)上運(yùn)行程序,并非利用虛擬機(jī)解釋器執(zhí)行操作。因此采用JNI方法,可以實(shí)現(xiàn)Android應(yīng)用程序與本地操作系統(tǒng)直接通信。除了對Java代碼進(jìn)行執(zhí)行,Dalvik虛擬機(jī)能夠執(zhí)行Native代碼,即c/c++函數(shù)。在函數(shù)調(diào)用期間,虛擬機(jī)能夠利用本地操作系統(tǒng)直接進(jìn)行進(jìn)程或線程創(chuàng)建,得到相應(yīng)的Linux進(jìn)程和線程。利用Native代碼創(chuàng)建進(jìn)程,需要對虛擬機(jī)進(jìn)行加載.因此可以看成是虛擬機(jī)的一個進(jìn)程。如果創(chuàng)建出的線程能夠?qū)ava代碼進(jìn)行執(zhí)行,則能看成是虛擬機(jī)的一個線程。
2.2進(jìn)程創(chuàng)建過程
Dalvik虛擬機(jī)進(jìn)程能夠利用Activity Manager Service服務(wù)提供。分析進(jìn)程創(chuàng)建過程可以發(fā)現(xiàn),該服務(wù)能夠利用android.Os.Process類的靜態(tài)成員函數(shù)start進(jìn)行Zygote進(jìn)程創(chuàng)建,然后由該進(jìn)程通過dalvik.system.Zygote類的靜態(tài)成員函數(shù)forkAndSpecialize實(shí)現(xiàn)虛擬機(jī)線程創(chuàng)建。相較于進(jìn)程,線程占用資源少,能夠與其他線程共享資源。但線程管理相對麻煩,需要解決同步問題-個線程的崩潰可能引起其他線程崩潰從Java語言層面來講,可以利用java.lang.Thread類的成員函數(shù)start進(jìn)行虛擬機(jī)線程創(chuàng)建。在實(shí)際創(chuàng)建過程中,將完成本地操作系統(tǒng)進(jìn)程創(chuàng)建,得到Linux進(jìn)程。不同于之前創(chuàng)建的Linux進(jìn)程,該進(jìn)程無對應(yīng)虛擬機(jī)實(shí)例,因此不會自動附加到虛擬機(jī)中,而是需要對Java代碼進(jìn)行執(zhí)行才能完成附加。
2.3創(chuàng)建方法比較
由Dalvik虛擬機(jī)進(jìn)程創(chuàng)建過程可知,其基本采用本地方法實(shí)現(xiàn)進(jìn)程創(chuàng)建。采用fork方法,得到的子進(jìn)程僅為半初始化狀態(tài),是zygote進(jìn)程。在父進(jìn)程完成addNeWHeap調(diào)用的情況下,將采用寫時復(fù)制方式實(shí)現(xiàn)進(jìn)程共享,完成初始化操作。采用forkAndSpecialize方法,將單獨(dú)完成子進(jìn)程的創(chuàng)建,需要對HeapWorker線程進(jìn)行啟動,完成對象終結(jié)函數(shù)的執(zhí)行,進(jìn)行對象清理和歸隊(duì)引用,從而完成線程調(diào)試。通過執(zhí)行addNewHeap,能夠進(jìn)行新堆創(chuàng)建,為特定任務(wù)運(yùn)行提供支持。采用forkSystemServer方法,基本與forkAndSpecialize擁有相同進(jìn)程創(chuàng)建過程,但在子進(jìn)程結(jié)束后將不會進(jìn)行父進(jìn)程的創(chuàng)建。在Linux進(jìn)程中,對forx進(jìn)行調(diào)用,得到的父子進(jìn)程堆棧不存在關(guān)聯(lián),但除dex文件以往的其他文件均能對虛擬機(jī)核心庫代碼進(jìn)行共享,因此不僅可以使Linux進(jìn)程的優(yōu)勢充分發(fā)揮,也能使系統(tǒng)內(nèi)存得到節(jié)省。從比較結(jié)果來看,Dalvik虛擬機(jī)在對傳統(tǒng)Java進(jìn)程控制API方式進(jìn)行保留的同時,也對Linux操作系統(tǒng)特點(diǎn)進(jìn)行了汲取,能夠利用特有進(jìn)程實(shí)現(xiàn)API的控制,利用forx語義或控制信號實(shí)現(xiàn)進(jìn)程創(chuàng)建,因此在系統(tǒng)啟動時就能完成系統(tǒng)服務(wù)進(jìn)程創(chuàng)建。
3結(jié)論
綜上所述,在開源的Android系統(tǒng)中,Dalvik虛擬機(jī)能夠通過加強(qiáng)Java應(yīng)用和吸取Linux特點(diǎn)利用特有進(jìn)程完成API控制,因此才能在大量智能移動平臺上得到使用和移植。相信伴隨著虛擬技術(shù)的發(fā)展,Dalvik虛擬機(jī)也將突破運(yùn)行速度方面的局限性。
參考文獻(xiàn)
[1]尹學(xué)淵,陳興蜀,陶術(shù)松,等.一種無代理虛擬機(jī)進(jìn)程監(jiān)控方法[J],南京大學(xué)學(xué)報(bào)(自然科學(xué)),2019,55(02):221 230.
[2]陳佳昕,虛擬機(jī)隱藏進(jìn)程檢測系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J]現(xiàn)代計(jì)算機(jī)(專業(yè)版),2019(O1):93-96.