在 Fast DDS(Fast Data Distribution Service)中,数据共享传递(Data-sharing delivery)是一种通过共享内存来加速同一台机器内的实体之间通信的机制。它允许 DataWriter 将其历史记录与 DataReader 共享,从而避免在传输层面上的开销,有效地防止了 DataWriter 和 DataReader 之间的数据复制。
概述
- 共享内存使用:当创建 DataWriter 时,Fast DDS 会预先分配一个样本池,这个池中的样本存储在一个共享内存映射文件中。当有新数据发布时,DataWriter 会从这个池中取出一个样本,并将其添加到历史记录中,同时通知 DataReader 哪个样本包含新数据。DataReader 可以访问同一个共享内存映射文件,从而直接获取由 DataWriter 发布的数据。
限制条件
要使用数据共享传递功能,需要满足以下要求:
- 共享内存访问:DataWriter 和 DataReader 必须能够访问相同的共享内存。
- 话题类型限制:话题必须是有限制的 TopicDataType,即其
is_bounded()
成员函数返回 true。 - 无键话题:话题不能是键控的。
- 内存配置:DataWriter 必须配置为
PREALLOCATED_MEMORY_MODE
或PREALLOCATED_WITH_REALLOC_MEMORY_MODE
模式。 - 无安全插件:不允许使用安全插件。
另外,对于 DataReader 的 HistoryQos 存在限制。在使用数据共享机制时,DataReader 实际上与 DataWriter 共享历史记录。这意味着有效的 HistoryQos 深度最多只能等于 DataWriter 的 HistoryQos 深度。为了避免混淆,建议将 DataReaders 的历史深度设置为小于或等于 DataWriter 的值。
总结
数据共享交付是一种高效的通信方式,通过减少数据复制和提高数据访问速度,可以显著提高系统性能。然而,它需要特定条件才能实现,因此在设计系统时需要考虑这些限制。
内容由零声教学AI助手提供,问题来源于学员提问