C++高性能通信:图形简述高性能中间件Iceoryx

文章目录

    • 1. 概述
    • 2. 支持一个发布者多个订阅者
      • 2.2 Iceoryx为何不支持多个发布者发布到同一个主题
    • 3. Iceoryx的架构和数据传输示意图
      • 3.1 发布者与订阅者的通信机制
      • 3.2 零拷贝共享内存通信机制
    • 4. 使用事件驱动机制
      • 4.1 WaitSet机制
      • 4.2 Listener机制
    • 5. 已知限制
    • 6. 参考

1. 概述

本文将通过图示简要介绍高性能通信中间件Iceoryx的核心特点。详细介绍请参见:C++高性能通信:了解Iceoryx与零拷贝技术的实现与应用。

2. 支持一个发布者多个订阅者

Iceoryx架构与数据传输

Iceoryx支持一个发布者对应多个订阅者,每个发布者将数据发布到特定的主题,多个订阅者可以订阅该主题并接收数据。

2.2 Iceoryx为何不支持多个发布者发布到同一个主题

Iceoryx不支持多个发布者发布到同一个主题,主要原因如下:

  1. 数据一致性:多个发布者需要额外机制确保数据一致性和顺序性,增加系统复杂性和延迟。
  2. 内存管理:多个发布者同时访问同一共享内存区域,带来内存管理挑战。
  3. 数据竞态:多个发布者可能导致数据竞态问题,需要额外锁机制解决,降低系统性能。

这种设计选择保持了系统的简单性和高效性,避免了多发布者带来的复杂性,同时充分利用共享内存机制,实现高性能数据传输。

3. Iceoryx的架构和数据传输示意图

下图展示了Iceoryx的架构与数据传输流程,主要包括发布者(Publisher)、订阅者(Subscriber)、RouDi守护进程(Daemon)和共享内存。

  1. 写入数据块(Write Chunk):发布者将数据写入共享内存中的数据块(Chunk)。
  2. 发布信号量(Post Semaphore):发布者写入数据后,通过信号量(Semaphore)通知RouDi守护进程有新数据可用。
  3. 通知(Notification):RouDi守护进程收到信号量通知后,通过消息队列(Message Queue)将新数据的通知发送给所有订阅者。
  4. 读取数据块(Read Chunk):订阅者接收到RouDi的通知后,从共享内存中读取数据块。

RouDi守护进程负责管理发布者和订阅者的配置和注册,通过消息队列实现通知机制,确保发布者和订阅者之间的高效通信。共享内存用于存储和传输数据,极大地避免了数据拷贝。
架构和数据传输示意图

3.1 发布者与订阅者的通信机制

在Iceoryx中,发布者和订阅者通过消息队列与RouDi(Runtime and Discovery Daemon)进行通信和配置。

  1. 注册:发布者和订阅者启动时向RouDi注册,声明自己发布或订阅的主题。
  2. 连接:RouDi根据注册信息建立发布者和订阅者之间的连接,并配置共享内存区域。
  3. 通信:发布者将数据写入共享内存,通过消息队列通知RouDi;订阅者接收RouDi的通知,从共享内存读取数据。

3.2 零拷贝共享内存通信机制

  1. 零拷贝方法:Iceoryx使用基于共享内存的零拷贝方法,允许发布者和订阅者通过共享内存实现高效通信,避免数据拷贝。
  2. 共享内存映射:共享内存是一种物理内存,通过映射到进程的虚拟地址空间,使多个进程能够访问同一内存区域。
  3. 进程间共享:共享内存段可以被多个进程映射,不同进程中的映射地址可能不同。这些共享内存段位于RAM或文件系统中,通过映射到进程的虚拟地址空间,使其可访问。

零拷贝共享内存通信

4. 使用事件驱动机制

事件驱动机制

4.1 WaitSet机制

WaitSet用于通过非忙等待将线程置于睡眠状态,并等待用户定义的事件发生。通常,这些事件对应于特定订阅者或客户端的数据可用性。

  1. 创建WaitSet:创建一个WaitSet,附加多个订阅者和/或客户端和用户触发器,然后等待一个或多个附加对象发出事件。
  2. 接收通知:当事件发生时,接收到一个名为notificationVector的所有发生事件的列表。
  3. 处理数据:在订阅者或客户端通知WaitSet有新数据或新响应可用时,直接从订阅者或客户端收集数据。

