15.8. Zero-Copy communication
本节解释了如何在 Fast DDS 中配置零拷贝通信。零拷贝通信允许在应用程序之间传输数据,而无需在内存中复制数据,从而节省时间和资源。为实现这一点,它利用了数据共享交付(Data-sharing delivery)以及应用程序与 Fast DDS 之间的数据缓冲区借用。
15.8.1. Overview
数据共享交付提供了一个通信通道,允许 DataWriter 和 DataReader 使用共享内存进行交流。因此,它不需要将样本数据复制到内存中以进行传输。
DataWriter 样本借用 是 Fast DDS 的一种扩展,允许应用程序借用一个用于发布的 DataWriter 中样本的缓冲区。样本可以直接构建在这个缓冲区上,从而消除了之后将其复制到 DataWriter 的需求。这防止了在发布应用程序和 DataWriter 之间的数据复制。如果使用了数据共享交付,则借用的数据缓冲区将位于共享内存中。
在订阅者端读取数据时,也可以通过从 DataReader 借用来完成。应用程序获取接收到的样本作为接收队列本身的引用。这防止了从 DataReader 到接收应用程序的数据复制。同样,如果使用数据共享交付,则借用的数据将在共享内存中,并且确实是用于 DataWriter 历史记录 的相同内存缓冲区。
结合这三种特性,我们可以实现发布应用程序和订阅应用程序之间的零拷贝通信。
15.8.2. Getting started
要启用零拷贝,请执行以下步骤:
- 在 IDL 文件中定义一个普通的有界类型,并生成相应的源代码,以便后续处理使用 Fast DDS-Gen 工具。
struct LoanableHelloWorld
{
unsigned long index;
char message[256];
};
在 DataWriter 端:
- 为上述类型创建一个 DataWriter。确保该 DataWriter 未禁用数据共享。
- 使用
loan_sample()
借用一个样本。 - 使用
write()
写入该样本。
在 DataReader 端:
- 为上述类型创建一个 DataReader。确保该 DataReader 未禁用数据共享。
- 使用 DataReader 中可用函数采取/读取样本。有关如何访问接收数据的贷款,请参考“贷款和返回数据”以及“SampleInfo 序列”部分以获取更多详细信息。
- 使用
DataReader::return_loan()
返回借来的样本。
以上步骤概述了如何在 Fast DDS 中实现高效且无额外开销的数据传输方式,即零拷贝通信,显著提高系统性能并减少资源消耗。
内容由零声教学AI助手提供,问题来源于学员提问