通过套接字与共享内存进行进程间通信的优缺点是什么?


9

我了解进程间通信的许多其他选项中的两个可以是:

  1. 共享内存
  2. 插座

实际上,我看到Intellij Idea公开了这两个选项,用于调试Java应用程序。我想知道每种方法的优缺点。


一种较新的方法是D-Bus。
ott--

@ ott-- D-Bus本身不使用Unix域套接字吗?

@BrianMarshall确实,域和tcp / ip套接字。
ott-- 2013年

Answers:


11

每个人的脑海中都有一些优势。请注意,其中某些项目可能并非在所有情况下都适用;这些只是一般性观察。

插座

简单且可控。几乎不需要修改就可以根据需要扩展到网络套接字。编程模型需要序列化,而序列化又需要您考虑哪些数据实际上是从A传输到B的。无需其他同步。

共享内存

不一定需要系统调用(因此可能更快)。共享并不明确要求传输数据-可以使接收者无法检索的数据可用(不必浪费带宽来传输接收者不会使用的数据)。没有序列化/反序列化步骤意味着没有时间花费在通信开销上。


4
+1:套接字可以扩展到分布式系统,而共享内存要快得多。
mouviciel

@tylerl为什么共享内存不需要系统调用?
极客

@Geek:了解现代操作系统中如何实现虚拟内存管理。基本上,共享内存的实现几乎与普通进程内存相同。碰巧的是,同一物理页面被故意映射到2个(或N个)不同的进程中。但是,一旦建立了映射,* px = 5就会产生相同的指令集,无论px是否指向常规变量还是指向共享内存段内。
DXM

从技术上讲,如果目标可以接受您发送的格式的原始字节流,则无需通过套接字序列化数据。显然,大多数人会序列化以便可以发送给任何人。
gbjbaanb

1
@gbjbaanb我认为从技术上讲,无论编码结构如何,如果将其作为顺序的位串传输,则您正在对数据进行序列化。
tylerl

6

套接字是一对一的。如果要将同一事物发送到多个进程,则需要多个套接字。使用共享内存,您可以有多个读取器,也可以有多个写入器。

套接字占用大量资源。每条消息都通过操作系统。使用共享内存,您可以将共享内存映射到应用程序的内存中,然后再由您使用。但是,当您使用共享内存时,仍然需要浏览操作系统。见下文。

套接字是同步的(只要您不使用UDP)。使用共享内存时,您几乎不可避免地需要一些其他机制来告诉其他进程可以对共享内存进行读取或写入。不要这样做,您将遇到内存损坏的问题。示例:假设进程A开始读取大块共享内存,但在读取的途中被换出。进程B写入共享内存的同一块。当进程A重新启动并继续读取共享内存时,它读入的是旧数据和新数据的混搭。为避免这种情况,在使用共享内存时,您仍然需要检查操作系统。

将基于套接字的应用程序集转换为使用网络套接字的应用程序相当容易。您可以将处理过程扩展到实验室中的所有机器,甚至更远的地方。只是无法使用共享内存来做到这一点。使用基于共享内存的解决方案将您锁定在一台计算机上。

套接字用于处理少量数据,共享内存用于处理大量数据。存在解决不同问题的不同机制。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.