ZBLOG

15.6.1. Tuning allocations Allocating and deallocating memory implies some non-deterministic time consuming operations. Therefore, most real-time systems need to operate in a way that all dynamic memory is allocated during the application initial...

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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=21889

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?