当前位置: 首页 > news >正文

Iceoryx2:高性能进程间通信框架(中间件)

文章目录

    • 0. 引言
    • 1. 主要改进
    • 2. Iceoryx2 的架构
    • 3. C++示例代码
      • 3.1 发布者示例(`publisher.cpp`)
      • 3.2 订阅者示例(`subscriber.cpp`)
    • 4. 机制比较
    • 5. 架构比较
    • 6. Iceoryx vs Iceoryx2
    • 参考资料

0. 引言

Iceoryx2 是一个基于 Rust 实现的开源中间件,专为实现低延迟和零拷贝进程间通信而设计。相比其前身Iceoryx,Iceoryx2 在内存安全、并发处理、模块化设计以及多平台支持上进行了优化。

提前阅读:

  • C++高性能通信:图形简述高性能中间件Iceoryx
  • C++高性能通信:了解Iceoryx与零拷贝技术的实现与应用
  • 详解高性能中间件Iceoryx在ROS2中的使用

1. 主要改进

  1. 零拷贝通信:Iceoryx2 保留了零拷贝通信的特性,通过直接在进程间传递数据引用,极大减少了数据复制,从而提升了性能并降低了延迟。

  2. Rust 语言的引入:采用 Rust 语言后,Iceoryx2 提升了内存安全和并发安全性。Rust 的所有权和借用机制有效防止了数据竞争和其他常见的并发错误。

  3. 模块化和扩展性:模块化设计允许单独替换或升级内部组件。

  4. 跨平台支持:除了在 Linux 和 Windows 上的原生支持,Iceoryx2 还计划扩展到 Android、QNX 等多个平台。

  5. 支持多种编程语言:Iceoryx2 不仅提供 C 和 C++ 的 API 绑定,还支持 Python 和其他编程语言。

2. Iceoryx2 的架构

以下是 Iceoryx2 的架构图,展示了主要应用模块、通信网关及支持的开发语言:

Supported Platforms
Iceoryx2 Vision
Android
Linux x86_64
Linux aarch64
Linux 32-bit
macOS
QNX
VxWorks
Windows
GPU
FPGA
Iceoryx2 App
Iceoryx2 App
zenoh App
DDS App
... App
ROS 2 App
ROS 2 App
ROS 2 Tooling
Autosar App
Adaptive Autosar
Iceoryx2 - Gateway
Iceoryx2
RMW Iceoryx2
C / C++ / Python / ...
Supported_Platforms

3. C++示例代码

以下是 Iceoryx2 的发布者和订阅者的示例代码:

3.1 发布者示例(publisher.cpp

#include "iox/duration.hpp"
#include "iox/slice.hpp"
#include "iox2/node.hpp"
#include "iox2/sample_mut.hpp"
#include "iox2/service_name.hpp"
#include "iox2/service_type.hpp"#include <cstdint>
#include <iostream>
#include <utility>constexpr iox::units::Duration CYCLE_TIME = iox::units::Duration::fromSeconds(1);auto main() -> int {using namespace iox2;auto node = NodeBuilder().create<ServiceType::Ipc>().expect("successful node creation");auto service = node.service_builder(ServiceName::create("Service With Dynamic Data").expect("valid service name")).publish_subscribe<iox::Slice<uint8_t>>().open_or_create().expect("successful service creation/opening");uint64_t worst_case_memory_size = 1024; // NOLINTauto publisher = service.publisher_builder().max_slice_len(worst_case_memory_size).create().expect("successful publisher creation");auto counter = 1;while (node.wait(CYCLE_TIME).has_value()) {counter += 1;auto required_memory_size = (8 + counter) % 16; // NOLINTauto sample = publisher.loan_slice_uninit(required_memory_size).expect("acquire sample");sample.write_from_fn([&](auto byte_idx) { return (byte_idx + counter) % 255; }); // NOLINTauto initialized_sample = assume_init(std::move(sample));send(std::move(initialized_sample)).expect("send successful");std::cout << "Send sample " << counter << "..." << std::endl;}std::cout << "exit" << std::endl;return 0;
}

3.2 订阅者示例(subscriber.cpp

#include "iox/duration.hpp"
#include "iox/slice.hpp"
#include "iox2/node.hpp"
#include "iox2/service_name.hpp"
#include "iox2/service_type.hpp"#include <cstdint>
#include <iostream>constexpr iox::units::Duration CYCLE_TIME = iox::units::Duration::fromSeconds(1);auto main() -> int {using namespace iox2;auto node = NodeBuilder().create<ServiceType::Ipc>().expect("successful node creation");auto service = node.service_builder(ServiceName::create("Service With Dynamic Data").expect("valid service name")).publish_subscribe<iox::Slice<uint8_t>>().open_or_create().expect("successful service creation/opening");auto subscriber = service.subscriber_builder().create().expect("successful subscriber creation");while (node.wait(CYCLE_TIME).has_value()) {auto sample = subscriber.receive().expect("receive succeeds");while (sample.has_value()) {std::cout << "received " << sample->payload().size() << " bytes: ";for (auto byte : sample->payload()) {std::cout << std::hex << byte << " ";}std::cout << std::endl;sample = subscriber.receive().expect("receive succeeds");}}std::cout << "exit" << std::endl;return 0;
}

