Dalvik 虚拟机进程模型分析

misssss

贡献于2015-01-24

字数:0 关键词: 嵌入式开发

第20卷.第2期2010年2月计算机技术与发展V01.20No.2(_X3MPUTERTFX’FINOI.OGYANq)DEVEIX)PMENTFeb.2010Dalvik虚拟机进程模型分析周毅敏,陈榕(同济大学基础软件工程中心,上海200092)摘要:Android手机操作系统是Google于2008年推出的智能手机操作系统,它的所有应用都是基于Java语言的,它的类Java虚拟机Dalvik提供了所有应用的运行时环境。Dalvik是一个面向Linux作为嵌入式操作系统设计的虚拟机,尤其是它的面向进程的设计,充分利用了Linux进程管理的特点。介绍了Dalvik所依赖的基础,即Linux操作系统内核中进程管理的一些特性和传统Java程序对进程的控制;进而论述了Dalvik的进程模型的特点,从API和本地代码两个层面具体阐述了进程运行、创建和之间通信的部分细节。文中旨在为Dalvik的研究和应用提供参考。关键词:Dalvik;虚拟机;结合子;fork;写时复制中图分类号-.TP311.52文献标识码:A文章编号:1673—629X(2010)02—0083—04AnalysisaboutProcessinDalvikVirtualMachinezI-IOUYi—min,CHENRong(SystemSoftwareEngineeringCentreofTongjiUniversity,Shanghai200092,China)Al强tract:Androidmobileoperatingsystemisall0Sreleasedat2008byGougle.AlltheapplicationsalewrittenbyJavalanguage.Itsse.mi—JavavirtualmachineDalvikprovidesthewholeenvironment.However.Dalvikisbased∞theLinuxoperatingsystemkernelespe.ciallyitsdesignoftheprocessmanag㈣twhichtakeadvantageofthefeaturesofLinuxpl'OC雠.n诗articlefirstlyintroducesthepro-o嘲inthekerneIofLinuxoperating驰曲andtheprocessinthetraditionalJavaprogramandthenillustratesthefeaturesofDalvikpro-嘲andalsodepicmsomedetailsofpro·2esses’mnningandcreationandcommunicationsbetweenthemthroughthetwohyersAPIandnativecodes.n硷aimofthisarticleistOprovideardereneeforDalvik’sresearchandapplication.Keywords:Dalvik;virt吲machine;zygote;fork;copy—on—writeO引言And商d【1]是集操作系统、中间件和关键应用为一体的运行于移动设备上的软件包。Dalvik虚拟机是Google自主开发的代号为Dalvik的Java虚拟机技术。Google自主开发Java虚拟机的目的,是避开Sun公司的授权问题,针对移动手机在保证API[2,3J方面兼容的同时对Java虚拟机【4’5J进行大幅优化,使其占用资源更少、运行效率更高。Dalvik是Android的重要组成部分。Android是一个很大的范畴,其中操作系统部分基于Linux2.6的内核,而很多其他组成部分包括Dalvik的实现与操作系统的内核不可分割。笔者深入研究了收稿日期:2009—03—30;修回日期:2009一07一06基金项目:国家“863”计划资助项目(2001AAll3400);国家移动通信产舳研究开发专项项目(财政部(财建[2005]182g-),信息产业部(信部请醒i[2005]297号))作者简介:周毅敏(1980一),男,上海人。硕上研究生,研究矗向为嵌入式操作系统、系统软件支撑技术;陈榕。博士生导师,教授,科泰世纪首席科学家,研究方向为嵌入式系统、构件技术。Dalvik虚拟机的源代码,发现较为底层的部分直接调用了Unu)【内核的部分[6J。l基本概念1.1Linux环境中的进程和大多数操作系统一样,进程是Linux调度的最小单位。调度采用“有条件抢占式”的方式。进程可以自愿地让出执行机会,也可以在必要的时候抢占执行。这样,既为多任务应用提供了灵活性。又为实时系统提供了便利。Linux的进程结构体(进程控制块,PCB)可谓包罗万象,文件系统、虚拟内存、页面管理、信号应有尽有,使进程资源的控制变得更直接更容易。与有些操作系统创建进程的方式不同的是,Linu)【使用fork语义而不是creat—proc,这是因为复制进程的效率高于创建进程的效率。即使对应用程序而言fork不如ere.at—proe易用,但是通过提供一个将复制与创建结合在一起的库函数就可提高易用性。此外,Linux进程间通信使用管道、信号、报文、共享内存[7-9J等多种途径。 万方数据 ·84-计算机技术与发展第20卷1.2Java编程环境中的进程在传统Java编程环境中,以SunJava手机平台Phoneme(https://phoneme.dev.java.net)为例,当虚拟机启动一个Java应用后,程序逻辑在操作系统中运行于单进程状态。虽然对应用开发者而言,存在可以使用的多线程模型,但是对操作系统而言这些线程并不可见,它们完全是虚拟机模拟出来的,操作系统所见到的只是单线程的进程【10】。虽然,API中也提供了创建操作系统意义上的进程的类,即java.1ang.Process和java.1ang.ProcessBuilder类,可是似乎没有提供更多的API用于进程间通信。1.3Dalvik编程环境中的进程Dalvik虚拟机中保留了传统Java进程控制的API,并结合Linux操作系统的特点加入了特有的进程控制API,可以控制信号甚至是fork语义的进程创建。事实上在Android启动时就已启动了Dalvik虚拟机,并且使用fork语义创建了系统服务进程。与Phoneme不同的是,Dalvik虚拟机上的线程是对应于操作系统线程的,而且Dalvik中的进程对应于操作系统中的进程。Dalvik启动的进程与操作系统进程的关系如图1所示。图1Dalvik启动的进程与操作系统进程的关系图2Dalvik运行时的进程模型2.1Dalvik运行时进程关系Linu)c创建进程时,会共享.text正文段,并且对静态数据采用写时复制(Copy—on—write)的方式操作,这样当一个进程把Java运行时所需要的基础类库等加载了以后,再fork()出来的进程就“继承”了父进程的这些Java运行时环境。所以在Dalvik中,引入了zy—gote(结合子)进程的概念,它加载了Java基础类库,在虚拟机启动参数中包含一Xzygote。并可以创建子进程,此模式称为Zygote模式。Dalvik虚拟机单个实例在Zygote模式下运行时的进程关系图如图2所示。图2Dalvik虚拟机单个实例进程关系图图2中的每个圈代表一个进程,每个箭头表示父进程指向子进程,箭头上的文字表示创建时调用的Zygote类的静态方法的名字,圈内的文字代表进程属于哪一类进程。线程较进程的优点在于占用资源少,而且可以与其它线程共享资源,即共享性好。进程耗费资源,为实现与其它进程共享开销更大。相对进程,线程的缺点在于管理线程非常复杂,要解决麻烦的线程同步问题。通常这是令程序员很头痛的事情。一个线程的崩溃很可能影响到其它线程的正确执行,而进程则不存在这样的问题,因为进程间协作和通信现在已经有很多成熟的模型可以使用。在Linux进程中,线程可以说是一种轻量级的进程,这实际上使进程在这个操作系统上更有优势。在实际应用中,为在效率和易用性、稳定性之间求得平衡,多进程和多线程都要用到。这可能也是Dalvik虚拟机在Java语言层同时对多进程和多线程提供支持的原因。Dalvik直接在JavaAPI中提供了操作进程的API,比如用于控制操作系统进程的Process类。除此之外,还提供了一个类dalvik.system.Zygote来创建三类进程:zygote进程,非zygote进程,以及系统服务进程。以下是与这三类进程相对应的三个创建进程的静态方法:*fork(),创建出一个zygote进程。*forkAndSpecialize(),创建出一个非zygote进程。*forkSystemServer(),创建出一个系统服务进程。其中,zygote进程可以再fbrk出其它进程,而非zygote进程则不能fork出其它进程,而系统服务进程 万方数据 第2期周毅敏等:Dalvik虚拟机进程模型分析·85·在终止后它的父进程(也就是fork出它的进程)也必须终止。本节是在Dalvik的Java语言层面研究其语义,下一节将深入虚拟机的源代码,根据函数的调用关系。比较研究以上的三个静态方法。2.2lYalvlk进程的创建这三个方法都是本地方法。先看foIk方法,与另两个本地方法不同的是,fork方法生成的子进程是一个半初始化的进程,它也是zy.gote进程。如果父进程之前已经调用过addNewHeap.则不再调用它。这里使用的是写时复制技术,因此zy.gote进程是共享同一个堆的。整个初始化到这里就结束了。forkAndSpecial诞则不同。首先它创建的子进程将不再是一个zygote进程(即离开Zygote模式,不能再创建子进程),它会启动HeapWorker线程(一个主要执行对象的终结函数和引用对象的清理和归队工作的线程)和调试线程。其次,它一定会执行addNewHeap函数,创建一个新的堆,因为一个运行特定任务的进程不应该和其它进程共享一个堆。forkSystemServer和forkAndSpecialize很相似,唯一的不同点是用forkSystemServer创建的子进程一旦结束就会立即终止创建它的父进程。根据Linux的fork系统调用可以知道,父子进程在fork之后各自堆栈互不相关,但是共享程序正文段也就是虚拟机核心库代码,dex文件除外。这样设计一方面是为了节省内存,另一方面也发挥了Linux进程的长处。fork方法调用执行的过程如图3所示。forkAnd—Specialize方法调用执行的过程如图4所示。forkSys.temServer方法调用执行的过程如图5所示。开始父进程子进程图3fork方法调用开始子进程图4forkAndSpeeialize方法调用开始子进程图5forkSystemServer方法调用 万方数据 ·86·计算机技术与发展第20卷3Daivik虚拟机进程间通信关于信号部分Dalvik虚拟机暴露的API中直接提供了对信号的支持,这体现在android.OS.Process类中。其中包括了用于终结指定进程的kltProcess(int),以及用于向指定进程发送特定信号的SendSignal(int,int)。目前可以发送的信号是SIG№也一KILL、SIGNAL—QUIT和SIG—NAL—USRl,Dalvik的源代码对这些信号都做了特殊处理。。上文对三个创建进程的APl分析中省略了关于父子进程间通信的信号发送和接收的部分。信号处理也是进程间通信的主要手段,尤其是在Linux这样一个以进程为主体的操作系统之上。以上这三个API(对应的本地方法的源代码)中父进程都调用了函数SetSignalHandler(),它的实质是将进程中用于接收子进程的SIGCⅫD信号的处理函数设为sigchldHandler()。在这个信号处理函数中,绝大多数部分代码用来根据不同的情况写日志,唯一一处真正用于进程间通信的程序逻辑是下面这段代码:if(pid==g队吼.system..se_rverPid)l/*子进程是一个系统服务进程*/LoG(⋯⋯);垴Ⅱ(getpid(),SlGKILL);/*终止本父进程*/}即如果子进程是个服务进程,则将本进程(相对于这个子进程来说是父进程)终止。之前在f6rksystemserver进程中也有类似的终结父进程的代码,笔者认为并不多余,这是个双保险以保证父进程的正确终结。当创建非zygote进程和systemserver进程时,子进程似乎也有调用setSignalHandler()。但是后面又调用了unsetSignalHandler把这个处理函数删除了。因此,完全符合API设计的语义。如果虚拟机启动时,没有加上“一Xrs”和“一Xno.quithandler'’参数,那么在创建非zygote进程时,将会触发一个线程运行signalCatcherThreadStart函数。这个线程的功能就是在一个无限循环中不断地监听两个信号:SIGQUlT和SIGUSRl。当SIC,QUIT被捕获的时候,就打印jni全局参考表的信息;当接收到SI—GUS融信号时,会强制进行不回收软引用的垃圾收集,此时,在程序中向进程发送SIGUSRl信号,就可使进程进行不回收软引用的垃圾收集。在Dalvik中没有暴露使用管道的API。因此,在虚拟机初始化时就将管道信号屏蔽,以阻止管道端因读关闭,写入失败而直接退出。4结束语Android是~个开源的嵌入式操作系统,Dalvik则是在它之上的核心组件,基于Dalvik的Java应用打破了Sun对Java世界的垄断,并使之成为当今最为流行的嵌入式应用开发标准之一。虽然随着Android的发展,新版本的不断推出,尚无法预测它的发展方向,因而文中内容可能存在时间和空间上的局限性,但是,对Dalvik的深入探索是极具意义的一种尝试,能够给Dalvik的使用、移植、研究以及虚拟机设计提供建议和参考,这是撰写本文的主要目的。参考文献:C1]姚昱雯,刘卫国.Android的架构与应用开发研究[J].计算机系统应用,2008,17(11):110—112.[2]SunMierosystemslnc.JavaMETechnologyAPIDoctnrlenta.tion[EB/OL].2007.trp://java.SLWI.com/javame/rderence/apis.isp.[3]GoogleInc.Android№ration[EB/OL].2007。hnp://oode.google.oom/ind/en/android‰tation.html.[4]VennersB.深入jaWd虚拟机[M].第2版.曹晓钢,蒋靖译.北京:机械工业出版社,2003.[5]探矽工作室.深入嵌入式Java虚拟机[M].北京:中国铁道出版社,2003.【6]陈闳中.‰在嵌入式操作系统中的应用[J].同济大学学报,2001,5(14):564—566.[7]河秦,王洪涛.Linux2.6内核标准教程[M].北京:人民邮电出版社,2008.[8]李正平,徐超,陈军宁,等.Linux2.6内核进程调度分析[J】.计算机技术与发展。2006,16(9):82—84.[9]毛德操,胡希明.Urmx内核源代码情景分析[M].杭州:浙江大学出版社。2001.[10]SunMicrosystermInc.PortingGuideSunJava(1’M)WirelessClientSoftware2.0JavaPhtform,MicroEditiun[EB/OL].2007—05.hrtp://java.Sun.com/javame/referenoe/apis.jso.-.P·+-+-—P-+——p——p_-+一+=.-4--+---+-.--+--a---+---+---+-.--+..-+-+--+-·(上接第82页)2007(2):21—23.【7】郑莉,董渊,张瑞丰.C++语言程序设计【M].第3版.北京:清华大学出版社,2004:188一19(),293—300.[8]msdn,VisualC++DevelopeCemre,Library.OperatorOver.10ading[EB/OL].2007一11.http://msdn.microsoft.oom/zh—en/library/5tk49fh2.aspx,2007.11.[9]PriestleyM.PracticalObject—orientecDesignwithUML[M].2nded(影印版).北京:清华大学出版社,2004:176一177. 万方数据 Dalvik虚拟机进程模型分析 作者: 周毅敏, 陈榕, ZHOU Yi-min, CHEN Rong 作者单位: 同济大学,基础软件工程中心,上海,200092 刊名: 计算机技术与发展 英文刊名: COMPUTER TECHNOLOGY AND DEVELOPMENT 年,卷(期): 2010,20(2) 被引用次数: 6次 参考文献(10条) 1.姚昱旻;刘卫国 Android的架构与应用开发研究[期刊论文]-计算机系统应用 2008(11) 2.Sun Microsystems Inc Java ME Technology API Documentation 2007 3.Google Inc Android Documentation 2007 4.Venners B;曹晓钢;蒋靖 深入java虚拟机 2003 5.探矽工作室 深入嵌入式Java虚拟机 2003 6.陈闳中 Linux在嵌入式操作系统中的应用[期刊论文]-同济大学学报 2001(05) 7.河秦;王洪涛 Linux 2.6内核标准教程 2008 8.李正平;徐超;陈军宁 Linux 2.6内核进程调度分析[期刊论文]-计算机技术与发展 2006(09) 9.毛德操;胡希明 Linux内核源代码情景分析 2001 10.Sun Microsystems Inc Porting Guide Sun Java (TM) Wireless Client Software2.0 Java Platform,Micro Edition 2007 本文读者也读过(1条) 1. 陈卫伍.王建民.陈榕.CHEN Wei-wu.WANG Jian-min.CHEN Rong Dalvik在CAR构件运行时中的应用研究[期刊论文 ]-电脑知识与技术2010,06(31) 引证文献(6条) 1.蔡泽廷.姜梅 基于权限的朴素贝叶斯Android恶意软件检测研究[期刊论文]-电脑知识与技术 2013(14) 2.杨胜利 基于Linux的Android OS平台应用浅析[期刊论文]-科技传播 2011(9) 3.陈灏.陈榕 支持复合对象的Java虚拟机内存管理技术研究[期刊论文]-电脑知识与技术 2011(22) 4.Yongpan Sheng.Ruiting Dai The Research on building cache for Android platform using soft references[期刊论文]-无线互联科技 2013(7) 5.刘兆坤.李烨.王亚刚.刘晓峰 异构网络终端接入智能切换系统研究[期刊论文]-通信技术 2013(10) 6.魏栋.谭功全.叶建平 Android系统的内存管理研究[期刊论文]-单片机与嵌入式系统应用 2012(4) 本文链接:http://d.wanfangdata.com.cn/Periodical_wjfz201002022.aspx

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档

相关文档