(计算机系统结构专业论文)java线程状态的保存和重构—解析和扩展java虚拟机.pdf_第1页
(计算机系统结构专业论文)java线程状态的保存和重构—解析和扩展java虚拟机.pdf_第2页
(计算机系统结构专业论文)java线程状态的保存和重构—解析和扩展java虚拟机.pdf_第3页
(计算机系统结构专业论文)java线程状态的保存和重构—解析和扩展java虚拟机.pdf_第4页
(计算机系统结构专业论文)java线程状态的保存和重构—解析和扩展java虚拟机.pdf_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

上海大学研究生论文用纸 摘要 j a v a 语言系统因为平台无关性而被广泛的应用于异构的网络环境中,j a v a 程序任 务能够在网络的不问节点间迁移,为此需要保存并重构j a v a 程序的运行状态。 关于程序运行状态的研究是一个长久而又十分关键的课题。本文比较了几种提取 j a v a 线程运行状态的方法,指出了它们各自的优点和存在的问题,并在此基础上提出 了自己的一种新的解决方案:在虚拟机层面上对j a v a 进行修改,扩充了j a v a 虚拟机 内部的本地函数库,使得虚拟机内部线程环境上下文变得可访问,从而达到在用户层上 获得底层虚拟机内相关信息的目的。 作者深入研究了一种源代码开放的j a v a 虚拟机k a f f e v m ( k v m ) :首先,解 析了它的运行机制和其内部主要组成结构;其次,详细阐述了j a v a 程序运行过程中, k v m 内部关于j a v a 线程状态的各种重要信息;然后,根据k v m 运行过程中采用的 种将编译执行和解释执行相结合的特殊的j a v a 语言运行方式,提出了从k v m 内部和 l i n u x 内核两方面相结合的解决方案:扩充k v m 的j n i 函数库,添加l i n u x 内核系统调 用,提供一些新的j a v a a p i 函数。j a v a 应用程序的开发者能够通过这些j a v a a p i 的调 用,访问j a v a 虚拟机内部的j a v a 程序运行信息,使得j a v a 程序员在普通用户层就能 得到底层系统的一些重要信息,顺利完成j a v a 程序的“强迁移”。 本文首先在第三章中阐述了j a v a 虚拟机规范,并解析了k v m 的实现机理,从而 从理论上深入的阐述了我们的实现方案;在随后的第四、第五章中继续从实践上进行进 一步论证,给出了一些具体的实现数据结构和函数方法以及在实现过程中使用到的一些 关键的技术;在文章结束部分通过几个对比试验说明了这种解决方案的运行效果,从而 提出的进一步的改进方案和研究方向。 关键词:线程,强迁移,y a v a 虚拟机,j a v a 运行环境,j a v a 本地函数 一l 一 上海大学研究生论文用纸 a b s t r a c t t h i sp a p e rc o m p a r e st h ea d v a n t a g e sa n dd i s a d v a n t a g e s o fs e v e r a la p p r o a c h e s t oc a p t u d n gj a v at h r e a d ss t a t e ,o nt h eb a s i so fw h i c han e wa p p r o a c hi sp r o p o s e d , n a m e l y ,t om o d i f y j a v ab y e x t e n d i n g t h ej a v av i r t u a lm a c h i n e j v m ) t h i sa p p r o a c h e x t e n d sj a v an a i v em e t h o di n t e r f a c e ( j n i ) i n s i d et h ej v m ,w h i c hm a k e s t h en a t i v e t h r e a dc o n t e x ta c c e s s i b l e ,s ot h a ts o m e i n f o r m a t i o na b o u tj v mc a r lb e c a p t u r e d a tt h e u s e ri e v e l k a f f e ,a no p e nj v m ,i si n v e s t i g a t e da sac a s es l u d y t os h o wa l lk i n d so fi m p o r t a n t i n f o r m a s o na b o u tj a v at h r e a d ss t a t ei na ,鹾。a c c o r d i n gt oi t ss p e c i a le x e c u g o n 热o d e t h a tc o m b i n e dw i t hi n t e r p r e t e ra n dt r a n s l a t o r w ea d o p t t w om e t h o d s ( e m e n dk v m b y a p p e n d i n g j n ia n da d ds o m es y s t e mc a l l si nl i n u xk e r n e l ) t oc o m p l e t et h eg o a l t h a t j a v aa p p l i c a t i o nd e v e l o p e r sc a na c c e s ss o m es y s t e mi n f o r m a t i o nb yc a l l i n gs o m e j a v a a p ip r o v i d e db yu 8 n o t o n l y d ot h i sp a p e ri l l u m i n a t eo u r a p p r o a c h i nt h e o r y ,b u ta l s os o m ed a t a s t r u c t u r e su s e dt op r e s e r v ea n dr e b u i l dj a v ar u n t i m ee n v i r o n m e n t ( j r e ) a r e d e s i g n e d a t t h ee n do ft h ep a p e r ,t e c h n i q u e su s e dt or e a l i z eo u ra p p r o a c ha r e d i s c u s s e d k e y w o r d s :t h r e a d ,s t r o n gm i g r a t i o n ,j a v a v i r t u a lm a c h i n e ,j a v ar u n t i m e e n v i r o n m e n t ( j r e ) ,j a v an a t i v em e t h o di n t e r f a c e ( j n i ) 上海大学研究生论文用纸 第1 章绪论 近年来,随着高性能计算和计算机网络的高速发展,特别是机群计算机系统和网格 计算的出现和广泛应用,实现单一系统映像的要求越来越高:异构的底层硬件资源需要 在统一的调度下协调工作;计算任务能够利用网络资源并行运行,并在不同的节点间实 现任务迁移。j a v a 语言系统因为强大的自身优势,成为信息时代、网络应用中的一种 强有力的语言系统,得到了越来越多异构系统开发人员的青睐。 本文论述了一种新的方法,扩充了j a v a 语言系统的功能,提供了一种“强迁移” 1 】的机制,使得j a v a 计算任务能够在网络的不同节点间迁移,并在最近的“程序状态 保存点“处继续执行下去。这项研究将会有深远的意义。 1 1 研究意义 1 1 1 应用于并行计算机系统与机群计算机 高性能计算是关系到国家战略的核心技术,也是国民经济发展的重要基础。高性能 计算技术不仅会深刻地改变产品和材料的设计方法、改变科学研究和实验的方式,而且 也将逐步影响人们的生活方式。并行计算是实现高性能计算的重要手段之一,当前的高 性能计算机大多都是采用各种并行技术的并行计算机,尤其是基于r i s c 的工作站和集 群计算机系统。集群计算机是利用高速通讯网络将一组高性能工作站或高档p c 按一定 的结构连接起来,在并行程序设计及可视化人机交互集成开发环境支持下,统一调度, 协调处理,实现高效并行处理的系统,由于具有投资风险小、可扩展性好、可继承现有 软硬件资源和开发周期短、可编程性好等特点,目前已成为并行处理的热点和主流。集 群系统中的主机和网络可以是同构的,也可以是异构的,这就需要在一般操作系统之上 建立并行编程环境以完成系统的资源管理及相互协作,屏蔽工作站及网络的异构性。 1 1 2应用于网格计算 网格计算( g r i dc o m p u t i n g ) 2 作为计算领域的最新技术,正在全球范围内掀起一股 研究和应用的热潮。网格计算的面向计算的特点,将极大的促进未来高性能计算环境的 建设,使得许多面向计算的新型应用层出不穷。网格计算很有可能会成为下一代 i n t e r n e t ( s u p e ri n t e m e t ) 。网格计算从根本上改变我们对计算的看法,使我们的计算能 上海大学研究生论文用纸 力不再受限于本身所拥有的资源( 计算能力,存储资源等) ,我们完全可以仅仅将任务 ( 包括计算任务) 以统一的格式提交给网格平台,然后由网格平台来做剩下的一切事 情:在网格所覆盖范围内动态查找,申请获得可以使用的资源( 空闲的c p u 时间片, 存储设备,及可以重复利用的已存在的应用) 。 要实现这一切,不仅需要一种适用于异构平台的语言系统( j a v a 语言系统) ,更需 要这种语言系统具有很强的网络可移植性。 1 2 j a v a 系统的特点 j a v a 系统【3 】包括j a v a 编程语言、“c l a s s ”文件规范、j a v a 本地a p i 和j a v a 虚 拟机等几部分。平台无关性、网络可移植性和安全性是它的三大特点。 1 2 1平台无关性 j a v a 技术非常适用于网络环境,其中的一个重要原因在于它的平台无关性,即产 生的二进制文件能够不加修改就在不同的硬件平台上运行。网络环境中经常存在多种不 同类型的计算机和设备,这些不同的硬件设备间要共享数据,协调工作,就需要一个统 一的管理机制。这种管理机制的实现越简单越好,目标是能够不加任何修构就能应用在 网络系统中的各个节点上,并且在不同节点间实现迁移。 j a v a 系统的平台无关性在于它建立了自己j a v a 平台。这是一种虚拟的硬件平台, 类似存在于j a v a 应用程序和操作系统、硬件平台间的一个缓冲池,j a v a 源程序被编译 成能够运行在j a v a 虚拟机上的“c l s s s ”文件,这种文件通过j a v a a p i 接口访问底层 资源。无论运行于何种环境,j a v a 程序只需要建立在适用于底层环境的j a v a 平台之 上,就可完成既定的任务,关系到具体运行平台特性的操作,都由特定平台下的j a v a 虚拟机协同j a v a a p i 完成。 1 2 2 网络可移植性 j a v a 作为网络环境下一个最有用的工具,另一个重要的特点是j a v a 程序的网络可 移植性。这是j a v a 语言独有的特色。网络计算机比个人计算机计算能力强大,主要优 势在于网络计算机能够最大利用网络资源,特别是各节点计算机的c u p 和内存资源。 在一个节点上提交的计算任务能够根据需要,分解成若干子任务被分配在不同网络节点 上执行,在执行过程中,由于任务的重新分配,或网络设备等硬件故障,子任务要求能 够在网络上实现迁移,这样才能保证整个系统的健壮,使网络资源的使用达到最优。 上海大学研究生论文用纸 j a v a 系统能够实现网络节点闻的迁移,是以j a v a 的平台无关性为基础的,j a v a 源程序不加任何修改就能在不同的硬件平台上运行,使得在异构平台问的迁移成为现 实。 l ,2 3安全性 j a v a 的安全性机制是j a v a 最蓬要的特点,是j a v a 语言真正应用在网络环境下的 僳障。两络安全是网络环凌中最重疆的因素,两络系统经常会受到些无意或恶意的攻 击,实观网终系统的语言软件必须拥有很强的安全机制,必须严格的定义一些访阀规 划,确傈网络发全。这些规则主要应包括读写本地硬盘规则、建立网络连接规尉、创建 瓤进稷煅则、艇载动态链接库趣则等。 j a v a 系统提供的安全机制主要有:“c l a s s ”装载机制、“c l a s s ”文件验证机 制、安全策略梳隶鞠j a v a 震撅祝、j a v a 语言中的安全往定义。 1 3 j a v a 语言在网络环境中应用的不足 从前面小节的介绍中,可以知道j a v a 是最适用于嘲络环境的一种软件语言,目前 许多劂络软件都是使用它绽铸4 两成。正是幽于应用的涤入。j a v a 语裔在网络应用中的 不足也逐渐暴嚣出来。 1 3 1速度较慢 速度懂鼹j a v a 系统静蓠要不足之处,j a v a 翠麓的应用主簧在溪速随辫浚备上或嵌 入在低处理s & 力的硬件中,运行速度并不是整个系统考虑的首要因素。随罄现代工艺的 发展,高速网络的出现、c p u 计冀能力的增强,j a v a 程序编译和执行的速度问题又再 次成为了关注的焦点,s u n 公司及其他磺究团体也提出了据瘦蛔改进方案,妇及时绽译 技术( j i t ,j u s ti nt i m e ) ,自适应式优化器等,都取得了很好的效果。 1 3 2安全策略裔待完善 最然尧了2 应舔子鼹络环境,特剐是嚣前最大的网络i n t e m e t 圈,j a v a 语言鼹供 了许多安全箢略,如h 如服务器爨赂、r m i 策略等。但随着网格计算的发腱,在隧囱 计算的新型网络环境中必然会出现许多新的需求,j a v a 系统也因添加许多新的策略与 之据适应。 上海大学研究生论文用纸 1 3 3需要提供“强迁移”机制 “网络迁移”是j a v a 语言系统的特色之一,但它只能提供“弱迁移”机制,发生 迁移的任务只能从开始处重新执行,这只适用于目前面向信息的网络时代。随着面向计 算的网络新时代的到来,许多计算任务的迁移将不能满足于“弱迁移”机制,甚至可以 说“弱迁移”可能会阻碍j a v a 语言在新时代的应用。这就需要一种“强迁移”机制, 使任务能够在新节点处继续执行,这将是j a v a 系统迁移机制的发展方向。 1 4 研究目的 本文就如何实现j a v a 的“强迁移”机制,提供了一种具体实现方法。要实现“强 迁移”,使任务在中断处继续执行下去,就是需要保存j a v a 程序的运行时状态,并在 新节点实现计算环境的重构。由于j a v a 语言的平台无关性,只要重构了j a v a 程序运 行时状态,就能完成j a v a 程序的强迁移,j a v a 任务能够在新节点处继续执行。 依据这一基本思想,有些研究机构也提出了一些具体的实现方案。本文主要提出了 一种新的设想【4 】:“修改j a v a 虚拟机”,并据此做出了具体的实现。试验的环境是 l i n u x 平台上的j a v a 虚拟机,在实现中主要是通过添加l i n u x 系统内核调用,扩充 j a v a 本地接口函数库,以达到研究的目的。 1 5 本文的结构安排 针对这项研究,国内外也有一些研究机构做出了具体实现,提出了一些建设陛的意 见,本文在第二章分析了这些解决方案的优缺点,并依此提出了我们自己的解决办法。 在第三章中对我们具体的实现方案做出了详细的阐述。我们的工作主要是要修改 l i n u x 平台下的j a v a 虚拟机,在此之前必须深入的研究j a v a 虚拟机结构,掌握j a v a 虚拟机的运行机制。在介绍了j a v a 虚拟机的结构后,针对一种具体的虚拟机- k a f f e 的 不同的执行方式,本文详细的说明了其相应的修改实现方案。 第四章中主要介绍的是在实现过程中使用的关键性数据结构和技术,这些数据结构 记录了j a v a 程序运行过程中的重要信息。 随后的章节是实验数据对比分析,说明我们这种方法的效果,和今后待改进的地 方。 上海大学研究生论文用纸 第2 章国内外研究现状 目前,国内外已有一些研究团体正在研究j a v a 应用程序运行环境,并提出了各自 的解决办法,但关于如何提取j a v a 程序运行状态,才能到达各方面因素的完美统一 ( 既能顾及到j a v a 系统的三大特点,又能简单高效的实现) ,还没有一个统一的定 论。我们的工作是在摸索中展开的,因此需要先分析已有方案各自的优缺点。 j a v a 语言采用多线程机制,应用程序以线程的方式并行执行,因此对j a v a 应用程 序运行环境的研究就是对j a v a 线程状态的研究。 2 1 j a v a 本身提供了某些对象状态保存机制 j a v a 作为一种面向网络的语言,本身提供了许多机制,能够满足j a v a 对象的 重构和j a v a 类的动态加载。例如串行化( s e n a l i z a b o n ) 【5 】机制。这是一种简单的方法, 采用流式存储方式,具有存储和还原j a v a 对象的能力。它存储了j a v a 对象的状态, 包括所有变量( 类变量和实例变量) 的值,这些值代表了每个对象的本质类型和状态。 使用这种机制,能够保存重建程序状态时所需的绝大部分信息。这种方法实现简单,不 会破坏j a v a 系统的平台无关性和安全性。 但是,这种方法的效率并不高,因为它无法保存j a v a 程序的运行时数据,包括: 方法调用堆栈和程序计数器信息。因此j a v a 只能提供对象级别的状态存储,无法存储 程序的执行状态。程序运行状态的保护只能以对象为基本单位,这就导致了j a v a 只能 提供“弱迁移”【6 】( w e a km i g r a t i o n ) ,即,每当j a v a 程序发生迁移时( 因追求负载平衡 或程序回卷恢复等需求而发生) ,j a v a 程序代码段虽然能够移植到新节点上,但必须 从头开始重新执行。但是,在实际应用当中,往往某个计算任务由于非常复杂而需运行 数日甚至更长时间。显然,若采用j a v a 自身的“弱迁移”机制,不能很好的满足大计 算量时对系统性能的要求。 2 2 对j a v a 线程状态的研究 于是,一些学者提出了j a v a 线程运行状态提取的概念。j a v a 是种解释执行的语 言,j a v a 源代码经过编译后形成“c l a s s ”文件,“c l a s s ”文件依靠j a v a 虚拟机 ( j a v av i r t u a lm a c h i n e ,j v m ) 解释执行或编译成本地代码执行。方法调用堆栈( 存储方 上海大学研究生论文用纸 法的本地变量的值) 和程序计数器都保存在j v m 中。j a v a 线程运行状态的提取就是把 j a v a 线程在j v m 中执行的状态现场( 包括堆栈和程序计数器) 提取出来并且保存在存 储介质上,并能够将这些信息传递到新的节点上,使得程序能够从保存点开始继续执 行。 要实现j a v a 线程运行状态提取的机制,必须对j a v a 程序做出一定的修改,在适 当的地方加入相应的代码。因为,j a v a 线程的所有运行状态都在j v m 中,很自然的, 有关如何对j a v a 程序做出修改,根据与j v m 的关系分可为语言级和j v m 级。 2 2 _ 1 语言级上的j a v a 线程运行状态的提取 这种方法的主要思路是对j a v a 程序的修改不触及j v m 的改动,单纯依靠程序员对 j a v a 代码的修改以达到提取的目的。在这方面的研究,国外起步较早,到目前为止已 有一些成果。例如f t t n f r o c k e n 等实现的基于j a v a 的移动代理 7 ( m o b i l ea g e n t s ) 5 b ,讨 论了有关j a v a 线程运行状态提取的问题。其具体思想为: 提供了一种预处理器,利用j a v a 提供的语法分析器,分析语法树并做出修改,在 适当的地方插入代码,用软件模拟硬件运行过程的办法,保存所有方法的本地变量和与 程序计数器相关的信息。在保存过程中有几点值得注意: 一是,要注意变量的局部性,每个变量都有自己的作用范围,特别是会出现重名变 量,在保存时若不注意它们的使用范围,将会在程序现场恢复时带来混乱。 再则,执行保存功能的程序代码只能在“状态提取”进程初始化后立即运行。因为 j a v a 是完全的面向对象的语言,线程状态提取这一机制也是被看作一种特殊的对象来 实现的。之所以认为它特殊,是因为这种对象一经初始化后,用来提取程序状态的方法 就必须立即执行,如果在初始化后,仍有其它任务执行,那么提取的状态信息很有可能 不完全而导致恢复失败。 第三,对堆栈和程序计数器信息的存储。由于这些信息都是记录在j v m 中,因此 需要用软件模拟的方式构建自己的堆栈和p c 。 在正确的存储了程序现场后,就是要能够恢复执行。主要包括重建程序的对象域和 每个对象的状态、程序方法调用栈以及本地数据的值和程序计数器。 这种方法的主要缺陷是效率低下,实现难度较大。j a v a 是解释执行的语言,速度 慢是其自身的弱点,如果再加上大量的额外代码,会给系统在时间和空间上带来严重的 负担,降低效率。另外由于纯粹是在j a v a 语言级别上的实现的保存与恢复,需要对 岳 上海大学研究生论文用纸 j a v a 程序本身作出一定的修改,这对每个j a v a 程序员的要求很高,需要有很强的编程 技巧。 2 - 2 2t v m 级上的j a v a 线程运行状态的提取 近几年,有关对j a v a 虚拟机进行扩展使得j a v a 程序能够访问虚拟机内部某些信 息的研究越来越多。也提出了j a v a 虚拟机级上的j a v a 线程运行状态提取的一些相关 概念。例如j a m e s s p l a n k 等正在研究的“c h e c k p o i n t i n gj a v a ”【8 】,和s a r a b o u c h e n a k 、d a n i e lh a g i m o n t 等正在研究的“m a k i n gj a v aa p p l i c a t i o n sm o b i l eo r p e r s i s t e n t ”。【9 】 1o 】【111 1 12 】 这是一种全新的思想,涉及到了j a v a 系统底层的虚拟机机制,实现难度很大,将 会影响到j a v a 系统的各个方面。国外的一些团体在这方面的研究还处在探索之中,仅 初步提出了一些理论和设想。但这种方法能够很好的解决实现和实用之间的矛盾,大多 数困难的工作都由j a v a 虚拟机的设计人员完成,对普通j a v a 程序员来说是透明的, 仅仅需要像常规一样使用j a v a a p i 函数,就能达到j a v a 程序强迁移的目的,极大的提 高了编程效率和运行效率。 如果这能成为一种规范,将会提高j a v a 虚拟机的性能,给j a v a 系统带来一次飞 跃。 2 3 本文的设计方案和目标 笔者综合比较了上述几种国际上流行的解决方案,认为对j a v a 虚拟机的修改,能 够更好的达到未来的目标。 总体思路 为:扩展j a v a 虚拟机,提供 一系列函数, 能够以用户层 数据的形式保 存或恢复虚拟 机内部关于 j a v a 线程运行 时状态的重要 图卜1 本文工作在幽舱语言系统中的相对位置 上海大学研究生论文用纸 信息;再编写j a v a 类,封装这些函数,以j a v a a p i 的形式提供给普通j a v a 程序员。 这样j a v a 程序员就能在用户层得到位于底层的j a v a 虚拟机内部信息。大概过程如 图: 图2 1 描述了本文工作在j a v a 语言系统中的相对位置,从整体上阐述我们工作 的作用。 图2 2 描述了本文工作的逻辑结构,包括几个重要的组成部分。 图2 2 详细解 舫案逻辑图 亭数据流+ 控制流一静转换关系 - 8 - 上海大学研究生论文用纸 第3 章详述:实现对删的扩展 在实现过程中,对j a v a 虚拟机源代码进行了深入的研究,在此基础上对j a v a 虚 拟机做出一定的扩展,并针对j a v a 虚拟机的不同执行办法,增加了一些l i n u x 内核系 统调用,从而提供了一些j a v a a p i 函数,使得在用户程序级上可以访问j a v a 虚拟机内 部的一些重要信息,以达到对j a v a 线程状态进行保存和重构等目的。 在下面的小节中,首先介绍一下j a v a 虚拟机的总体框架,再针对某一具体的j a v a 虚拟机k a 仟e ,一边阐述j a v a 虚拟机的理论规范,一边解析了k v m 的实现机理, 从而从理论上深入的阐述了我们的实现方案。 在随后的第四、第五章中会从实践的角度上进一步阐述,并给出一些具体的实现数 据结构和函数方法以及在实现过程中使用到的一些关键的技术。 3 1 j a v a 虚拟机( j a v a v m ,j v m ) 介绍 j a v a 语言的一个非常重要的特点就是与平台的无关性。而使用j a v a 虚拟机是实现 这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的 目标代码。而引入j a v a 语言虚拟机后,j a v a 语言在不同平台上运行时不需要重新编 译,j a v a 虚拟机屏蔽了与具体平台相关的信息,使得j a v a 语言编译程序只需生成在 j a v a 虚拟机上运行的目标代码( 字节码) ,就可以在多种平台上不加修改地运行。 j a v a 虚拟机【1 3 ”4 】【1 5 】【1 6 】【1 7 】是一台抽象的计算机,是一个执行j a v a 字节码 ( b y t e c o d e ) 的理想硬件结构的软件仿真,有自己想象中的硬件,如处理器、堆栈、寄存 器等,还具有一个逻辑指令集或伪代码相应的指令系统。对于一个特殊的目标硬件结 构,面向j a v a 虚拟机的编译器所产生的并不是机器代码指令,而是基于假想计算机的 指令集的伪代码流。解码器实际上只是一个应用程序,这种应用程序能够理解计算机所 使用的机器代码语义,并将其转换为底层硬件所使用的机器代码指令,这是j a v a 语言 跨平台的本质原因。一个j a v a 源程序经j a v a 编译器编译后变成独立于平台的类格式 文件,再由j a v a 虚拟机运行。j a v a 虚拟机仅规定了j a v a 类格式字节码形式的虚拟机 指令集及部分操作规范,而具体的实现,如运行数据的内存布局、垃圾收集( g a r b a g e c o l l e c t i o n ) 算法、字节码优化等,则可根据不同的硬件平台加以优化。用户可以用软件 采用解释执行字节码方式或把j a v a 虚拟机指令编译成实际的机器指令执行方式来实现 上海大学研究生论文用纸 j a v a 虚拟机,也可以通过硬件方式在微代码级或直接在j a v a 芯片上实现j a v a 虚拟 机。 采用软件实现的j a v a v m ,由于用于宿主v m 的硬件平台工具的不一致性,大多采 用基于堆栈计算机的概念而实现的。堆栈计算机在指令之间传送信息时不使用任何物理 寄存器。相反,它使用堆栈的帧来表示方法的状态、字节码的操作对象、方法的参数空 间以及局部变量的空间等。只有少量的几个虚拟寄存器用于保存虚拟机的运行状态。与 微处理器中的某些专用寄存器功能类,包括: 程序计数器( p c ) :指向当前 所执行指令的字节码数组的指 针; 栈顶指针( o p t o p ) :指向操 作数栈顶端的指针; 运行环境指针( f r a m e ) :指 向当前执行方法的执行环境的 指针: 局部变量指针( v a b ) :指向 当前执行方法的局部变量区第 一个变量的指针。 j v m 在运行时会创建一个内部运行 时系统,用来支持运行j a v a 指令的语 义实现。这个运行时系统还负责装入对 象( 或c l a s s ) 文件、内存管理、垃圾 收集器以及保存虚拟寄存器数据。 如图3 1 ,描述了j a v a 虚拟机的运行流程图,图3 2 为j a v a 虚拟机逻辑结构 图,很好的描述了j a v a 虚拟机内各部分的相互关系。 上海大学研究生论文用纸 图3 2j a v a 虚拟机逻辑结构 3 2 对k a f f e 虚拟机( k w m ) 的扩展 在s u n 公司的j a v a 虚拟机规范的基础上,许多供应商都建立了自己的j a v a v m 的 实现,虽然这些供应商在他们的实现中都增加了一些独特的特性,但最根本最重要的一 点是它们都支持s u n 公司的“c l a s s ”文件结构、字节码定义及虚拟机的初始规范。 k a f f e 14 1 是一种源码开放的j a v a v m ,是k a f f e 公司提供的一种j a v a v m 的具体实现, 运行的操作系统平台为l i n u x ,我们的研究工作就是在此基础上展开的。 对k a f f e 的扩展,要增加了一系列函数调用,用来将k a f f e 的运行期数据区写到自 定义的数据结构中( 运行期数据区含有j a v a 程序运行时j a v a 线程的状态信息) ,或 者在虚拟机建立时用保存的数据填写运行期数据区以达到任务迁移的目的。k a f f e 运行 期数据的存储位置根据k a f f e 的运行原理分别存储在j a v a 虚拟机内和l i n u x 内核中。 3 2 1k a f f e 的运行原理 不同的运行机制( 解释执行和编译执行) 决定了j a v a 程序运行期数据的存储位置 的不同。k a 仟e 采取的是“解释执行”【1 8 年n “编译执行” 1 8 相结合的运行方式,j a v a 程序运行期数据一部分存储在j a v a 虚拟机内部,另一部分存储于操作系统内核内部。 下面将简单分析下这两种执行方式。 上海大学研究生论文用纸 3 2 1 1 解释执行 j a v a 编译器将j a v a 源代码编译生成字节码,并将其放入字节码文件,j a v a v m 首 先对字节码进行载入、校验,通过校验后,解释器开始对字节码进行解释执行。每次取 一条指令,然后执行于该指令相应的机器码,该过程不断循环直到指令被处理完,或者 有指令使它停止处理。 该结构的最大优点是带来了j a v a 语言的平台无关性,j a v a 程序的运行时信息都记 录在j a v a 虚拟机中,整个j a v a 虚拟机相当于是一个大的管理进程,代替操作系统管 理了运行于其上的所有子进程;另外,由于在前面的编译过程中已经进行了词法、语 法、语义分析,字节码解释器无需再做通常语言解释器所要做的各种分析工作,速度较 普通语言解释器快。 最大的缺点还是速度问题,虽然有一定程度的提高,但与完全编译执行的程序相 比,速度还是太慢,由于是解释执行,也很难采取优化措施。 3 2 1 2j l t ( j u s tlnti m e ) 编译执行 这种虚拟机中不再采用解释器执行通过效验后的字节码,而是使用即时 c b c o d e c o d e l n ”标示。 k a f f e 为每条指令( p c ) 分配了一个框架( f r a m e ) 空间,每个框架由若干个框架元素 ( f r a m e e l e m e n t ) 组成,框架元素的个数由操作数栈大小( s t a c k s z ) 和局部变量大小 ( i o c a l s z ) 决定。 同时,这些指令又按照定的顺序链入“b h e a d - - b t a i l ”队列中,该队列中存放 的是每条p c 的结构( p c i n f o ) 的地址。这条链表表示了实际指令的运行顺序,优化了 在解释执行过程中取指令的操作。 3 2 2 4 k a 艉方法区和常数池 k v m 有一个所有线程间共享的方法i 贾 1 6 1 9 ( m e t h o da r e a ) 。该方法区类似于传统 语言的编译后代码的存储区,或者u n i x 进程中的“正文”段。它存储每个类结构,例 如常数池、域和方法数据,以及方法和构造函数,包括类和实例初始化与接口类型初始 化中用到的特殊方法的代码。 上海大学研究生论文用纸 方法区在k v m 启动时创建。尽管方法区逻辑上是垃圾回收堆的一部分,但在k a f f e 中,这属于特殊的内存部分,既不作为垃圾回收,也不压缩。 常数池( c o n s t a n tp 0 0 1 ) 是每个类或者每个接1 :3 的“c l a s s ”文件中的 “c o n s t a n tp o o l ”表的运行期表示。它包含几种常数,范围从编译期已知的数值文字到 必须在运行期解析的方法和域引用。常数池的功能类似于传统程序设计语言的符号表, 尽管它比通常的符号表包含更宽的数据范围。每个常数池都从k v m 的方法区中分配。 类或者接口的常数池在该类或者接口的“c l a s s ”文件被k v m 成功的装载时创建。 虽然,方法区和常数池在k a f f e 的运行过程中起着非常重要的作用,但是它们的创 建是在k v m 创建时初始化的,与j a v a 程序的运行时系统关系不大,因此在保存j a v a 程序线程运行状态时,并不要保存这部分内存的内容。而且,更为重要的一点是,在 k v m 的重建过程中,方法区和常数池的重建是由k v m 自动完成的,在重建k v m 环境 的过程中要注意保护这部分内存空间。 3 2 _ 3对l i n u x 内核的研究 在前面的介绍中,我们知道,k a f f e 运行的方式采用的是适应性的执行方式,即是 一种将解释执行和编译执行两者相结合的运行方式。关于解释执行的部分已做了较为详 细的阐述,包括k a f f e 堆、k a f f e 栈、k a f f e 框架、k a f f e 程序计数器等等,笔者设计了一 些相关的数据结构,用来保存这些重要的信息( 这些数据结构在后面的章节中将回详细 介绍) 。 以下内容将阐述k v m 编译执行的部分,这会涉及到具体的操作系统平台。我们使 用的是r e dh e a d 7 2 操作系统。 在l i n u x 系统中,采用的是三层映射的存储管理机制【2 4 】,在页面目录和页面表中 间增设了一层“中间目录”。由于k a 仟e 执行部分的信息是存储在计算机主存中,因此 我们主要研究的是l i n u x 内核中的页面管理机制。3 2 位地址意味着4 g 字节的虚拟存储 空间,l i n u x 内核将这4 g 字节的空间分成两部分。将最高的1 g 字节( 从虚地址 0 x c 0 0 0 0 0 0 0 至0 x f f f f f f f f ) ,用于内核本身,成为“系统空间”。而将较低的3 g 字节( 从虚地址0 x 0 至0 x b f f f f f f f ) ,用作各个进程的“用户空间”。这样,理论 上每个进程可以使用的用户空间都是3 g 。虽然各个进程拥有自己的3 g 字节用户空 间,系统空间却由所有的进程共享。每当一个进程通过系统调用进入了内核,该进程就 在共享的系统空间中运行,不再拥有其自己的独立空间。从具体进程的角度上看,则每 个进程都拥有4 g 字节的虚拟存储空间,较低的3 g 字节为自己的用户空间,最高的 一1 9 上海大学研究生论文用纸 1 g 字节则为与所有进程以及内核共享的系统空间。在用户空间部分,l i n u x 进程使用c 程序的存储空间布局。在高地址部分,依次向下分布命令行参数、环境变量和用户栈。 在低地址部分,依次向上分布正文、初始化的数据、未初始化的数据和堆。栈和堆中间 的空洞是未分配的虚地址空间。栈由上向下增长,堆自下向上分配动态内存。下图很好 的描述了系统空间和用户空间的关系以及用户3 g 空间的具体划分。 0 x f f f f f f f 0 x b f f f f f f 一雎监一 未分配 内存空间 一用户| 一一 未初始化的数据 已初始化的数据 代码段 用户空闻 图3 7系统空间和用户空间的关系以 及用户3 g 空间的具体划分 l i n u x 进程状态是指进程的上下文。严格地说,进程上下文是由它地用户级上下文 ( u s e r - l e v e lc o n t e x t ) 、寄存器上下文( r e g i s t e rc o n t e x t ) 和系统上下文( s y s t e m 1 e v e l c o n t e x t ) 组成。用户级上下文由进程的正文、数据、用户栈和共享存储区组成。在 l i n u x 操作系统中,它们占据了该进程o 到3 g 的虚地址空间。寄存器上下文由程序计 数器、处理机状态寄存器、栈指针、通用寄存器等硬件寄存器的内容组成。系统上下文 是由与进程相关的内核数据结构组成。l i n u x 内核中的核心数据结构是t a s ks t r u c t 结 构,它记录与进程相关的全部资源。t a s ks t r u c t 数据结构在l i n u x s c h e d h 中定义。其 中m m 数据结构是进程整个用户空间的抽象和控制结构,它包括指向进程页表目_struct 录的指针p g d ,和代码段、数据段、堆、栈、参数段与环境段各自的起止,以及其他各 信息。f s _ s t r u c t 记录文件系统的信息:_ i e s _ s t r u c t 记录打开的文件信息:s i g n a l s t r u c t 记录进程设置好的信号处理程序。 上海大学研究生论文用纸 内核中有个全局量m e m ,这是一个指针,指向一个“页面”数据结构的数map 组,每个“页面”数据结构代表着一个物理页面,整个数组就代表着系统中的全部物理 页面。因此页面表的高2 0 位就是一个物理页面的序号,将这个序号用作下标就可以从 m e mm a p 找到代表这个物理页面的“页面”数据结构 前面的介绍都是作用于物理空间管理的,我们还需要研究虚拟空间的管理策略,也 就是虚存页面的管理。虚存空间的管理不像物理空间的管理那样有一个总的物理页面仓 库,而是以进程为基础的,每个进程都有各自的虚存( 用户) 空间。不过,如前所述, 每个进程的“系统空间”是统一为所有进程所共享的。 如果说物理空间是从“供”的角度来管理的,也就是:“还有什么可用”的概念; 则虚存空间的管理是从“需”的角度来管理的,就是“需要用虚拟空间中的哪些部 分”。拿虚拟空间中的“用户空间”部分来说,几乎没有一个进程会真的需要使用全部 的3 g 字节的空间。同时,一个进程所需要使用的虚存空间中的各个部位又未必是连续 的,通常形成若干离散的虚存“区间”,l i n u x 操作系统中使用数据结构 “v m a r e a s t r u c t ”来描述这些“区间”。如图3 8 所示,描述了l i n u x 内核中管理 操作系统内存的几个重要数据结构间的相互关系。 上海大学研究生论文用纸 t a s ks t r u c t 圈 物珊内存 m e mm a d 图3 8l i n u x 内核中几个管理操作系统内 存数据结构间的相互关系 o x 0 结构中的v m _ s t a r t 和v m e n d 决定了一个虚拟空间。v m _ s t a r t 是包含在区间内 的,而v m _ e n d 则不包含在区间内。区间的划分并不仅仅取决于地址的连续性,也取决 于区间的其他属性,主要是对虚拟页面的访问权限。如果一个地址范围内的前一半页面 和后一半页面有不同的访问权限或其他属性,就得要分成两个区间。所以,包含在同一 个区间里的所有页面都应有相同的访问权限( 或者说保护属性) 和其他一些属性,这就 上海大学研究生论文用纸 是结构中的成分v m _ p a g e _ p r o t 和v m 竹a g s 的用途。属于同一个进程的所有区间都要 按虚存地址的高低次序链接在一起,结构中的v m _ n e x t 指针就是用于这个目的。由于 区间的划分并不仅仅取决于地址的连续性,一个进程的虚存( 用户) 空间很可能会被划 分成大量的空间。内核中给定一个虚拟地址而么找出其所属的区间是一个频繁用到的操 作,如果每次都要顺着v m 在链中作线性搜索的话,势必会显著地影响到内核的_next 效率。所以,除了通过v m 指针把所有区间串成一个线性队列以外,还可以在区_next 间数量较大时为之建立一个a v l ( a d e l s o n _ v e l s k i ia n dl a n d i s ) 树。a v l 树是一种平 衡的树结构,读者从有关的数据结构专著中可以了解到,在a v l 树中搜索的速度快而 代价是o ( 1 9n ) ,即与树的大小的对数( 而不是树的大小) 成比例。虚存区间结构 v ma r e as t r u c t 中的v ma v l h e i g h t 、v ma v ll e f t 以及v ma v l三个成分就是用_right 于a v l 树,表示本区间在a v l 树中的位置的。 系统上下文由与进程相关的内核数据结构组成。通过进程控制块t a s ks t r u c t 数据 结构可以获得全部系统上下文的内容。内核数据结构通过指针层层相连,非常复杂,不 太可能保存它的全部内容,事实上也没有必要。系统上下文在创建进程时形成,在进程 执行过程中( 除调用与文件、信号或虚存等相关的系统调用) 基本不改变。保存系统上 下文就只需保存与文件、信号、虚存等相关内核数据结构的主要内容。与虚存相关的只 需保存数据段、堆、栈等的起始和结束地址,这些信息在m ms t r u c t 结构中,可通过 c u r r e n t 一 m m 指针访问。 在保存过程中,就要对进程的上下文状态进行保存。用户级上下文包括代码段、数 据段、堆、用户栈以及命令行参数和环境变量。其中代码段、命令行参数与环境变量在 进程运行过程中并不改变,因此没有必要保存。进程运行过程就是对数据段、堆和用户 栈的读写过程,无论何时做检查点,都要对它们进行完整的保存。然而保存方法又各不 相同。对数据段的保存,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论