使用rtsj实现实时orb分析

May,2003

Cocia Lin(cocia@163.com)

Huihoo.org

概述

rtsj是实时java规范,现在已经是1.0最终版了,相信不久会有很多基于此规范的jvm实现。现存的rtsj jvm在功能上和应用范围上,都还很有限。

Rtcorba规范是omg.orgCorba规范的扩展,现在是1.1版本。比较著名的c++实现是TAOVisibroker也有c++的实时版本。Orbix也有RT-ORB。而且c++版本的rt-corba也已经得到了广泛的应用。Java的实现据我所知,只有TAO的姊妹作品Zen,基于rtsjZen现在还处于开发阶段。而且现在的进度好像不太理想。这可能是rtsj的应用推广进度比较慢有关系。

RT-ORB for rtsj,就是借助rtsj的实时特性和易用特性实现rt-corba的分布式模型结构。下面针对rt-corba的规范和rtsj的具体特性,探讨一下在rtsj上实现rt-orb需要解决的问题和可能的实现方法。

根据rt-corba规范,可以把实现需要的部分划分为以下几项内容来探讨

1.  RTORBRTPOA的实现

2.  高性能的,基于优先级调度和分配的实时线程池的实现

3.  CORBA优先级到RTSJ优先级的映射

4.  实时CORBA资源共享访问控制的实现(Mutex)

5.  优先级绑定的连接,GIOP的实时版本

 

 

这里讨论的是rt-orb主要的部分,还有协议配置,优先级模型的细节规范内容这里没有列出。这可能在对rt-orb实现的进一步探讨中再做讨论。

 

RTORBRTPOA的实现

 

       RTCORBA::RTORB扩展了一些CORBA::ORB的方法。在逻辑上可以认为RTORB继承了ORB接口,但是实际上,RTORB不是从ORB继承。RTORB只是按照ORB的思路和根据RT-CORBA的需要,定义了一些和ORB相关的方法。这些方法主要是工厂方法,为了适应线程池,新的ORB策略等的构造的需要。在后面的相应模块的讨论中,会再次描述这些具体的方法。这里不再多说。

       RTPortableServer::POARTCORBA::RTORB的定义方法不用,它是直接从PortableServer::POA中继承而来,所以RTPOA具有普通POA所具有的全部功能。也就是说,普通CORBA虽然不兼容RT-CORBA的实时特性,但是可以把RTPOA当作普通POA一样的调用。在面向对象语言中,这叫做上塑造形,是合法的使用方式。RTPOAPOA存在两点区别:1.RTPOA提供了一些方法和行为来支持对象级的优先级定义和优先级行为;2.RTPOA需要适应RT-CORBA中增加的策略,所以添加了一些相应的方法。

       要得到RTPOA对象,参考如下代码:

    // initialize and get reference to the ORB

    org.omg.CORBA.ORB orb =

                  org.omg.CORBA.ORB.init(args, null);

    // now get the reference to the RootPOA

    org.omg.PortableServer.POA rootPOA =

            org.omg.PortableServer.POAHelper.narrow (

                      orb.resolve_initial_references("RootPOA"));

(此段代码问题:如何得到RTPOA对象,有RTPOAHelper类么???)

 

RTPOA中定义了4个新的方法,

1.  create_reference_with_priority

2.  create_reference_with_id_and_priority

3.  activate_object_with_priority

4.  activate_object_with_id_and_priority

从方法名字来看,他们分别对应POA4个方法,不同的是都加上了优先级。也就是说,这些方法都需要需要指定优先级。

       另外,在使用create_POA方法创建Child POA的时候,可以在设置的策略包含ThreadpoolPolicy策略,用来绑定这个POA运行的时候,指定使用的线程池。

    在内部运行的行为上,RTPOA必须体现很强的实时特性,这就是前面的指定优先级和指定线程池的原因。在接到调用Servant的请求的时候,RTPOA需要根据优先级,借助线程池来最优化的实现请求的分发,避免优先级翻转,提高响应速度。

 

 

高性能的,基于优先级调度和分配的实时线程池的实现

       线程池的实现,首先的一个问题,就是线程池的构架问题。这个构架是否具有通用性,可扩展性,合理性等几个简单的选择条件。在rtsj中,虽然做了很多共享资源控制和性能优化,但是这还远远不够。Rtsj提供的这方面的功能,仍然是最基本的,到达到实用,还必须需要开发者的细节控制。而rtsj本身的资源同步访问的划分有很粗糙,对于开发者来说,并不完备。

Java中,就这个问题,已经有很多人扩展自己的并发同步线程模型。现在这个模型我认为最完备的是Doug Lea开发的Util.concurrent并发控制工具包。这个工具包首先定义了一个线程同步的模型,然后根据这个模型,可以提供不同的实现。例如,对于Pool这个功能,我可以提供基于List的实现,也可以提供基于Array的实现。在我们的实时系统中,我们也可以作出一个基于rtsj的实现。Jdk的将来版本中,也可能集成这样类似的工具包,或者直接继承这个工具包也不一定(apache xerce就做到了)。针对这个工具包的基本结构和使用方法,请参见相关文档。

