POSIX 共享内存 - 自动客户端通知的方法

Posted

技术标签:

【中文标题】POSIX 共享内存 - 自动客户端通知的方法【英文标题】:POSIX shared memory - method for automatic client notification 【发布时间】:2020-08-11 06:39:53 【问题描述】:

我正在研究 IPC 的 POSIX 共享内存来代替 POSIX 消息队列。我计划创建一个足够大的共享内存区域来容纳 50 条 750 字节的消息。消息会以随机间隔从多个核心(服务器)发送到一个核心(客户端),该核心(客户端)接收消息并根据消息内容采取行动。

我有三个关于 POSIX 共享内存的问题:

(1) 是否有在新数据可用时自动通知客户端的方法,例如 POSIX 管道和消息队列可用的方法?

(2) 在数据是一次写入、一次读取的情况下,使用没有锁的共享内存会出现什么问题?

(3) 我读到共享内存是最快的 IPC 方法,因为它具有最高的带宽,并且数据可以立即在服务器和客户端内核中可用。但是,使用消息队列和管道,服务器核心可以发送消息并继续其工作,而无需等待锁定。在上述场景类型中,对锁的需求是否会降低共享内存在消息队列和管道上的性能?

【问题讨论】:

1) No. 2) 与任何多线程程序中对变量的不协调访问相同。 3) 带宽对于传输比 750 字节大得多的数据量更为关键 - 在这种大小下,延迟将是一个更大的问题。 【参考方案1】:

(1) 没有自动机制来通知线程/进程数据已写入内存位置。您必须使用其他一些通知机制。

(2) 您有一个多生产者/单消费者 (MPSC) 设置。实现无锁 MPSC 队列并非易事。您必须注意以正确的顺序和正确的内存顺序执行原子比较和交换 (CAS) 操作,并且您应该知道如何避免错误的高速缓存行共享。有关 C11 中的原子操作支持,请参阅 https://en.cppreference.com/w/c/atomic 并阅读有关内存屏障的信息。另一个不错的读物是 http://lmax-exchange.github.io/disruptor/files/Disruptor-1.0.pdf 上有关 Disruptor 的论文。

(3) 您的数据大小 (50*750) 很小。很有可能它都适合缓存,并且您访问它不会有带宽问题。锁与管道与消息队列:在争用时以及队列已满或为空时,这些都不是空闲的。

无锁队列的一个好处是它们可以完全在用户空间中工作。当需要极低的延迟时,这是一个巨大的好处。

【讨论】:

以上是关于POSIX 共享内存 - 自动客户端通知的方法的主要内容,如果未能解决你的问题,请参考以下文章

在 C/C++ 共享内存中等待和通知

linux进程间通信之Posix共享内存用法详解及代码举例

Posix共享内存

Posix 共享内存与映射文件

Posix共享内存

POSIX 共享内存 - 有多少个内存副本