有人能说,与共享内存(或备用内存映射文件)相比,UNIX域套接字有多慢?
感谢。
答案 0 :(得分:66)
这更像是一个设计问题,而不是速度(共享内存 更快),域套接字明显更具UNIX风格,并且可以解决更少的问题。在事先知道的选择方面:
域套接字优势
域套接字缺点
共享内存优势
共享内存不利
这就是我现在所能想到的。但是,我每天都会使用域套接字 - 更不用说重新实现它们来分布式计算要容易得多。由于需要安全设计,共享内存的速度增益将会丢失。但是,如果您确切知道自己在做什么,并使用正确的内核调用,那么可以通过共享内存实现更快的速度。
答案 1 :(得分:10)
在速度方面,共享内存绝对是赢家。使用套接字,您将拥有至少两个数据副本 - 从发送进程到内核缓冲区,然后从内核到接收进程。对于共享内存,延迟仅受到盒子核心之间的缓存一致性算法的约束。
正如Kornel所指出的那样,处理共享内存更加复杂,因为你必须提出自己的同步/信令方案,这可能会增加延迟,具体取决于你走的路线。绝对在共享内存中使用信号量(在Linux上用futex实现),以避免在非竞争情况下进行系统调用。
答案 2 :(得分:4)
两者都是进程间通信(IPC)机制。 UNIX域套接字用于一个主机上的进程之间的通信,类似于在不同主机之间使用TCP套接字。 共享内存(SHM)是一块内存,您可以在其中放置数据并在进程之间共享。 SHM通过使用指针为您提供随机访问,可以写入或读取套接字,但您无法倒带或进行定位。
答案 3 :(得分:0)
在这种情况下 - 套接字更快。写入共享内存比任何IPC都要快,但是写入内存映射文件并写入共享内存是完全不同的事情。
当写入内存映射文件时,您需要将写入共享内存的内容“刷新”到实际的绑定文件(不完全是,正在为您完成刷新),因此您首先将数据复制到共享内存,然后你再次复制(刷新)到实际文件,这是超级duper扩展 - 甚至更多,甚至更多,然后写入套接字,你没有做到这一点。
答案 4 :(得分:0)
@Kornel Kisielewicz 的回答是很好的 IMO。只是在这里添加我自己的套接字结果,而不仅仅是 Unix 域套接字。
共享内存
套接字
在我的测试中,小块数据的交换(大约 1MB/秒)显示共享内存没有真正的优势。我什至会说使用 TCP 的 ping/pong 交换速度更快(由于简单有效的信号机制)。 但是在交换大量数据(大约 200 兆字节/秒)时,我使用套接字的 CPU 消耗为 20%,而使用共享内存的 CPU 消耗为 3%。因此,共享内存在 CPU 方面取得了巨大的胜利,因为 read
和 write
套接字调用并不便宜。