这里,我们需要使用rtsj实现一套Util.concurrent模型的线程工具包,更具体一点,我们现在首先需要用到的就是线程池,基于rtsj的和基于优先级的线程池。Rt-orb中,几乎任何地方都能用到线程池。

在这套同步模型之上,实现线程池,需要实现以下两部分:

l         Channel:放置/取走(put/take) 协议

l         Executor:执行Runnable任务

 

这里的Channel就是Queue队列的概念,需要在这之上实现可控制内存的,实现优先级相关的,可实时强占的部分控制。Channel是线程池实现的基础。

       Executor就是提供被开发者使用的具体线程池了,使用时情况如下:

Executior ex = PoolFactory.getPoole( “N1” );

ex.execution(new Runnable(){

  public void run(){

    //do some thing here.

}

}

通过这样的方式,就将一个任务交给了线程池来处理了。不同的线程池可能使用不同的优先级策略。

       线程池部分,在具体设计和实现的时候,在详细探讨。

 

 

CORBA优先级到RTSJ优先级的映射

       这部分就比较简单。在c++rt-orb中,需要实现不同操作系统的版本,例如rt-linuxlynxOS的,而这两种操作系统的优先级的定义不同,rt-linux有可能是0-100,而lynxos0-255。这样的情况下,一个优先级50,在不同的操作系统中,意义也就不同。而rt-corba的调用,有可能是不同操作系统之间的调用。优先级的表示的不同,就会给rt-corba应用带来很大的麻烦。为了解决这个问题,rt-corba定义了一套Corba优先级,0-2e16,在rt-corba应用中,统一使用Corba优先级来表示,而在具体一个线程需要操作系统的支持来运行时,在根据rt-corba事先做好的优先级映射,得到本地操作系统的优先级,赋给线程来运行。C++rt-orb中,不用的操作系统版本,需要作不同的映射。而在rtsj中,实际上rtsj为我们做好了跨平台的特性,所以,只要将rt-corba的优先级和rtsj的优先级做好映射就可以了。

       Rt-corba定义的接口,java语法的api如下:

PriorityMapping {

    public boolean to_native (short corba_priority,

                       org.omg.CORBA.ShortHolder native_priority);

    public boolean to_CORBA (short native_priority,

                      org.omg.CORBA.ShortHolder corba_priority);

}

在这里,直接将rtsj的线程优先级数字转换到rt-corba中的表示,和反向转换就可以了。Rtsj的优先级范围是0-28.

 

 

 

实时CORBA资源共享访问控制的实现(Mutex)

       对于非分布式环境下的资源共享访问,各个语言工具都有很好的实现。但在分布式环境下,一个资源有可能是分散在不同的主机上,或者在一个主机上,但是不在本地。语言工具提供的基本资源共享访问方式就难以实现了。

       借助于rt-corba,这件事情就简单多了,利用corba的分布式特性,将这个访问互斥对象做成corba对象就可以了。Rt-corbaMutex接口如下:

public interface MutexOperations

{

        void lock();

        void unlock();

        boolean try_lock(long max_wait);

}

       对于实现,将这里接口借助本地语言工具实现就可以了。

 

 

优先级绑定的连接,GIOP的实时版本

       rt-corba已经把优先级的控制武装到牙齿上了,无处不在控制。网络连接也不例外。连接的优先级控制,类似于前面说过的Channel的控制,也就是Quere的优先级控制。根据连接的优先级的高低,分配可用的资源和发送到orbpoa中的优先级别。

       Rt-corba通过扩展GIOP来实现。增加了如下定义:

// IDL

module IOP {

const ServiceId RTCorbaPriority = 10;

const ServiceId RTCorbaPriorityRange = 11;

};

 

       把这两个优先级有关参数绑定到GIOP消息的ServiceContext中,这样,GIOP就有了优先级别,客户端和服务器端可可以根据这些参数,进行优先级调度了。Tao把这样实现的IIOP版本叫做RIOP.

       对于这样的RIOP的实现,就需要发送和接收消息的时候,在线程池之上,增加基于优先级的消息分发。

 

 

告一段落

       这里,粗略的将rt-corbartsj上进行实现,作了基本的分析。Rt-corba的内容没有在这里全部包括。针对以上几部分和rt-corba的其他部分的分析和讨论。将在后续的文字中和大家进行讨论。

参考

 

开放企业基金会
http://www.huihoo.org

 

 

C++ RT-ORB:Borland Visibroker-RT

http://www.highlander.com/

 

 

C++ RT-ORB:TAO

http://www.cs.wustl.edu/~schmidt/TAO.html

 

 

orbas是开放源码的一个Java CORBA的实现,对RT-CORBA进行支持。

http://www.huihoo.org/orbas/index.html

 

 

基于Jratertsj RT-ORB:ZEN

http://www.zen.uci.edu/

 

 

Real-Time Java Expert Group
http://www.rtj.org

 

 

Util.concurrent并发控制工具包概述

http://www.huihoo.org/rt/util_concurrent_tools.html

 

 

使用Real-Time Java编写Real-Time程序

http://www.huihoo.org/rt/rtj/rtj_rta.html

 

 

实时CORBA结构构架概述

http://www.huihoo.org/rt/rtcorba/index.html