一种移动Agent强迁移的方法

文档序号:6442968阅读:194来源:国知局
专利名称:一种移动Agent强迁移的方法
技术领域
本发明涉及移动Agent (人工智能)的迁移机制,尤其涉及一种应用在基于Java 的移动Agent系统中,藉由continuation(续延)机制、字节码转换技术,在不需要修改 Java虚拟机的前提下实现强迁移的方法。
背景技术
移动Agent是一种新颖的构建分布式应用程序的设计范例,由于Java的平台无关性和对代码迁移的良好支持,目前大多数移动Agent系统都是基于Java来构建的。然而, Java的执行模型没有提供对程序运行状态的访问,因此,目前直接基于Java提供的代码迁移机制构建的主流移动Agent系统都只支持弱迁移,也就是说Agent在不同的主机间迁移代码,迁移时可能携带一些初始化数据,但是不涉及执行状态的迁移,因此,在Agent迁移到新的主机后通常是从其初始状态重新开始执行。基于这些系统进行应用程序的开发存在着一定的难度,系统的易用性很差。

发明内容
发明目的针对直接基于Java的移动Agent系统不支持强迁移的现状,本发明提出一种实现移动Agent强迁移的方法,该方法引入了 continuation机制,结合字节码转换技术实现线程状态的捕获;使用对象序列化机制和Java socket机制实现Agent在网络中的主动迁移;实现Agent在迁移到目的主机后的状态恢复。技术方案为实现上述目的,本发明采用的技术方案为一种移动Agent强迁移的方法,包括如下步骤(1)状态捕获使用continuation机制实现线程执行状态捕获,并把该线程执行状态具体化为Java对象;(2)Agent迁移=Agent携带着捕获到的线程执行状态在网络环境中主动迁移;(3)状态恢复=Agent在迁移到目的主机后,先恢复线程执行状态,进而使得Agent 从原来中断的地方开始继续执行。所述步骤(1)中,continuation机制通过字节码转换技术实现。所述步骤O)中,捕获到的线程执行状态需首先具体化为continuation,再使用对象序列化机制和Java socket机制通过Agent携带着在网络环境中主动迁移。所述步骤(3)中,在目的主机上建立有continuation环境,Agent迁移过来的线程执行状态恢复在该环境中,进而恢复Agent的执行。有益效果本发明提供的移动Agent强迁移的方法,引入了 continuation机制, 结合字节码转换技术实现线程状态的捕获;使用对象序列化机制和Java socket机制实现 Agent在网络中的主动迁移;实现Agent在迁移到目的主机后的状态恢复;该方法通用性强,可方便的集成到已有的基于Java的移动agent系统中,使得该系统具有强迁移的能力; 由于没有修改Java虚拟机,因此,该方法具有一定的可移植性。


