iceoryx(冰羚)-简介

概要

RouDi

在这里插入图片描述

RouDi是Routing and Discovery的缩写。RouDi负责通信设置,但实际上并不参与发布者与订阅者或客户端与服务器之间的通信。鲁迪可以被认为是iceoryx的总机操作员。它的另一个主要任务是设置共享内存,应用程序使用共享内存交换有效负载数据。RouDi有时被称为守护进程,它管理共享内存并负责服务发现,即使订阅者/客户端能够找到发布者/服务器提供的主题。它还跟踪所有已初始化运行时的应用程序,从而能够创建发布者、订阅者、服务器或客户端。它为应用程序查询此信息提供了便利。
当应用程序崩溃时,RouDi会清理所有资源。由于我们的进程间机制大多是无锁的(只有最后一个锁;我们正在努力删除它),与使用锁定的传统机制相比,基于iceoryx的通信要可靠得多。

共享内存

为了实现零拷贝进程间通信,iceoryx使用共享内存方法,即发布者和订阅者或客户端和服务器可以通过共享内存进行通信,从而实现零拷贝通信。
共享内存是指多个进程可以通过映射到其虚拟地址空间中的内存区域来访问的物理内存。
有关更多信息,请参阅我们的共享内存概念文章。

Runtime

每个想要使用iceoryx的应用程序都必须实例化其运行时,这基本上实现了与RouDi的通信。
为此,需要以下代码行
iox::runtime::PoshRuntime::initRuntime(“some_unique_application_name”);

runtime是用户应用程序中的一个对象,它将共享内存映射到用户应用程序的地址空间中。
(注意)每个用户应用程序只允许有一个运行时对象。

Creating service descriptions for topics

iceoryx中的ServiceDescription表示一个主题,发布者和订阅者或客户端和服务器可以在该主题下交换数据,并由三个字符串标识符唯一标识。
1.Group name
2.Instance name
3.Topic name
由这样的字符串组成的三元组称为ServiceDescription。如果这三个字符串在元素上都相等,即组、实例和主题名称都相同,则两个ServiceDescriptions被视为匹配。这意味着可以忽略组和实例标识符来创建不同的ServiceDescriptions。它们将在未来用于高级过滤功能。
iceoryx的服务模型是从AUTOSAR派生的,并且仍然在API中使用这些名称(service、Instance、Event)。所谓的规范协议是在名称空间capo中实现的。
下表概述了不同的术语和当前映射:

服务与实例相关,就像类与C++中的对象相关一样。服务描述一个抽象主题,实例是该抽象的一个实例化,就像对象是一个实例化的类一样。事件在这种上下文中类似于类的成员。
Example:
class MyRadarService {
public:
bool hasObstacleDetected;
float distanceToObstacle;
};

MyRadarService frontLeftRadarInstance;
std::cout << frontLeftRadarInstance.hasObstacleDetected << std::endl;

例如,在iceoryx世界中,我们会订阅该服务(“MyRadarService”、“frontLeftRadarInstance”、“hasObstructureDetected”),并在检测到障碍物时接收样本。或者,我们会订阅distance ToObstruct,并收到一个恒定的数据流,显示到障碍物的距离。

限制

传输数据的数据类型可以是任何C++类、结构或纯旧数据类型,只要满足以下条件:
1.没有使用堆
2.数据结构完全包含在共享内存中——没有指向进程本地内存的指针,没有指向进程局部结构的引用,也没有动态分配器
3.数据结构必须是可重定位的,因此不能在内部使用指针/引用
4.没有虚拟成员函数

Publisher

发布者与主题相关,需要构建服务描述。如果它是类型化的,则需要额外指定数据类型作为模板参数。否则,发布者只知道原始内存,用户必须确保它被正确解释。
一旦提供了主题,就可以发布(发送)特定类型的数据。请注意,默认情况下,同一主题有多个发布者(n:m通信)。可以使用编译时选项将iceoryx限制为1:n通信。如果使用1:n通信,RouDi会检查同一主题的多个发布者,如果一个主题有多个发布器,则会引发错误。

Subscriber

