[go: up one dir, main page]
More Web Proxy on the site http://driver.im/

CN1438576A - 基于操作栈记录的恢复的Java线程迁移的方法 - Google Patents

基于操作栈记录的恢复的Java线程迁移的方法 Download PDF

Info

Publication number
CN1438576A
CN1438576A CN 03121035 CN03121035A CN1438576A CN 1438576 A CN1438576 A CN 1438576A CN 03121035 CN03121035 CN 03121035 CN 03121035 A CN03121035 A CN 03121035A CN 1438576 A CN1438576 A CN 1438576A
Authority
CN
China
Prior art keywords
code
stack
java
content
written
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN 03121035
Other languages
English (en)
Other versions
CN100356326C (zh
Inventor
杨广文
马聪鹏
陈明
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Tsinghua University
Original Assignee
Tsinghua University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Tsinghua University filed Critical Tsinghua University
Priority to CNB03121035XA priority Critical patent/CN100356326C/zh
Publication of CN1438576A publication Critical patent/CN1438576A/zh
Application granted granted Critical
Publication of CN100356326C publication Critical patent/CN100356326C/zh
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

基于操作栈记录与恢复的Java线程迁移的方法属于线程迁移技术领域,其特征在于:它通过动态的解释载入的字节码,使得在载入目标字节码的同时,动态地修改插入的目标字节码。对于赋值操作,它把相应的代码段隔离,以此代替对操作栈中的内容进行隔离;对于保存操作栈内容的操作,针对每一次出栈入栈的操作,都用插入相应的字节码的方法来记录相应的操作,它操作安全效率也高。

Description

基于操作栈记录的恢复的Java线程迁移的方法
技术领域
基于操作栈记录的恢复的Java线程迁移的方法属于线程迁移技术领域,尤其涉及Java线程迁移技术。
背景技术
随着分布式计算系统(distributed computing)以及移动式计算系统的发展,线程迁移技术的重要性越来越显现出来,而随着异构系统的需要Java平台的普遍使用,Java线程迁移策略越来越被重视,它被广泛的应用到容错,负载平衡等领域。
Java线程迁移(Java Thread Migration)指的是,将在我们的系统中运行的线程(Thread),以线程(Thread)为最小单位,从正在运行的节点(node)暂停执行,将该线程的代码(code)以及数据(data)传输到系统中其他的可运行节点,继续执行的过程。通常,我们所说的透明迁移(transparent migration),指的是,系统在捕捉和恢复线程的代码以及数据的过程中,没有外部的介入,这个外部指的是用户。
目前,Java线程迁移领域里,由于java虚拟机没有相应的接口,不能提供给外部程序使其得到正在运行的线程的各种状态,其中包括PC(指令指针)以及操作栈内的内容,公认的可行的方法有两种:
第一种:直接修改虚拟机代码,这样的处理方法很直接,但是带来的问题也是很明显的,这种不透明的处理方法会产生很严重的兼容性问题,众所周知,拥有Java虚拟机版权的SUNMicrosystems(太阳微系统)公司对版权问题是很敏感而且很严格控制其版本的。
第二种:不涉及到修改虚拟机的任何代码,根据Java代码的执行特点,在代码动态加载的时候,动态的修改需要执行的代码,在目标代码中增加所需要的代码段,记录所需要的环境变量包括PC(指令指针)的值,同时利用Java提供的调试工具JPDA(Java Platform DebugArchitecture Java调试平台体系结构),抽取java虚拟机中的操作栈中的内容。
我们阐述的重点将放在第二种方案,针对Java线程(Thread)中的PC(Program Counter程序指针计数器)值以及Local Variables(局部变量)的恢复,目前有一些研究机构提出了自己的策略,如比利时的KULEUVEN研究院采用了Java线程序列化策略,以色列技术学院采用了重新改装Java编译器的策略。我们沿用了利用JPDA捕捉PC以及Local Variables的数值,采用了Java线程序列化来保存,并利用插入Byte Code(字节码)来恢复这些值的状态的方案。
虽然很多研究机构对上述的两种PC和Local Varaiables的捕捉和恢复,有很多方案,但是很少提及对Thread的Operand Stack(操作栈)的捕捉和恢复,并且没有研究机构能发表出明确可行的方案,这一点是我们参考的文献中没有任何一家研究提到过的。
针对这个线程迁移中的重点和难点,我们提出了自己的可行方案,实现了Java Thread线程中的Operand Stack(操作栈)的恢复,我们的策略可以很安全有效地实现。
发明内容:
本发明的目的在于提供一种安全有效的基于操作栈记录的恢复的Java线程迁移方法。本发明的特征在于:它通过动态地解释载入的字节码,使得在载入目标字节码的同时,动态地修改载入的目标字节码;它对下述不同的程序操作进行不同的处理:
(1).赋值操作:把相应的代码段隔离,以便当执行到这些隔离代码段时去阻止迁移,以此代替对操作栈中的内容进行隔离;
(2).操作栈内容保存的操作:在载入目标字节码的过程中,插入相应的处理代码,及时对每一次出栈入栈的操作,都用插入相应的字节码的方法来记录相应的操作。
使用证明:它同时保证了线程迁移的正确性和Java线程迁移的效率。
附图说明
图1,基于操作栈记录的恢复的Java线程迁移方法的程序流程框图。
具体实施方式
本发明采用的方法是不对Java虚拟机进行任何的修改,而从目标代码入手。Java是一种解释性的语言,它通过动态的解释载入的字节码(Byte Code),使我们在载入目标字节码的同时,动态的修改插入目标字节码的策略成为可能,这样一来,Java虚拟机(JVM)解释的就是经过我们的程序处理过的代码了。
Java本质上是一种面向堆栈的语言,这种特点决定了,Java里面任何与数值有关的操作比如赋值,表达式的计算都需要借助栈来完成,而我们的目的是要在目标代码计算的同时,记录和保存操作栈中的内容,以便于在程序迁移到其他的目标节点的时候能够恢复操作栈的内容。
我们针对不同的程序操作进行了不同的处理。第一种赋值操作,我们的策略是将相应的代码段隔离,当执行到这些隔离代码段的时候,不进行迁移,这样也就不用对操作栈中的内容进行隔离了。第二种情况是我们需要进行操作栈内容保存的,在载入目标字节码的过程中,如果遇到了下面这样类型的语句赋值、表达式运算(形如以下的表达式代码段):x=y+z;我们要插入相应的处理代码。
下面,我们针对这两种不同的处理过程,给出两个简单的例子A)赋值操作的处理:
。。。。。。。
x=100;//X变量的值设置成100
。。。。。。。
普通汇编的结果是:
0:    bipush    100 //常数100进入操作栈(0perand stack)
2:    istore_1    //将操作栈顶的数值弹出并设置变量X
我们的处理,在该代码段的前后都插入我们的代码隔离标志,向系统表明,该代码段不可以打断,只有执行完毕才可以迁移。
处理的结果的代码是:
0:   iconst_1    //插入的代码隔离段开始部分标志
1:   istore_2    //插入的代码隔离段开始部分标志
2:   bipush    100//原来的代码段
4:   istore_1    //原来的代码段
5:   iconst 0    //插入的代码隔离段结束部分结束标志
6:   istore_2    //插入的代码隔离段结束部分标志B)表达式操作的处理:
。 。 。 。 。 。 。
×=y+z;//将y,z相加并将结果赋值给X
普通汇编的结果是:
8:   iload_2   //将变量y的值压入操作栈
9:   iload_3   //将变量z的值压入操作栈
10:  iadd      //将操作栈顶的两个值相加并将结果放入栈顶
11:  istore_1  //将操作栈顶的数值弹出并设置变量X
我们的处理是针对每一次出栈入栈操作,都用插入相应的byte code来记录相应的操作,
针对上面第8条语句就处理成如下结果:
26:  iconst_1       //插入的代码隔离段开始部分标志
27:  istore    %4     //插入的代码隔离段开始部分标志
29:  iload_2       //原来的代码段
30:  iinc    %5  -1  //记录操作栈中的内容计数器+1
33:  dup             //复制操作栈顶的内容
34:  istore    %6    //弹出并保存操作栈顶的内容到新插入的变量中
36:  iconst_0       //插入的代码隔离段结束部分标志
37:  istore    %4   //插入的代码隔离段结束部分标志
经过针对每条语句的类似的处理,结果的代码如下:
//对第8条语句iload_2的修改
26:  iconst_1       //插入的代码隔离段开始部分标志
27:  istore    %4     //插入的代码隔离段开始部分标志
29:  iload_2       //原来的代码段
30:  iinc   %5  -1 //记录操作栈中的内容计数器+1(操作栈为1个值)
33:  dup            //复制操作栈顶的内容
34:  istore    %6    //弹出并保存操作栈顶的内容到新插入的变量中
36:  iconst_0       //插入的代码隔离段结束部分标志
37:  istore    %4    //插入的代码隔离段结束部分标志
//对第9条语句iload_3的修改
39:  iconst_1      //插入的代码隔离段开始部分标志
40:  istore    %4    //插入的代码隔离段开始部分标志
42:  iload_3        //原来的代码段
43:  iinc   %5  -1 //记录操作栈中的内容计数器+1(操作栈为2个值)
46:  dup           //复制操作栈顶的内容
47:  istore    %7   //弹出并保存操作栈顶的内容到新插入的变量
49:  iconst_0     //插入的代码隔离段结束部分标志
50:  istore    %4    //插入的代码隔离段结束部分标志
//对第10条语句iadd的修改
52:  iconst_1    //插入的代码隔离段开始部分标志
53:  istore    %4    //插入的代码隔离段开始部分标志
55:  iadd          //原来的代码段
56:  iinc    %5  1   //记录操作栈中的内容计数器-1(此时操作栈数为1)
59:  dup          //复制操作栈顶的内容
60:  istore    %6    //弹出并保存操作栈顶的内容到新插入的变量
62:  iconst_0    //插入的代码隔离段结束部分标志
63:  istore    %4   //插入的代码隔离段结束部分标志
//对第11条语句istore_1的修改
65:  iconst_1    //插入的代码隔离段开始部分标志
66:  istore    %4    //插入的代码隔离段开始部分标志
68:  istore_1       //原来的代码段
69:  iinc    %5  1 //记录操作栈中的内容计数器-1(此时操作栈为空)
72:  iconst_0    //插入的代码隔离段结束部分标志
73:  istore    %4    //插入的代码隔离段结束部分标志
综上所述,针对我们的目标,保证Java线程迁移的过程中的栈能够被正确的恢复,同时考虑到迁移过程中的效率问题,我们采用的策略是分析目标代码的类型,采用了对赋值表达式利用类似数据库中的事务处理(transention)进行隔离,也就是说把赋值表达式的目标代码看作一个整体,进行原子操作。而同时针对Java线程中的表达式操作,我们则采用了上面所描述的方法,同时上面也展示了被我们的策略修改前和修改之后的目标代码。
经过测试,我们的策略能够保证Java线程在迁移过程栈能够正确的恢复,从而保证了线程迁移的正确性,同时我们的策略也保证了Java线程迁移的效率。
相应的一般性的程序流程框图见图1。
首先,需要指出和说明的是,本文中的算法采用的机制是对透明的算法,这里透明的含义是指,本文上面流程中阐述的,针对用户提交程序迁移的过程中所需要的,捕捉用户程序的程序指针,程序的变量的数值,和用户程序操作栈的内容,并且在目标代码迁移到目标代码之后,针对用户程序指针,程序的变量的数值,和用户程序操作栈的内容的恢复工作,所有的上面的工作,都是在用户透明的情况下进行的,也就是说,用户不需要对上面所阐述的种种工作进行参与和操作,这些工作都是由,元计算系统中的线程迁移模块来完成的。
因此,鉴于上面的阐述,拥有本文中的所描述的线程迁移的算法的元计算系统中,如果需要迁移用户提交的任务到目标节点,用户无需做出额外的动作。

