APP下载

基于共享内存的测试指挥显示系统进程数据同步技术研究

2020-12-14涂二看见

计算机应用与软件 2020年12期
关键词:传输数据队列数据包

李 强 涂二看见 张 明

(中国华阴兵器试验中心 陕西 华阴 714200)

0 引 言

测试指挥显示系统能将测试系统的数据收集并进行显示,对于指挥员掌握试验整体态势、了解试验进程、辅助进行决策分析具有重要的作用。指挥员在进行试验测试数据实时评估分析或者对试验的关键进程进行决策时,需要测试指挥显示系统将试验中能反映出试验总体进程的态势数据、关键设备测试数据、实时监视视频、指令进程数据、调度语音、气象数据、电磁环境参数、靶标毁伤数据等进行汇集并同步显示,这就要求测试指挥显示系统的各个构件之间数据的高度协调和同步。测试指挥显示系统在设计时,按照“一体化”软件集成的思想,将通用服务、数据接口以及显示框架以构件方式进行划分,便于后期功能拓展。系统运行时,终端上部署的通用服务、数据接口以及不同的显示构件间需要保持数据的一致性,使得呈现在指挥员面前的各类原始数据、结果数据、态势曲线分析图表等保持同步。本文主要针对测试指挥显示系统多个进程间的数据同步问题进行分析,并提出解决的思路。

1 进程间数据同步的主要方式

进程间的数据同步通常可以采用管道、套接字、共享内存等机制[1]。管道是一种通过具有两个端点的固定缓冲区进行数据交换的方式,它采用的是类似于通信中半双工信道的进程通信机制,一个管道可以实现双向数据传输,而同一个时刻只能最多有一个方向的传输,管道提供了一种进程间简单的消息同步方式,管道中的数据通常是以FIFO方式保存,在管道的两端,进程一边写入数据,另一边则读取数据[2]。共享内存则是将某一段内存空间通过映射的方式投影在多个用户进程空间,从而实现多个进程间的数据共享,是进程间进行通信最快捷的方式。使用共享内存技术,不同进程可以同时访问相同的内存区域,能够通过共享它们地址空间的若干部分,对存储在共享内存中的数据进行读写,从而实现彼此直接通信[3]。采用共享内存方式进行数据通信时,为避免访问中出现的同步和互斥问题,需要通过信号量的方式进行进程间的同步和协调操作。套接字则是通过操作系统为用户进程通信提供一种抽象数据结构来进行用户进程间的网络通信和连接的一种方式[3]。套接字实际上是提供进程通信的端点,通过此端点完成数据传递。文献[4]对进程间的数据同步方式进行了测试分析,结果表明使用管道的方式进行数据同步,其数据传输时间基本固定,不随数据报文大小的变化而变化(其传输时间基本由管道建立的时间决定),而采用共享内存和套接字的方式其数据传输时间都随传输数据报文大小的增加而增加。因此,当传输较大数据报文时,采用管道方法比较理想;而在传输较小的数据报文时,共享内存方式优势就比较明显。从文献中的测试数据情况来看,在传输数据报文小于10 KB时,采用共享内存方式性能最优。进程通信性能测试比较结果如图1所示。

图1 进程通信性能测试比较

本文研究的测试指挥显示系统包括态势综合显示、态势管理和综合数据采集服务三大部分。在网络上部署系统时,通常在一台终端上部署态势管理和综合数据采集服务,在另外多个终端上部署态势综合显示。为保证多个终端与态势管理之间数据显示的一致性,通常需要各终端之间快速的数据同步。同步的数据包括各类测试数据、地图显示参数、编组信息、录入参数、统计结果、标绘信息、操作指令等。按照测试显示系统数据交互协议,目前接收的测试数据为固定字长78 B,编组信息、地图显示参数、统计结果数据其数据包均小于10 KB,因此按照上文进程通信性能测试的结果,测试指挥显示系统最终采用共享内存方式实现多进程间的数据同步。

2 基于多环形队列的共享内存异步传输数据同步机制

2.1 共享内存的一般模型

