CN100356326C - 基于操作栈记录的恢复的Java线程迁移的方法 - Google Patents
基于操作栈记录的恢复的Java线程迁移的方法 Download PDFInfo
- 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
Links
- 238000000034 method Methods 0.000 title claims abstract description 70
- 230000005012 migration Effects 0.000 claims description 30
- 238000013508 migration Methods 0.000 claims description 29
- 238000012545 processing Methods 0.000 claims description 22
- 230000008569 process Effects 0.000 claims description 12
- 238000011084 recovery Methods 0.000 claims description 12
- 238000013459 approach Methods 0.000 claims description 3
- 238000003780 insertion Methods 0.000 abstract description 32
- 230000037431 insertion Effects 0.000 abstract description 32
- 238000002955 isolation Methods 0.000 abstract description 3
- 238000012986 modification Methods 0.000 description 6
- 230000004048 modification Effects 0.000 description 6
- 238000011160 research Methods 0.000 description 5
- 238000005516 engineering process Methods 0.000 description 3
- 238000004321 preservation Methods 0.000 description 3
- 230000007704 transition Effects 0.000 description 2
- 239000002253 acid Substances 0.000 description 1
- 230000009471 action Effects 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 230000007613 environmental effect Effects 0.000 description 1
- 239000000284 extract Substances 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
基于操作栈记录与恢复的Java线程迁移的方法属于线程迁移技术领域,其特征在于:它通过动态的解释载入的字节码,使得在载入目标字节码的同时,动态地修改插入的目标字节码。对于赋值操作,它把相应的代码段隔离,以此代替对操作栈中的内容进行隔离;对于保存操作栈内容的操作,针对每一次出栈入栈的操作,都用插入相应的字节码的方法来记录相应的操作,它操作安全效率也高。
Description
技术领域
基于操作栈记录的恢复的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直到表达式类型语句的目标代码段处理完毕。
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)
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)
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 |
-
2003
- 2003-03-21 CN CNB03121035XA patent/CN100356326C/zh not_active Expired - Fee Related
Patent Citations (6)
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 |