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指针信息,

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