Claims (1)

1.基于操作栈纪录的恢复的Java线程迁移的方法,其特征在于:它通过动态地解释载入的字节码,使得在载入目标字节码的同时,动态地修改载入的目标字节码;它对下述不同的程序操作进行不同的处理:
(1).赋值操作:把相应的代码段隔离,以便当执行到这些隔离代码段时去阻止迁移,以此代替对操作栈中的内容进行隔离;
(2).操作栈内容保存的操作:在载入目标字节码的过程中,插入相应的处理代码,及时对每一次出栈入栈的操作,都用插入相应的字节码的方法来记录相应的操作。
CNB03121035XA 2003-03-21 2003-03-21 基于操作栈记录的恢复的Java线程迁移的方法 Expired - Fee Related CN100356326C (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CNB03121035XA CN100356326C (zh) 2003-03-21 2003-03-21 基于操作栈记录的恢复的Java线程迁移的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CNB03121035XA CN100356326C (zh) 2003-03-21 2003-03-21 基于操作栈记录的恢复的Java线程迁移的方法

Publications (2)

Publication Number Publication Date
CN1438576A true CN1438576A (zh) 2003-08-27
CN100356326C CN100356326C (zh) 2007-12-19

Family

ID=27674249

Family Applications (1)

Application Number Title Priority Date Filing Date
CNB03121035XA Expired - Fee Related CN100356326C (zh) 2003-03-21 2003-03-21 基于操作栈记录的恢复的Java线程迁移的方法

Country Status (1)

Country Link
CN (1) CN100356326C (zh)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102236576A (zh) * 2011-08-09 2011-11-09 复旦大学 一种支持混合模式执行的Java虚拟机执行引擎
CN102859489A (zh) * 2010-04-27 2013-01-02 微软公司 可恢复的方法
CN101069156B (zh) * 2004-09-30 2013-08-21 茨特里克斯系统公司 用于在隔离环境之间移动进程的方法和设备
CN104318135A (zh) * 2014-10-27 2015-01-28 中国科学院信息工程研究所 一种基于可信执行环境的Java代码安全动态载入方法

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6401109B1 (en) * 1996-11-18 2002-06-04 International Business Machines Corp. Virtual socket for JAVA interprocess communication
UA55489C2 (uk) * 1997-10-07 2003-04-15 Каналь+ Сосьєте Анонім Пристрій для багатопотокової обробки даних (варіанти)
US6349322B1 (en) * 1998-05-06 2002-02-19 Sun Microsystems, Inc. Fast synchronization for programs written in the JAVA programming language
US6385643B1 (en) * 1998-11-05 2002-05-07 Bea Systems, Inc. Clustered enterprise Java™ having a message passing kernel in a distributed processing system
US6529962B1 (en) * 1999-02-05 2003-03-04 International Business Machines Corporation Preserving thread identity during remote calls
JP2003510681A (ja) * 1999-09-21 2003-03-18 コーニンクレッカ フィリップス エレクトロニクス エヌ ヴィ 仮想マシン命令の最適化されたバイトコードインタープリタ

Cited By (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101069156B (zh) * 2004-09-30 2013-08-21 茨特里克斯系统公司 用于在隔离环境之间移动进程的方法和设备
CN102859489A (zh) * 2010-04-27 2013-01-02 微软公司 可恢复的方法
CN102859489B (zh) * 2010-04-27 2016-06-29 微软技术许可有限责任公司 可恢复的方法
CN102236576A (zh) * 2011-08-09 2011-11-09 复旦大学 一种支持混合模式执行的Java虚拟机执行引擎
CN102236576B (zh) * 2011-08-09 2015-01-07 复旦大学 一种支持混合模式执行的Java虚拟机执行引擎
CN104318135A (zh) * 2014-10-27 2015-01-28 中国科学院信息工程研究所 一种基于可信执行环境的Java代码安全动态载入方法
CN104318135B (zh) * 2014-10-27 2017-04-05 中国科学院信息工程研究所 一种基于可信执行环境的Java代码安全动态载入方法

Also Published As

Publication number Publication date
CN100356326C (zh) 2007-12-19

Similar Documents

Publication Publication Date Title
Morandat et al. Evaluating the design of the R language: Objects and functions for data analysis
CN1146788C (zh) 用于产生平台所特定的编译器的装置和方法
EP0911726B1 (en) Mixed execution stack and exception handling
CN100342329C (zh) 零开销异常处理
CN1149478C (zh) 从本地码有效调用Java方法的方法和设备
CN1238500A (zh) 用于进行静态初始化的方法和系统
US8255658B2 (en) Memory management method and computer using the same
US9495136B2 (en) Using aliasing information for dynamic binary optimization
CN1821964A (zh) 将本机函数内嵌到编译的Java代码中的方法和系统
US6912553B1 (en) Virtual machine memory management
CN1468399A (zh) 使用微代码引擎的java硬件加速器
CN106033370B (zh) 64位Java虚拟机的实现方法及装置
US9921959B2 (en) Efficient reference classification and quick memory reuse in a system that supports concurrent garbage collection
CN1295605C (zh) 处理虚拟机指令、执行本机处理器子程序的方法
US6523168B1 (en) Reduction of object creation during string concatenation and like operations that utilize temporary data storage
CN100378657C (zh) 用于改进java方法调用速度的方法和装置
US20030093778A1 (en) Method and apparatus for facilitating lazy type tagging for compiled activations
US8261251B2 (en) Modification of array access checking in AIX
US20100192139A1 (en) Efficient per-thread safepoints and local access
US8438468B2 (en) Annotation management
US6836782B1 (en) Method and apparatus for implementing modular garbage collectors
CN1438576A (zh) 基于操作栈记录的恢复的Java线程迁移的方法
US20060242635A1 (en) Method and system for optimizing array sizes in a JAVA virtual machine
US20120221821A1 (en) Method of managing memory in computer system, computer system and memory managing program
Stadler et al. Lazy continuations for Java virtual machines

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20071219

Termination date: 20150321

EXPY Termination of patent right or utility model