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

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

Info

Publication number
CN100356326C
CN100356326C CNB03121035XA CN03121035A CN100356326C CN 100356326 C CN100356326 C CN 100356326C CN B03121035X A CNB03121035X A CN B03121035XA CN 03121035 A CN03121035 A CN 03121035A CN 100356326 C CN100356326 C CN 100356326C
Authority
CN
China
Prior art keywords
statement
code
java
istore
distance piece
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.)
Expired - Fee Related
Application number
CNB03121035XA
Other languages
English (en)
Other versions
CN1438576A (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 Variables的捕捉和恢复,有很多方案,但是很少提及对Thread的Operand Stack(操作栈)的捕捉和恢复,并且没有研究机构能发表出明确可行的方案,这一点是我们参考的文献中没有任何一家研究提到过的。
针对这个线程迁移中的重点和难点,我们提出了自己的可行方案,实现了Java Thread线程中的Operand Stack(操作栈)的恢复,我们的策略可以很安全有效地实现。
发明内容:
本发明的目的在于提供一种安全有效的基于操作栈记录的恢复的Java线程迁移方法。
其特征在于:它通过动态地解释载入的目标字节码,使得在载入目标字节码的同时,动态地修改载入的目标字节码,对下述不同的程序操作进行不同的处理:
[1]进入目标字节码,判断用户java程序的目标字节码中定义的所有方法是否处理完毕,如果处理完毕,退出Java线程迁移处理程序;
[2]读入用户java程序的目标字节码定义的下一个未处理的方法;
[3]判断该方法是否为java语言中的类的初始化方法,即开头标识为“<init>”,如果是初始化方法,则不进行任何处理;
[4]如果该方法不是初始化方法,则逐条依次读入该方法的每条语句;
[5]进入该方法的定义体,判断该方法中的语句是否全部处理完毕,如果处理完毕,退出该方法的处理部分,转到步骤[1];
[6]读入该方法中下一条未处理的语句,判断该语句是否为赋值语句,如果该语句是赋值语句,则进行赋值类型语句的相应处理,如果该语句是表达式类型的语句,则进行表达式类型的相应处理;处理结束后重复步骤[5]:
(1)赋值操作:把相应的代码段隔离,以便当执行到这些隔离代码段时去阻止迁移,以此代替对操作栈中的内容进行隔离:
赋值类型语句的处理:
I.在赋值类型语句的前面插入代码隔离段开始部分标志:iconst_1,istore_2,
II.在赋值类型语句的后面插入代码隔离段结束部分标志:iconst_0,istore_2,
(2).操作栈内容保存的操作,它是针对表达式类型语句的:在载入目标字节码的过程中,插入相应的处理代码,及时对每一次出栈入栈的操作,都用插入相应的字节码的方法来记录相应的操作:
表达式类型语句处理:
I.读入表达式类型语句的目标代码段下一条未处理语句;
II.插入代码隔离段开始部分标志:iconst_1,istore;
III.插入代码隔离段结束部分标志:iconst_0,istore;
IV.转到I直到表达式类型语句的目标代码段处理完毕。
使用证明:它同时保证了线程迁移的正确性和Java线程迁移的效率。
附图说明
图1,基于操作栈记录的恢复的Java线程迁移方法的程序流程框图。
具体实施方式
本发明采用的方法是不对Java虚拟机进行任何的修改,而从目标代码入手。Java是一种解释性的语言,它通过动态的解释载入的目标字节码(Byte Code),使我们在载入目标字节码的同时,动态的修改插入目标字节码的策略成为可能,这样一来,Java虚拟机(JVM)解释的就是经过我们的程序处理过的代码了。
Java本质上是一种面向堆栈的语言,这种特点决定了,Java里面任何与数值有关的操作比如赋值,表达式的计算都需要借助栈来完成,而我们的目的是要在目标代码计算的同时,记录和保存操作栈中的内容,以便于在程序迁移到其他的目标节点的时候能够恢复操作栈的内容。
我们针对不同的程序操作进行了不同的处理。第一种赋值操作,我们的策略是将相应的代码段隔离,当执行到这些隔离代码段的时候,不进行迁移,这样也就不用对操作栈中的内容进行隔离了。第二种情况是我们需要进行操作栈内容保存的,在载入目标字节码的过程中,如果遇到了下面这样类型的语句赋值、表达式运算(形如以下的表达式代码段):x=y+z;我们要插入相应的处理代码。方法如下:
[1]进入目标字节码,判断用户java程序的目标字节码中定义的所有方法是否处理完毕,如果处理完毕,退出Java线程迁移处理程序;
[2]读入用户java程序的目标字节码定义的下一个未处理的方法;
[3]判断该方法是否为java语言中的类的初始化方法,即开头标识为“<init>”,如果是初始化方法,则不进行任何处理;
[4]如果该方法不是初始化方法,则逐条依次读入该方法的每条指令;
[5]进入该方法的定义体,判断该方法中的指令是否全部处理完毕,如果处理完毕,退出该方法的处理部分,转到步骤[1];
[6]读入该方法中下一条未处理的语句,判断该语句是否为赋值语句,如果该指令是赋值语句,则进行赋值类型语句的相应处理,如果该语句是表达式类型的语句,则进行表达式类型的相应处理;处理结束后重复步骤[5]:
(1)赋值操作:把相应的代码段隔离,以便当执行到这些隔离代码段时去阻止迁移,以此代替对操作栈中的内容进行隔离:
赋值类型语句的处理:
I.在赋值类型语句的前面插入代码隔离段开始部分标志:iconst_1,istore_2,
II.在赋值类型语句的后面插入代码隔离段结束部分标志:ieonst_0,istore_2,
(2).操作栈内容保存的操作(针对表达式类型语句):在载入目标字节码的过程中,插入相应的处理代码,及时对每一次出栈入栈的操作,都用插入相应的字节码的方法来记录相应的操作:
表达式类型语句处理:
I.读入表达式类型语句的目标代码段下一条未处理指令;
II.插入代码隔离段开始部分标志:iconst_1,istore_2;
III.判断表达式类型语句的目标代码段:
1)如果是表达式类型当中的计算部分,记录操作栈中的内容计数器加1,复制操作栈顶的内容,弹出并保存操作栈顶的内容到新插入的变量中;
2)否则,如果是表达式类型中的最后一个赋值操作,记录操作栈中的内容计数器减1,弹出并保存操作栈顶的内容到新插入的变量中;
IV.插入代码隔离段结束部分标志:iconst_0,istore_2;
V.转到I直到表达式类型语句的目标代码段处理完毕。
下面,我们针对这两种不同的处理过程,给出两个简单的例子
A)赋值操作的处理:
。。。。。。。
x=100;//X变量的值设置成100
。。。。。。。
普通汇编的结果是:
0: bipush    100  //常数100进入操作栈(Operand stack)
2: istore_1     //将操作栈顶的数值弹出并设置变量X
我们的处理,在该代码段的前后都插入我们的代码隔离标志,向系统表明,该代码段不可以打断,只有执行完毕才可以迁移。
处理的结果的代码是:
0: iconst_1    //插入的代码隔离段开始部分标志
1: istore_2    //插入的代码隔离段开始部分标志
2: bipush  100  //原来的代码段
4: istore_1   //原来的代码段
5: iconst_0   //插入的代码隔离段结束部分结束标志
6: istore_2  //插入的代码隔离段结束部分标志
B)表达式操作的处理:
。。。。。。。
x=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_2  %4 //插入的代码隔离段开始部分标志
29: iload_2    //原来的代码段
30: iinc  %5-1//记录操作栈中的内容计数器+1
33: dup        //复制操作栈顶的内容
34: istore  %6    //弹出并保存操作栈顶的内容到新插入的变量中
36: iconst_0     //插入的代码隔离段结束部分标志
37: istore_2%4    //插入的代码隔离段结束部分标志
经过针对每条语句的类似的处理,结果的代码如下:
//对第8条语句iload_2的修改
26: iconst_1    //插入的代码隔离段开始部分标志
27: istore_2%4   //插入的代码隔离段开始部分标志
29: iload_2     //原来的代码段
30: iinc  %5-1 //记录操作栈中的内容计数器+1(操作栈为1个值)
33: dup         //复制操作栈顶的内容
34: istore  %6   //弹出并保存操作栈顶的内容到新插入的变量中
36: iconst_0    //插入的代码隔离段结束部分标志
37: istore_2%4   //插入的代码隔离段结束部分标志
//对第9条语句iload_3的修改
39: iconst_1    //插入的代码隔离段开始部分标志
40: istore_2  %4   //插入的代码隔离段开始部分标志
42: iload_3     //原来的代码段
43: iinc %5 -1 //记录操作栈中的内容计数器+1(操作栈为2个值)
46:  dup            //复制操作栈顶的内容
47:  istore    %7    //弹出并保存操作栈顶的内容到新插入的变量
49:  iconst_0      //插入的代码隔离段结束部分标志
50:  istore_2  %4    //插入的代码隔离段结束部分标志
//对第10条语句iadd的修改
52:  iconst_1      //插入的代码隔离段开始部分标志
53:  istore_2  %4    //插入的代码隔离段开始部分标志
55:  iadd          //原来的代码段
56:  iinc  %5 1   //记录操作栈中的内容计数器-1(此时操作栈数为1)
59:  dup           //复制操作栈顶的内容
60:  istore    %6    //弹出并保存操作栈顶的内容到新插入的变量
62:  iconst_0      //插入的代码隔离段结束部分标志
63:  istore_2  %4    //插入的代码隔离段结束部分标志
//对第11条语句istore_1的修改
65:  iconst_1      //插入的代码隔离段开始部分标志
66:  istore_2  %4    //插入的代码隔离段开始部分标志
68:  istore_1      //原来的代码段
69:  iinc   %5  1 //记录操作栈中的内容计数器-1(此时操作栈为空)
72:  iconst_0      //插入的代码隔离段结束部分标志
73:  istore_2    %4  //插入的代码隔离段结束部分标志
综上所述,针对我们的目标,保证Java线程迁移的过程中的栈能够被正确的恢复,同时考虑到迁移过程中的效率问题,我们采用的策略是分析目标代码的类型,采用了对赋值表达式利用类似数据库中的事务处理进行隔离,也就是说把赋值表达式的目标代码看作一个整体,进行原子操作。而同时针对Java线程中的表达式操作,我们则采用了上面所描述的方法,同时上面也展示了被我们的策略修改前和修改之后的目标代码。
经过测试,我们的策略能够保证Java线程在迁移过程栈能够正确的恢复,从而保证了线程迁移的正确性,同时我们的策略也保证了Java线程迁移的效率。
相应的一般性的程序流程框图见图1。
首先,需要指出和说明的是,本文中的算法采用的机制是对透明的算法,这里透明的含义是指,本文上面流程中阐述的,针对用户提交程序迁移的过程中所需要的,捕捉用户程序的程序指针,程序的变量的数值,和用户程序操作栈的内容,并且在目标代码迁移到目标代码之后,针对用户程序指针,程序的变量的数值,和用户程序操作栈的内容的恢复工作,所有的上面的工作,都是在用户透明的情况下进行的,也就是说,用户不需要对上面所阐述的种种工作进行参与和操作,这些工作都是由,元计算系统中的线程迁移模块来完成的。
因此,鉴于上面的阐述,拥有本文中的所描述的线程迁移的算法的元计算系统中,如果需要迁移用户提交的任务到目标节点,用户无需做出额外的动作。

