当前位置: 首页 > 专利查询>清华大学专利>正文

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

技术编号:2876404 阅读:224 留言:0更新日期:2012-04-11 18:40
基于操作栈记录与恢复的Java线程迁移的方法属于线程迁移技术领域,其特征在于:它通过动态的解释载入的字节码,使得在载入目标字节码的同时,动态地修改插入的目标字节码。对于赋值操作,它把相应的代码段隔离,以此代替对操作栈中的内容进行隔离;对于保存操作栈内容的操作,针对每一次出栈入栈的操作,都用插入相应的字节码的方法来记录相应的操作,它操作安全效率也高。(*该技术在2023年保护过期,可自由使用*)

【技术实现步骤摘要】

属于线程迁移
,尤其涉及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 i本文档来自技高网...

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

【技术特征摘要】

【专利技术属性】
技术研发人员:杨广文马聪鹏陈明
申请(专利权)人:清华大学
类型:发明
国别省市:11[中国|北京]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1