C# 内存映射文件是否比命名管道更快?
我正在阅读SQL Server内部构件和故障排除(Wrox),它有效地指出,C# 内存映射文件是否比命名管道更快?,c#,.net,tcp,named-pipes,communication-protocol,C#,.net,Tcp,Named Pipes,Communication Protocol,我正在阅读SQL Server内部构件和故障排除(Wrox),它有效地指出,共享内存是默认的连接方法,然后是TCP,然后是命名管道。但奇怪的是,他们说: “命名管道是为局域网(LAN)开发的,但在速度较慢的网络(如广域网(WAN))中可能效率低下” 我以为命名管道完全是为了IPC?为了从IPC跳到网络通信,必须使用TCP/UDP。不过,我更感兴趣的是提到共享内存/内存映射文件——它们比命名的管道/IPC快吗?答案是,像往常一样,“这取决于”。如果涉及到大量数据,共享内存将大大减少复制数据的开销。
共享内存
是默认的连接方法,然后是TCP,然后是命名管道。但奇怪的是,他们说:
“命名管道是为局域网(LAN)开发的,但在速度较慢的网络(如广域网(WAN))中可能效率低下”
我以为命名管道完全是为了IPC?为了从IPC跳到网络通信,必须使用TCP/UDP。不过,我更感兴趣的是提到共享内存/内存映射文件——它们比命名的管道/IPC快吗?答案是,像往常一样,“这取决于”。如果涉及到大量数据,共享内存将大大减少复制数据的开销。但是以这种方式使用映射文件仍然需要一些附加形式的IPC来协调对共享内存空间的访问。IPC作为一个概念并不局限于一台机器,因此我不理解“我认为命名管道是严格为IPC命名的”这是一个好观点。我想我的意思是,我认为命名管道严格来说是为了在同一台机器上跨不同进程/应用程序域进行通信。哦,我明白了,所以本质上你仍然需要一个管道来协调内存映射文件的使用方式,在某些情况下,单独使用管道会更快吗?有趣。我想在我的情况下,内存映射文件是有意义的。只是为了证实/否认我的怀疑。管道是否严格用于同一台机器上的IPC,或者它们也可以通过网络使用?不,不需要管道来协调。您可以为标志和其他控制数据保留MMF的一个区域。当然,您必须小心同步。您也可以使用ManualResetEvent或其他信号事件进行同步。(管道可以通过网络使用)是的,这基本上是正确的;尽管管道之外还有其他机制可以用于协调。例如,System V消息队列或Mach IPC端口。