背景技术
数据分发服务(Data Distribution Service,DDS)是新一代分布式实时通信中间件协议,采用发布/订阅体系架构,强调以数据为中心,提供丰富的QoS服务质量策略,以保障数据进行实时、高效、灵活地分发,可满足各种分布式实时通信应用需求。
相比于其他的通信中间件协议,DDS的显著优势之一就是其能提供不依赖于传输层的可靠性,并且支持丰富的传输机制,无论是传统的UDP/TCP传输,或是域内的共享内存传输,或是高确定性的TSN传输,等等。
其中,共享内存传输(SHM)依赖于主机操作系统提供的共享内存机制,允许运行在同一处理单元/机器上的DDS实体之间进行快速通信。共享内存传输(SHM)能够提供比其他网络传输(如UDP/TCP)更好的性能,即使这些传输使用环回接口。这主要是由于以下因素决定的:
1、大消息支持:为了符合特定的协议和网络协议栈要求,网络协议需要对数据进行分片,这无疑增加了通信开销。共享内存传输允许完整的消息复制,唯一的大小限制来自于机器的内存容量。
2、减少内存拷贝的数量:当发送相同的消息到不同的对端时,共享内存传输可以直接与所有的目标端点共享相同的内存缓冲区。而其他协议则要求对每个端点执行一次消息的拷贝。
3、更小的操作系统开销:一旦完成了初始设置,共享内存传输需要的系统调用要比其他协议少得多。因此,使用共享内存可以有效的提升性能,减少时间消耗。
鉴于共享内存传输上述的优势,目前大部分主流的DDS中间件产品都支持了域内共享内存传输机制,主要有以下两种形式:
1、内建型的共享内存传输,其特点是将共享内存的机制集成在DDS协议栈内部,通过配置显式的指定共享内存传输方式。缺点是每个DDS应用都要进行相关的配置,用户需要保证所有配置的正确性,否则无法正常进行共享内存传输;每个DDS协议栈要额外的拉起多个线程用于负责共享内存的发现流程和数据传输,实现不够轻量级;共享内存传输与其他的传输机制是割离的,不能自适应的选择合适的传输类型;当DDS应用进程退出后,会残留未销毁的共享内存块、信号量、互斥锁等资源,由于缺乏全局的管理角色,用户还需要手动的去清理这些资源,以保证下次DDS应用拉起时能够正常的申请。
2、配合共享内存套件实现共享内存传输,其特点是在全局部署一个共享内存服务端,由该服务端负责协调域内所有DDS应用的共享内存资源和同步机制,DDS协议栈里调用共享内存套件的接口进行共享内存传输。缺点是额外引入了共享内存套件,增加了DDS协议栈的依赖条件,不易于开发和维护;用户数据的传输需要经过DDS协议栈层和共享内存套件层,没有真正意义的实现零拷贝;用户需要搭建共享内存套件的运行环境,需要学习和了解共享内存套件的配置方式和使用方法,用户体验较差。
发明内容
为解决现有技术中存在的不足,本发明的目的在于,提供一种基于分离式数据分发服务的域内共享内存传输架构及机制。
为实现本发明的目的,本发明所采用的技术方案是:
一种基于分离式数据分发服务的域内共享内存传输架构,包括多个DDS客户端、共享内存区、DDS服务端;在DDS服务端的DDS协议栈内引入共享内存管理模块,并行于网络会话管理模块;
共享内存区是多个共享内存池的集合,共享内存池是多个相同大小的内存块的集合,内存块是共享内存传输的基本单位,DDS客户端发布侧将数据写入某个内存块,而订阅侧读取时访问该内存块;
共享内存传输的配置集成在DDS服务端的配置中,DDS服务端上电时,DDS协议栈的共享内存管理模块会根据配置申请共享内存传输所需的所有资源;共享内存管理模块负责多个DDS客户端之间共享内存描述符的传递,为各个DDS客户端动态的协调共享内存资源,维护多个DDS客户端之间的同步机制,定期回收共享资源。
进一步地,配置共享内存传输开关,指定开启或者关闭共享内存传输功能,关闭后DDS服务端上电时不会申请共享内存资源。
进一步地,在分离式数据分发服务架构下,域内所有的DDS客户端都会连接到同一个DDS服务端上,DDS服务端只识别本地的DDS节点并进行匹配。
一种基于分离式数据分发服务的域内共享内存传输机制,DDS服务端和DDS客户端之间只传递共享内存地址的描述符,传输流程包括write流程和read流程;
DDS客户端发布侧的write流程具体步骤:
用户调用dds_write,写入用户数据;writer向DDS服务端上的共享内存管理模块发起申请内存块;内存管理器根据数据长度匹配到合适的内存块,并返回给writer描述符;writer收到描述符,转换成共享内存地址;writer将用户数据拷贝到共享内存地址上;writer通知共享内存管理模块写入数据;内存管理器将描述符插入协议栈的缓存区;协议栈返回成功给writer;dds_write返回成功给用户;
DDS客户端订阅侧的read流程具体步骤:
用户调用dds_read,申请读取数据;reader发送请求至DDS服务端的DDS协议栈上,申请读取历史缓存;DDS协议栈查找到历史缓存,然后返回描述符给reader;reader将描述符转换成共享内存地址;reader将数据拷贝至用户空间,然后dds_read返回给用户。
进一步地,还包括零拷贝的借用/归还共享内存传输机制,包括write流程和read流程;
借用/归还机制的write流程:
用户向writer发起内存借用;writer向DDS服务端的共享内存管理模块发起申请内存块;内存管理器根据数据长度匹配到合适的内存块,并返回给writer描述符;writer收到描述符,转换成共享内存地址,返回给用户;用户在共享内存地址上准备用户数据;用户调用dds_write发起写入;writer将共享内存地址转换成描述符;writer通知共享内存管理模块写入数据;内存管理器将描述符插入协议栈的缓存区;协议栈返回成功给writer;dds_write返回成功给用户;
借用/归还机制的read流程:
用户调用dds_read,申请读取数据;reader发送请求至DDS服务端的DDS协议栈上,申请读取历史缓存;DDS协议栈查找到历史缓存,然后返回描述符给reader;reader将描述符转换成共享内存地址;dds_read返回共享内存地址给用户,供用户直接读取数据;用户读取数据后,发起内存归还;reader将共享内存地址转换成描述符;reader通知共享内存管理模块归还内存块。
进一步地,借用/归还机制的使用限制:writer侧显式的调用内存“借用”,reader侧显式的调用内存“归还”;只支持固定长度的数据类型;用户需要确保在写入或读取数据后不对内存块进行任何数据修改。
进一步地,还包括同步机制,保证多线程/进程并发访问共享内存时的数据有效性;
同步机制具体为:writer申请/写入内存块时与DDS服务端进行同步;同一writer可以多次写入同一个内存块;reader读取内存块时与DDS服务端进行同步;多个writer申请/写入的内存块必须是不同的内存块;多个reader可以并发的读取同一个内存块;当存在reader访问某个内存块时,任意writer不得修改该内存块。
进一步地,还包括自动匹配机制,DDS客户端上的writer在调用dds_write写入数据时,通过DDS服务端上的共享内存管理模块为其自动匹配合适的内存块,包括主题数据类型为固定长度和主题数据类型为变长两种情况。
进一步地,还包括资源回收机制,对共享内存资源进行回收和销毁,包括定期回收、QoS老化、显式回收、显式归还、生命监控。
进一步地,还包括自适应传输机制,DDS服务端复用原有的发现流程,识别DDS实体的位置,自适应的选择传输类型,具体包括:当域内的writer实体没有任何匹配的reader时,优先选择其他传输类型;当匹配的writer和reader实体同时位于域内时,优先选择共享内存传输;当匹配的writer和reader实体同时位于域内时,但共享内存传输不可用时,则选择其他传输类型;当域内的writer实体匹配了域外的reader实体时,选择其他传输类型;当域内的writer实体同时匹配了域内和域外的多个reader实体时,则同时使用共享内存传输和其他传输类型。
本发明的有益效果在于,与现有技术相比,本发明基于分离式的数据分发服务架构,在不改变域间数据分发服务传输方式的基础上,提供高性能、易用的域内共享内存传输服务。
本发明通过DDS服务端直接实现域内DDS节点的发现机制,并协调所有DDS应用的共享内存资源和同步机制;自适应的选择共享内存作为域内DDS的传输机制,同时又不影响域间DDS的正常通信;实现DDS应用的生命监控和资源回收,避免资源泄漏和残留;提供借用和归还机制,实现更高性能的零拷贝传输;简化配置流程和使用方式,提升用户体验。
具体实施方式
下面结合附图和实施例对本发明的技术方案作进一步的说明。以下实施例仅用于更加清楚地说明本发明的技术方案,而不能以此来限制本申请的保护范围。
如图1所示,本发明所述的基于分离式数据分发服务的域内共享内存传输架构,包括多个DDS客户端、共享内存区、DDS服务端;在DDS服务端的DDS协议栈内引入共享内存管理模块,该模块并行于传统的网络会话管理模块。
共享内存管理模块主要负责:根据DDS服务端的配置,初始化整个共享内存区,包括不同SIZE的共享内存池和内存块个数等;初始化共享内存传输所必须的同步机制变量,如信号量,互斥锁等;为各个DDS客户端动态的协调共享内存资源,例如共享内存块的申请,借用和归还等;维护多使用者(DDS的writer和reader)之间的同步机制;维护共享内存块的引用计数,定期的回收共享内存块,避免资源泄露;负责多个DDS客户端之间共享内存描述符的传递;根据DDS客户端的生命状态,妥善的回收或销毁共享内存相关的资源。
共享内存区是多个共享内存池的集合,大部分情况下,用户只需配置一个共享内存区。共享内存池是多个相同大小的内存块的集合,也是共享内存资源初始化的基本单位,用户可以根据需求配置内存池中的内存块大小和数量。内存块是共享内存传输的基本单位,DDS的发布端将数据写入某个内存块,而订阅端读取时也是访问该内存块。
共享内存传输的配置集成在DDS服务端的配置中。可配置共享内存传输开关,指定开启或者关闭共享内存传输功能,关闭后DDS服务端上电时不会申请共享内存资源。可配置回收间隔,共享内存管理模块根据回收间隔定期的对已使用的内存块进行回收。
DDS服务端上电时,DDS协议栈的共享内存管理模块会根据配置申请共享内存传输所需的所有资源,包括共享内存区的申请,内存区/内存池/内存块的信息维护和描述符维护,同步机制变量的初始化等。当本机的内存资源不能满足用户配置下的共享内存申请时,DDS服务端会中止上电流程,并通过前端打印或者日志的形式告知用户资源不足。当共享内存管理模块发现本机残留了同名的历史资源时(例如当DDS服务端被强制重启时),会自动销毁历史资源,并重新进行资源申请,用户无需感知这个流程。
如图2所示,在分离式数据分发服务架构下,域内所有的DDS客户端都会连接到同一个DDS服务端上,为DDS节点的互相发现提供天然的通道,无需借助网络也无需开辟新的IPC通道用于发现流程。DDS服务端只需要识别本地的DDS节点并进行匹配即可。
如图3所示,基于分离式数据分发服务的域内共享内存传输机制,DDS服务端和DDS客户端之间只传递共享内存地址的描述符,而不产生实际的数据拷贝;传输流程包括write流程和read流程。
DDS客户端发布侧的write流程具体步骤:
1.用户调用dds_write,写入用户数据;
2.writer向DDS服务端上的共享内存管理模块发起申请内存块;
3.内存管理器根据数据长度匹配到合适的内存块,并返回给writer描述符;
4.writer收到描述符,转换成共享内存地址;
5.writer将用户数据拷贝到共享内存地址上;
6.writer通知共享内存管理模块写入数据;
7.内存管理器将数据(描述符)插入协议栈的缓存区;
8.协议栈返回成功给writer;
9.dds_write返回成功给用户。
DDS客户端订阅侧的read流程具体步骤:
1.用户调用dds_read,申请读取数据;
2.reader发送请求至DDS服务端的DDS协议栈上,申请读取历史缓存;
3.DDS协议栈查找到历史缓存,然后返回描述符给reader;
4.reader将描述符转换成共享内存地址;
5.reader将数据拷贝至用户空间,然后dds_read返回给用户。
可以看出,在用户写入和用户读取时均会产生一次拷贝。为了进一步的提升共享内存传输的性能和确定性,本发明还提出通过借用/归还机制消除不必要的拷贝,也就是零拷贝的共享内存传输,如图4所示。
借用/归还机制的write流程:
1.用户向writer发起内存借用;
2.writer向DDS服务端的共享内存管理模块发起申请内存块;
3.内存管理器根据数据长度匹配到合适的内存块,并返回给writer描述符;
4.writer收到描述符,转换成共享内存地址,返回给用户;
5.用户在共享内存地址上准备用户数据;
6.用户调用dds_write发起写入;
7.writer将共享内存地址转换成描述符;
8.writer通知共享内存管理模块写入数据;
9.内存管理器将数据(描述符)插入协议栈的缓存区;
10.协议栈返回成功给writer;
11.dds_write返回成功给用户。
借用/归还机制的read流程:
1.用户调用dds_read,申请读取数据;
2.reader发送请求至DDS服务端的DDS协议栈上,申请读取历史缓存;
3.DDS协议栈查找到历史缓存,然后返回描述符给reader;
4.reader将描述符转换成共享内存地址;
5.dds_read返回共享内存地址给用户,供用户直接读取数据;
6.用户读取数据后,发起内存归还;
7.reader将共享内存地址转换成描述符;
8.reader通知共享内存管理模块归还内存块。
借用/归还机制的使用限制:零拷贝共享内存传输的前提是writer侧显式的调用内存“借用”,reader侧显式的调用内存“归还”;借用/归还只能支持固定长度的数据类型,对于变长的数据类型,用户在借用内存时writer无法判断用户数据的真实长度(writer只有通过序列化才能判断出用户数据的真实长度);借用/归还机制暴露了共享内存地址给用户,为了保证数据的有效性,用户需要确保在写入或读取数据后不对内存块进行任何数据修改。
基于分离式数据分发服务的域内共享内存传输机制,还包含同步机制、自动匹配机制、资源回收机制、自适应传输机制。
同步机制,共享内存管理模块维护了多使用者(DDS的writer和reader)之间的同步机制,保障了多线程/进程并发访问共享内存时的数据有效性。共享内存的同步机制可以保证在共享内存传输下N:N的收发模式,与标准的DDS特性对齐。
同步机制具体为:writer申请/写入内存块时与DDS服务端进行同步;同一writer可以多次写入同一个内存块(具体视QoS配置而定);reader读取内存块时与DDS服务端进行同步;多个writer申请/写入的内存块必须是不同的内存块;多个reader可以并发的读取同一个内存块;当存在reader访问某个内存块时,任意writer不得修改该内存块。
自动匹配机制,DDS客户端上的writer在调用dds_write写入数据时,会通过DDS服务端上的共享内存管理模块为其申请合适的内存块,这里主要涉及以下两种情况:
1.主题数据类型为固定长度:共享内存管理模块为writer自动匹配合适大小的内存块,将描述符返回给writer,writer写入用户数据时会拷贝到该描述符对应的共享内存块上;
2.主题数据类型为变长:当数据定义中包含了string、sequence等类型时,主题数据类型就是变长的。这种情况下需要在DDS客户端对用户传入数据进行序列化后判断其长度,然后再通过共享内存管理模块匹配合适大小的内存块,将序列化后的用户数据拷贝到描述符对应的共享内存块上。
在上述两种情况下,若不能匹配到合适大小的内存块,则不能使用共享内存进行传输,但仍可以走正常的网络传输或其他传输类型。
资源回收机制,对于共享内存资源的回收和销毁主要有:定期回收、QoS老化、显式回收、显式归还、生命监控。
定期回收,是共享内存管理模块根据回收间隔的配置,定期的对已使用的内存块进行回收。QoS老化,是根据DDS QoS的HISTORY、LIFESPAN等设定,触发历史缓存的老化,同时会回收已使用的内存块。显式回收,是为用户(writer侧)提供专门的回收接口,触发共享内存管理模块回收当前writer占用的共享内存块。显式归还,是共享内存管理模块会对所有的共享内存块维护引用计数;当reader显式的调用了内存归还后,该内存块的引用计数清0,才会满足回收的条件。生命监控,是在DDS服务端实现对于各个DDS客户端的生命监控机制。当监测到某个DDS客户端失效后,共享内存管理模块会回收其对应的所有DDS实体占用的共享内存资源,同时也会销毁所有相关的同步机制变量。
自适应传输机制,在默认的策略下,DDS服务端复用原有的发现流程,识别DDS实体的位置,自适应的选择传输类型,具体包括:当域内的writer实体没有任何匹配的reader时,优先选择其他传输类型;当匹配的writer和reader实体同时位于域内时,优先选择共享内存传输;当匹配的writer和reader实体同时位于域内时,但共享内存传输不可用时(例如无法为用户数据匹配到合适大小的内存块),则选择其他传输类型;当域内的writer实体匹配了域外的reader实体时,选择其他传输类型;当域内的writer实体同时匹配了域内和域外的多个reader实体时,则同时使用共享内存传输和其他传输类型;用户也可以通过配置指定共享内存传输的开关。
本发明的核心在于:1、基于分离式数据分发服务的架构,将共享内存传输机制内建在DDS服务端;2、共享内存相关参数集成在DDS服务端的配置中,DDS服务端根据配置初始化共享内存资源;3、DDS服务端在不借助网络或IPC通道的基础上直接实现域内DDS节点的发现机制;4、DDS服务端动态的为各个DDS客户端协调共享内存资源和同步机制;5、DDS服务端和DDS客户端之间只传递共享内存地址的描述符,而不产生实际的数据拷贝;6、DDS服务端复用原有的发现流程,根据DDS实体的位置,自适应的选择传输类型,只有当双方实体同时位于本机(域内)时才会使用共享内存传输,同时不影响域间DDS实体的正常通信;7、DDS服务端监控DDS客户端的生命周期,并妥善的回收或销毁共享内存相关的资源;8、通过借用/归还机制实现零拷贝,提升共享内存传输的性能。
本发明的有益效果在于,与现有技术相比,本发明基于分离式的数据分发服务架构,在不改变域间数据分发服务传输方式的基础上,提供高性能、易用的域内共享内存传输服务。
本发明通过DDS服务端直接实现域内DDS节点的发现机制,并协调所有DDS应用的共享内存资源和同步机制;自适应的选择共享内存作为域内DDS的传输机制,同时又不影响域间DDS的正常通信;实现DDS应用的生命监控和资源回收,避免资源泄漏和残留;提供借用和归还机制,实现更高性能的零拷贝传输;简化配置流程和使用方式,提升用户体验。
本发明申请人结合说明书附图对本发明的实施示例做了详细的说明与描述,但是本领域技术人员应该理解,以上实施示例仅为本发明的优选实施方案,详尽的说明只是为了帮助读者更好地理解本发明精神,而并非对本发明保护范围的限制,相反,任何基于本发明的发明精神所作的任何改进或修饰都应当落在本发明的保护范围之内。