UNIX域套接字与共享内存(映射文件)
谁能告诉,与共享内存(或替代内存映射文件)相比,UNIX域套接字有多慢?
谢谢。
这更多的是一个devise问题,而不是速度(共享内存更快),域套接字明确地更多的UNIX风格,并且执行更less的问题。 在select方面事先知道:
域套接字的优点
- 阻塞和非阻塞模式以及它们之间的切换
- 任务完成后,您不必释放它们
域套接字的缺点
- 必须以线性方式读写
共享内存的优势
- 非线性存储
- 永远不会阻止
- 多个程序可以访问它
共享内存的缺点
- 需要locking实现
- 即使未被任何程序使用,也需要手动释放
这就是我现在能想到的。 但是,我会随时使用域套接字 – 更不用说重新实现分布式计算要容易得多了。 共享内存的速度增益将因为安全devise的需要而丢失。 但是,如果您确切知道自己在做什么,并使用正确的内核调用,则可以使用共享内存实现更高的速度。
速度共享内存绝对是赢家。 使用套接字,您将至less拥有两个数据副本 – 从发送进程到内核缓冲区,然后从内核到接收进程。 通过共享内存,延迟将仅受框中内核之间的caching一致性algorithm的约束。
正如Kornel指出的那样,处理共享内存更为重要,因为您必须提出自己的同步/信令scheme,这可能会根据您走哪条路线而增加延迟。 在共享内存中肯定使用信号量(在Linux上使用futex实现),以避免非竞争情况下的系统调用。
两者都是进程间通信(IPC)机制。 UNIX域套接字用于在一个主机上的进程之间进行通信,类似于在不同主机之间使用TCP-套接字。 共享内存(SHM)是一块内存,您可以在其中放入数据并在进程之间共享。 SHM通过使用指针为您提供随机访问,套接字可以被写入或读取,但不能倒带或定位。
在这种情况下 – 套接字更快。 写入共享内存比任何IPC都快,但写入内存映射文件和写共享内存是完全不同的事情。
当写入内存映射文件时,您需要将写入共享内存的内容“刷新”到实际绑定的文件(不完全是为您完成刷新),因此您先将数据复制到共享内存,然后那么你再次复制(刷新)到实际的文件,这是超duper膨胀 – 超过任何东西,甚至更多的写入套接字,你没有得到这样做。