我目前正在建设实时IPC系统。
我正在尝试构建一个没有所有不确定性组件的实时系统。
我试图建立基于共享内存模型的IPC。
使用boost库中的managed_shared_memory以减少不可预测的延迟是否安全?还是应该使用mmap()来共享内存?
另外,有从SIGRTMIN到SIGRTMAX的通道的rt_signal是否安全使用?
谢谢!顺便说一下,我是在抢占-rt补丁linux内核上使用它们的。
发布于 2020-03-16 18:54:53
使用boost库中的
managed_shared_memory以减少不可预测的延迟是否安全?还是应该使用mmap()进行内存共享?
使用是个昂贵的手术操作进程地址空间映射,因此您希望尽量减少使用mmap的次数。mmap是不可预测延迟的一个来源。
managed_shared_memory使用mmap,并在此基础上提供额外的功能,在使用mmap时,您需要实现这些功能。
您所使用的性能可能并不重要,因为mmap成本将占主导地位。
另外,有从
SIGRTMIN到SIGRTMAX的通道的SIGRTMAX是否可以安全使用?
信号可能不是IPC的最佳选择,因为POSIX信号接口容易出现争用条件:进程ids被重用,以便pid参数在调用sigqueue时可以引用完全不同的进程。
信号只支持定向通信,不支持广播。对排队的实时信号的数量也有一个系统范围的限制.
处理信号的API也不方便,但随着signalfd和pidfd_open的引入,这种情况最近发生了变化。
相对简单和健壮的基于消息的共享内存IPC是共享内存中的消息环缓冲区以及共享内存互斥量和条件变量。
Boost进程间库提供interprocess_mutex和interprocess_condition,对于环形缓冲区,您可以使用固定大小的boost::lockfree::spsc_queue。
顺便说一下,我是在抢占-rt补丁linux内核上使用它们的。
你应该看2016年内核-谁需要一个实时操作系统(不是你!)-史蒂文·罗斯特特。实时基本上意味着缓慢,但保证死路一条。
https://stackoverflow.com/questions/60710511
复制相似问题