图1为本发明的物理结构示意图;图2为本发明的逻辑结构示意图;图3为本发明中状态捕获的流程示意图;图4为本发明中状态恢复的流程示意图。
具体实施例方式下面结合实施例对本发明作更进一步的说明。一种移动Agent强迁移的方法,如图1、图2所示包括如下三个阶段(1)状态捕获使用continuation机制实现线程执行状态捕获,并把该线程执行状态具体化为Java对象;(2)Agent迁移=Agent携带着捕获到的线程执行状态在网络环境中主动迁移;(3)状态恢复=Agent在迁移到目的主机后,先恢复线程执行状态,进而使得Agent 从原来中断的地方开始继续执行。下面就各个阶段做具体说明。阶段1 状态捕获状态捕获的流程示意图如图3所示,本发明首先将continuation定义为Agent的执行环境,该环境为Agent的强迁移提供了支持。在Agent运行前,需要首先建立这个环境, 再在该环境中开始Agent的运行,而且,以后所有的操作都是在这个环境中进行的,这样就保证了 continuation对Agent执行状态的捕获。随后,由于Agent的执行状态存在于虚拟机的栈结构中,而该栈结构是一个本地的数据结构,不具有可移植性,Agent迁移时为了保存执行状态需要将该栈转换为可以移植的数据结构,continuation提供了这种转换功能,具体步骤如下1、中断执行过程。在进行转换前首先中断Agent的执行过程,中断执行过程采用了设置标志位的方法,该标志位表示是否需要保存Agent的状态,如果该标志位为真值,程序就会保存Agent的执行状态,接着跳出continuation环境,程序流程处于Agent运行的环境之外,表示中断了其执行过程。在Agent运行的任何地方都可以使用continuation 的中断机制来中断其执行过程。Agent的执行过程被中断后就可以捕获其执行状态。由于 Agent运行在continuation所创建的环境中,continuation将负责捕获Agent的执行状态,这样continuation所捕获到的执行状态也应该保存在该环境中。2、捕获局部变量。continuation机制模仿Java虚拟机也维持了一个逻辑上的栈, 称为MackRecorder。Java虚拟机栈在方法调用时会保存该方法局部变量的值,在方法返回时会弹出这些值,与此类似,StackRecorder在保存Agent状态时,捕获栈框架中的所有局部变量的值,在恢复状态时将这些值弹出并赋给Agent中方法的局部变量。3、捕获程序计数器。要实现Agent的强迁移,除了需要保存栈框架中的所有局部变量的值,还需要保存程序计数器的值,对于程序计数器的值,该方法引入一个人工程序计数器的概念,人工程序计数器是一个整型变量,用来表示方法调用指令的顺序,第一个方法调用指令的人工程序计数器的值为0,第二个为1,以此类推。并将人工程序计数器的值在保存完局部变量值后保存到MackRecorder中。这样做的目的是为了在恢复状态的时候首先恢复人工程序计数器的值,并根据该值跳转到相应的方法调用指令处,保证了在和原先捕获时相同位置的地方恢复状态。需要注意的是这里局部变量和程序计数器值的保存顺序是很重要的,保存时的顺序将影响到状态恢复时这些值的恢复顺序,两者应该保持一致。4、收集数据的类型信息。在捕获线程执行状态时,除了捕获Java栈框架中所有局部变量的值和程序计数器的值以外,还需要注意的是局部变量和操作数栈中的项的类型对于实现Agent透明迁移来说也是很重要的一方面。Java虚拟机并没有管理位于其Java栈中的数据的任何类型信息,因此,需要使用类型推断技术来搜集这些数据的类型信息。该方法中的类型推断过程使用和Java虚拟机规范中定义的Java字节码检验器所使用的数据流分析器类似的方法,进行类型的推断,数据流分析器中包含一个数据结构表示栈的局部变量表和操作数栈项中数据的类型。捕获和恢复Agent执行状态的功能需要使用字节码改写技术来实现。本发明在 Java虚拟机加载Agent的时候对其字节码进行动态的转换,字节码转换器接收字节码方法并对其进行改写,在其中插入具有捕获和恢复线程状态功能的字节码指令,最终产生一个新的字节码方法。这样,当Agent加载进虚拟机中运行时,Agent就具有了强迁移的能力。为了减少插入额外指令带来的系统开销,本发明使用了一种优化的方法,该方法只对调用了 continuation中断指令的方法进行转换,这里的调用包括直接调用和间接调用,对这两种调用方式都需要进行转换。对于其它不需要中断的方法,则没有必要进行转换,一定程度上降低了指令插入所引入的系统空间和运行时的开销。具体步骤如下1、识别局部变量的类型。在插入状态捕获指令前先使用前面讨论的类型推断技术识别出栈框架中局部变量和操作数栈中项的类型,然后再将值和类型信息保存到 continuation 中。2、插入捕获执行状态的指令。对于捕获执行状态指令的插入,字节码转换器在方法中的每条方法调用指令的后面插入状态捕获指令,这样做的目的是为了能够保存处于中断点处的方法调用指令的人工程序计数器的值。3、插入恢复执行状态的指令。对于恢复执行状态指令的插入,字节码转换器在方法体的开始部位插入状态恢复指令。在状态捕获阶段,人工程序计数器的值保存的是方法调用指令的调用顺序,也就是方法调用指令相对于方法体开始部位的偏移值,因此,在方法体的开始部位插入状态恢复指令首先恢复人工程序计数器的值,通过该值可以知道原先状态捕获时中断点处是哪个方法调用指令,接着程序就跳转到这个方法调用指令处恢复执行。阶段2 =Agent 迁移阶段1将捕获到的Agent的执行状态保存在continuation中,这样,在需要的时候,continuation就可以携带着Agent的执行状态在网络中迁移。对于具体的迁移操作, 该方法使用对象序列化机制和Java socket机制。Java线程序列化机制要求其所序列化的 Java对象必须实现java. io. serializable接口。因此,为了实现迁移功能,continuation 及其所捕获的Agent都必须实现java. io. serializable接口。这样,就可以使用Java socket机制实现agent在网络中的迁移。阶段3 状态恢复
状态恢复的流程示意图如图4所示,要实现Agent的强迁移,需要在Agent迁移到目的主机后从Agent原来中断的地方开始继续执行,步骤如下1、新建continuation环境。在捕获有Agent对象的continuation迁移到目的主机后,为了恢复Agent的执行状态,先恢复continuation的执行,这需要在目的主机上根据迁移过来的continuation创建一个新的continuation的环境,并在这个新的环境中接收迁移过来的携带有Agent对象及其执行状态的continuation。2、重新建立对象的状态。在新建的continuation环境中恢复状态的基本思想是重新建立对象的状态,包括重新建立Java栈以及在新建的Java栈上恢复每个方法的局部变量的值。Java的反序列化机制可以恢复迁移过来的continuation以及其所捕获的agent 对象。在目的主机上重新建立Java栈时,就可以将continuation中保存的变量的值赋给 agent的局部变量,由于在捕获时使用了类型推断技术,在恢复时就根据变量的类型信息进行正确的赋值。3、恢复程序计数器。在恢复时为了保证能够从原先中断的地方继续执行,需跳过在状态捕获发生前就已经执行的部分代码。因为,这些代码在状态捕获前就已经执行了,如果在恢复时再执行一遍,就形成了重复执行,应当避免这种情况的发生。如何跳过已执行的代码,从原先中断的地方继续执行?这里使用先前状态捕获时保存的人工程序计数器的值,由于该值保存了中断点处的方法调用指令在整个方法调用过程中的调用顺序,因此,根据该值就能够判断出程序需要跳转到哪条方法调用指令。以上所述仅是本发明的优选实施方式,应当指出对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
权利要求
1.一种移动Agent强迁移的方法,其特征在于,该方法包括如下步骤(1)状态捕获使用continuation机制实现线程执行状态捕获,并把该线程执行状态具体化为Java对象;(2)Agent迁移=Agent携带着捕获到的线程执行状态在网络环境中主动迁移;(3)状态恢复=Agent在迁移到目的主机后,先恢复线程执行状态,进而使得Agent从原来中断的地方开始继续执行。
2.根据权利要求1所述的移动Agent强迁移的方法,其特征在于所述步骤(1)中, continuation机制通过字节码转换技术实现。
3.根据权利要求1所述的移动Agent强迁移的方法,其特征在于所述步骤O)中, 捕获到的线程执行状态需首先具体化为continuation,再使用对象序列化机制和Java socket机制通过Agent携带着在网络环境中主动迁移。
4.根据权利要求1所述的移动Agent强迁移的方法,其特征在于所述步骤( 中,在目的主机上建立有continuation环境,Agent迁移过来的线程执行状态恢复在该环境中, 进而恢复Agent的执行。
全文摘要
本发明公开了一种移动Agent强迁移的方法,包括状态捕获、Agent迁移和状态恢复三个步骤。本发明方法,引入了continuation机制,结合字节码转换技术实现线程状态的捕获;使用对象序列化机制和Java socket机制实现Agent在网络中的主动迁移;实现Agent在迁移到目的主机后的状态恢复;该方法通用性强,可方便的集成到已有的基于Java的移动agent系统中,使得该系统具有强迁移的能力;由于没有修改Java虚拟机,因此,该方法具有一定的可移植性。
文档编号G06F9/46GK102541637SQ20111043738
公开日2012年7月4日 申请日期2011年12月23日 优先权日2011年12月23日
发明者戚荣志, 李水艳, 毛莺池 申请人:河海大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1