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

POSIX shared memory - method for automatic client notification

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

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

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

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

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

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

(2) 您有一个 multiple-producer/single-consumer (MPSC) 设置。实施无锁 MPSC 队列并非易事。您必须特别注意以正确的内存排序以正确的顺序执行原子比较和交换 (CAS) 操作,并且您应该知道如何避免错误的缓存行共享。参见 https://en.cppreference.com/w/c/atomic for the atomic operations support in C11 and read up about memory barriers. Another good read is the paper on Disruptor at http://lmax-exchange.github.io/disruptor/files/Disruptor-1.0.pdf

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

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