共享内存方式实现进程间数据同步可以用图2进行描述。按照共享内存的数据写入或读取方式,将用户进程分为客户端和服务端。客户端读取数据和服务端写入数据。服务器端写入数据时(图中用进程A表示)首先建立共享内存,然后可以往共享内存中写入数据,并将内存区映射成可以被多个进程访问的共享内存;客户端读取数据时(图中用进程B表示)首先获得共享内存的地址,然后通过地址映射,就可以从中读出数据。文献[4]设计了单项链表的共享内存方式进行进程同步测试,其数据同步带宽远远大于测试指挥显示系统同步的需求。

图2 共享内存通信一般模型

然而,测试指挥显示系统的数据同步涉及多个进程,因此在设计共享内存时,需要为每个进程分别建立一个数据缓冲区进行数据同步。由于各进程内部处理数据的速率并不一样,处理每一批数据所消耗时间也就不相同,当这种差别较大时,就会造成相对应的数据缓冲区阻塞,对整个系统运行的性能产生影响,特别是在数据长度比较大时,需要引入信号量来协调对共享内存段的访问,这会增加较多的时间开销。因此在共享内存需求不断增大时,需要采用一定的方式对共享内存数据同步方式进行优化,以消除共享内存增长引入信号量带来的性能影响。

针对上述不足,本文提出一种基于多环形队列的共享内存异步传输同步机制,将数据读写分别用多个环形队列进行调度,很好地解决共享内存段读写互斥操作带来的信号量开销问题,同时降低收发进程构件的耦合度,提高系统整体性能。

2.2 设计思路

多环形队列共享内存异步传输数据同步模型如图3所示。

图3 多环形队列共享内存异步传输数据同步模型

在多环形队列共享内存异步传输数据同步机制中,系统进行数据同步的共享内存区分成两部分:管理控制块和数据区。管理控制块由管理控制信息、多个写队列环、多个读队列环组成,管理控制信息保存各写队列环对应的数据区大小,各写队列环写入数据索引和读取状态标志等。写队列环保存的是一组空闲数据内存块的索引;读队列环保存的则是已经读取到显示构件中的数据内存块索引。

系统工作时,首先申请一块内存区域作为共享内存缓冲池,并根据接入数据的种类和显示构件多少生成相应数量的写队列环和读队列环,同时系统为各写队列环分配不同大小的空闲数据块。空闲数据块的大小和对应的数据类型有关,为了节省系统开销,空闲数据块大小固定。

数据发送时,系统根据发送的数据类型,查找相应的写队列环,并在这个写队列环上获取到一个空闲数据块索引,并将数据拷贝到该数据块中,并更新管理控制数据块中对应的写入队列的写入索引。数据读取时,系统根据管理控制数据块中的标志位,将写入块索引放至读取环的末尾,只有所有读取环都写入该索引后,管理控制数据块中的标志位才重新复位,并更新对应的写队列环中数据索引。通过对读写环形队列的不间断交替操作,极大地弱化了共享内存空间物理结构带来的影响,从而实现了收发双方数据的异步传输,降低了模块间的耦合度。采用这种共享内存动态管理的模式可以极大地提高内存的利用效率,并且使用多个读写队列环进行数据同步还可以避免多个进程访问调度带来的性能影响。

3 方法设计

3.1 测试指挥显示系统构成

测试指挥显示系统为了实现各显示终端与系统管理端的主从控制模式,设计了基于多环形队列的共享内存和多进程协作机制,通过终端系统软件的进程管理对共享内存中的资源以及进行资源请求的事件进行统一管理。每个终端软件都有共享内存管理进程,可以对资源池中的共享内存块进行调度管理,将人员编组、地图标绘、控制指令、态势信息等按相应的数据包大小构建写队列环。读队列环则按照终端系统软件部署的显示构件进行分配。调度管理进程通过共享内存资源池中定义的管理控制信息对读写进程进行调度管理。每个终端软件上还需要部署数据收发进程,在系统进程管理下实时对系统端的数据进行数据同步操作,及时更新资源池中的数据,使各终端数据与系统管理端保持同步。测试指挥显示系统结构如图4所示。

图4 测试指挥显示系统结构图

3.2 读写数据同步的工作流程

