我了解进程间通信的许多其他选项中的两个可以是:
- 共享内存
- 插座
实际上,我看到Intellij Idea公开了这两个选项,用于调试Java应用程序。我想知道每种方法的优缺点。
我了解进程间通信的许多其他选项中的两个可以是:
实际上,我看到Intellij Idea公开了这两个选项,用于调试Java应用程序。我想知道每种方法的优缺点。
Answers:
每个人的脑海中都有一些优势。请注意,其中某些项目可能并非在所有情况下都适用;这些只是一般性观察。
插座
简单且可控。几乎不需要修改就可以根据需要扩展到网络套接字。编程模型需要序列化,而序列化又需要您考虑哪些数据实际上是从A传输到B的。无需其他同步。
共享内存
不一定需要系统调用(因此可能更快)。共享并不明确要求传输数据-可以使接收者无法检索的数据可用(不必浪费带宽来传输接收者不会使用的数据)。没有序列化/反序列化步骤意味着没有时间花费在通信开销上。
套接字是一对一的。如果要将同一事物发送到多个进程,则需要多个套接字。使用共享内存,您可以有多个读取器,也可以有多个写入器。
套接字占用大量资源。每条消息都通过操作系统。使用共享内存,您可以将共享内存映射到应用程序的内存中,然后再由您使用。但是,当您使用共享内存时,仍然需要浏览操作系统。见下文。
套接字是同步的(只要您不使用UDP)。使用共享内存时,您几乎不可避免地需要一些其他机制来告诉其他进程可以对共享内存进行读取或写入。不要这样做,您将遇到内存损坏的问题。示例:假设进程A开始读取大块共享内存,但在读取的途中被换出。进程B写入共享内存的同一块。当进程A重新启动并继续读取共享内存时,它读入的是旧数据和新数据的混搭。为避免这种情况,在使用共享内存时,您仍然需要检查操作系统。
将基于套接字的应用程序集转换为使用网络套接字的应用程序相当容易。您可以将处理过程扩展到实验室中的所有机器,甚至更远的地方。只是无法使用共享内存来做到这一点。使用基于共享内存的解决方案将您锁定在一台计算机上。
套接字用于处理少量数据,共享内存用于处理大量数据。存在解决不同问题的不同机制。