共享内存和IPC

我正在阅读有关共享内存的教程,并发现以下语句:“如果进程希望通知另一个进程已将新数据插入共享内存,则必须使用信号,消息队列,管道,套接字或其他IPC的类型。“ 那么使用共享内存和其他类型的IPC仅用于通知而不是使用不需要任何其他IPC类型的IPC(如消息队列和套接字)的主要优点是什么?

这里的区别是用于信令与共享状态的 IPC机制

信令 (信号,消息队列,管道等)适用于往往短,及时和有针对性的信息。 这些机制上的事件往往会唤醒或中断另一个程序。 比喻的是,“一个人将短信节目发送给另一个人?”

  • 嘿,我在哈希表中添加了一个新条目!
  • 嘿,我完成了你要我做的那件事!
  • 嘿,这是我猫的照片。 他不可爱吗?
  • 嘿,你今晚想出去吗? 这个新地方叫做硬盘。

与上述相比, 共享存储器对于共享相对较大,稳定的对象更有效,这些对象在小部件中变化或被重复读取。 程序可能会不时或在收到其他信号后咨询共享内存。 考虑一下,一系列程序会在家里厨房的(大)白板上写什么?

  • 我们最喜欢的食谱。
  • 我们知道的事情。
  • 我们的朋友的电话号码和其他联系信息。
  • 由监狱时间组织的我们家族辉煌历史的最新手稿。

通过这些示例,您可能会说共享内存更接近文件而不是最严格意义上的IPC机制,共享内存的明显例外是

  1. 随机访问,而文件是顺序的。
  2. 易失性,而文件往往在程序崩溃中幸存。

您希望共享内存的示例是共享哈希表(或btree或其他复合结构)。 您可以让每个进程都接收更新消息并更新结构的私有副本,或者您可以将哈希表存储在共享内存中并使用信号量进行锁定。

共享内存非常快 – 这是您使用它的主要优势和原因。 您可以使用部分内存来保留有关数据有效性的标志/时间戳,但如果您想避免轮询共享内存,则可以使用其他forms的IPC进行信号发送。

共享内存用于在进程之间传输数据(以及快速读/写磁盘文件)。 如果您不需要传输数据并且只需要通知其他进程,请不要使用共享内存 – 而是使用其他通知机制(信号量,事件等)。

根据要从进程传递到进程的数据量,共享内存会更有效,因为您可以最大限度地减少数据从用户区内存复制到内核内存并返回到用户区内存的次数。