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

news2024/9/8 22:18:14

文章目录

    • 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.coloradmin.cn/o/1961390.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sci-hub下载不了的文献去哪里获取全文

我们在查找外文文献时经常会用到sci-hub,但sci-hub也有没有收录的文献,遇到这种情况我们可以用另一个途径来获取该文献。 例如这篇Wiley数据库中的文献:Unveiling Gating Behavior in Piezoionic Effect: toward Neuromimetic Tactile Sensin…

Linux服务管理(四)Apache服务

Apache服务 1、基于IP的虚拟主机2、基于IP端口的虚拟主机3、基于域名的虚拟主机4、prefork模式5、worker模式6、event模式7、细说驱动工作模式和MPM(多处理模块)工作模式 新旧域名都保留,因为旧域名已有一定的知名度和流量,直接下…

Cocos Creator2D游戏开发(8)-飞机大战(6)-炸机

碰撞 飞机与飞机碰撞 子弹与飞机碰撞 ① 设置碰撞矩阵 设置碰撞矩阵,就是设置谁跟谁碰撞(添加Enemy,PlayerBullet,Player) ②设置刚体和碰撞体 两个预制体设置(Enemy和PlayerBullet) 注意点: 1. 都在预制体节点上,不在图片上; 2.碰撞体Collider2D中的Editing悬着好之后可以调整…

C#-读取测序数据的ABI文件并绘制svg格式峰图-施工中

本地环境:win10,visual studio 2022 community 目录 前言问题描述解决思路实现效果 前言 本文是在已有的代码基础上进行的开发,前期已经实现: ABI文件的解析峰图的简单绘制svg绘图 对于1,主要用到之前重写的struct包…

大模型面经之bert和gpt区别

BERT和GPT是自然语言处理(NLP)领域中的两种重要预训练语言模型,它们在多个方面存在显著的区别。以下是对BERT和GPT区别的详细分析。 一、模型基础与架构 BERT: 全称:Bidirectional Encoder Representations from Trans…

系统移植(九)Linux内核移植(未整理)

文章目录 一、概念二、在linux内核源码的arch/arm/configs目录下生成FSMP1A板子对应的默认配置文件三、将自己编写的驱动通过图形化界面的方式编译到内核的镜像文件uImage中(一)拷贝myled.c和myled.h文件到linux内核源码的drivers/char目录下&#xff08…

第15周 15.1 Zookeeper简介安装及基础使用

1. Zookeeper介绍 1.1 介绍 1.2 应用场景简介 1.3 zookeeper工作原理 1.4 zookeeper特点

Canva收购Leonardo.ai,增强生成式AI技术能力

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

MyBatis-Plus自动生成代码

目录 前言一. 什么是 MyBatis-Plus1. Mybatis-Plus 的特点2. Mybatis-Plus 结构二. MyBatis-Plus 自动生成步骤1. 数据库准备2. 环境准备(1) 创建一个空的 Spring Boot 工程(2) 导入pom依赖(3) 编辑application.yml文件(4) 在启动类加入 @MapperScan 注解3. 配置代码4. 运行三.…

Hutool SoapClient 调用使用@webservice 发布的webService接口,参数传递为空

一.发布webService接口 (1)接口声明 import javax.jws.WebService;WebService public interface Calculator {String add(String a, String b);int multi(int a, int b);}(2)实现方法 import com.maxnerva.cloud.webservice.ser…

初始mybatis

一、J D B C 编程和 ORM 模 型 1.JDBC回顾 加载驱动 :导入JDBC 连接数据库的 jar包,利用CLASS.forName 加载驱动; 获取连接 : 利用 DriverManager 获取 Connection,然后创建 Statement ; 执行SQL语句 &…

算法刷题day20|回溯:39. 组合总和、40. 组合总和 II、131. 分割回文串

39. 组合总和 回溯 class Solution { private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& candidates, int target, int sum, int startIndex) {if (sum > target) {return;}if (sum target) {result.push…

valideer,一个超强的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超强的 Python 库 - valideer。 Github地址&#xff1a;https://github.com/podio/valideer 在开发应用程序时&#xff0c;数据验证是一个至关重要的环节。它确保了输入数…

【SpringBoot】5 Swagger

官网 https://swagger.io/ 介绍 Swagger 是一套基于 OpenAPI 规范构建的开源工具&#xff0c;可以帮助开发者实现设计、构建、记录、使用 Rest API。 Swagger 是一款根据 Restful 风格生成的接口开发文档&#xff0c;并且支持做测试的一款中间软件。 Swagger主要包括三部分&…

jfif怎么改成jpg?分享给大家三个小技巧!

在数字时代&#xff0c;图片是我们日常生活和工作中不可或缺的一部分。然而&#xff0c;在处理图片时&#xff0c;我们可能会遇到各种格式的问题&#xff0c;比如JFIF格式的图片在某些平台上无法直接打开或编辑。别担心&#xff0c;今天我就给大家分享三个简单实用的小技巧&…

spring自动装配读取引用jar包下的META-INF文件里的类,将其加载进spring启动容器.

总结: 0.ComponentScan默认只扫描同包、子包下的所有类, 因此扫描不到引的其他jar包依赖里的类 1.引的其他jar包依赖里的类想要被spring加载进容器, 在spring2.7之前,要把类的全类名写在自己项目包下的resources/META-INF/spring.factories下的文件中, 从spring boot2.7开…

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

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

spring源码 bean的生命周期

问&#xff1a;谈谈对spring的理解 答&#xff1a;总分思想&#xff0c;先说对spring的总体认知&#xff0c;再说小一点的比如&#xff1a;IOC,AOP,IOC如何实现&#xff0c;生命周期&#xff0c;循环依赖等 IOC&#xff1a;控制反转 xml和注解创建对象的流程 xm文件通过IO流读…

RVC-AI声音克隆-你的声音不再是唯一

RVC是一个基于Hubert模型的AI语音转换工具&#xff0c;可以实现男女声的互换和降噪。 本文将要介绍RVC的安装和使用方法 首先感谢花儿不哭大佬带来的RVC声音克隆 花儿不哭&#xff1a; 花儿不哭的个人空间-花儿不哭个人主页-哔哩哔哩视频 (bilibili.com) RVC下载地址&#xff…

Elastic 线下 Meetup 将于 2024 年 8 月 25 号在南京举办

2024 Elastic Meetup 南京站活动&#xff0c;由 Elastic、华博集团、新智锦绣联合举办&#xff0c;现诚邀广大技术爱好者及开发者参加。 时间地点 2024 年 8 月 25 日 13:30-18:00 活动地点 南京雨花台区花神大道 17 号 华博智慧园 7 楼 智慧岛会议厅 报名地址 2024 Elasti…