应用DCOM技术在远程教育中实现组件化的网络虚拟实验室探讨
摘要:为了使虚拟实验室适合远程网络教学的需要,使它能够在网络上工作,利用DCOM技术以C/S方式实现了组件化的虚拟实验室。将模拟计算部分作为服务器端,界面输入/输出作为客户端。在多用户的情况下DCOM没有提供分布式策略,则利用调度对象来平衡负载,从而引入分布式处理方式。
关键词:远程教育;DCOM;虚拟实验室;客户/服务器(C/S)
Abstract: In order to make the virtual laboratory for teaching the need for long-distance network to enable it to work on the network, the use of DCOM technology to C / S achieved the components of the virtual laboratory. The simulation as part of the server-side, the interface I / O as a client. In many cases, users did not provide DCOM Distributed strategy, the use of targeted scheduling to balance the load, so the introduction of distributed processing way.
Key words: distance education; DCOM; virtual laboratory; client / server (C / S)
前言
随着Internet的不断扩大,日益增多的计算机正在连接到互联网上,以共享资源。于是远程教育作为一种新的教育模式被提上了议事日程,现代计算机技术和网络技术为远程教育的发展提供了强有力的技术保障。尤其是WWW浏览器技术和数据库技术的发展,使得教学活动不再受地域和时间上的限制,利用Internet就能进行实时或非实时的教与学,从而实现了跨越时空的学习。然而,大学实验室里许多实验课,在远程教育的网上学习中将会有许多困难。如何在网络课件中解决好这个问题,对于进一步办好远程教育是具有重要实际意义的。本文利用DCOM(Distributed Component Object Module)技术,将单机板的虚拟电路实验系统升级为网络版的虚拟电路实验系统。
虚拟电路实验系统是一个用于仿真电子线路实验的软件。用户通过界面在计算机屏幕上选用各种元器件搭建电路,测试波形,得到实验数据等结果,以模拟真实实验的方式使用户掌握有关电路方面的知识。从功能上讲,虚拟实验室系统分为两个模块:一个是仿真计算部分,它是整个系统的核心部分,负责输入数据的处理、大量的模拟计算,并向输出界面部分传送结果;另一个则包括输入界面和输出界面两部分。输入部分完成用户电路搭建时的界面处理,从某种角度来讲,它完成了数据的采集。同样,输出界面完成结果的输出,如波形输出、数据输出等。
为了满足远程教学的需要,必须将单机虚拟实验系统改造为可在网络上运行的系统。从通信的开销上来讲,Socket是最合适的。但是Socket本身是面向通信的,有复杂的通信细节需要处理。而且,Socket服务器对于客户来说,很难提供稳定的应用程序接口,一旦服务器发生了变化,客户必须相应地变化,不利于客户和服务器单独开发和文护。另外一种则是文本采用的COM(Component Object Module)技术。
1 组件对象模型(COM)
现代的软件开发都以模块方式进行。每个模块均有自己的功能,并与其它模块以接口进行通信。于是,复杂的软件系统就可以用搭积木的方式进行。这就是组件软件的基本思想。COM就是实现软件组件化的一种努力。
实际上,COM是一种规定了组件之间的接口标准。COM还引入了面向对象的思想,COM对象是一个能完成一定功能的软件模块。COM对象是组件的基本构成,它以接口的方式向其它对象或软件提供服务。通常情况下,对象的服务与被服务都是客户/服务器的关系。COM对象不同于C++对象。C++对象是类的实例。C++是面向对象的编程语言,是人们在源码级试图实现软件模块化的一种努力。COM对象是二进制的规范。换言之,C++在源码级提供了代码重用的便利,而COM是在二进制级提供了可重用性。COM的二进制级重用是通过COM对象工作来实现的。它主要有两种方式:(1)包容,一个对象通过利用另一对象的功能实现同样的接口。(2)聚合,一个对象直接将另一对象的接口提供给客户。
由于COM的实现是在二进制级,而不是源码级,于是决定了COM与语言的无关性。一个用C或C++实现的COM可以与一个用BASIC实现的客户正常地通信。因此,整个软件的一部分可以用一种语言开发,而另一部分可以使用其它语言。这给软件开发者在根据性能的要求做出编程语言选择时提供了方便。COM的另一个特性是进程的透明性。一个组件可以有很多种形式出现,比如DLL,EXE等。DLL形式的组件与客户程序工作在同一进程,EXE组件工作在独立的进程。无论是进程内的组件还是进程外的组件,对于客户来讲都是同样的,客户无需关心进程间的通信。进程间的通信是复杂的,然而COM掩盖了这种复杂性。
2 分布式组件对象模型(DCOM)
COM给软件开发带来了极大的便利。但是,在网络环境下,单机上的组件重用和进程透明性已不能满足需要,COM必须扩展。Microsoft的DCOM便是COM在网络环境下的无缝扩展,DCOM能够支持在局域网、广域网,甚至在Internet上与不同计算机的对象之间的通信。使用DCOM,应用程序可以在位置上达到分布性,从而满足客户和应用的需求。
DCOM隐藏了网络通信的细节,在可以利用的网络协议的支持下,组件或客户无需关心对方组件的位置,便可以进行通信。因此DCOM具有协议无关性。在网络环境下,组件之间的通信不像在COM的进程内或进程间的LPC(Local Procedure Call),而是以RPC(Remote Procedure Call)来完成的。客户与COM对象必须通过Proxy和Stub来进行通信。Proxy工作在客户进程中,Stub工作在服务器进程中。此外,DCOM提供了所有在网络上工作的软件都应有的特殊性与安全性。
3 COM/DCOM在网络虚拟实验室中的应用
从程序设计的角度来看,COM/DCOM的结构是这样的:对象是构建组件的基本元素,而服务器为组件提供进程内/外的服务,提供了组件工作的场所。对象是一个自包含的结构,提供一定的功能,它不能直接被客户使用,客户必须通过接口访问它。对象必须通过接口来表现自己的功能,甚至对象的创建都不能由客户直接完成,对象的创建必须借助一个特殊的对象,即类厂来完成。
对于客户,它可以是一个组件对象也可以是一个支持COM的普通程序。它通过COM API来调用类厂创建对象,并增加引用计数,来决定对象的生存期。这样COM库和COM服务器会在适当的时候卸载。
虽然C++对象和COM对象有本质的区别,但是它们在二进制一级的构造上有一定的相似性,C++对象和COM对象都使用VTable。而且,C++的对象描述能力使它很容易创建COM。因此C++是实现COM的最佳选择。Visual C++在CO
M编程方面提供了两种方式:一种是MFC(Microsoft Foundation Class);一种是ATL(Active Template Library)。MFC是以嵌套类的方式来实现COM的;ATL大量地使用于模板,采用多重继承的方式来实现COM。但不管是MFC还是ATL,都为开发软件提供了极大的方便,很多的处理都由MFC提供,比如引用计数、服务器锁计数、类厂等。尽管MFC和ATL都能实现COM,但MFC是一种开发完全应用程序的有效手段。相比之下,ATL是专为COM设计的。所以,ATL更适合创建快速小型化的COM组件。
3.1 服务器
在本文设计的网络虚拟实验室系统中,将模拟计算部分作为服务器。对于单用户服务器的情况,可以使用STA(Single Thread Apartment)线程模型。在这种情况下,分作为一个COM对象。对于在这个组件来说,它至少应该提供一个Simulator对象、一个Isimulate接口和两种方法。
interface IDatdT’: IUnknown
{
HRESULT InputData( [ in]... );
HRESULT OutputData( [ out]... );
…
};
这个对象是一个可连接对象。在模拟算法完成之后,它必须向用户发出通知。而用户程序内置了一个接收器。客户使用InputData()向服务器传送采集的数据,服务器在处理数据完成之后,客户通过OutputData()取得处理结果。
对于多用户服务器,实际上只要简单地在这个COM组件中加入注册表信息,或者用CoCreatelnst9nEX(),以主机信息为参数就可以在指定主机上创建对象,利用DCOM进行通信。位置透明性使客户很容易使用DCOM。如果为客户指定相应的主机(即服务器),客户就可以创建并使用对象。
3.2 多用户服务器的负载平衡
在多用户的情况下,当用户的数量达到一定程度的时候,多个用户在主机上创建的对象实例会使服务器的压力增大,从而造成服务器性能的下降,影响服务质量。当然,可以使用多个服务器来提供服务,人工地平衡多个服务器上的负载,但这将给文护带来极大的困难。一旦用户群动态地变化,服务器的负载平衡将被打破。显然,这种没有任何分布式策略的分布式COM(DCOM)是不够的。虽然DCOM提供了位置透明性,但是没有提供分布式的策略,分布式策略需要软件开发者来提供。因此,提供负载平衡是DCOM组件开发的一个重要任务。为了平衡多个服务器的负载,建立了如下图所示的系统结构。
对于模拟计算的COM对象,为了避免多次重复地创建和释放,本文采用了服务对象。服务对象是已创建的COM对象实例。该系统中还引入了简单的调度对象。调度对象是一个中间对象,它以STA(单线程Apartment)方式工作。调度对象负责建立服务对象Simulator,文护主机列表COSERVERINFO Server[N]、对象列表ISimulate*pISimulate[N]和对象状态列表Int State[N]。主机列表保存主机名字,对象列表存放对象接口指针,状态列表是一个对象的状态值。对于对象来讲,它有三种状态:(1)未创建或创建失败;(2)忙;(3)闲。三个列表都以全局变量的形式出现。由于使用了STA,可以不必考虑对象的同步问题。但是,多个同类对象访问全局变量仍然可能造成对象在线程上的安全问题。因此,本文使用临界区(Critical Section)来同步。此外,调度对象是一个可连接对象,它必须与服务对象通信并获得服务对象的状态。
调度对象负责在主机列表指定的主机上创建服务对象,并初始化。所有的客户在需要服务的时候应向调度对象发出请求。当有客户向调度对象请求服务时,调度对象检索主机列表、对象列表和状态列表,在选定主机上查询并检查对象的有效性,获取服务对象接口指针,并返回给客户,然后客户与服务对象通信。根据COM的特性,此时客户和服务对象之间的通信是直接进行的,不经过调度对象。调度对象根据什么原则来获取某个主机上的对象是一个策略上的问题,实际应用中必须考虑主机的负载平衡。对于复杂的系统,这种策略可能相当的复杂。然而,为了简单起见,本文采用了以执行任务的对象在主机上的数量多少作为平衡负载的标准。在客户使用完毕对象后,对象激发一个调度对象事件,调度对象负责将对象状态复位。因此,调度对象是一个可连接对象,实现了一个接收器,接收来自服务对象的事件。
此外,调度对象还负责将服务对象卸载。应该看到调度对象的引入增加了网络通信量,但对于采用分布式策略的系统来说是必要的。实际上调度对象很大程度上起到了目录服务的作用。如果必要的话,调度对象加上适当的模块可以作为一个简单的中间管理模块,比如控制用户登录、限制用户数量等。
3.3 客户
客户控制着虚拟实验室数据的采集和输出表现,它将直接面对用户。对于客户来讲,它只需要在数据处理的时候,在执行调度的主机上创建调度对象,本文来自范文中国网www.fw789.com。调度对象负责返回可用的服务对象。客户将数据交给服务对象来处理,并取得输出值。在客户与服务对象通信的过程中,客户还必须接收来自服务对象激发的事件,所以客户必须内置接收器。
4 结束语
本文使用了调度对象来实现负载的平衡,采用的平衡策略是以运行在主机上的对象数目作为衡量负载的标准,这对于简单的系统已经足够了,但对于比较复杂的系统,必须有更复杂的负载平衡策略。
DCOM虽然提供了很多的优点,如位置透明性、协议无关性等,然而这是以增加开销为代价的。与Socket比较,DCOM的开销要大一些,但是DCOM提供的方便超出了它带来的额外开销。
参考文献:
[1]潘爱民 COM原理与应用[M].北京,清华大学出版社。1999。
[2]刘绍光,徐凯声.三层C/S结构机理及微软的解决方案—Windows DNA。
交通与计算机,2000-(2)