对称地,订阅者也对应于主题,因此需要构建服务描述。至于出版商,我们区分打字订户和非打字订户。
一旦订阅者订阅了某个主题,它就能够接收与该主题相关的类型的数据。在非类型化的情况下,这是原始内存,用户必须注意以与实际发送的数据兼容的方式对其进行解释。
当多个发布者提供了相同的主题时,订阅者将接收所有发布者的数据(但不同发布者之间的顺序不确定)。请注意,订阅者不会从服务器或客户端接收数据,即使它们使用相同的主题。

client

与发布者和订阅者类似,客户端与主题相关,需要构建服务描述。如果客户端是类型化的,则需要将请求和响应数据类型指定为模板参数。在非类型化的情况下,客户端只知道原始内存,用户必须注意其正确解释。
一旦客户端连接到服务器,它就可以向服务器发送请求并从服务器接收响应。序列ID用于将响应与特定请求相匹配。它必须在用户请求时设置,并在用户响应时检查。

Server

与客户端一样,服务器需要构建服务描述,并且可以是类型化的或非类型化的。在类型化的情况下,用户必须提供请求和响应数据类型作为模板参数。否则,服务器处理原始内存,用户必须确保对其进行正确解释。
一旦连接,服务器就可以接收来自客户端的请求并发送相应的响应。

避免轮询

接收数据的最简单方法是定期轮询数据是否可用,如下图左侧所示,用于发布-订阅消息模式。这对于简单的用例来说已经足够了,但通常效率低下,因为它通常会导致不必要的延迟和在没有数据的情况下唤醒。接收数据的另一种方法是等待用户定义的事件发生。这是由我们的WaitSet和Listener提供的,它们将在以下部分中介绍。
在这里插入图片描述

WaitSet

WaitSet可以用来放弃控制,方法是让线程在非繁忙等待时进入睡眠状态,并等待用户定义的事件发生。通常,这些事件对应于特定订阅者或客户端的数据可用性。这样,我们可以在数据可用时立即醒来,并在没有数据可用时避免不必要的醒来。
一个典型的用例是创建一个WaitSet,连接多个订阅者和/或客户端以及用户触发器,然后等待一个或多个连接的对象发出事件信号。如果发生这种情况,则会收到一个名为notificationVector的所有已发生事件的列表。这使得当它向WaitSet发出新数据或新响应可用的信号时,可以直接从订户或客户端收集数据。
WaitSet使用reactor模式,并通过推送策略通知用户发生了一个附加事件。
有关如何使用WaitSet的更多信息,请参阅我们的WaitSet示例。

Listener

侦听器可用于将自定义回调连接到用户定义的事件。与WaitSet不同,它通过在后台线程中执行连接的自定义回调来对这些事件做出反应,该回调将由Listener创建。与WaitSet一样,后台线程在接收新数据时等待非繁忙状态。
一个用例可能是创建一个Listener并附加多个订阅者。每次有新的数据可用时,都会执行相应的连接回调,例如将某些内容打印到控制台或计算算法。另一个用例可能是,服务器连接到侦听器,每次接收到请求时,都会执行创建并发送响应的连接回调。
与WaitSet一样,Listener使用reactor模式。
有关Listener的更多信息,请参阅我们的回调示例。

API

API有两种语言,C++和C。详细信息可以在C++示例和C示例中找到。
C++API的许多部分都遵循函数式编程方法,这种方法的错误较少。这需要使用此处介绍的一元类型cxx::expected和cxx::optional。
使用C++API,我们可以区分类型化的API和非类型化的API。在类型化的API中,底层数据类型通过对某些数据类型T(通常是模板参数)的类型化指针或引用而变得明显。这允许以C++惯用和类型安全的方式处理数据,并且应该尽可能首选。类型化的API主要用于iceoryx独立使用时,即未集成到第三方框架中。
非类型化的API提供了指向数据的不透明(即无效)指针,这是灵活有效的,但也要求用户注意正确解释接收到的数据,即与实际发送的数据兼容的类型。这是与其他较低级别API交互和集成到第三方框架(如ROS)中所必需的。有关更多信息,请参阅相应的头文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/152254.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

