APP下载

主动对象模型在车次追踪系统中的应用

2010-08-06张德明

铁路计算机应用 2010年5期
关键词:车次线程队列

张德明

(中国铁道科学研究院通信信号研究所,北京100081)

模块化是软件设计中需要达到的主要目标之一。相对于传统的面向过程的语言将数据结构与算法分开的方式,面向对象的设计方法将相关的数据结构与算法作为一个对象进行封装,形成一个拥有自己状态以及行为的整体。在设计对象时,通过有效地将相互关联的数据结构与行为进行封装,而向外只提供必要的接口,从而达到强内聚松藕合的效果,也就达到了模块化的目标。

在单线程环境下,采用对象的方式确实能够实现有效的封装。然而,当软件在多线程环境中运行时,对象在封装上则会遇到并发范围的问题。

图1 对象交互的图示

图1展示了一个简单多线程环境。其中,有A,B,C3个以面向对象方法进行封装的对象,另外有两个环境线程。系统期望两个线程能够在3个对象的并发运行中,完成系统的功能。我们可以看到,对象B虽然作为一个独立的对象,封装了自己的结构和行为。但是,由于它同时被两个线程访问,这样,在对象C和A与B进行交互时,必须要考虑许多线程同步的因素,造成对象间访问时接口复杂,也就是增强了对象间的耦合性。当系统的对象更多,并发线程更多时,对象间的耦合将会成倍增加,软件的模块化目标将遇到严重的挑战。

1 车次追踪系统

车次追踪系统是调度监督以及调度集中系统中一个重要的组成部分,车次追踪系统根据现场采集的站场表示信息,无线车次号信息,行调台下达的计划信息,以及人工车次修改等信息,通过综合运算,对追踪区段的列车进行识别、跟踪和校核,并在此基础上提供自动报点,列车位置报告等信息。

在实际设计中,车次追踪系统作为调度系统应用服务器中的一个模块。作为整体的应用服务器,除了提供车次信息相关运算和服务外,还要提供通信信息转发、表示信息处理和进路信息处理等功能。

当把应用服务器作为系统的环境,而将通信转发、车次追踪和进路控制分别作为一个重量级的对象时,将得到一个类似图1的系统结构环境,见图2。

图2 车次追踪的应用服务器环境框图

在图2的应用服务环境中,系统要求应用服务器所提供的各个功能,包括车次追踪,通信转发,以及进路控制等都能够并行运行,因此,系统中必须引入多个线程。 同时,由于各个服务模块之间需要交互,以传统面向对象模式进行设计,必然将多个线程引入对象中,造成同步的困难,增强了系统的藕合性。如何保证车次追踪系统设计的模块化,同时又保证模块的并行性,如前面引用中提到的,是对系统设计方法的一个挑战。

2 主动对象模型

我们以图3来说明主动对象模型。

图3 主动对象模型

图3中的对象分为两种,其中A,B,C同以前的对象一样,只能被别的线程被动调用,称之为被动对象。另外一种对象,作为A,B,C3个对象的运行环境,它将系统的线程进行了封装,并提供了对外接口的邮箱,称之为主动对象。

系统的运转过程如下:当外界有任务或者指令要主动对象来完成时,外界系统将任务以消息形式发送到主动对象的邮箱队列中,主动对象的封装线程则一直对其邮箱队列进行监视,一旦发觉邮箱中有消息,将取出消息进行处理。当任务比较复杂时,主动对象将消息分发给相关的被动对象,让其进行相应处理。

可以看出,在主动对象模型中,因为引入了主动对象,对任务线程进行了封装,这样就给其它被动对象提供了一个单线程的环境。在对A,B,C等各个被动对象进行算法设计时,只需要考虑基本的业务逻辑,而不需要考虑系统的并发性问题,有效地降低了系统的耦合性,增强了系统的模块化。

3 具体实现

图4给出基于主动对象模型车次追踪模块的主框架结构。其中主要包含4个部分:接口,队列,线程以及处理。

图4 车次追踪主框架结构

3.1 接口部分

接口部分将所有输入输出进行封装,其中CallIn供其它系统进行调用,将表示信息,计划信息等输入到车次追踪系统,CallIn的处理就是将这些调用以消息的形式存放到消息队列中。

CallOut封装了车次追踪模块的输出部分,外界系统通过重载CallOut方法,从而实现对车次号和报点等信息的获取。

3.2 队列部分

队列部分完成主动对象模型中的邮箱功能。所有外界的信息要传递到车次追踪系统,均需要以消息形式压入队列。同时,封装线程部分对队列进行不间断监视,一旦发现队列中有数据,将以先进现出的方式从中取出。

由于队列部分同时要被外部线程和模块内部线程访问,因此,在队列访问时设置同步机制。

3.3 线程部分

系统通过将操作系统提供的线程进行封装,从而形成只在车次追踪模块内部运行的线程,当对象生成时,生成并启动线程,当对象消亡时,终止并结束线程。

系统线程在对象生存期不间断地运转,给车次追踪的业务逻辑处理对象提供运行环境,同时从消息队列中获取消息,并将这些消息分发给实现部分进行具体处理。

3.4 处理部分

处理部分是车次追踪算法的核心,包含大量站场相关的数据结构和处理类。这些处理类由封装线程进行调用,对接收到的表示信息、无线车次号信息以及计划信息等进行综合分析,运算得出列车车次号位置信息以及报点等信息,将这些信息通过CallBack函数回调输出。

4 结束语

本文引入主动对象模型,将车次追踪的具体实现与并发处理分开,允许在进行算法设计时不用考虑系统的并行性,有效地降低了系统设计的复杂度。在满足系统实时性特征的情况下,保证了系统的独立性和模块化。

[1] 朱冰,梅宏,杨芙清. 基于事件驱动的主动对象模型[J] . 软件学报,1996(3).

[2] F.Buschmann, K.Henney, D.C.Schmidt. Patten-Oriented Software Architecture, Volume 4: A Pattern Language for Distributed Computing[M] . John Wiley & Sons, 2007: 365-367.

猜你喜欢

车次线程队列
调度集中系统车次号技术的研究
基于C#线程实验探究
动车所车次号处理逻辑存在问题分析与对策
队列里的小秘密
基于多队列切换的SDN拥塞控制*
基于国产化环境的线程池模型研究与实现
在队列里
丰田加速驶入自动驾驶队列
浅谈linux多线程协作
CTC系统自动变更折返车次号功能的实现