基于LCM与ZeroMQ的进程间通信研究
作者:刘号 张新晨 李中年
来源:《电子科学技术》2016年第04期
作者:刘号 张新晨 李中年
来源:《电子科学技术》2016年第04期
摘 要:进程间通信作为一个广泛的研究课题,具有显著的适用性。我们结合轻量级通信与编组LCM和零消息队列ZeroMQ 各自的特点,探究进程间通信新机制。这里我们采用LCM的发布/订阅模式来实现消息在网内的封送,同时,运用ZeroMQ的请求/应答模式实现网间消息传递。本文所提出的通信方法,经过了实验性的探究,验证了LCM与ZeroMQ在进程间通信的可行性。
关键词:进程间通信;发布;订阅;网元
中图分类号:TP393.03 文献标识码: A 文章编号: 2095-8595 (2016)提供端到端的进程间通信服务的是 04-480-04电子科学技术 URL: http//www.china-est DOI: 10.16453/j.issn.2095-8595.2016.04.028Abstract: As an extensively research topic, interprocess communication has a significant application. We combine the characteristics of LCM and ZeroMQ to explore the new interprocess communication mechanisms. Here, we use LCM publish-subscribe m
ode to achieve the intra-network message marshalling, while making use of ZeroMQ request-reply mode to achieve inter-network message passing. The communication method, which proposed in this paper, has already had an experimental inquiry to verify the feasibility of LCM and ZeroMQ in the interprocess communication.
Key words: Interprocess Communication; Publish; Subscribe; Network Element引言
模块化是我们软件设计的一项基本原则,是一种将复杂系统分解为更好的可管理模块的方式。模块化是解决一个复杂问题时自顶向下逐步细化的过程,有多种属性,分别反映其内部特性。每个模块都作为一个独立的进程,都有自己独立的地址存储空间。我们可以通过不同模块的组合实现具有不同功能的系统,而系统运行的稳定性取决于各模块间通信的流畅性,这就对各模块进程间通信提出更高的要求,进程间的信息实时传递就显得尤为重要。本文中,我们将引入一套进程间通信新机制,即LCM与ZeroMQ。
LCM(Lightweight Commuciation and Marshalling)作为消息传递和封送的通信库,其首要任务是简化低时延消息传递系统的开发。
ZeroMQ(Zero Message Queue)提供了进程通信的API、套接字和模式,相比于传统的端到端的(1:1的关系)的Socket,ZeroMQ所提供四类通信模式不仅可以支持传统的一对一的通信,还能实现一对多,甚至多对多的通信。人们对BSD套接字的了解较多的是点对点的连接,点对点连接需要显式地建立连接、销毁连接、选择协议(TCP/UDP)和处理错误等,而ZMQ屏蔽了这些细节。ZeroMQ以统一接口支持多种底层通信方式:线程间通信、进程间通信以及跨主机通信[1]。
1 LCM与ZeroMQ通信库介绍
1.1 LCM通信方法
轻量级通信和编组(LCM),提供了一种基于“推”的发布/订阅模型。相比于一些系统所提供的包含预定义的数据类型、现成模块、事件循环、消息传递系统、可视化和仿真工具、包管理和其他[2-4]等的操作“环境”,LCM旨在建立一个“点菜”式的消息传递系统,使其能够被集成到各种系统中。
LCM所采用的通信机制与众不同之处在于,它更注重调试和分析。相反,大多数系统通常以牺牲效率和性能为代价建立易于调试和检查的模块间通信机制[5] 。
LCM包含类型规范、编组、通信和工具四个部分。
类型规范指的是对于复合数据类型定义的方式和语法,以及进程间运用LCM进行数据交换的唯一方式。LCM定义了正式的类型规范语言来描述消息,其不支持定义远程过程调用协议(RPC),而是要求应用程序通过交换个人信息进行通信。编组是指为负责实际传输的通信系统,将消息编码和解码为二进制数据的过程。LCM通信可以概括为使用UDP组播作为其底层传输层的一个发布-订阅消息系统。根据publish-subscribe模型,每个消息通过已命名的信道传输,模块订阅所需的信道完成自己的指定任务。LCM提供了有用的工具用于日志记录、回放和流量检查。它们允许开发人员迅速和有效地分析LCM系统的行为和性能。
1.2 ZeroMQ简介
ZMQ(以下ZeroMQ简称ZMQ)是一个简单好用的传输层,像框架一样的socket library,它使得Socket编程更加简单、简洁和性能更高。
ZMQ传递的消息是指定长度的二进制数据块,而不是TCP那样传递字节流,或者UDP那样的数据包。ZMQ可以将整块数据(消息)快速而高效地发送到节点,这里的节点可以是
线程、进程或节点。ZMQ提供给应用程序一个单独套接字API来开展工作,而不管实际使用的传输协议是什么(例如,进程内、进程间、TCP或者多播)。
ZMQ提供给了我们多种消息传递模式[6-7],ZMQ模式是由类型相匹配的套接字对来实现的。这些模式的合理运用,将有助于开发者在设计消息传递模块时,ZMQ模式会根据需要,将消息同时在发送者和接受者之间进行路由和排队。
2 进程间通信设计
2.1 设计思路
进程间通信采用LCM模式,为了保持总体构架不变,因此把通信总体分成两类:
一类为内网通信,由各个实体单元自己采用LCM方式来实现;
另一类为外网通信,即不同网络实体间的通信。
由于LCM只能工作在局域网内,不能跨网段工作,因此采用ZeroMQ的通信方式来实现外网通信。
为了实现外网通信,在两个网元内各开设一个代理进程,负责转发内外网消息。外网通信分为以下两步:
(1)网元内通信:各个实体内进程如需发送外网消息,首先发消息给一个代理进程,此消息为LCM消息,这样不改变整个内网通信采用LCM的构架。
(2)网元间通信:代理进程接收到LCM消息后,经过分析寻址,重新组包,通过ZeroMQ发送给另外一个实体。即外网消息通过ZeroMQ来传递。或者代理进程收到ZeroMQ数据包,转化成LCM消息,示意图如图1所示。
2.2 软件架构
为了提供统一的接口,此处采用SendMSG来统一封装。同时为了实现减小代理进程的维护量,需对业务进程发送的LCM消息做一些特殊规定,需要包含以下几个部分:
(1)对方网元名称;
(2)对方的LCM信道;
(3) 流化的数据;
这样做的好处在于代理进程并不需要对具体的业务做业务识别,加快了转发速度,降低了软件维护量。
整个通信流程如图2所示。
图示说明:发端业务进程:调用sendMSG函数,发送数据。在sendMSG内部中需要添加对方网元-信道二元组和Message数据,在函数内部对Message数据进行二进制流化,然后发到转接代理进程。
发端代理进程:LCM-receive接收数据,根据接收到的对方网元寻址,得到对方的ZeroMQ socket,同时剥离出流化数据,然后ZMQ-send出去。
收端代理进程:ZeroMQ-receive接收数据,得到ZeroMQ数据包,反流化二进制数据。根据得到的Message数据,得到对端LCM信道号,和解出的数据,作为LCM的数据包,LCM-send发送出去。
收端业务进程:LCM-receive接收数据,得到LCM数据包,处理控制数据。
3 车间数据通信设计与实现
为了验证说明LCM与ZeroMQ在进程间通信的可行性,本文选用了网络自动化驾驶中车间通信所采用的设计方案。整个设计和验证都在Linux平台进行,编程语言为C++。
在验证过程中,我们设计了四个模块,其中RSU_LCM、CSU_LCM模块位于两台不同内网主机上,RSU_proxy、CSU_proxy模块位于两台公网主机上,命名了NEMSG_RSU, NEMSG_CSU两个信道。整个流程如图3所示。
测试过程中,我们以RSU_LCM向CSU_LCM注册这一业务进程为例,对上述四个模块间的通信实现进行验证。测试结果如表1所示。
通过对比发送端和接收端的消息类型,以及消息传输时延,我们不难看出,进程间的消息能够通过LCM和ZeroMQ进行完整而高效的传输。由于LCM的低时延特性,以及ZeroMQ在支持多种通信模式方面的特点,我们在探索进程间低延时通信方面,灵活运用LCM与ZeroMQ的消息传送机制,将大大提高传输效率。
4 结束语
本文是在传统的socket通信基础上,提出的进程间通信新机制,专门针对实时系统在高带宽和低的延迟的情况下进行消息发送和数据封送处理。对上述提出的通信设计方法,我们进行了基本的实验性测试,性能表现良好。目前,我们在车间通信的开发过程中,对LCM和ZeroMQ通信机制的优势所在,也正在进行更深入的探索研究。
参考文献
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论