共享内存和IPC

时间:2011-03-25 18:41:51

标签: c operating-system ipc shared-memory

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

5 个答案:

答案 0 :(得分:8)

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

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

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

共享内存对于共享相对较大,稳定的对象更有效,这些对象可以在较小的部分中进行更改或重复读取。程序可能会不时或在收到其他信号后咨询共享内存。考虑一下,一系列节目会在他们家的厨房里的(大)白板上写什么?

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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