当前位置:   article > 正文

iceoryx之Roudi

roudi

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的个数
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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

/// 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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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

代码分析

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

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

无锁队列

文档参考

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/705943
推荐阅读
相关标签
  

闽ICP备14008679号