2010-01-20 108 views

回答

53

这是一个更多的设计问题,而不是速度(共享内存更快),域套接字明确更多的UNIX风格,并且做了更少的问题。在选择方面事先知道:

域套接字优势

  • 阻塞和非阻塞模式和它们之间的切换
  • 你没有释放他们时,任务完成

域套接字的缺点

  • 必须阅读并以线性方式写

共享内存优点

  • 非线性存储
  • 不会阻塞
  • 多个程序可以访问它

共享内存弊

  • 需要锁定实施
  • 需要手动释放,即使未使用任何程序

这就是我现在能想到的。但是,我会随时使用域套接字 - 更不用说,重新实现分布式计算要容易得多。由于需要安全的设计,共享内存的速度增益将会丢失。但是,如果您确切知道自己在做什么,并使用正确的内核调用,则您可以使用共享内存以更快的速度实现

+0

+1作比较。 – jldupont 2010-01-20 13:56:12

+0

感谢您的详细解答和比较! – SyBer 2010-01-21 13:18:11

+2

'需要手动释放,即使未被任何程序使用'也可以与['/dev/ashmem'](http://lwn.net/Articles/452035/) – 2014-01-17 16:05:36

2

两者都是进程间通信(IPC)机制。 UNIX域套接字用于在一台主机上的进程之间进行通信,类似于在不同主机之间使用TCP-套接字。共享内存(SHM)是一块内存,您可以在其中放入数据并在进程之间共享。 SHM通过使用指针为您提供随机访问,套接字可以被写入或读取,但无法倒带或定位。

7

在速度共享内存方面绝对是赢家。使用套接字,您将拥有至少两个数据副本 - 从发送进程到内核缓冲区,然后从内核到接收进程。使用共享内存时,延迟将仅受框中内核之间的缓存一致性算法的约束。

尽管Kornel指出,处理共享内存更为复杂,因为您必须提出自己的同步/信令方案,这可能会根据您走哪条路线而增加延迟。绝对使用共享内存中的信号量(在Linux上使用futex实现)以避免非竞争情况下的系统调用。

+0

作斗争我相信什么将Unix域套接字与正常的套接字是一端的写入直接进入另一端的接收缓冲区。所以没有必要额外的副本。如果您可以找出一种方法让应用程序在共享内存中实际使用相同的对象,而不是将其复制出来,则这可能仍然是需要的副本。 – 2010-03-28 22:28:24

+0

至少有两个额外的副本 - 从用户到内核,然后回来。 – 2010-03-28 23:39:50

0

在这种情况下 - 套接字更快。写入共享内存比任何IPC都快,但写入内存映射文件并写入共享内存是两件完全不同的事情。

当写入内存映射文件时,需要将写入共享内存的内容“刷新”到实际绑定文件(不完全是为您完成刷新),因此您先将数据复制到共享内存,然后再次将它复制(flush)到实际的文件中,那是超级膨胀 - 更多的东西,甚至更多的写入套接字,你这样做没有任何好处。

+2

这是不正确的。通过内存映射文件(这是正常机制)设置共享内存相对简单,并且数据共享以快速方式进行。 – 2015-09-15 15:20:15