15.6.1. 调整分配
内存的分配和释放意味着一些非确定性的耗时操作。因此,大多数实时系统需要以一种方式运行,即在应用程序初始化期间分配所有动态内存,以避免在主循环中进行内存管理操作。
如果用户为 Fast DDS 内部保持的数据和集合提供了最大大小,则这些数据和集合的内存可以在实体初始化期间预先分配。为了选择正确的大小值,用户必须了解整个域的拓扑结构。具体来说,在设置配置时,必须知道 DomainParticipants、DataWriters 和 DataReaders 的数量。
以下部分描述了如何配置在实体初始化期间进行的内存分配。虽然每个部分都提供了一些示例作为参考,但还有一个完整的示例用例。
15.6.1.1. 参与者上的参数
每个 DomainParticipant 都持有一个内部集合,该集合包含有关已发现的每个本地和远程对等 DomainParticipants 的信息。这些信息包括但不限于:
- 一个嵌套集合,其中包含有关每个在对等 DomainParticipant 上宣布的 DataWriter 的信息。
- 一个嵌套集合,其中包含有关每个在对等 DomainParticipant 上宣布的 DataReader 的信息。
- 用户在对等 DomainParticipant 上配置的自定义数据,即 UserDataQosPolicy、PartitionQosPolicy 和 PropertyPolicyQos。
默认情况下,这些集合是完全动态的,这意味着当发现新的 DomainParticipant、DataWriter 或 DataReader 时,会分配新的内存。同样,提到的自定义配置数据参数具有任意大小。默认情况下,这些参数的内存在对等 DomainParticipant 宣布其值时进行分配。
然而,DomainParticipantQos 有一个名为 allocation() 的成员函数,其类型为 ParticipantResourceLimitsQos,可以配置这些集合和参数的最大大小,从而确保所有所需内存在 DomainParticipant 初始化期间预先分配。
15.6.1.1.1. 限制发现实体的数量
ParticipantResourceLimitsQos 提供了三个数据成员,用于配置已发现实体的分配行为:
- participants:配置已发现 DomainParticipants 集合的分配。
- readers:配置每个已发现 DomainParticipant 内部 DataWriters 集合的分配。
- writers:配置每个已发现 DomainParticipant 内部 DataReaders 集合的分配。
默认情况下,使用的是完全动态行为。然而,通过使用这些成员,可以轻松地将集合配置为在初始化期间进行预先分配,将它们设置为静态最大预期值,如下面示例所示。请参阅 ResourceLimitedContainerConfig,以获取由这些数据成员提供的额外配置选项完整描述。
C++ 示例
DomainParticipantQos qos;
// 将发现参与者限制为3
// 这将在初始化期间有效地预先分配内存
qos.allocation().participants =
eprosima::fastdds::ResourceLimitedContainerConfig::fixed_size_configuration(3u);
// 将每个 DomainParticipant 的 DataWriters 数量限制为1
// 将每个 DomainParticipant 的 DataReaders 数量限制为3
// 这将在初始化期间有效地预先分配内存
qos.allocation().writers =
eprosima::fastdds::ResourceLimitedContainerConfig::fixed_size_configuration(1u);
qos.allocation().readers =
eprosima::fastdds::ResourceLimitedContainerConfig::fixed_size_configuration(3u);
XML 示例
<?xml version="1.0" encoding="UTF-8" ?>
<profiles xmlns="http://www.eprosima.com">
<participant profile_name="participant_profile_qos_entity_resource_limit">
<rtps>
<allocation>
<!-- 限制参与者数量为3 -->
<total_participants>
<initial>3</initial>
<maximum>3</maximum>
<increment>0</increment>
</total_participants>
<!-- 每个参与者最多限3个读者 -->
<total_readers>
<initial>3</initial>
<maximum>3</maximum>
<increment>0</increment>
</total_readers>
<!-- 每个参与者最多限1个写者 -->
<total_writers>
<initial>1</initial>
<maximum>1</maximum>
<increment>0</increment>
</total_writers>
</allocation>
</rtps>
</participant>
</profiles>
警告
将集合配置为固定大小会有效限制可被发现的对等实体数量。一旦达到配置限制,任何新的实体将被忽略。在给定示例中,如果出现第四个对等域参与者,它将无法被发现,因为已发现域参与者的集合已经满员。
内容由零声教学AI助手提供,问题来源于学员提问