2011-03-25 121 views
3

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

回答

6

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

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

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

共享存储器,与上述相比,是用于共享在小部件更改或反复读取相对大的,稳定的物体更有效。程序可能会不时地咨询共享内存或在收到其他信号后。想想看,一个家庭的程序会在他们家的厨房的(大)白板上写什么?

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

这些例子之后,你可能会说,共享内存,而不是严格意义上的IPC机制更接近于一个文件,与共享内存明显的例外是

  1. 随机访问,而文件是连续的。
  2. 挥发性,而文件倾向于生存程序崩溃。
+1

我可以为我的流程创建自定义信号来收听吗? – CMCDragonkai 2014-06-23 05:52:55

+0

例如,如果您调用'kill(pid,50333)',我很难找出_supposed_发生了什么,但无论如何我都不会推荐它。 标准信号包括SIGUSR1和SIGUSR2,其含义由程序定义。但是,如果你需要两条以上的消息,那么你可能根本不应该使用信号。它们不是一个特别灵活的IPC机制。 – 2014-06-23 07:25:16

+0

这似乎是正确的。 – CMCDragonkai 2014-06-23 07:45:12

0

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

2

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

2

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

0

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