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://xiahunao.cn/news/3279971.html

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

相关文章

Python .whl 独立安装和全部依赖安装命令

以安装 Flask 为例: 1. 独立安装 pip install whl_files/Flask-1.1.2-py2.py3-none-any.whl 2. 安装 Flask 全部依赖包和自己 cd /path/to/flask/1.0 pip install --no-index --find-links/path/to/downloaded/files Flask1.1.2 cd /path/to/flask/2.0 pip install …

批量输出文件夹内所有文件名和文件——vba实现

导出一个文件夹下所有文件名,可用vba插件实现,如图 如下图,已在桌面生成一个txt文本,但此方法只可输出一级目录下的文件,若输出所有文件,则需修改插件代码 (若想导出硬盘下所有文件和文件夹&…

网络通信HTTP

学习内容 这是昨日学习内容,之后花费昨晚和今天一整天的时间做了个小项目 项目:基于网络爬虫的天气查询系统 其中用了cJSON库来解析相关内容,感兴趣的朋友也可以做一做

SM2在线解密工具

SM2加密算法,采用公钥加密、私钥解密,在上一篇文章提到SM2加密工具,对应的这里再次提供SM2的在线解密工具 在线SM2解密工具 这个工具非常强大,不管什么加密模式都能无需指定的直接解密。

yolov10在地平线旭日X3派上的部署和测试(Python版本和C++版本)

0、搭建开发环境 当前的测试根据一下的步骤并修改源码是可以实现yolov8的板端运行,如果不想再搭建环境和测试代码bug上浪费更多的时间可以直接获取本人的测试虚拟机,所有的测试代码、虚拟环境和板端测试工程以全部打包到了虚拟机,需要的可以…

MLP多层感知机与Pytorch实现

参考文章: 1.动手学深度学习——多层感知机(原理解释代码详解)_多层感知机 代码-CSDN博客 2.4.1. 多层感知机 — 动手学深度学习 2.0.0 documentation 3.深度理解多层感知机(MLP) | 米奇妙妙屋 1. 神经网络由来 神经网…

Qt Designer的尺寸策略学习笔记

在 PySide6(或者 PyQt6)中,小部件的 sizePolicy 主要用于控制小部件在布局中的行为,特别是在调整窗口大小时。sizePolicy 由两个主要策略组成:水平策略和垂直策略。它们可以进一步细分为伸展、固定、最小、最大等类型。…

FP分数规划在无线通信中的应用(II)

3. 具体例子 3.1-3.3都只需要用第一章concave-convex方法求解,3.4-3.6需要用到第二章的拉格朗日对偶变换,而且具体解 x \mathbf{x} x时需要对离散变量单独开发算法。 3.1 多小区SISO能量分配 第一个例子是具有一组单天线基站(BSs&#xff…

网工内推 | 合资公司、上市公司数据库工程师,OCP/OCM认证优先,双休

01 欣旺达电子股份有限公司 🔷招聘岗位:数据库管理高级工程师 🔷岗位职责: 1、负责数据库规划、管理、调优工作; 2、负责数据库应急预案制定、应急预案维护和应急支持; 3、负责数据库异常处理&#xff…

TwinCAT3 创建变量并链接

文章目录 右键 PLC 选择添加新项 选择 Standard PLC Project,并把名称改成英文,例如下图中的‘test’ 双击 POUs 文件下的 MAIN 开始编程,编辑一段简单的程序,输入导通输出 程序写好后右键 test Project,选择 Bu…

【Unity渲染】Drawcall优化:利用GPU高效渲染大量动画角色

在游戏开发中,创建一个充满活力和真实感的游戏世界是至关重要的。Render-Crowd-Of-Animated-Characters是一个专注于高效渲染大量动画角色的项目,它通过优化技术和算法,使得在Unity中渲染动画角色群集变得更加高效和可行。 项目概述 这个项…

【C 语言】深入理解冒泡排序算法

0. 前言 冒泡排序是一种经典且基础的排序算法。它虽然在效率上并非最优,但对于初学者理解排序的基本概念和逻辑有着重要的意义。 1. 冒泡排序的基本思想 冒泡排序的基本思想是通过反复比较相邻的元素并交换它们(如果顺序错误),…

使用Chainlit接入通义千问快速实现一个多模态的对话应用

开通灵识服务 首先需要到阿里云-模型服务灵积开通账户,获得apiKey 模型服务灵积 https://dashscope.aliyun.com/ 进入控制台 ,在API-KEY管理里,创建一个新的API-KEY,然后保存起来,后面会用到。 模型服务灵积服务所有API文档地址…

USB 接口小科普

专栏文章目录传送门:返回专栏目录 Hi, 我是你们的老朋友,主要专注于嵌入式软件开发,有兴趣不要忘记点击关注【码思途远】 文章目录 目录 1. 基础概念 2. USB 接口 3. USB 传输标准 3.1 USB 传输速率 3.2 雷电技术 4 USB 总结 Hi&…

MyBatis-Plus知识总结

1. MP前瞻 官网:https://baomidou.com/ 1、MyBatis-Plus是什么:MyBatis-Plus(简称MP)是一个MyBatis的增强工具,它在MyBatis的基础上只做增强不做改变,为简化开发、提供效率而生。并且MP内部提供了丰富的 AP…

企业数据防泄密软件知多少

企业数据防泄密软件是保护企业或组织内部敏感信息不被非法泄露的重要技术工具。加密系统功能多样,通过该系统来监控、管理和保护数据,确保数据在内部网络、终端设备以及互联网上的安全传输和存储。 一、企业数据防泄密软件详解(主要功能&…

arduino程序-程序函数2(led电路及相关函数)(基础知识)

arduino程序-程序函数2(led电路及相关函数)(基础知识) 1-9 程序函数2(led电路及相关函数)点亮LED需要Blink程序PinMode(LED_BUTTIN,OUTPUT)DigitalWrite(LED_BUILTIN,HIGH)第一个参数(13/LED_BUILTIN)第二个…

QT——信号和槽学习笔记

Qt 信号和槽 信号和槽(Signals and Slots)是Qt框架中的核心机制之一,用于对象之间的通信。它们提供了一种非常灵活和类型安全的事件处理系统,允许对象之间在发生特定事件时进行交互,而不需要紧密耦合。这使得代码更易…

App尺寸:5个创新方法,提升界面吸引力

当用户打开应用程序时,应用程序图标是用户认知品牌的第一个门槛,可以直接影响用户对应用程序的第一印象。应用程序图标尺寸直接影响应用程序图标的视觉效果,这也是决定用户是否愿意下载应用程序图标的关键因素。应用程序图标尺寸规范在图标设…

SEO优化 prerender-spa-plugin工具使用 踩坑记录

安装prerender-spa-plugin yarn add prerender-spa-plugin 或 npm install prerender-spa-plugin初始配置 后面记录踩的坑 配置路由 const routes [{path: /,redirect: {path: /HomeView},},{path: /home,redirect: {path: /HomeView},},{ path: /HomeView,component: HomeV…