Claims (1)

1.基于操作栈纪录的恢复的Java线程迁移的方法,其特征在于:它通过动态地解释载入的目标字节码,使得在载入目标字节码的同时,动态地修改载入的目标字节码,对下述不同的程序操作进行不同的处理:
[1]进入目标字节码,判断用户java程序的目标字节码中定义的所有方法是否处理完毕,如果处理完毕,退出Java线程迁移处理程序;
[2]读入用户java程序的目标字节码定义的下一个未处理的方法;
[3]判断该方法是否为java语言中的类的初始化方法,即开头标识为“<init>”,如果是初始化方法,则不进行任何处理;
[4]如果该方法不是初始化方法,则逐条依次读入该方法的每条语句;
[5]进入该方法的定义体,判断该方法中的语句是否全部处理完毕,如果处理完毕,退出该方法的处理部分,转到步骤[1];
[6]读入该方法中下一条未处理的语句,判断该语句是否为赋值语句,如果该语句是赋值语句,则进行赋值类型语句的相应处理,如果该语句是表达式类型的语句,则进行表达式类型的相应处理;处理结束后重复步骤[5]:
(1).赋值操作:把相应的代码段隔离,以便当执行到这些隔离代码段时去阻止迁移,以此代替对操作栈中的内容进行隔离:
赋值类型语句的处理:
I.在赋值类型语句的前面插入代码隔离段开始部分标志:iconst_1,istore_2,
II.在赋值类型语句的后面插入代码隔离段结束部分标志:iconst_0,istore_2,
(2).操作栈内容保存的操作,它是针对表达式类型语句的:在载入目标字节码的过程中,插入相应的处理代码,及时对每一次出栈入栈的操作,都用插入相应的字节码的方法来记录相应的操作:
表达式类型语句处理:
I.读入表达式类型语句的目标代码段下一条未处理语句;
II.插入代码隔离段开始部分标志:iconst_1,istore;
III.插入代码隔离段结束部分标志:iconst_0,istore;
IV.转到I直到表达式类型语句的目标代码段处理完毕。
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 CN1438576A (zh) 2003-08-27
CN100356326C true 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)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7680758B2 (en) * 2004-09-30 2010-03-16 Citrix Systems, Inc. Method and apparatus for isolating execution of software applications
US8549506B2 (en) * 2010-04-27 2013-10-01 Microsoft Corporation Resumable methods
CN102236576B (zh) * 2011-08-09 2015-01-07 复旦大学 一种支持混合模式执行的Java虚拟机执行引擎
CN104318135B (zh) * 2014-10-27 2017-04-05 中国科学院信息工程研究所 一种基于可信执行环境的Java代码安全动态载入方法

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP0955584A2 (en) * 1998-05-06 1999-11-10 Sun Microsystems, Inc. Fast synchronization for programs written in the java programming language
CN1281613A (zh) * 1997-10-07 2001-01-24 卡纳尔股份有限公司 多线程数据处理器
CN1330785A (zh) * 1998-11-05 2002-01-09 Bea系统公司 分布式处理系统中含消息传送核心的集团型企业javatm
CN1347525A (zh) * 1999-09-21 2002-05-01 皇家菲利浦电子有限公司 虚拟机指令的优化字节码解释器
US6401109B1 (en) * 1996-11-18 2002-06-04 International Business Machines Corp. Virtual socket for JAVA interprocess communication
US6529962B1 (en) * 1999-02-05 2003-03-04 International Business Machines Corporation Preserving thread identity during remote calls

