计算机工程
Computer Engineering
1999年　第25卷　第9期　Vol.25 No.9  1999



基于自治对象的分布系统研究及实现
宋　辉　尚文倩　朱海滨
　　摘　要：简单介绍造分布式系统的RPC机制，描述了一个使用语言实现的自治对象分布式系统原形．
　　关键词：自治对象；代理；Java；分布式系统
Research and Application for Distributed System Based on Sutoomous Object
Song Hui Shang Wenqian Zhu Haibin
(School of Computer Science, National University of Defense Technology, Changsha 410073)
　　Abstract　It introduces some traditionary technologies for constructing distributed system and decribes an autonomous object based on Java.
　　Key words　Autonomous object; Agent; Java; Distrbuted system
　　Internet 将数以百万计的计算机连成一体，为我们提供了前所未有的计算能力。如何在这样一个巨大的网络上进行分布式系统应用，成为一个很重要的方向。鉴于传统的构造分布式系统的技术在大规模网络上存在许多缺点，有必要使用新的技术和思想来构造分布式系统。以下介绍构造分布式系统的几种传统技术。 
1　RPC机制
　　RPC(远程过程调用) 是一种传统的构造分布应用的方法，可以说它是其它几种机制的基础。 
　　RPC操作一般在本地进程进行过程调用，而在服务器上执行调用。RPC 的基本原理非常简单，即让本地计算机中的某个过程调用服务器上的另外一个过程。 RPC 的执行过程是：本地过程通过消息传递机制将过程调用请求消息传送到服务器的一个进程，该过程接收这一过程调用消息，执行被调用过程，然后通过应答消息返回执行结果给调用过程。 RPC 的语义大部分与传统过程调用一样。 
　　但是，与传统过程调用所不同的是，远程过程调用 RPC 中被调用的远程过程不能访问调用过程运行环境中的变量和数据，
因为两个过程执行所在的地址空间不同 (两个机器上不同的操作系统管理自己不同的地址空间) ，因而要进行参数的传递。
　　这种方法，主程序的使用比较简单，缺点是系统的升级比较繁琐。由于执行的主体程序在服务器上，所以必须在服务器上安装所需要的服务进程。当应用的规模较小时，问题还不明显，当系统的规模扩大到一定程度，整个应用的升级和一致性的保持就很困难。
2　自治对象系统结构
2.1　自治对象技术
　　自治对象可以称为Agent。它为了用户的利益，在网络上根据一定的规则进行移动，在合适的位置执行合适的动作，完成用户的要求。 
　　相对前面所说的构造分布式系统技术，自治系统有两个最显著的特点： 
　　(1) 自主导航性　自治对象可以自动寻找完成用户赋予的任务所需要协作的其他自治对象或场所。用户不需要详细指明这些信息。用户只需在 Agent 启动的时候指明交给它的任务和其它一些必要信息即可。自治对象自己会根据已有的知识到合适的地方获取那些信息。
　　(2) 代码的移动  自治对象与通常的 RPC 等机制不一样。它在移动的时候，程序之间不仅进行了控制的转移，还进行了代码的转移。服务器上不需要事先安装客户的程序，它只需要能够解释和执行用户的程序代码即可。当用户的代码需要在某地执行的时候，它就携带自身的执行代码移动到该地，该地的服务器解释执行它的代码。这样，整个系统的结构灵活性大大提高，有很好的可扩充性。
2.2　自治对象的体系结构
　　自治对象系统由两部分组成：Agent和场所。Agent就是一个自治对象，它提供某种服务或寻求某种服务。Agent分为两种：用户Agent和服务Agent。用户Agent由用户发出，代表用户的利益，可以在网络上各个场所之中移动。服务Agent由该场所的管理员发出，它不能在网络上各个场所之中移动，它固定在某个场所，提供某种特定的服务，它可以与用户Agent 和其它的服务 Agent 交流信息。场所是Agent之间进行交易的地方，一般情况下，每个场所都有一个服务 Agent ，用户Agent需要某种服务时必须移动到提供该服务的场所与服务Agent 进行交互才能完成交易。例如某个节点定义为售票处场所，那么这里就有一个售票的服务Agent ，所有要购票的用户Agent必须移动到该处，与这个服务Agent进行交易。

