iceoryx之Roudi

本文详细介绍了Iceoryx中的Roudi守护进程,其负责共享内存管理、端口控制、数据传输以及故障处理。重点讲解了Chunk、Block和Segment的概念,以及TOML配置文件的使用。同时涉及Roudi中的无锁队列设计和内存分配机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Roudi作为中间件守护进程,主要职责包括:

  • 管理共享内存:roudi负责创建、管理和分配共享内存,这是Iceoryx中进程间通信的基础。
  • 端口管理:roudi管理着所有的发送者和接收者端口。当一个进程需要发送或接收数据时,它会通过roudi来创建或获取对应的端口。
  • 数据传输:roudi不仅负责管理端口,还负责实际的数据传输。它会根据接收者端口的需求,将数据从发送者端口转发到接收者端口。
  • 故障处理:如果一个进程崩溃,roudi可以清理该进程使用的所有资源,以防止资源泄漏。

概念理解

Chunk:在 Iceoryx 中,chunk 是数据交换的基本单位,当一个进程或线程需要发送数据时,会从内存池中请求一个 chunk,将数据写入其中,然后将 chunk 发送到目标进程或线程。接收方收到 chunk 后,可以直接从中读取数据。

Block:block 是 Iceoryx 中用于管理内存的基本单位。每个 block 都有一个固定的大小,可以包含并管理一个或多个 chunk。当请求一个新的 chunk 时,实际上是从一个 block 中分配的。

Segment:segment 是一段连续的内存区域,由多个 block 组成。在 Iceoryx 中,所有的数据交换都发生在同一个 segment 中,这样可以保证数据的连续性,提高数据传输的效率。

配置文件

文档参考这里
.toml格式的配置,如果使用需要设置CMake选项-DTOML_CONFIG=ON
可以通过命令行参数指定配置文件:./iox-roudi -c /absolute/path/to/config/file.toml
格式如下

[general]
version = 1

[[segment]]

# 以下可以是多个
[[segment.mempool]]
size = 512    # size为chunk的大小
count = 10    # size的个数

如果没有配置,则设置默认配置

/// this is the default memory pool configuration if no one is provided by the user
MePooConfig& MePooConfig::setDefaults() noexcept {
    m_mempoolConfig.push_back({128, 10000});
    m_mempoolConfig.push_back({1024, 5000});
    m_mempoolConfig.push_back({1024 * 16, 1000});
    m_mempoolConfig.push_back({1024 * 128, 200});
    m_mempoolConfig.push_back({1024 * 512, 50});
    m_mempoolConfig.push_back({1024 * 1024, 30});
    m_mempoolConfig.push_back({1024 * 1024 * 4, 10});

    return *this;
}

iceoryx使用一个management的segment用于管理,若个user segment用于event通信。这些segment被划分为mempools,mempool包含若干chunks,可以参考上面的配置文件。chunk就是iceoryx中内存分配的基本单元。这部分内容可以参考文档
在这里插入图片描述

代码分析

Roudi中设计到的主要有以下类:
在这里插入图片描述

Roudi中申请的共享内存分布,以一个provider为例:
在这里插入图片描述

无锁队列

文档参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值