iceoryx--iceoryx整体分析

iceoryx是一种专注于降低延迟、提高通信速度的IT技术,其核心是iox_roudi中心节点,实现高效的数据交换。优点包括低时延(<1us),CPU占用低,但存在中心节点依赖和数据类型的限制。
摘要由CSDN通过智能技术生成

1:整体架构分析

iceoryx是基于共享内存实现通信的中间件,主要目的在于降低通信延迟、增加通信速度、减低目标设备CPU,据官方介绍,iceoryx的通信延迟在1us以内,并且不会随着payload的增加而增加。

1.1 实现原理

   iceoryx的通信实现主要依靠于其中心节点,iox_roudi,其主要工作如下:manager shared memory和payload shared memory的创建与分配、进程的注册与监控,内存资源的管理与调度,服务发现与更新,通信信息的输出(publisher与subscriber信息输出,应用程序吞吐量输出、通信进程信息输出),任何一个通信进程的创建需要向中心节点注册,分配对应的应用程序资源。对于整个通信来说,主要包括三个组件:publishser, subscriber和listener

  • Publisher:iceoryx的通信服务的识别主要通过topic,topic主要包含有service、instance和event,三者共同确定一个topic服务,他们的类型都是字符串;在创建publisher的时候,需要指定topic;创建publisher的进程将publish对应的信息发送到iox_roudi,iox_roudi根据接收的信息进行检测并创建具有唯一表示的发送端数据接收PublisherPortData,同时iox_roudi根据该topic的订阅情况进行publisher和subscriber了解,然后返回PublisherPortData数据对应的共享内存的偏移量给客户端,应用根据这个结构体进行服务操作和发送信息,如:offerSerivce和stopService。
  • Subscriber:类似于publisher,subscriber的创建也需要指定topic,这样才能订阅相应的数据信息;当进程创建subscriber时,创建进程会向iox_roudi发送对应的创建信息,iox_roudi根据接收的信息创建具有唯一标识的

    SubscriberPortData结构体,同时根据publisher信息,进行两者关联;

  • Listener:Listener主要服务于subscriber,用于事件驱动式的通知应用程序订阅消息的到来,其创建的时候,应用程序会向iox_roudi发送创建条件变量消息,iox_roudi分配条件变量并返回条件变量结构体的内存偏移量,listener拿到条件变量之后,将条件变量指定给所有attachevent的subscriber中的ChunkReceiverData_t结构体,当publisher发送消息的时候就会触发该条件变量,通知Listener,

整体的结构体如下图所示:

publisher的发送结构体中保存所有订阅者的数据接收队列地址,当publisher发送对应的数据时,publisher会先将存有数据的chunk存放到subscriber的ChunkReceiverData_t中,然后触发响应的条件变量,通知对应的listener接收消息,实现数据传输;根据官方的接收,其通信流程大体如下图:

1.2 优点

  • 通信时延短,官方测试是小于1us以内,由于我这边是在qnx上测试的,时间精度没有那么高,测试接收是<1ms
  • 通信的时延不会随着payload数据的增加而增加,相对稳定
  • 整个进程通信的CPU非常低,20ms的数据正常进程通信CPU是0.03%
  • 使用比较简单,能够方便快速的集成

1.3 缺点

  • 有中心节点存在,用于维护节点之间的通信,如果中心节点奔溃,则通信无法完成
  • 通信的数据类型是连续的数据结构,其中不能含有任何的进程的heap指针信息,

下面是一个iceoryx发布订阅的C代码示例,其中一个发布者发布一个消息,而两个订阅者订阅这个消息: ```c #include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include "iceoryx_posh/popo/subscriber.hpp" #include "iceoryx_posh/popo/publisher.hpp" #include "iceoryx_posh/runtime/posh_runtime.hpp" #include "iceoryx_posh/roudi/introspection_types.hpp" int main() { // 初始化iceoryx runtime iox::runtime::PoshRuntime::initRuntime("publisher"); // 创建发布者和订阅者 iox::popo::Publisher publisher({"Radar", "FrontLeft", "Object"}); iox::popo::Subscriber subscriber1({"Radar", "FrontLeft", "Object"}); iox::popo::Subscriber subscriber2({"Radar", "FrontLeft", "Object"}); // 订阅者1等待消息 subscriber1.subscribe(); printf("Subscriber 1 waiting for messages...\n"); // 订阅者2等待消息 subscriber2.subscribe(); printf("Subscriber 2 waiting for messages...\n"); // 发布者发布消息 printf("Publisher publishing message...\n"); publisher.publish("Hello, world!"); // 等待订阅者接收消息 while (true) { if (subscriber1.hasData()) { printf("Subscriber 1 received message: %s\n", subscriber1.getChunk()->userPayload()); break; } if (subscriber2.hasData()) { printf("Subscriber 2 received message: %s\n", subscriber2.getChunk()->userPayload()); break; } } // 清理资源并退出 iox::runtime::PoshRuntime::shutdownRuntime(); return 0; } ``` 需要注意的是,这个示例代码需要使用iceoryx库,需要将iceoryx库链接到您的项目中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值