4. 机制比较

在这里插入图片描述

5. 架构比较

在这里插入图片描述

6. Iceoryx vs Iceoryx2

特性IceoryxIceoryx2
编程语言C++Rust
是否支持真正的零拷贝数据传输
是否需要中央守护进程
消息传递模式发布-订阅发布-订阅
通知机制轮询事件
支持的平台Linux, Windows, macOS, FreeBSD, QNX, FreeRTOSLinux, Windows, macOS, FreeBSD, Android), QNX, FreeRTOS, VxWorks
语言绑定C/C++Rust/C/C++/Python/Go/C#/Lua

参考资料

Welcome to iceoryx2’s C / C++ documentation!
eclipse-iceoryx/iceoryx
eclipse-iceoryx/iceoryx2

相关文章:

Iceoryx2:高性能进程间通信框架(中间件)

文章目录 0. 引言1. 主要改进2. Iceoryx2 的架构3. C示例代码3.1 发布者示例&#xff08;publisher.cpp&#xff09;3.2 订阅者示例&#xff08;subscriber.cpp&#xff09; 4. 机制比较5. 架构比较6. Iceoryx vs Iceoryx2参考资料 0. 引言 Iceoryx2 是一个基于 Rust 实现的开…...

构 造 器

我们创建了一个对象&#xff0c;在其中定义了属性&#xff0c;new一个对象&#xff0c;然后设置对应的属性&#xff0c;但是我们可以在new对象的时候&#xff0c;同时传入我们要设置的属性&#xff0c;这个时候就需要构造器。 特点 构造方法是一个特殊的成员方法&#xff0c;…...

草莓叶片病害识别与分类数据集(猫脸码客 第234期)

草莓叶片病害识别与分类数据集 草莓作为一种重要的经济作物&#xff0c;在全球范围内广泛种植。然而&#xff0c;草莓生产过程中常常受到各种病害的困扰&#xff0c;其中叶片病害尤为严重。为了有效识别、检测和分类草莓叶片病害&#xff0c;构建一个高质量的数据集是至关重要…...

微服务设计模式 - 断路器模式 (Circuit Breaker Pattern)

微服务设计模式 - 断路器模式 (Circuit Breaker Pattern) 定义 断路器模式&#xff08;Circuit Breaker Pattern&#xff09;是云计算和微服务架构中的一种保护性设计模式&#xff0c;其目的是避免系统中的调用链出现故障时&#xff0c;导致系统瘫痪。通过断路器模式&#xff…...

HarmonyOS NEXT 应用开发实战(九、知乎日报项目详情页实现详细介绍)

在本篇博文中&#xff0c;我们将探讨如何使用 HarmonyOS Next 框架开发一个知乎日报的详情页&#xff0c;逐步介绍所用到的组件及代码实现。知乎日报是个小巧完整的小项目&#xff0c;这是一个循序渐进的过程&#xff0c;适合初学者和有一定开发经验的工程师参考。 1. 项目背景…...

lvgl 模拟器移植(V9)

1.模拟器代码下载 1.1&#xff1a;通过git 下载 github链接&#xff1a;GitHub - lvgl/lv_port_pc_visual_studio: Visual Studio projects for LVGL embedded graphics library. Recommended on Windows. Linux support with Wayland is work in progress.https://github.com…...

基于vue+neo4j 的中药方剂知识图谱可视化系统

前言 历时一周时间&#xff0c;中药大数据R02系统中药开发完毕&#xff0c;该系统通过scrapy工程获取中药数据&#xff0c;使用python pandas预处理数据生成知识图谱和其他相关数据&#xff0c;利用vuespringbootneo4jmysql 开发系统&#xff0c;具体功能请看本文介绍。 简要…...

(自用)机器学习python代码相关笔记

一些自存的机器学习函数和详细方法记录&#xff0c;欢迎指错。 前言&#xff1a;读取数据方法 import pandas as pd import pandas as pddf pd.read_csv(数据集.csv, header0) # header是从哪一行开始读起&#xff0c;一般是0&#xff0c;也可以取infer 一、数据处理&#…...

