0

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

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

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

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

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

谢谢!顺便说一句,我在 preempt-rt 修补的 linux 内核上使用它们。

4

1 回答 1

0

managed_shared_memory从 boost 库中使用以最大程度地减少不可预测的延迟是否安全?还是我应该mmap()用于内存共享?

mmap使用orbrk操作进程地址空间映射是一项昂贵的操作,因此您希望尽量减少使用次数mmapmmap是不可预测延迟的来源之一。

managed_shared_memory在此之上使用mmap并提供额外的功能,您需要在使用mmap.

您使用哪一种性能可能并不重要,因为mmap成本将占主导地位。

还有rt_signal哪个有通道SIGRTMIN可以SIGRTMAX安全使用?

信号可能不是 IPC 的最佳选择,因为 POSIX 信号接口容易出现竞争条件:进程 ID 被重用,因此pid在您调用时参数可能会引用完全不同的进程sigqueue

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

处理信号的 API 并不方便,但最近随着 and 的引入而改变signalfdpidfd_open


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

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


顺便说一句,我在 preempt-rt 修补的 linux 内核上使用它们。

您应该观看2016 年内核食谱 - 谁需要实时操作系统(不是您!) - Steven Rostedt。实时基本上意味着缓慢但有保证的最后期限。

于 2020-03-16T18:54:53.450 回答