我在最近的一些采访中被问过这个问题,当有其他方法来执行IPC时,在IPC中使用Socket的优点和缺点是什么。没有找到确切的答案。
非常感谢任何帮助。
答案 0 :(得分:6)
与管道相比,IPC套接字的不同之处在于双向,即读取和写入可以在同一个描述符上完成。与插座不同,管道是单向的。如果要进行读写操作,则必须保留一对描述符。
另一方面,管道在一定量的字节下读取或写入时保证原子性。一次写入少于PIPE_BUF
个字节的内容可以保证在一个块中传递,并且从未被观察到部分。在这方面,套接字确实需要程序员更多的关注。
共享内存用于IPC时,需要程序员明确同步。它可能是最有效和最灵活的机制,但这会增加复杂性成本。
答案 1 :(得分:2)
支持套接字的另一点:使用套接字的应用程序可以轻松分发 - 即。它可以在一台主机上运行,也可以轻松地分布在多台主机上。这当然取决于应用程序的性质。
答案 2 :(得分:1)
也许这个答案太简单了,但这是一个重要的细节。所有操作系统都不支持套接字。最近,我已经知道一个项目在整个地方使用套接字只是为了发现他们被迫从Linux更改为POSIX的专有操作系统,但不像Linux那样支持套接字。
答案 3 :(得分:1)
插座可以带来一些好处......
您可以将一个简单的客户端连接到它们进行测试(手动输入数据,查看响应)。 这对于调试,模拟和黑盒测试非常有用。
您可以在不同的计算机上运行这些进程。这对于可伸缩性非常有用,如果您使用嵌入式软件,则在调试/测试方面非常有用。
将您的流程作为服务公开非常容易
但也有缺点
开销大于针对单台机器优化的IPC。如果您需要性能,特别是共享内存会更好,并且您知道您的进程都在同一台机器上。
安全性 - 如果您的客户端应用程序可以连接,那么其他任何人都可以连接,如果您不小心身份验证。如果您没有加密,也可以嗅探数据,如果您至少没有签署通过网络发送的数据,则可以修改数据。
答案 4 :(得分:0)
使用真正的邮件队列往往会留下固定大小的邮件。如果您有大量不同大小的消息,这可能会成为性能问题。使用套接字可以解决这个问题,尽管你只是试图将这个功能包装成与队列相同,这对于获得正确的细节非常棘手,尤其是阻塞/非阻塞和原子性等方面。 / p>
共享内存很快但需要管理(最后编写一个malloc版本来管理SHM),你必须以某种方式同步和锁定它。虽然您可以使用库来帮助实现此功能,但可用性取决于您的环境和语言。
队列很简单,但在我的套接字讨论中列出了缺点。
布拉戈维茨对这个问题的答案涵盖了管道。
就像这种东西的情况一样,我建议阅读关于IPC和套接字的W. Richard Stevens书籍。没有比他更好的解释了! : - )