使用Socket进行进程间通信的优缺点是什么?

6

在最近面试中,我被问到一个问题:相较于其他IPC方法,Socket在IPC中的优缺点是什么?但我还没有找到确切的答案。

如果您能提供任何帮助,将不胜感激。

5个回答

10
与管道不同,IPC套接字具有双向性,即可以在同一描述符上进行读写操作。管道与套接字不同,是单向的。如果您想进行读写操作,必须保留一对描述符。
另一方面,当读取或写入少于PIPE_BUF字节的内容时,管道保证原子性。一次写入少于PIPE_BUF字节的内容将保证以一个块的形式传输,并且永远不会出现部分观察到的情况。在这方面,套接字需要程序员更加小心谨慎。
当用于IPC时,共享内存需要程序员进行显式同步。它可能是最高效、最灵活的机制,但代价是增加了复杂性。

这可能是IPC套接字某些非阻塞优势的情况吗? - jasonkim

2
也许这是一个过于简单的答案,但它是一个重要的细节。套接字不支持所有操作系统。最近,我意识到一个项目在各个地方都使用套接字进行IPC,结果发现他们被迫从Linux转换到一种专有的POSIX操作系统,但该系统并不像Linux那样支持套接字。

2

套接字的另一个优点是:使用套接字的应用程序可以轻松分布 - 也就是说,它可以在一个主机上运行,也可以在多个主机上分散运行,而不需要太多的努力。当然,这取决于应用程序的性质。


1
套接字允许您获得以下好处:
  • 您可以连接一个简单的客户端进行测试(手动输入数据,查看响应)。 这对于调试、模拟和黑匣子测试非常有用。

  • 您可以在不同的机器上运行进程。如果您从事嵌入式软件开发,这对于可扩展性非常有用,并且在调试/测试方面非常有帮助。

  • 将您的进程公开为服务变得非常容易

但是也存在缺点

  • 与为单台计算机优化的IPC相比,开销更大。特别是如果需要性能并且您知道进程都在同一台机器上,则共享内存更好。

  • 安全性 - 如果您的客户端应用程序可以连接,那么任何其他人也都可以连接,如果您没有谨慎进行身份验证。如果您不加密,则数据也会被嗅探,并且如果您没有至少对发送的数据进行签名,则数据可以被修改。


0

使用真正的消息队列往往会使您留下固定大小的消息。如果您有大量大小差异巨大的消息,这可能会成为性能问题。使用套接字可以解决这个问题,但是您需要尝试将此功能包装成与队列完全相同的方式,这很难在细节上得到正确处理,特别是像阻塞/非阻塞和原子性这样的方面。

共享内存快速但需要管理(最终编写malloc的版本来管理SHM),而且您必须以某种方式进行同步和锁定。虽然您可以使用库来帮助处理此问题,但可用性取决于您的环境和语言。

队列很容易,但它们具有作为我的套接字讨论优点的缺点。

Pipes已经由Blagovests回答了这个问题。

对于这种类型的内容,我建议阅读W. Richard Stevens关于IPC和套接字的书籍。没有比他更好的解释了! :-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接