将 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_mutex
和 interprocess_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。实时基本上意味着缓慢但有保证的最后期限。
我目前正在构建实时 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 usemmap()
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 fromSIGRTMIN
toSIGRTMAX
safe to use?
信号可能不是 IPC 的最佳选择,因为 POSIX 信号接口容易出现竞争条件:进程 ID 被重用,因此 pid
参数可能引用完全不同的进程你打电话给 sigqueue
的时间。
信号只支持定向通信,不支持广播。排队实时信号的数量也有系统范围的限制。
并且处理信号的 API 并不方便,但是最近随着 signalfd
and pidfd_open
的引入而改变了。
一个相对简单且健壮的基于消息的共享内存 IPC 是共享内存中的消息环形缓冲区以及共享内存互斥锁和条件变量。
Boost Interprocess 库提供 interprocess_mutex
和 interprocess_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。实时基本上意味着缓慢但有保证的最后期限。