WaitSet使用反应器模式,通过推送策略通知用户发生的事件。更多信息请参见WaitSet示例。

4.2 Listener机制

Listener用于将自定义回调连接到用户定义的事件。与WaitSet不同,它通过在后台线程中执行连接的自定义回调来响应这些事件。

  1. 线程安全:Listener是完全线程安全的,但大多数可以附加到Listener的对象不是线程安全的。要么对象完全由Listener处理,要么用户必须通过其他手段确保线程安全。
  2. 用例:创建一个Listener并附加多个订阅者。当有新数据可用时,将执行相应的连接回调,例如打印到控制台或执行计算算法。另一种用例是将服务器附加到Listener,每当接收到请求时,执行创建并发送响应的连接回调。

与WaitSet一样,Listener使用反应器模式。更多信息请参见回调示例。

5. 已知限制

  1. RouDi Daemon故障:RouDi Daemon不能崩溃,否则会导致系统故障。RouDi守护进程必须在任何应用程序之前运行。
  2. 固定虚拟地址依赖:目前,需要为所有进程mmap特定的基址。
  3. 内存池配置:编译后内存池无法配置,仅支持静态配置。
  4. 单个发布者限制:仅支持单个发布者,不支持多个。

6. 参考

待补充

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/387120.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ImportError: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20‘ 报错解决办法

1.查找 libstdc.so.6* find / -name libstdc.so.6*2.copy一个libstdc.so.6.0.19到/usr/lib64/下 cp /usr/lib64/libstdc.so.6 /usr/lib64/3.创建软连接 ln -sf /usr/lib64/libstdc.so.6.0.31 /usr/lib64/libstdc.so.6完毕!

中电金信:云原生时代IT基础设施管理利器——基础设施即代码(IaC)

在数字化转型、零售业务快速发展、信创建设驱动下,应用架构、技术架构、基础架构都已向云原生快速演进,银行业IT基础设施管理产生了非常大的变化,当前银行业,正在开展新一轮的核心应用系统重构、基础平台统一建设等重点任务&#…

Linux网络:传输层协议TCP(二)三次挥手四次握手详解

目录 一、TCP的连接管理机制 1.1三次握手 1.2四次挥手 二、理解 TIME_WAIT 状态 2.1解决TIME_WAIT 状态引起的 bind 失败的方法 三、理解CLOSE_WAIT状态 一、TCP的连接管理机制 在正常情况下, TCP 要经过三次握手建立连接, 四次挥手断开连接 1.1三次握手 三次握手顾名思…

【设计模式】代理模式详解

1.简介 代理模式是常用的Java设计模式,该模式的特点是代理类与委托类共享相同的接口。代理类主要负责预处理消息、过滤消息、将消息转发给委托类,并在事后处理消息等。代理类与委托类之间通常存在关联关系,一个代理类对象与一个委托类对象关…

SpringBoot Mysql->达梦8 activiti6.0.0 项目迁移

全部源码:公众号搜索资小库,回复dm获取源码 1.整合达梦 1.1 达梦驱动下载 MyBatis-Plus 框架 | 达梦技术文档 (dameng.com) 1.2 数据迁移 怎么安装数据库,很多大佬有帖子,搜一下达梦先建立用户,使用DM管理工具 链…

SQL Server 数据误删的恢复

在日常的数据库管理中,数据的误删操作是难以避免的。为了确保数据的安全性和完整性,我们必须采取一些措施来进行数据的备份和恢复。本文将详细介绍如何在 SQL Server 中进行数据的备份和恢复操作,特别是在发生数据误删的情况下。假设我们已经…

使用visual studio编译C++项目时无法找到 enum中的某些项

vs 2017 编译一个cocos2dx 的老项目时,报错: 在项目中搜索关键字 ARMATURE_LOOP_COMPLETE,发现在文件EventType.h中是有定义的,是 enum Event 的一项,而且确认了报错的文件已经引入了这个头文件: 这太奇怪了…

傻瓜式PHP-Webshell免杀学习手册,零基础小白也能看懂