操作系统(五)文件系统和I/O系统

文章目录 前言文件系统文件系统和文件文件描述符目录、文件别名和文件系统分层文件系统目录实现文件别名名字解析&#xff08;路径遍历&#xff09;文件系统挂载文件系统种类 虚拟文件系统文件缓存和打开文件打开文件 文件分配空闲空间管理和冗余磁盘阵列RAID空闲空间管理冗余磁…

JJJ:python学习笔记

p4 没有编译的过程 源码和输入得到输出 静态语言&#xff1a;编译型 脚本语言&#xff1a;解释型 p5 又叫做胶水语言 p7 p8 p10

RHCE8 资料整理(六)

RHCE8 资料整理 第 6 篇 软件管理第 23 章 用rpm管理软件23.1 rpm查询23.2 rpm卸载23.3 软件包升级23.4 rpm验证 第 24 章 用yum/dnf管理软件包24.1 yum架构介绍24.2 用光盘搭建yum源24.3 创建私有仓库24.4 yum客户端配置24.5 yum基本使用24.5.1 查询24.5.2 安装与卸载24.5.3 下…

Navicat Premium 16,无限重置试用14天

打开注册表编辑器 红箭头所指方向每个系统判别不一样 如何判别呢&#xff1f;一个个点开看底下是不是info&#xff0c;如果是那么把info文件夹删掉就可以了。

SecureCRT 9.4.2 for Mac

SecureCRT是一款由VanDyke Software公司开发的终端仿真软件&#xff0c;它提供了类似于Telnet和SSH等协议的远程访问功能。SecureCRT专门为网络管理员、系统管理员和其他需要保密访问网络设备的用户设计。 SecureCRT具有以下特点&#xff1a; 安全性&#xff1a;SecureCRT支持…

OpenHarmony应用开发入门教程(一、开篇)

前言 华为正式宣布2024年发布的华为鸿蒙OS Next版将不再兼容安卓系统。这一重大改变&#xff0c;预示着华为鸿蒙OS即将进入一个全新的阶段。 都说科技无国界&#xff0c;这是骗人的鬼话。谷歌的安卓12.0系统早已发布&#xff0c;但是自从受到美影响&#xff0c;谷歌就拒绝再向…

FPGA模块——IIC协议(FPGA做主机操作24C64)

FPGA模块——IIC协议&#xff08;FPGA做主机操作24C64&#xff09; EEPROM&#xff08;24C64&#xff09;向器件写数据时序向器件读数据时序 IIC协议FPGA主机代码IIC驱动 EEPROM&#xff08;24C64&#xff09; 掉电不丢失&#xff0c;采用固定的读写协议。数据的稳定性和可重复…

vite动态配置svg图标及其他方式集合

文章目录 前言使用vite-plugin-svg-icons动态配置安装插件引入图标下载新建组件svg-icon.vue使用 使用vue组件动态配置总结如有启发&#xff0c;可点赞收藏哟~ 前言 在配置化的情况下&#xff0c;图标配置也显得极为重要的 使用vite-plugin-svg-icons动态配置 参考vite-plugin…

入职算法工程师后敲的非常有趣使用的小工具

NOTE&#xff1a;代码仅用来参考&#xff0c;没时间解释啦&#xff01; &#x1f349;一、自动从数据库从抽取数据。 在某台服务器中&#xff0c;从存放数据集的数据库自动抽取标注好的数据标签&#xff0c;这一步操作有什么用呢&#xff1f;当我们发现我们数据不均衡的时候&a…

【Linux】vscode远程连接ubuntu失败

VSCode远程连接ubuntu服务器 这部分网上有很多&#xff0c;都烂大街了&#xff0c;自己搜吧。给个参考连接&#xff1a;VSCode远程连接ubuntu服务器 注意&#xff0c;这里我提前设置了免密登录。至于怎么设置远程免密登录&#xff0c;可以看其它帖子&#xff0c;比如这个。 …

FastAdmin表格顶部增加toolbar按钮

