CN1438576A - 基于操作栈记录的恢复的Java线程迁移的方法 - Google Patents
基于操作栈记录的恢复的Java线程迁移的方法 Download PDFInfo
- 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
Links
- 238000000034 method Methods 0.000 title claims abstract description 27
- 230000005012 migration Effects 0.000 claims description 26
- 238000013508 migration Methods 0.000 claims description 25
- 238000011084 recovery Methods 0.000 claims description 12
- 230000008569 process Effects 0.000 claims description 11
- 238000012545 processing Methods 0.000 claims description 10
- 238000002955 isolation Methods 0.000 abstract description 4
- 238000003780 insertion Methods 0.000 description 29
- 230000037431 insertion Effects 0.000 description 29
- 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 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).操作栈内容保存的操作:在载入目标字节码的过程中,插入相应的处理代码,及时对每一次出栈入栈的操作,都用插入相应的字节码的方法来记录相应的操作。
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)
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)
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 | コーニンクレッカ フィリップス エレクトロニクス エヌ ヴィ | 仮想マシン命令の最適化されたバイトコードインタープリタ |
-
2003
- 2003-03-21 CN CNB03121035XA patent/CN100356326C/zh not_active Expired - Fee Related
Cited By (7)
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 |