docker复现pytorch_cyclegan

1、安装docker 配置docker镜像 添加镜像源至docker engine 2、wsl2安装nvidia-docker 要在Ubuntu中安装NVIDIA Docker&#xff0c;需要满足以下条件&#xff1a; 确保主机已安装NVIDIA的CUDA驱动程序&#xff0c;并使用适用于您操作系统的正确版本。 wsl --update在Ubuntu…...

IDEA2024下安装kubernetes插件并配置进行使用

【1】安装插件 其实2024.2.3下默认已经安装了kubernetes插件&#xff0c;如果你发现自己IDEA中没有&#xff0c;在市场里面检索并下载即可。 【2】kubernetes配置 ① 前置工作 首先你要准备一个config文件和一个kubectl.exe 。 config文件类似如下&#xff1a; apiVersi…...

理解原子变量之二:从volatile到内存序-进一步的认识

目录 实例1 实例2 实例3 内存序中两个最重要的概念 补记 结论 实例1 看下面的例子&#xff1a;在vs2013中建立如下工程&#xff1a; #include <thread> #include <iostream> #include <chrono>bool done false;void worker(){std::this_thread::sle…...

DICOM标准:MR图像模块属性详解——磁共振成像(MR)在DICOM中的应用

目录 引言 磁共振成像&#xff08;MR&#xff09; 一、MR图像模块 二、MR图像属性描述 1、图像类型 (Image Type) 2、抽样每个象素 (Sampling per Pixel) 3、光度插值 (Photometric Interpretation) 4、位分配 (Bits Allocated) 结论 引言 数字成像和通信在医学&#xff08…...

Linux内核与用户空间

Linux内核与用户空间是Linux操作系统中的两个重要概念&#xff0c;它们各自承担着不同的功能和职责&#xff0c;并通过特定的机制进行交互。以下是对Linux内核与用户空间的详细解释&#xff1a; 一、Linux内核 定义&#xff1a;Linux内核是Linux操作系统的核心组件&#xff0c…...

计算机网络-以太网小结

前导码与帧开始分界符有什么区别? 前导码--解决帧同步/时钟同步问题 帧开始分界符-解决帧对界问题 集线器 集线器通过双绞线连接终端, 学校机房的里面就有集线器 这种方式仍然属于共享式以太网, 传播方式依然是广播 网桥: 工作特点: 1.如果转发表中存在数据接收方的端口信息…...

找树根和孩子c++

题目描述 给定一棵树&#xff0c;输出树的根root&#xff0c;孩子最多的结点max以及他的孩子 输入 第一行&#xff1a;n&#xff08;0<结点数<100&#xff09;&#xff0c;m&#xff08;0<边数<200&#xff09;。 以下m行&#xff1b;每行两个结点x和y&#xf…...

植物源UDP-糖基转移酶及其分子改造-文献精读75

植物源UDP-糖基转移酶及其分子改造 摘要 糖基化能够增加化合物的结构多样性,有效改善水溶性、药理活性和生物利用度,对植物天然产物的药物开发至关重要。UDP-糖基转移酶(UGTs)能够催化糖基从活化的核苷酸糖供体转移到受体形成糖苷键,植物中天然产物的糖基化修饰主要通过UGTs实…...

Redis中String 的底层实现是什么?

Redis中String 的底层实现是什么&#xff1f; Redis 是基于 C 语言编写的&#xff0c;但 Redis 的 String 类型的底层实现并不是 C 语言中的字符串&#xff08;即以空字符 \0 结尾的字符数组&#xff09;&#xff0c;而是自己编写了 SDS&#xff08;Simple Dynamic String&…...

像mysql一样查询es

先简单介绍一下这个sql查询&#xff0c;因为社区一直反馈这个Query DSL 实在是太难用了。大家可以感受一下下面这个es的查询。 GET /my_index/_search { “query”: { “bool”: { “must”: [ { “match”: { “title”: “search” } }, { “bool”: { “should”: [ { “te…...

SpringBoot中@Validated或@Valid注解校验的使用

文章目录 SpringBoot中Validated或Valid注解校验的使用1. 添加依赖2. 使用示例准备2-1 测试示例用到的类2-2 实体Dto&#xff0c;加入校验注解2-2 Controller 3. 示例测试4. Valid 和 Validated注解详解4-1 常用规则注解4-2 分组验证4-2-1 示例准备4-2-2 Controller接口4-2-3 P…...

HashMap为什么线程不安全?

一、Put操作&#xff08;数据覆盖&#xff09; HashMap底层是基于数组 链表&#xff08;在 Java 8 以后&#xff0c;当链表长度超过一定阈值时会转换为红黑树&#xff09;的数据结构。在多线程环境下&#xff0c;当多个线程同时对HashMap进行put操作时&#xff0c;可下面这种…...