Patent Citations (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
CN1281613A (zh) * 1997-10-07 2001-01-24 卡纳尔股份有限公司 多线程数据处理器
EP0955584A2 (en) * 1998-05-06 1999-11-10 Sun Microsystems, Inc. Fast synchronization for programs written in the java programming language
CN1330785A (zh) * 1998-11-05 2002-01-09 Bea系统公司 分布式处理系统中含消息传送核心的集团型企业javatm
US6529962B1 (en) * 1999-02-05 2003-03-04 International Business Machines Corporation Preserving thread identity during remote calls
CN1347525A (zh) * 1999-09-21 2002-05-01 皇家菲利浦电子有限公司 虚拟机指令的优化字节码解释器

Also Published As

Publication number Publication date
CN1438576A (zh) 2003-08-27

Similar Documents

Publication Publication Date Title
KR100640314B1 (ko) 혼합된 실행 스택 및 예외처리의 구현방법및 그 장치
TWI482094B (zh) 在程式碼轉換期間異常的精確處理之方法與裝置
Steenkiste et al. Tags and type checking in LISP: Hardware and software approaches
US8261251B2 (en) Modification of array access checking in AIX
WO2003001373A1 (en) Java rule engine framework
Anderson A computer for direct execution of algorithmic languages
Jacobs A formalisation of Java’s exception mechanism
CN100356326C (zh) 基于操作栈记录的恢复的Java线程迁移的方法
CN101366035A (zh) 保护便携装置中的中间语言软件代码执行的安全的方法
CN103092759A (zh) 一种嵌入式环境下的代码动态性能剖析器
Chase Implementation of exception handling
Strumpen Portable and fault-tolerant software systems
JP3049814B2 (ja) マイクロコンピュータの言語処理装置
Bouchenak et al. Efficient Java thread serialization
Phan et al. Runtime support for region-based memory management in Mercury
Sparud Tracing and debugging lazy functional computations
Berthold Orthogonal serialisation for Haskell
Reenskaug A DCI execution model
US20040139424A1 (en) Method for execution context reification and serialization in a bytecode based run-time environment
Cutts et al. The PamCase Machine
Phan Region-based memory management for the logic programming language Mercury
Marché et al. The Krakatoa tool for deductive verification of Java programs
Lafora et al. Reverse execution in a generalized control regime
Suzuki Translating java bytecode to BoogiePL
Hua et al. Rethink exception handling at C level

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