论文部分内容阅读
一般来说,一个软件系统在交付使用之后,会经历无数次的更新。我们通常所接触的更新都是静态软件更新,它是按照“关闭-更新-重新启动”这样的步骤进行的。和它相对应的是动态软件更新,动态软件更新的产生是由于用户难以接受更新所造成的拒绝服务。对于银行和电话交换系统软件来说,它们是不允许停止服务的。对于空中运输控制和生命维持软件,小小的中断都会关系到人们的生命安全,因此它们是一定不能中断的。在这些情况下,就需要程序具有动态更新的能力。本文的主要工作是提供和实现了一种JAVA软件动态更新方法,使得在不影响系统的持续运行的情况下,以组件为逻辑单位,以类为原子进行替换。运行时替换的一个难点是状态传递。通过状态传递,新组件能在旧组件已有计算的基础上继续执行,而不会使计算退化。以往的状态传递方法都是要新旧组件提供状态传递的接口,这样就必须事先为被替换组件准备状态传递接口。本文在sun的Java平台上实现了一种方法,自动完成状态传递,而不需要事先准备。并且将对象的状态定义为静态数据区,通过使新旧组件共享静态数据区,从而使新旧组件状态保持一致,完成状态传递,这种方法不需要旧组件事先准备相应的状态传递接口,而且没有性能损失。在实现上本文是以类为替换的最小单位,根据组件中类与类之间的依赖关系构建多个类的替换序列来完成组件替换(这里的组件不止局限于Java中的组件定义,它是指体系结构中的组件)。由于JVM本身对类的动态更新支持的不理想,所以本文在运行时对JVM的相应部分进行了少量的修改和扩充,使之能够完成对运行时类替换的支持,再由多个类的替换序列组成组件替换。运行时修改虚拟机是为了适应已有的正在虚拟机中运行着的程序,从而实现不用事先准备就能进行运行时演化。而且每次替换都有版本管理,解决替换中的名字冲突问题,以及保证下一次替换的一致性和正确性。本文提供了一个工具,实现了上面的想法。替换时把新组件和替换详细说明提交给这个工具,由它自动完成替换操作。以往的动态更新方法是等待旧组件没有活动的调用,才进行替换,所以必须等待时机。有可能一直都没有合适的时机,所以就有可能一直得不到替换。本文所提出的方法的好处是替换马上生效,已有的对象调用使用旧对象,新的对象调用使用新对象,这就形成了一个新旧对象共存的过渡阶段,等所有的旧对象都过了生命期,系统中就只有新对象了。最终完成整个替换过程。