系统进行数据同步机制设计时,在共享内存空间内需要根据发送数据的类型创建不同的写队列环,包括人员编组、地图标绘、控制指令、态势信息等。发送进程访问管理控制块中相应的写队列环,如果队列环不为空,则执行出队操作,将写队列环head指针指向的空闲数据块初始化,然后进行数据拷贝操作,同时将指向该数据块的索引写入管理控制块的管理控制信息中,并通过该共享内存块结构体内的条件变量,向管理进程发布数据更新事件消息。所有的显示构件(接收方)在收到事件消息提醒后,遍历对应的读队列环,获取head索引指向的数据块的数据,同时将数据块结构体中的计算器增加1,若判断计算器的数量等于写队列环的数量,则判断所有接收进程都已经完成数据的读取操作,并更新管理控制信息相应写队列环索引的标志位。终端进程发送接收流程如图5所示。

图5 系统数据同步工作流程

4 系统性能分析

为了验证系统采用多环形队列共享内存异步传输数据同步方式的实际性能是否满足系统的实时性要求,采用VC++9.0编写模拟数据发送软件(软件界面如图6所示),对测试指挥显示系统的数据读取、显示进行比较测试。测试环境为:主机:CPU i7-6700内存8 GB;网络环境:百兆局域网。测试指挥显示系统终端显示软件如图7所示。

图6 模拟数据发送软件界面

图7 测试指挥显示系统终端软件界面

4.1 数据传输延迟测试

为了测试数据传输延迟,模拟数据发送软件以固定频率向系统管理终端发送一定大小的数据,需要从管理端同步数据的显示端数量从1增加到4。利用数据发送和显示端接收的时间差计算传输的延迟。在本实验中,发送方每秒分别发送500、1 000、1 500、2 000、2 500个固定大小的数据包,计算各自的平均数据传输延迟,实验结果如图8所示。可见,多环形队列共享内存异步传输数据同步,数据传输延迟均随着传输数据大小及接收方数量的增加而缓慢增加,但受同步终端数量影响不明显。

图8 数据测试结果

4.2 最大吞吐量测试

测试指挥显示系统接收外部数据,每个数据包最大不超过5 KB,因此,在进行系统最大吞吐量测试时,模拟数据发送端传输的数据包大小固定为5 KB。发送方总计发送10 000个数据包,测试在不同发送频率下的带宽。带宽的计算方式为:带宽=数据包数量×5KB/时间,其中带宽、数据包、时间均按发送和接收分别计算。最大吞吐量则为其不丢包时的最大带宽。数据测试结果如图9所示。

图9 数据测试结果

进程间交换数据的传统方法是在共享内存中开辟数组,系统数据交换性能在数据包个数一定范围内是基本稳定的,但在数据超过共享内存空间时,系统响应时间会产生比较大的性能滑坡。采用多环形队列共享内存异步传输数据同步对共享空间访问进行优化,可以显著提升系统性能,其传输延迟和吞吐量受客户端数量影响不大。

5 结 语

测试指挥显示系统将试验中的态势数据、关键设备测试数据、实时监视视频、指令进程数据、调度语音、气象数据、电磁环境参数、靶标毁伤数据,以及各类数据统计结果进行综合显示,是试验指挥决策的关键环节。系统进程间数据的同步效率,直接影响其效能的发挥。本文针对较大数据量的数据同步问题,设计一种基于多环形队列共享内存异步传输数据同步方法,替代传统的内存数组的共享方式,很好地解决了大数据量汇集时共享内存数据同步效率降低的问题,提高了系统的适应性和可靠性,也为设计需要汇集较大数据量,且有多个进程进行数据同步协同工作类似指挥显示系统软件提供很好的解决思路。

猜你喜欢

传输数据队列数据包
二维隐蔽时间信道构建的研究*
基于SSL VPN实现安全共享疾控单位之间的数据
基于深度强化学习的物联网传输数据实时调度方法
基于物联网的电力通信系统传输数据感知分配研究
民用飞机飞行模拟机数据包试飞任务优化结合方法研究
队列队形体育教案
队列里的小秘密
基于多队列切换的SDN拥塞控制*
苹果专利可采用光纤输出灯光并传输数据将光纤隐藏于车辆部件内
在队列里