FastDDS之DataSharing
目录
- 原理说明
- 限制条件
- 配置
- Data-Sharing delivery kind
- Data-sharing domain identifiers
- 最大domain identifiers数量
- 共享内存目录
- DataReader和DataWriter的history耦合
- DataAck
- 阻塞复用
本文详细记录Fast DDS中Data Sharing的实现原理和代码分析。
DataSharing的概念:FastDDS中在同一台机器内通过利用共享内存共享DataWriter和DataReader的history实现通信加速,这种方式避免了传输层中的任何开销,有效减少了数据在DataWriter和DataReader之间复制所带来的额外负担。
Fast DDS 使用DomainParticipant的 GuidPrefix_t
来识别运行在同一主机上的其他participant。如果两个participant的 GuidPrefix_t
的前四个字节相同,则认为它们运行在同一主机上。提供了 is_on_same_host_as()
API 来检查这一条件。
使用Data-sharing并不能阻止数据在应用层和DataWriter或DataReader之间的拷贝,要避免这种形式需要使用zero-copy通信方式(TODO:)
尽管Data Sharing使用了共享内存,但是与共享内存不同的是,共享内存是一种完全符合传输规范的方式,这意味着使用共享内存传输时,被传输的数据必须从DataWriter history 拷贝到传输层再从传输层拷贝到DataReader中。使用Data-Sharing可以避免这类拷贝操作。
原理说明
当DataWriter创建后,Fast DDS会预先分配一个位于共享内存映射文件,大小为 max_samples+extra_samples大小的样本数的pool,当publish数据时,DataWriter从这个pool中取出一个sample并将其添加到它的history中,并通知DataReader哪个pool中的sample包含了新数据。然后DataReader访问相同的共享内存映射文件,就可以拿到由DataWriter发布的数据了。
限制条件
只有当以下条件满足时该特性才可以使用:
- DataWriter和DataReader可以访问相同的共享内存
- Topic有一个有界限的 TopicDataType(也就是说该数据类型有一个固定的大小限制),其成员函数 is_bounded() 返回 true
- Topic没有keyed
- DataWriter 使用
PREALLOCATED_MEMORY_MODE
或PREALLOCATED_WITH_REALLOC_MEMORY_MODE
.
还有一个限制,对于DataReader的HistoryQos。使用Data-sharing机制,DataWriter的history被共享给DataReaders,这意味着DataReaders上有效的HistoryQos的depth最多等于DataWriter的HistoryQos的depth。为避免混淆,将DataReaders的 history depth设置为小于等于DataWriter的 history depth。
配置
使用 DataSharingQosPolicy 配置DataWriter和DataReader。配置内容有四种:
Data-Sharing delivery kind
有三种模式
- AUTO:默认值,如果DataWriter 和 DataReader符合上述的限制条件,data-sharing的传输机制会生效
- ON:类似AUTO,但是如果条件不满足,entity的创建就会失败
- OFF:不会启用Data-sharing
DataWriter和DataReader的兼容性:
《TODO https://fast-dds.docs.eprosima.com/en/latest/fastdds/transport/datasharing.html 6.5.3.1 图片》
Data-sharing domain identifiers
每个entity定义了一组identifiers用于标识它所属的domain(TODO:一组?)。只有当两个entity至少有一个共同的domain时它们之间才能够使用Data-sharing。
用户通过DataSharingQosPolicy来定义DataWriter或DataReader的domain。如果没有提供domain的identifiers,系统会自动创建一个,这种自动的data-sharing domain对于entity运行所在的机器将是唯一的。也就是说,所有在同一台机器上运行的entities,且用户没有配置特定用户的domains的情况下,都能够使用data-sharing传输(前提是满足其余的要求)。
在服务发现阶段,entities之间会交换它们的domain identifiers,并检查它们是否能够使用data-sharing来进行通信。
尽管data-sharing domain identifiers是一个64位的整数,但是用户自定义的identifiers被限制为16位的整数。这意味着系统内部可能处理更大的64位整数作为domain identifiers,然而用户在配置或指定domain identifiers时只能使用较小范围的16位整数。这样的设计可能是为了简化用户接口,同时也确保了domain identifiers的一致性和兼容性。
最大domain identifiers数量
在发现过程中,从远程实体预期接收到的域标识符的最大数量。如果远程实体定义(并发送)的域标识符数量超过了这个数值,那么发现过程将会失败。
默认情况下,标识符的数量是没有限制的。可以通过 max_domains() 函数来改变这个默认值。定义一个有限的数量允许在实体创建时预分配接收标识符列表所需的内存,从而避免之后的动态内存分配。需要注意的是,数值0意味着没有限制。
共享内存目录
如果指定了用户定义的目录用于共享内存文件,那么这个目录将被用来存储用于数据共享传输的共享内存映射文件。如果没有指定,则会使用当前系统配置的默认目录。
配置用户定义的目录在某些场景下可能是有用的:
- 选择一个启用了 Huge TLB(透明的大页)的文件系统来存放记忆映射文件。
- 允许挂载了相同容器的容器之间进行数据共享传输。
DataReader和DataWriter的history耦合
普通的transport传输,DataReader和DataWriter保持独立的history,每个都有自己的sample的拷贝。一旦sample通过传输被DataReader接收,DataWriter就可以自由地从其history中删除sample,而不影响DataReader。
使用data-sharing方式,DataReader直接访问由DataWriter创建的数据实例,这意味着DataReader和DataWriter的history中的samples都指向共享内存的同一对象。因此DataWriter和DataReader的history之间存在着很强的耦合。
这也意味着一种情况:如果DataWriter复用一个旧的sample发布新的数据,而不是创建一个新的sample,那么这个被更新的sample在共享内存中的内容旧变成了新的数据,DataReader就无法获取这个sample的原始数据,因为已经被覆盖了。
DataWriter如果从其history中移除一个sample,只要它没有被复用,那么DataReader仍然能够访问到这些旧的数据,但如果DataWriter使用同一sample发布了新数据,则旧数据会被新数据所替代,DataReader也就无法再访问到原先的数据了。
DataAck
使用data-sharing传输,sample 的ack在应用程序的DataReader第一次接收到sample时开始(通过 DataReader::read_next_sample()
, DataReader::take_next_sample()
,或其他方式)。一旦数据被应用程序接收,DataWriter就可以自由使用sample发布新的数据,DataReader会探测到当一个sample被重复使用时自动从它的history中移除。这也意味着如果尝试连续访问DataReader的相同的sample或许没有sample返回。
阻塞复用
使用KEEP_LAST_HISTORY_QOS
或者 BEST_EFFORT_RELIABILITY_QOS
配置,DataWriter会从它的history中移除samples并添加新的,即使是没有收到DataReader的ack。有一种情况:如果发送的频率大于接收处理的频率,这会导致在每个smaple被处理前被重复使用。
为了避免这种情况,位于预先分配的pool中的samples不会被复用,除非它们收到了ack,比如它们至少被应用程序处理过一次。如果在pool中没有可复用的sample,DataWriter端的writer操作会被阻塞指导有一个可复用的,或max_blocking_time
到达。
这种行为不会影响DataWriter的history。samples仍然会按照规则从history中删除,唯一受影响的是pool中samples的服用哦个。这意味着即使DataWrtier的history为空,但如果pool中的所有samples都没有被确认接收,writer操作仍然可能是被阻塞的。
可用通过使用extra_samples
来减少DataWriter在writer操作时被阻塞的可能性,这会使pool的分配的大小比history的大小多更多samples,从而使DataWriter有更多的机会获取free sample,同时DataReader仍然可以访问那些已经被从DataWriter的history中删除的sample。
相关文章:
FastDDS之DataSharing
目录 原理说明限制条件配置Data-Sharing delivery kindData-sharing domain identifiers最大domain identifiers数量共享内存目录 DataReader和DataWriter的history耦合DataAck阻塞复用 本文详细记录Fast DDS中Data Sharing的实现原理和代码分析。 DataSharing的概念࿱…...
计算机网络在线测试-概述
单项选择题 第1题 数据通信中,数据传输速率(比特率,bps)是指每秒钟发送的()。 二进制位数 (我的答案) 符号数 字节数 码元数 第2题 一座大楼内的一个计算机网络系统…...
【MySQL】数据库必考知识点:查询操作全面详解与深度解剖
前言:本节内容讲述基本查询, 基本查询要分为两篇文章进行讲解。 本篇文章主要讲解的是表内删除数据、查询结果进行插入、聚合统计、分组聚合统计。 如果想要学习对应知识的可以观看哦。 ps:本篇内容友友们只要会创建表了就可以看起来了哦!&am…...
鲸鱼机器人和乐高机器人的比较
鲸鱼机器人和乐高机器人各有其独特的优势和特点,家长在选择时可以根据孩子的年龄、兴趣、经济能力等因素进行综合考虑,选择最适合孩子的教育机器人产品。 优势 鲸鱼机器人 1)价格亲民:鲸鱼机器人的产品价格相对乐高更为亲民&…...
游戏引擎学习第15天
视频参考:https://www.bilibili.com/video/BV1mbUBY7E24 关于游戏中文件输入输出(IO)操作的讨论。主要分为两类: 只读资产的加载 这部分主要涉及游戏中用于展示和运行的只读资源,例如音乐、音效、美术资源(如 3D 模型和…...
详解模版类pair
目录 一、pair简介 二、 pair的创建 三、pair的赋值 四、pair的排序 (1)用sort默认排序 (2)用sort中的自定义排序进行排序 五、pair的交换操作 一、pair简介 pair是一个模版类,可以存储两个值的键值对.first以…...
AI驱动的桌面笔记应用Reor
网友 竹林风 说,已经成功的用 mxbai-embed-large 映射到 text-embedding-ada-002,并测试成功了。不愧是爱折腾的人,老苏还没时间试,因为又找到了另一个支持 AI 的桌面版笔记 Reor Reor 简介 什么是 Reor ? Reor 是一款由人工智…...
搜维尔科技:使用sensglove触觉反馈手套进行虚拟拆装操作
使用sensglove触觉反馈手套进行虚拟拆装操作 搜维尔科技:使用sensglove触觉反馈手套进行虚拟拆装操作...
深入理解电子邮件安全:SPF、DKIM 和 DMARC 完全指南
引言 在当今数字时代,电子邮件已经成为我们日常通信中不可或缺的一部分。然而,随之而来的安全问题也日益突出。邮件欺诈、钓鱼攻击和垃圾邮件等威胁不断增加,这促使了多种邮件安全验证机制的出现。本文将深入探讨三个最重要的邮件安全协议&a…...
【有啥问啥】复习一下什么是NMS(非极大值抑制)?
复习一下什么是NMS(非极大值抑制)? 什么是NMS? NMS(Non-Maximum Suppression)即非极大值抑制,是一种在计算机视觉领域,尤其是目标检测任务中广泛应用的后处理算法。其核心思想是抑…...
Java-异步方法@Async+自定义分布式锁注解Redission
如果你在使用 @Async 注解的异步方法中,使用了自定义的分布式锁注解(例如 @DistributedLock),并且锁到期后第二个请求并没有执行,这可能是由于以下几个原因导致的: 锁的超时时间设置不当:锁的超时时间可能设置得太短,导致锁在业务逻辑执行完成之前就已经自 动释放。…...
基本定时器---内/外部时钟中断
一、定时器的概念 定时器(TIM),可以对输入的时钟信号进行计数,并在计数值达到设定值的时候触发中断。 STM32的定时器系统有一个最为重要的结构是时基单元,它由一个16位计数器,预分频器,和自动重…...
实现了两种不同的图像处理和物体检测方法
这段代码实现了两种不同的图像处理和物体检测方法:一种是基于Canny边缘检测与轮廓分析的方法,另一种是使用TensorFlow加载预训练SSD(Single Shot Multibox Detector)模型进行物体检测。 1. Canny边缘检测与轮廓分析: …...
如何在MindMaster思维导图中制作PPT课件?
思维导图是一种利用色彩、图画、线条等图文并茂的形式,来帮助人们增强知识或者事件的记忆。因此,思维导图也被常用于教育领域,比如:教学课件、读书笔记、时间管理等等。那么,在MindMaster免费思维导图软件中࿰…...
ORIN NX 16G安装中文输入法
刷机版本为jetpack5.14.刷机之后预装了cuda、cudnn、opencv、tensorrt等,但是发现没有中文输入,所以记录一下安装流程。 jetson NX是arm64架构的,sougoupinyin只支持adm架构的,所以要选择安装Google pinyin 首先打开终端&#x…...
【金融风控项目-07】:业务规则挖掘案例
文章目录 1.规则挖掘简介2 规则挖掘案例2.1 案例背景2.2 规则挖掘流程2.3 特征衍生2.4 训练决策树模型2.5 利用结果划分分组 1.规则挖掘简介 两种常见的风险规避手段: AI模型规则 如何使用规则进行风控 **使用一系列逻辑判断(以往从职人员的经验)**对客户群体进行区…...
退款成功订阅消息点击后提示订单不存在
问题表现: 退款成功发送的小程序订阅消息点击进入后提示订单不存在。 修复方法: 1.打开文件app/services/message/notice/RoutineTemplateListService.php 2.找到方法sendOrderRefundSuccess 3.修改图中红圈内的链接地址 完整方法代码如下 /*** 订…...
实验一 顺序结构程序设计
《大学计算机﹣C语言版》实验报告 实验名称 实验一 顺序结构程序设计 实验目的 (1)掌握C语言中常量和变量的概念。 (2)掌握C语言中常见的数据类型。 (3)掌握C语言中变量的定义和赋值方法。 …...
Elasticsearch搜索流程及原理详解
Elasticsearch搜索流程及原理详解 1. Elasticsearch概述1.1 简介1.2 核心特性1.3 应用场景2. Elasticsearch搜索流程2.1 搜索请求的发起2.2 查询的执行2.3 结果的聚合与返回3. Elasticsearch原理详解3.1 倒排索引3.2 分布式架构3.3 写入流程3.4 读取流程4. 技术细节与操作流程4…...
芯片之殇——“零日漏洞”(文后附高通64款存在漏洞的芯片型号)
芯片之殇——“零日漏洞”(文后附高通64款存在漏洞的芯片型号) 本期是平台君和您分享的第113期内容 前一段时间,高通公司(Qualcomm)发布安全警告称,提供的60多款芯片潜在严重的“零日漏洞”,芯片安全再一次暴露在大众视野。 那什么是“零日漏洞”?平台君从网上找了一段…...
【gitlab】gitlabrunner部署
1、下载镜像 docker pull gitlab/gitlab-runner:latest 2、启动gitrunner容器 docker run -d --name gitlab-runner --restart always \ -v /root/gitrunner/config:/etc/gitlab-runner \ ///gitlab-runner的配置目录,挂载在宿主机上方便修改,里面有config.…...
Flink监控checkpoint
Flink的web界面提供了一个选项卡来监控作业的检查点。这些统计信息在任务终止后也可用。有四个选项卡可以显示关于检查点的信息:概述(Overview)、历史(History)、摘要(Summary)和配置(Configuration)。下面依次来看这几个选项。 Overview Tab Overview选项卡列出了以…...
Ribbon 入门实战指南
Ribbon 是 Netflix 开发的一个开源项目,用于实现客户端负载均衡功能。它在微服务架构中广泛使用,并且是 Spring Cloud 生态中的重要组成部分。本文将带你从基础入门,逐步掌握如何在 Spring Cloud 项目中使用 Ribbon 实现客户端负载均衡。 1 负…...
uniapp: 微信小程序包体积超过2M的优化方法(主包从2.7M优化到1.5M以内)
一、问题描述 在使用uniapp进行微信小程序开发时,经常会遇到包体积超过2M而无法上传: 二、解决方案 目前关于微信小程序分包大小有以下限制: 整个小程序所有分包大小不超过 30M(服务商代开发的小程序不超过 20M) 单个…...
【百日算法计划】:每日一题,见证成长(026)
题目 给定一个包含正整数、加()、减(-)、乘(*)、除(/)的算数表达式(括号除外),计算其结果。 表达式仅包含非负整数,, - ,,/ 四种运算符和空格 。 整数除法仅保留整数部分。 * * 示例 1: 输入: “32X2” 输出: 7 import…...
【大模型】prompt实践总结
文章目录 怎么才算是好的prompt设计准则基本原则精炼原则(奥卡姆剃刀准则)具体原则真实操作技巧指定角色增加fewshots列表化代码化强调需求真实迭代大模型优化情形任务的定义和评估标准似乎可以再明确一下出现了一些之前没有考虑过的特殊情况,可以重新组织语言优化Prompt来处…...
在Qt(以及C++)中, 和 * 是两个至关重要的符号--【雨露均沾】
在Qt(以及C)中,& 和 * 是两个至关重要的符号,它们用于处理引用和指针。我们将逐个解释这两个符号,并提供简单示例来说明它们的用法。 1. 引用(&) 定义: 引用是一种别名,它不…...
本地部署Apache Answer搭建高效的知识型社区并一键发布到公网流程
文章目录 前言1. 本地安装Docker2. 本地部署Apache Answer2.1 设置语言选择简体中文2.2 配置数据库2.3 创建配置文件2.4 填写基本信息 3. 如何使用Apache Answer3.1 后台管理3.2 提问与回答3.3 查看主页回答情况 4. 公网远程访问本地 Apache Answer4.1 内网穿透工具安装4.2 创建…...
Ubuntu常见命令
关于export LD_LIBRARY_PATHcmake默认地址CMakelists.txt知识扩充/home:挂载新磁盘到 /home 子目录 关于export LD_LIBRARY_PATH 程序运行时默认的依赖库的位置包括lib, /usr/lib ,/usr/local/lib 通过命令export LD_LIBRARY_PATHdesired_path:$LD_LIBRARY_PATH追加…...
网络安全领域的最新动态和漏洞信息
网络安全领域的最新动态和漏洞信息涉及多个方面,以下是对这些信息的详细归纳: 一、网络安全领域最新动态世界互联网大会乌镇峰会召开2024年11月19日至22日,以“拥抱以人为本、智能向善的数字未来——携手构建网络空间命运共同体”为主题的202…...
个人做的网站有什么危险/关键词排名代做
退休的贵族进程 0号进程所有进程的祖先叫做进程0 在系统初始化阶段由start_kernel()函数从无到有手工创建的一个内核线程 进程0最后的初始化工作创建init内核线程asmlinkage __visible void __init start_kernel(void){...//初始化0号进程pcbset_task_stack_end_magic(&ini…...
推广产品网站建设/东莞疫情最新消息今天
看了看咱们的联想A765e手机没有专属的论坛版块,所以相关的资料也比较难找,尤其是线刷包的资料,今天在这里就来大家说一下有关这个手机的具体的线刷包的下载和具体的线刷刷机教程供大家参考了,为什么要说线刷教程呢,因为…...
制作一个app的完整流程/国外seo网站
php上传文件并存储到mysql数据库的方法,本文实例讲述了php上传文件并存储到mysql数据库的方法。分享给大家供大家参考。具体分析如下:下面的代码分别用于创建mysql表和上传文件保存到mysql数据库创建mysql表:上传文件并保存到mysql中…...
seo如何提高网站排名/营销效果分析怎么写
购买产品链接请点击“阅读原文”https://yao.jk.cn/index.html#/yao-item/263856/0?channelCodeduojin&promoCodeMERCENARY5279360301...
仪征网站建设公司哪家好/企业营销策略分析论文
1. 概述 中断是指出现需要时, CPU暂停执行当前程序,转而执行新程序的过程。即在程序运行过程中,系统出现了一个必须由CPU立即处理的事务,此时, CPU暂时中止当前程序的执行转而处理这个事务,这个过程就叫做中…...
网站主机注册/长沙seo推广优化
ZeroPadding,数据长度不对齐时使用0填充,否则不填充PKCS7Padding,假设数据长度需要填充n(n>0)个字节才对齐,那么填充n个字节,每个字节都是n;如果数据本身就已经对齐了,则填充一块长度为块大小的数据&…...