用Logisim搞定Educoder交通灯实训:从数码管驱动到状态机集成的保姆级避坑指南

用Logisim征服Educoder交通灯实训&#xff1a;从零搭建到联调的全链路实战手册 第一次打开Educoder平台的交通灯实训项目时&#xff0c;我盯着那些闪烁的数码管和错综复杂的线路图&#xff0c;感觉像在破解某种外星密码。三小时后&#xff0c;当我的第一个状态机模块终于通过测…...

【ZYNQ】AXI4总线协议实战:从握手时序到PS-PL高效通信

1. AXI4总线协议基础&#xff1a;从握手信号到通道架构 第一次接触ZYNQ的PS-PL通信时&#xff0c;我被AXI4协议里那些VALID/READY信号搞得头晕眼花。直到在示波器上抓到真实的握手波形&#xff0c;才突然理解这个看似复杂的协议其实像极了我们日常的对话机制——只有当说话方准…...

西门子PLC通信必备:手把手教你用SCL编写Modbus RTU CRC校验功能块

西门子PLC通信实战&#xff1a;SCL实现Modbus RTU CRC校验的工程化解决方案 在工业自动化领域&#xff0c;可靠的数据通信如同设备的神经系统。当两台PLC需要通过RS485接口交换温度传感器读数时&#xff0c;Modbus RTU协议因其简洁高效成为首选。但许多工程师在调试阶段都会遇到…...

如何通过Jellyfin Android TV客户端打造家庭影院级媒体体验?

如何通过Jellyfin Android TV客户端打造家庭影院级媒体体验&#xff1f; 【免费下载链接】jellyfin-androidtv Android TV Client for Jellyfin 项目地址: https://gitcode.com/gh_mirrors/je/jellyfin-androidtv 想要在智能电视上享受专业的媒体管理体验吗&#xff1f;…...

Boss直聘职位数据自动化采集:Python爬虫架构设计与工程实践

1. 项目概述与核心价值最近在技术社区里&#xff0c;看到不少朋友在讨论一个叫longsizhuo/BossZhiPin_Job_Search的项目。光看名字&#xff0c;你大概就能猜到&#xff0c;这是一个跟“Boss直聘”和“职位搜索”相关的自动化工具。作为一个在招聘数据分析和自动化领域摸爬滚打了…...

UEFITool终极指南:轻松解析和编辑UEFI固件的开源利器

UEFITool终极指南&#xff1a;轻松解析和编辑UEFI固件的开源利器 【免费下载链接】UEFITool UEFI firmware image viewer and editor 项目地址: https://gitcode.com/gh_mirrors/ue/UEFITool 你是否曾好奇计算机启动时底层发生了什么&#xff1f;想要深入了解UEFI固件的…...

Kubernetes原生自动化部署工具Keel:实现容器镜像自动更新的最后一公里

1. 项目概述&#xff1a;什么是Keel&#xff0c;以及它解决了什么问题如果你和我一样&#xff0c;在团队里负责过一段时间的应用部署和更新&#xff0c;那你一定对“发布日”的紧张感深有体会。开发那边代码一提交&#xff0c;这边就得开始手动拉取镜像、更新Kubernetes的Deplo…...

基于RAG的智能知识库问答系统:从原理到部署实战

1. 项目概述&#xff1a;当AI大模型遇见知识库&#xff0c;一个开源的智能问答解决方案 最近在折腾一个很有意思的开源项目&#xff0c;叫 zhimaAi/chatwiki 。光看名字&#xff0c;你大概能猜到它的核心&#xff1a; chat 代表对话&#xff0c; wiki 代表知识库。没错&a…...

告别命令行恐惧:用Docker Compose一键部署EMQX集群(附Web控制台和端口映射配置)

告别命令行恐惧&#xff1a;用Docker Compose一键部署EMQX集群&#xff08;附Web控制台和端口映射配置&#xff09; 在物联网和分布式系统开发中&#xff0c;EMQX作为高性能的MQTT消息服务器&#xff0c;已经成为连接海量设备与后端服务的核心枢纽。然而&#xff0c;传统安装方…...

从理论到实践:三维形状上下文(3DSC)如何构建鲁棒的点云局部描述符

1. 为什么我们需要三维形状上下文(3DSC) 想象一下你正在玩一个拼图游戏&#xff0c;但所有碎片都被随机撒上了胡椒粉&#xff0c;有些碎片还被书本盖住了一角。这就是计算机处理含噪声、遮挡的点云数据时的真实处境。在机器人导航、自动驾驶或者工业质检中&#xff0c;我们经常…...