项目描述 一、PHP相关资料 PHP官方手册: https://www.php.net/manual/zh/ PHP函数参考: https://www.php.net/manual/zh/funcref.php 菜鸟教程: https://www.runoob.com/php/php-tutorial.html w3school: https://www.w3school…

【React】全面解析:从基础知识到高级应用,掌握现代Web开发利器

文章目录 一、React 的基础知识1. 什么是 React?2. React 的基本概念3. 基本示例 二、React 的进阶概念1. 状态(State)和属性(Props)2. 生命周期方法(Lifecycle Methods)3. 钩子(Hoo…

Spring Cloud微服务项目统一封装数据响应体

在微服务架构下,处理服务之间的通信和数据一致性是一个重要的挑战。为了提高开发效率、保证数据的一致性及简化前端开发,统一封装数据响应体是一种非常有效的实践。本文博主将介绍如何在 Spring Cloud 微服务项目中统一封装数据响应体,并分享…

ValueError: invalid literal for int() with base 10: ‘a‘

ValueError: invalid literal for int() with base 10: ‘a‘ 目录 ValueError: invalid literal for int() with base 10: ‘a‘ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰&#xff…

基于web3区块链的名酒资产数字化、个人闲置资产收藏系统,实现联盟链、NFT数据上链、智能合约开发

系统背景: 国内有众多历史悠久却极具收藏价值的名酒品类,但是传统名酒投资存在着保真、流通和收藏三大痛点,极大影响了名酒产业的发展。基于区块链的分布式、不可篡改、可追溯、透明性、多方维护、交叉验证等特性,数据权属可以被有…

【Linux】软连接|硬链接|当前路径(.)|上级路径(..)|硬链接不能链接目录

目录 前言 软连接 ​编辑 删除源文件 快捷应用 总结 硬链接 硬链接为何不能链接目录 为什么软连接可以 软硬链接区别 当前路径(.)和上级路径(..) ​编辑 前言 在 Linux 中,文件的存储位置和数据(属性内容)是由 inode 号来唯一标…

错误:请查看是否设备未加入到证书列表或者确认证书类型是否匹配

这个问题实际上网上都有解法,但是可能没有那么的清楚,大家在各种问,我既然搞定了,就分享给大家吧网上解法: 开发调试需要另外创建开发证书和描述文件,描述文件同时绑定开发设备解读: 实际上这句…

electron 主进程和渲染进程

最近在整理electron 相关的项目问题,对自己来说也是温故知新,也希望能对小伙伴们有所帮助,大家共同努力共同进步。加油!!!! 虽然最近一年前端大环境不好,但是大家还是要加油鸭&#…

SmartInitializingSingleton和InitializingBean的区别

SmartInitializingSingleton:接口里面就一个方法afterSingletonsInstantiated,它是spring容器将所有bean都初始化完成之后,才会去调用,要求实现它接口的bean必须是单例的。 应用场景:可以在服务启动之后去处理一些逻辑…

科普文:从源码解读5种Redis基本数据类型

键值对字符串 char* 与 SDS char* 的不足: 操作效率低:获取长度需遍历,O(N)复杂度 二进制不安全:无法存储包含 \0 的数据 SDS 的优势: 操作效率高:获取长度无需遍历,O(1)复杂度&#xff08…

60个常见的 Linux 指令

常见60个Linux指令 1.ssh 登录到计算机主机2.ls 列出目录内容3.pwd 当前终端会话所在的完整路径4.cd 切换当前工作目录5.touch 创建空文件或更新文件的时间戳6.echo 终端输出文本或变量值7.nano 在终端中编辑文件8.vim 文本编辑器9.cat 查看、连接和创建文件10.shred 安全删除敏…

XPathParser类

XPathParser类是mybatis对 javax.xml.xpath.XPath的包装类。 接下来我们来看下XPathParser类的结构 1、属性 // 存放读取到的整个XML文档private final Document document;// 是否开启验证private boolean validation;// 自定义的DTD约束文件实体解析器,与valida…

科研绘图系列:R语言山脊图(Ridgeline Chart)

介绍 山脊图(Ridge Chart)是一种用于展示数据分布和比较不同类别或组之间差异的数据可视化技术。它通常用于展示多个维度或变量之间的关系,以及它们在不同组中的分布情况。山脊图的特点: 多变量展示:山脊图可以同时展示多个变量的分布情况,允许用户比较不同变量之间的关…