图1　自治对象系统逻辑图
　　基于自治对象的分布式系统分为两层：系统服务层和应用层。系统服务层有：Java虚拟机、场所间通信器和类服务器，它向应用提供必要的系统服务。Java虚拟机负责系统中程序代码的解释执行。场所间通信器提供了网络之间的通信支持，场所之间信息的交流，Agent的传输和节点的构造等。每个节点对应一个场所。类服务器负责 Java类库的加载。类库可以从本地磁盘上加载，也可以从网络某个节点上加载。应用层由针对某个特定应用开发的各种Agent和场所构成，不同的应用有不同的组成。图1是自治对象系统的逻辑结构。
2.3　自治对象的实现
　　在设计实现基于自治对象的分布式系统时，采用了 Java 语言，主要原因如下： 
　　.Java 是跨平台的语言  采用了字节码，提供了跨平台解释器。可以在不同的计算机系统中实现自治对象。
　　.Java 是面向对象的语言在Java中，一切东西都是对象。提供了很多很好的特性，可以有效地支持对象计算。使用它来构造分布式对象系统显然是一个很好的选择。 
　　.Java 语言自身对 Internet 应用的支持 Java 语言的最初目的就是为了进行网络计算，因此它提供了良好的网络支持，且提供了对象系列化 (Object　erialization) 包，可以方便地在网络上存取对象。 
　　自治对象应具有以下属性和方法： 
　　属性 CheckPoint：表示纪录转移时，live方法中语句的执行位置。这样在移动到另外的场所后，就可以接着执行后继动作。
　　・.方法live：描述了自治对象在生命中的行为。它也是自治对象移动到下一个场所后首先执行的方法。 
　　.方法go：将自治对象移动到另外一个场所。
　　.方法meet：自治对象使用该方法与场所中的服务Agent进行交易。
3　实现基于自治对象的分布式系统的主要问题
　　在实现基于自治对象分布式系统时，主要解决了3个技术难点：对象的转移、类库的加载和移动对象的通信。 
　　(1) 对象的转移 
　　自治对象在一生中经常进行转移。自治对象的转移不仅是执行控制的转移，还包括执行代码的转移，这就涉及到一个经典的分布式系统难题－进程的转移。 
　　在构造分布式系统中，一般都不支持进程的转移。这是因为进程的转移非常麻烦，所需要的代价很大。进行进程转移，需要保存进程的执行环境，同时还要在另外的计算机上进行进程执行环境的恢复。很难对异构的计算机设计一个统一的方法。Java虚拟机是一个逻辑上的计算机，只要是支持Java语言，使用的虚拟机的体系结构就是一样的。因此可以设计一种统一有效的进程转移方法。
　　但是使用Java虚拟机仅仅解决了平台一致性问题，如果要解决进程转移中的其它问题，就必须对Java虚拟机进行剖析和改造；还必须保证改造后的虚拟机的兼容性，实现的工程量很大。因此在系统中使用了另外一种方法－对象系列化和检查点机制结合完成转移。这种方法利用了Java语言中提供的机制，不对虚拟机进行改造，能够保证兼容性和跨平台性，但是对程序的编制有要求。
　　对象的状态是由3个方面决定的：成员变量状态、程序的代码(程序状态)和执行状态(语景)。只要完成上述3个状态的转移就可以认为完成了对象的转移。程序状态和成员变量状态的转移可以使用对象系列化技术来解决，执行状态的转移是通过检查点机制实现转移的。
　　对象系列化　它使得程序员能够方便地存取对象。不论它是在本地文件系统，还是在网络上，每个人都可以把对象通过网络或是其他途径发送到另一台计算机上运行。Java对象系列化允许对象方便地通过流传输，如文件流、Socket数据流。使用流机制程序员能够方便地将复杂的对象写入文件或通过网络传输。对象系列化机制实现了对对象类型、关联，以及对象存储细节的透明处理。绝大部分工作都由系统自动完成，使得大多数采用对象系列化的应用实现起来相当简单。
　　大多数情况下，要实现对象的系列化，可以通过采用 Serializable 接口来得到。 Serializable 接口不需要实现任何特殊方法，但类中的每一个数据对象必须是对象系列化对象。 JDK1.1 中的所有基本对象和类型，如 Int 、 String、 Array 、 Vectorashtable 都是对象系列化对象。
　　检查点　自治对象的执行状态与live方法的执行位置有关。由于自治对象的行为由该方法决定，它的执行位置也决定了该对象移动到另外节点的什么位置执行，且保证对象活动的连续性。在系统中，使用了检查点机制来解决执行点的恢复和保存。对象的移动并不是任何时候都可以进行，移动只能在检查点上进行。自治对象由一个私有变量CheckPoint，把当前Live方法执行保存到检查点的位置。当对象移动到另外一个场所后，服务器先恢复该对象的成员变量，然后执行Live方法，该方法检查变量CheckPoint的值，跳转到该检查点执行。这种方法比较简单，但是编程不方便，必须手工进行检查点的设置，在需要转移的地方进行CheckPoint的设置，增加了程序员的负担。但是，它的最大优点是可以在不改动编译器的情况下实现对象的转移。 
　　(2) 类库的动态加载
　　由于用户 Agent 的执行代码是解释执行的，类库是动态加载的，所以Agent的对象并不包含它继承的所有类代码。因此当用户Agent移动到某地执行，动态加载它的父类时，可能该地没有该类，因此必须从该Agent上次执行的节点或诞生的节点处获得该类代码。在系统中，专门提供了一个类服务器。负责Agent的类库代码加载。如果在本地磁盘上没有该类，它就向该Agent的诞生地的类服务器发送请求。当类服务器收到请求后，就查找本地类库管理器，如果找到了
该类代码，就将代码发给请求者。
　　当网络的规模很大时，发出请求的节点可能与用户Agent的诞生地非常远，直接向诞生地请求可能效率低，因此在每个节点的系统中增加一个类库缓冲，当用户的Agent离开某个节点时，类服务器将收到的该Agent的父类代码放入类库缓冲。用户的Agent在执行时，如果本地磁盘上没有该类，它就向该Agent的上次执行节点的类服务器请求。当类服务器收到请求后，就查找本地类库管理器，如果找到了该类代码，就将代码发给请求者；如果没有，就返回 " 查无此类 "
信息。类服务器收到 " 查无此类 " 信息就向该Agent的诞生地的类服务器发送请求。
　　(3) 对象间通信
　　自治对象的不断移动带来位置的不确定性。要保证通信畅通，就必须保证该对象的新位置能够被需要的对象得到。自治对象的位置由 TCP/IP 协议中的地址和端口号组成。
　　系统中存在 3 类通信：用户Agent之间的通信、用户Agent和服务Agent之间的通信和场所间通信。场所间通信实现场所之间的信息交流，主要是通过Agent之间的传输和虚拟节点的构造进行信息交换。由于场所是固定的，它们之间可以建立固定的通信连接，交换特定的消息。 
　　用户Agent和服务Agent之间的通信中包含目录服务通信和特定服务通信。目录服务Agent不断监听某个特定端口，向用户Agent的查询消息返回结果。该特定端口是公开的。特定服务通信的端口可由开发者自己设定，提供服务之前需要向目录服务 Agent 提交自己的特征信息 ( 如提供的服务类型，URL等 ) 。用户Agent从目录服务Agent得到该类信息后再与该服务Agent进行信息交互。
　　用户Agent之间的信息交互由于移动产生了位置的不确定性。为了保证对象在任意位置都能与其他对象通信，因此在每个节点中都设有一个对象管理Agent，它负责本地产生的对象和驻留在本地对象的管理。具体的工作如下：
　　①对象管理Agent记录和维护本地出生用户Agent的特征信息(对象名，ID，驻留节点，驻留时的URL等 )，并赋予用户Agent一个含有出生地信息的标识号。根据本地出生用户Agent在新驻留地获得的临时URL修改相应的记录信息。用户Agent在完成任务后，向出生节点的对象管理Agent注销，然后死亡。 
　　②对象管理Agent记录漫游到本地的外地出生用户Agent的驻留信息 (对象名，ID，使用的端口号等)，并根据本节点端口号的使用情况向用户Agent分配一个新的端口号或让它保留原有端口号。当用户Agent漫游到某节点时，向该节点的对象管理Agent登记驻留信息。用户Agent将其在驻留地获得的URL报告给出生地对象管理Agent。当Agent A第一次有消息发送给 Agent B的时候，首先向Agent B出生地的对象管理Agent查询Agent B的驻留节点的URL，获得后，通过该URL来与Agent B直接通信，以后每次都直接通信。当连续几次通信失败后，就意味着 Agent B已经移动，Agent A向Agent B的出生地的对象管理Agent查询Agent B的驻留节点的URL。
4　结束语
　　目前，网络技术的迅速发展，使得在大规模网络上构造复杂的分布式应用系统成为可能。未来工作的一个重要方向就是代码的移动。目前的移动做得还很不够，效率并不高，对程序的要求却比较高。一种方法是提供一个预编译器，对程序进行预处理，实现检查点的透明；另外一种就是直接在Java虚拟机上做一些改动，使它能够较好地支持代码移动。系统中对象之间的安全性也是一个重要问题，需要解决相互之间的信任问题、通信内容的安全性等。 
*基金项目：国防科技大学预研基金
作者简介：宋　辉(1974～)，男，研究生，主要研究方向：计算机体系结构
作者单位：国防科技大学计算机学院，长沙　410073
参考文献
1　Griswold.Unleashing Agents：The First Wave of Products Incorporation Software Agent Technology Has Hit the Market.See What's Afoot.Internet World,1996 
2　Luca C.Mobile Computation.http://www.research.digital.com/SRC/ 
3　Sun 公司 .JDK1.1.6 Document.1998,http://www.javasoft.com 
收稿日期：1998－11－30