效果入下图&#xff0c;在表格顶部增加一个自定义按钮&#xff0c;点击确认后请求服务器接口 表格对应的index.html中 <div class"panel-body"><div id"myTabContent" class"tab-content"><div class"tab-pane fade active …

JVM GC 调优命令看这一篇就够了

JVM GC 调优命令看这一篇就够了 2023-11-11 23:27IT果果日记 jstat 可用于统计内存分配速率、GC次数&#xff0c;GC耗时 jstat常用命令格式 jstat -gc <pid> <统计间隔时间> <统计次数> 例如&#xff1a;jstat -gc 6 1000 10 &#xff0c;统计pid6的进…

【设计一个缓存--针对各种类型的缓存】

设计一个缓存--针对各种类型的缓存 1. 设计顶层接口2. 设计抽象类 -- AbstractCacheManager3. 具体子类3.1 -- AlertRuleItemExpCacheManager3.2 -- AlertRuleItemSrcCacheManager 4. 类图关系 1. 设计顶层接口 // 定义为一个泛型接口,提供给抽象类使用 public interface Cach…

技术管理责任制度《三》

为了加强新时期科技档案的保密工作&#xff0c;确保档案在保管、利用、复制、销毁过程中的保密工作&#xff0c;特规定如下&#xff1a; 彩虹图纸管理软件_图纸管理系统_图纸文档管理软件系统_彩虹EDM【官网】 1、档案员要认真学习和严格执行国家有关安全、保密制度规定&#…

【java学习—十四】反射获取类的父类、接口、构造方法、方法(3)

文章目录 1. 通过反射获取一个类的父类和接口2. 反射获取一个类的构造方法3. 反射获取全部构造器4. 通过反射创建一个对象5. 反射机制获取类的方法 1. 通过反射获取一个类的父类和接口 使用反射可以取得&#xff1a; 实现的全部接口 public Class<?>[] getInterfaces(…

【小黑嵌入式系统第二课】嵌入式系统的概述(二)——外围设备、处理器、ARM、操作系统

上一课&#xff1a; 【小黑嵌入式系统第一课】嵌入式系统的概述&#xff08;一&#xff09;——概念、特点、发展、应用 下一课&#xff1a; 【小黑嵌入式系统第三课】嵌入式系统硬件平台&#xff08;一&#xff09;——概述、总线、存储设备&#xff08;RAM&ROM&FLASH…

优思学院|新版ISO9001:2015质量体系的优势(一)高阶结构

在全球商业环境中&#xff0c;不断提高产品和服务的质量至关重要。因此&#xff0c;国际标准组织&#xff08;ISO&#xff09;于2015年发布了更新的ISO 9001标准&#xff0c;即ISO 9001:2015质量体系标准。这一更新旨在适应不断变化的商业需求和挑战&#xff0c;为组织提供更强…

母婴行业数字化发展趋势:内容多元化、服务定制化、人群全覆盖

母婴行业数字化发展趋势&#xff1a;内容多元化、服务定制化、人群全覆盖 引言&#xff1a;时代的高速发展&#xff0c;在经济压力、生活节奏、婚育观念等多重因素的影响下&#xff0c;我国人口出生率自2016年&#xff08;人口出生数量统计1883万&#xff09;到2022年&#xf…

nn.Embedding()的原理

nn.Embedding()的原理&#xff1a; 定义一个Embedding&#xff1a; embeddings nn.Embedding(num_embeddings10, embedding_dim3)vocab_size : 10 输出维度为&#xff1a; 3 假定输入inputs如下&#xff1a; inputs torch.tensor([[1,3,6, 8],[9,1,3,5] ],dtypetorch.lo…

zabbix基本介绍 安装部署 页面访问

这里写目录标题 一、zabbix 监控1、zabbix 监控架构2、zabbix 监控报警渠道3、Zabbix 优点4、Zabbix 缺点5、Zabbix 监控系统监控对象6、Zabbix监控方式7、zabbix 架构1、Server2、数据库存储3、Web界面4、Proxy 代理服务器5、Agent监控代理6、数据流 8、Zabbix常用术语的含义1…