当前位置: 首页 > 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

http://www.lryc.cn/news/475512.html

相关文章:

  • 构 造 器
  • 草莓叶片病害识别与分类数据集(猫脸码客 第234期)
  • 微服务设计模式 - 断路器模式 (Circuit Breaker Pattern)
  • HarmonyOS NEXT 应用开发实战(九、知乎日报项目详情页实现详细介绍)
  • lvgl 模拟器移植(V9)
  • 基于vue+neo4j 的中药方剂知识图谱可视化系统
  • (自用)机器学习python代码相关笔记
  • docker复现pytorch_cyclegan
  • IDEA2024下安装kubernetes插件并配置进行使用
  • 理解原子变量之二:从volatile到内存序-进一步的认识
  • DICOM标准:MR图像模块属性详解——磁共振成像(MR)在DICOM中的应用
  • Linux内核与用户空间
  • 计算机网络-以太网小结
  • 找树根和孩子c++
  • 植物源UDP-糖基转移酶及其分子改造-文献精读75
  • Redis中String 的底层实现是什么?
  • 像mysql一样查询es
  • SpringBoot中@Validated或@Valid注解校验的使用
  • HashMap为什么线程不安全?
  • 类加载器及反射
  • aws boto3 下载文件
  • 3DDFA-V3——基于人脸分割几何信息指导下的三维人脸重建
  • 求串长(不使用任何字符串库函数)
  • 第02章 MySQL环境搭建
  • linux系统编程 man查看manual.stat
  • 从网络到缓存:在Android中高效管理图片加载
  • 【数据结构】链表详解:数据节点的链接原理
  • 使用AWS Redshift从AWS MSK中读取数据
  • 从0开始学统计-数据类别与测量层次
  • 使用AIM对SAP PO核心指标的自动化巡检监控