我目前正在构建实时 IPC 系统。
我正在尝试构建一个没有所有不确定组件的实时系统。
我尝试基于共享内存模型设置 IPC。
使用 boost 库中的 managed_shared_memory 来最小化不可预测的延迟是否安全?还是应该使用 mmap() 进行内存共享?
还有从 SIGRTMIN 到 SIGRTMAX 的通道的 rt_signal 可以安全使用吗?
谢谢!顺便说一句,我在 preempt-rt 修补的 linux 内核上使用它们。
我目前正在构建实时 IPC 系统。
我正在尝试构建一个没有所有不确定组件的实时系统。
我尝试基于共享内存模型设置 IPC。
使用 boost 库中的 managed_shared_memory 来最小化不可预测的延迟是否安全?还是应该使用 mmap() 进行内存共享?
还有从 SIGRTMIN 到 SIGRTMAX 的通道的 rt_signal 可以安全使用吗?
谢谢!顺便说一句,我在 preempt-rt 修补的 linux 内核上使用它们。
managed_shared_memory
从 boost 库中使用以最大程度地减少不可预测的延迟是否安全?还是我应该mmap()
用于内存共享?
mmap
使用orbrk
操作进程地址空间映射是一项昂贵的操作,因此您希望尽量减少使用次数mmap
。mmap
是不可预测延迟的来源之一。
managed_shared_memory
在此之上使用mmap
并提供额外的功能,您需要在使用mmap
.
您使用哪一种性能可能并不重要,因为mmap
成本将占主导地位。
还有
rt_signal
哪个有通道SIGRTMIN
可以SIGRTMAX
安全使用?
信号可能不是 IPC 的最佳选择,因为 POSIX 信号接口容易出现竞争条件:进程 ID 被重用,因此pid
在您调用时参数可能会引用完全不同的进程sigqueue
。
信号只支持定向通信,不支持广播。排队的实时信号的数量也有系统范围的限制。
处理信号的 API 并不方便,但最近随着 and 的引入而改变signalfd
了pidfd_open
。
一个相对简单且健壮的基于消息的共享内存 IPC 是共享内存中的消息环形缓冲区以及共享内存互斥体和条件变量。
Boost Interprocess 库提供interprocess_mutex
和interprocess_condition
用于环形缓冲区,您可以使用boost::lockfree::spsc_queue
固定大小。
顺便说一句,我在 preempt-rt 修补的 linux 内核上使用它们。
您应该观看2016 年内核食谱 - 谁需要实时操作系统(不是您!) - Steven Rostedt。实时基本上意味着缓慢但有保证的最后期限。