有人能告诉我,UNIX域套接字与共享内存(或替代的内存映射文件)相比有多慢吗?
谢谢。
这更多是一个设计问题,而不是速度问题(共享内存确实更快),域套接字明显更符合UNIX风格,且会出现较少的问题。在选择时要事先了解:
域套接字优点
域套接字缺点
共享内存优点
共享内存缺点
这就是我现在所能想到的全部。但是,我会每天都选择域套接字——更不用说重新实现它们以进行分布式计算要容易得多。由于需要安全设计,共享内存的速度优势将会丧失。但是,如果您确切地知道自己在做什么,并使用适当的内核调用,您就可以通过共享内存获得更高的速度。
就速度而言,共享内存绝对是胜者。通过套接字,数据至少会复制两次——从发送进程到内核缓冲区,然后从内核到接收进程。而使用共享内存,延迟只受限于盒子上的核之间的高速缓存一致性算法。
正如Kornel所指出的那样,处理共享内存更加复杂,因为您必须想出自己的同步/信号方案,这可能会根据您选择的路线增加延迟。在共享内存中一定要使用信号量(在Linux上实现为futex),以避免在非竞争情况下进行系统调用。
两者都是进程间通信(IPC)机制。 UNIX域套接字用于在同一主机上的进程之间进行通信,类似于TCP套接字用于不同主机之间的通信。 共享内存(SHM)是一个内存片段,您可以将数据放入其中并在进程之间共享此数据。 使用指针,SHM提供随机访问,套接字可以被写入或读取,但您无法倒带或定位。
@Kornel Kisielewicz的回答我认为很好。这里只是为了sockets添加我的结果,不仅涉及Unix域套接字。
共享内存
套接字
在我的测试中,小块数据的交换(每秒约1MB)对于共享内存没有真正的优势。我甚至要说,由于简单而有效的信令机制,使用TCP的Ping/Pong交换更快。但是,当交换大量数据时(约每秒200MB),使用套接字时,CPU消耗20%,而使用共享内存时仅消耗3%的CPU。因此,在CPU方面,共享内存取得了巨大的胜利,因为read和write套接字调用并不便宜。
/dev/ashmem
来解决。 - Vi.