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

问题描述 投票:0回答:1

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

关于POSIX共享内存,我有三个问题。

(1)有没有像POSIX管道和消息队列的方法一样,在有新数据时自动通知客户端的方法?

(2)使用没有锁的共享内存,数据是只写只读的,会出现什么问题?

(3)我读到共享内存是最快的IPC方法,因为它的带宽最高,数据在服务器和客户机的内核中都能立即可用。 但是,如果使用消息队列和管道,服务器核心可以发送消息并继续工作,而不需要等待锁。 在上述类型的情况下,需要锁是否会使共享内存的性能比消息队列和管道慢?

c linux posix ipc shared-memory
1个回答
3
投票

(1)没有自动的机制来通知线程processes数据被写入内存位置。你必须使用其他机制来通知。

(2)你有一个多生产者单消费者(MPSC)的设置。实现一个无锁的MPSC队列并不是一件小事。你将不得不小心翼翼地注意以正确的顺序和正确的内存排序来进行原子比较和交换(CAS)操作,你应该知道如何避免错误的缓存行共享。请看 https:/en.cppreference.comwcatomic。 C11中的原子运算支持,并阅读了关于内存障碍的文章。另一个好读的文章是关于Disruptor在 http:/lmax-exchange.github.iodisruptorfilesDisruptor-1.0.pdf。.

(3)你的数据大小(50*750)很小。有可能都能放在缓存里,你访问它不会有带宽问题。锁定与管道与消息队列:在争用的时候和队列满了或空了的时候,这些都不是免费的。

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

© www.soinside.com 2019 - 2024. All rights reserved.