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

文档序号:6450486阅读:364来源:国知局
专利名称:基于操作栈记录的恢复的Java线程迁移的方法
技术领域
基于操作栈记录的恢复的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线程迁移的效率。
Java本质上是一种面向堆栈的语言,这种特点决定了,Java里面任何与数值有关的操作比如赋值,表达式的计算都需要借助栈来完成,而我们的目的是要在目标代码计算的同时,记录和保存操作栈中的内容,以便于在程序迁移到其他的目标节点的时候能够恢复操作栈的内容。
我们针对不同的程序操作进行了不同的处理。第一种赋值操作,我们的策略是将相应的代码段隔离,当执行到这些隔离代码段的时候,不进行迁移,这样也就不用对操作栈中的内容进行隔离了。第二种情况是我们需要进行操作栈内容保存的,在载入目标字节码的过程中,如果遇到了下面这样类型的语句赋值、表达式运算(形如以下的表达式代码段)x=y+z;我们要插入相应的处理代码。
下面,我们针对这两种不同的处理过程,给出两个简单的例子A)赋值操作的处理。。。。。。。
x=100;//X变量的值设置成100。。。。。。。
普通汇编的结果是0bipush100 //常数100进入操作栈(0perand stack)2istore_1//将操作栈顶的数值弹出并设置变量X我们的处理,在该代码段的前后都插入我们的代码隔离标志,向系统表明,该代码段不可以打断,只有执行完毕才可以迁移。
处理的结果的代码是0 iconst_1//插入的代码隔离段开始部分标志1 istore_2//插入的代码隔离段开始部分标志2 bipush100//原来的代码段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 //记录操作栈中的内容计数器+133 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。
首先,需要指出和说明的是,本文中的算法采用的机制是对透明的算法,这里透明的含义是指,本文上面流程中阐述的,针对用户提交程序迁移的过程中所需要的,捕捉用户程序的程序指针,程序的变量的数值,和用户程序操作栈的内容,并且在目标代码迁移到目标代码之后,针对用户程序指针,程序的变量的数值,和用户程序操作栈的内容的恢复工作,所有的上面的工作,都是在用户透明的情况下进行的,也就是说,用户不需要对上面所阐述的种种工作进行参与和操作,这些工作都是由,元计算系统中的线程迁移模块来完成的。
因此,鉴于上面的阐述,拥有本文中的所描述的线程迁移的算法的元计算系统中,如果需要迁移用户提交的任务到目标节点,用户无需做出额外的动作。
权利要求
1.基于操作栈纪录的恢复的Java线程迁移的方法,其特征在于它通过动态地解释载入的字节码,使得在载入目标字节码的同时,动态地修改载入的目标字节码;它对下述不同的程序操作进行不同的处理(1).赋值操作把相应的代码段隔离,以便当执行到这些隔离代码段时去阻止迁移,以此代替对操作栈中的内容进行隔离;(2).操作栈内容保存的操作在载入目标字节码的过程中,插入相应的处理代码,及时对每一次出栈入栈的操作,都用插入相应的字节码的方法来记录相应的操作。
全文摘要
基于操作栈记录与恢复的Java线程迁移的方法属于线程迁移技术领域,其特征在于它通过动态的解释载入的字节码,使得在载入目标字节码的同时,动态地修改插入的目标字节码。对于赋值操作,它把相应的代码段隔离,以此代替对操作栈中的内容进行隔离;对于保存操作栈内容的操作,针对每一次出栈入栈的操作,都用插入相应的字节码的方法来记录相应的操作,它操作安全效率也高。
文档编号G06F9/45GK1438576SQ0312103
公开日2003年8月27日 申请日期2003年3月21日 优先权日2003年3月21日
发明者杨广文, 马聪鹏, 陈明 申请人:清华大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1