实时高效的共享内存技术在高速磁浮交通仿真中的应用
2016-11-25张旭彤
张旭彤
摘要:该文论述了一种实施高效的共享内存技术,它可用于高速磁浮交通仿真中仿真计算机或者仿真服务器内部的多进程通信管理和信息传输,并且能够满足磁浮仿真环境中三层硬件架构(顶层工作站、中间层服务器、底层管理计算机)之间的网络通信要求,以完成对磁浮功能软件的测试与验证。在统一的报文格式下,该共享内存技术使用配置文件记录通信节点的起始端口和IP地址等信息,确保了通信进程的独立性和实时性。此外,选取共享内存技术以实现仿真环境中应用层和通信层之间的数据传输,提高仿真环境处理数据的效率,确保高速磁浮交通仿真的传输性能。
关键词:多进程通信;共享内存技术;高速磁浮交通仿真;网络通信
中图分类号:TP311.52 文献标识码:A 文章编号:1009-3044(2016)26-0248-02
1研究背景
为了实现高速磁浮交通仿真中仿真计算机或仿真服务器内部的信息传输或者数据传输,以完成对本机所运行的磁浮功能软件进行环境故障注入条件下的系统功能和性能的测试与验证,需要使用一种可在多进程之间切换的高效通信技术。高速磁浮仿真的硬件架构分为三层:底层是子系统仿真管理计算机,中间层是仿真支撑服务器,顶层是工作站仿真计算机。由于仿真环境通过以太网相连,网络中的每一台机器不仅作为一个通信节点与网络进行信息传输,而且需要与多种类的磁浮功能软件进行数据交互。共享内存技术作为最高效的本机进程间通信技术,可以快速地将内存中的数据映射到多个不同的进程中。因此,在磁浮交通仿真环境中使用共享内存技术,不仅可以实现仿真计算机内部的多进程通信,还可以提高仿真环境处理数据的效率,减少信息传递或者故障注入的响应时间,确保高速磁浮交通仿真的传输性能。
2 影响因素分析
由于高速磁浮交通仿真的功能特性与通信要求,数据传输的高效性和实时性是通信时的重中之重。而且仿真环境中各个节点的端口信息、数量、IP地址等需要根据通信需求进行改变,因此通过对仿真环境中通信节点的信息传输要求分析,可以得到数据通信需具有以下特点:
1) 高速磁浮交通仿真环境中的数据传输是大批量、高频率的,具体的要求要视仿真设备终端采集数据的频率和请求发送的频率而定;
2) 数据传输要具有实时性,将仿真设备采集的数据实时传给网络中的通信层,并且对异常或者陈旧数据进行清除;
3) 仿真环境中磁浮计算机与通信节点采用“一对多”的关系;
4) 通信节点的端口信息、地址等可能改变,需要手动配置通信节点的信息;
5) 为了维护磁浮仿真环境的可扩展性,通信节点可能发生增加或删除的情况,需要对通信节点做增删操作。
3 方案设计
在高速磁浮交通仿真环境中,每一台计算机中的软件架构分为通信层与应用层。通信层进程主要负责为应用层和其他通信节点提供通信服务,并且监控网络中的通信状态,定时记录通信日志等;应用层进程即为环境中各个磁浮模块运行的磁浮功能软件,与用户及通信层进程进行交互。为了确保高速磁浮交通仿真的传输性能,本机间进程通过共享内存方式进行通信,并且同时为通信层与应用层提供可读写的共享内存接口,将共享内存技术封装为DLL动态链接库的方式分别提供给通信层与应用层以完成进程间的交互。其次,使用Windows系统的Initialization File(.ini文件)对可变化的通信节点进行配置和管理。
3.1 共享内存技术
高速磁浮交通仿真的共享内存技术采用一种“主—从式”的技术架构。在高速磁浮交通仿真计算机中,共享内存同时提供给计算机中的通信层和应用层,由通信层进行统一地新建和管理,应用层只能发送请求以获得对共享内存的读写权限。共享内存技术主要是通过内存映射文件的方式进行工作,内存映射文件通过将文件内容复制给虚拟地址空间,通过互斥锁管理内存的读写情况,完成多进程之间的通信。当内存映射文件被创建后,需要通信的线程分别将此对象载入自己的地址空间。此过程完成后,对此块内存的读写会实时的反映到另一个使用此共享内存的进程中。
共享内存技术以DLL动态链接库中函数的形式提供给通信层与应用层。载入动态链接库文件并成功调用相应的初始化函数之后,进程便有了对相应共享内存的读写权限。当有报文到达时,进程将报文传给对应的共享内存块(从对应的共享内存块中取出)。在每一个共享内存块中,使用互斥锁Mutex控制一个进程内多个线程对其的使用权。当某一个线程对共享内存块进行读(写)操作时,将Mutex置为锁状态,使其他调用相同共享内存块的线程置为阻塞状态,直到该读(写)操作结束并且Mutex为解锁状态,再将内存块的使用权交给其他线程。在每一个共享内存块中,使用事件Event实现共享内存的读写同步机制。当某一个“写入”共享内存块的Mutex为解锁状态并且内存内容为空时,则将SetEvent()函数置为挂起状态,等待线程的调用以及写操作的信号。当某一个“读出”共享内存块的Mutex为解锁状态并且内存内容不为空时,无需线程调用自动将SetEvent()函数置为发信号状态以进行读操作。直到线程读取完毕,解除发信号状态以实现读写同步机制。通过实现共享内存的读写同步机制,可以大大提高进程通信的实时性以保证磁浮仿真环境的传输效率。
3.2 共享内存代理
在高速磁浮仿真环境中,由于通信节点的数量较多并且具有不确定性,对建立的大量共享内存块进行查找会降低进程通信的传输效率,进程可能会花费大量的时间查找对应的共享内存块,即使该共享内存块可能早以销毁。因此在建立一组共享内存块的基础上,此共享内存技术同时建立一个共享内存代理Container。
共享内存代理Container将所有的共享内存块组成一个Map,并且以窗口的形式存储。共享内存代理存储共享内存块的数量、网络状态和地址指针等信息。进程只需提供通信节点名称以及收发地址即可调用共享内存代理,使用对应的共享内存块进行通信。同时共享内存代理使用3.1中的互斥体Mutex控制多进程对共享内存块的读写操作。共享内存代理使用事件Event维护共享内存块的网络状态,当Mutex为锁状态时,代理向特定的共享内存块发送Event信号,将共享内存块置为“读(写)”状态或者返回共享内存块不存在或错误信号给进程。
此外,共享内存块在建立的时候需要存储名称、ip地址、是否记录日志等各种各样的信息,但是共享内存代理只存储内存块的指针信息、是否可以读写的状态等少量信息。所以进程只需要提供少量的信息就可以调用共享内存代理,让代理去处理读写的问题,进程只需等待反馈即可。因此,使用共享内存代理解决了查找大量共享内存块所带来的效率降低问题,加快了进程读写的速度。
3.3 配置文件
共享内存使用Windows系统的Initialization File(.ini文件)对通信节点的端口信息、端口数量、起始地址、IP地址等其他信息进行配置和管理。由于高速磁浮交通仿真使用P2P通信协议作为通信架构,因此每一台仿真计算机都拥有多个不同功能的通信节点。共享内存通过读取.ini文件中通信节点信息,使用CreateFileMapping()创建文件映射,新建出通信结点数量的两倍的共享内存块。通过读取通信节点的名称,为每一个通信节点分配一个“读出”共享内存块和一个“写入”共享内存块,并且每一个共享内存块使用MapViewOfFile()或MapViewOfFileEx()函数,将文件映射到调用的进程地址空间中。用户只需要修改文本信息即可达到增删改共享内存的效果,以此提高了共享内存技术的高效性。
4 实验结果
根据共享内存的设计方案,编写对应的.ini配置文件,将共享内存技术封装为DLL文件提供给通信层和应用层之后,在传输速率为100Mbps的局域网中进行测试验证,得到结果如下表:
5 结束语
文中论述的共享内存技术确保了高速磁浮交通仿真环境可以实时高效的进行进程间通信,实现了顶层工作站、中层服务器与底层管理计算机之间的进程交互要求,并且在传输大量数据的前提下,确保了数据传输的速度与效率。同时通信层与应用层完全互相独立,通信节点可根据用户需求灵活配置,极大地增加了该共享内存技术的可扩展性,为今后的磁浮仿真环境的通信需求调整、通信节点增删提供了良好的基础。并且该共享内存技术不仅适用于此磁浮仿真环境中,还可应用于类似的交通局域网的网络通信中。
参考文献:
[1] Ivar Jacobson, Martin Griss, Patrik Jonsson. Software Reuse—Architecture, Process and Organization for Business Success[M]. Addison Wesley Longman, 1997.
[2] 汪翔, 袁辉. Visual C++实践与提高(网络编程篇) [M]. 北京: 中国铁道出版社, 2001.
[3] 余可曼, 陈平, 金连甫. 网络通信中间件的设计及实现[J]. 计算机工程, 2001, 27(5).
[4] Gary B Shelly, Thomas J Cashman, Harry J Rosenblatt.系统分析与设计教程[M]. 李芳, 朱群雄, 陈轶群, 等,译.北京: 机械工业出版社, 2004.
[5] 梁庚, 白焰. Windows下进程间通信方式探讨[J]. 微型电脑应用, 2006, 22(12).
[6] 马魁涛, 蔡颖, 郭宝峰. Win32进程间信息共享的实现方法研究[J]. 计算机应用与软件, 2007, 23(12).
[7] 周伟明. 多核计算与程序设计[M]. 武汉: 华中科技大学出版社, 2009.