将 boost 提供的共享内存和 rt_signal(在 linux 中提供)用于实时系统是否安全?

Is it safe to use boost provided shared memory and rt_signal (provided in linux) for realtime system?

我目前正在构建实时 IPC 系统。

我正在尝试构建一个没有所有不确定组件的实时系统。

我尝试基于共享内存模型设置 IPC。

使用来自 boost 库的 managed_shared_memory 来最小化不可预测的延迟是否安全?还是应该使用 mmap() 进行内存共享?

还有 rt_signal 从 SIGRTMIN 到 SIGRTMAX 的信道可以安全使用吗?

谢谢!顺便说一下,我在 preempt-rt patched linux kernel.

上使用它们

Is it safe to use managed_shared_memory from boost library to minimize unpredictable latency? or should I use mmap() for memory sharing?

正在处理进程地址 space 与 mmap or brk is an expensive operation 的映射,因此您希望尽量减少使用 mmap 的次数。 mmap 是不可预测延迟的来源之一。

managed_shared_memory 使用 mmap 并在此基础上提供额外的功能,您在使用 mmap.

时需要自己实现这些功能

您使用哪一个对性能可能无关紧要,因为 mmap 成本将占主导地位。

Also Is rt_signal which has channel from SIGRTMIN to SIGRTMAX safe to use?

信号可能不是 IPC 的最佳选择,因为 POSIX 信号接口容易出现竞争条件:进程 ID 被重用,因此 pid 参数可能引用完全不同的进程你打电话给 sigqueue 的时间。

信号只支持定向通信,不支持广播。排队实时信号的数量也有系统范围的限制。

并且处理信号的 API 并不方便,但是最近随着 signalfd and pidfd_open 的引入而改变了。


一个相对简单且健壮的基于消息的共享内存 IPC 是共享内存中的消息环​​形缓冲区以及共享内存互斥锁和条件变量。

Boost Interprocess 库提供 interprocess_mutexinterprocess_condition,对于环形缓冲区,您可以使用固定大小的 boost::lockfree::spsc_queue


By the way I am using them on preempt-rt patched linux kernel.

你应该看看 Kernel Recipes 2016 - Who needs a Real-Time Operating System (Not You!) - Steven Rostedt。实时基本上意味着缓慢但有保证的最后期限。