C#.NET MMF:通过内存映射文件实现专有通信只是重新命名命名管道吗?

Jan*_*Jan 3 c# ipc named-pipes memory-mapped-files

我需要在一台机器上实现非常快速,低延迟,高吞吐量的进程间(或应用程序间)通信.

消息通常每隔几毫秒流动一次(但在几分钟内,每毫秒甚至可能有多达3-5条消息),每条消息大约不到1KB,目标往返延迟最大为1ms(通过往返我的意思是交付一条消息,然后以某种方式回叫生产者,以宣布消费者是否想要"声明"该消息).

我做了一些研究,似乎内存映射文件是最快的可能性,但我需要专有实现它周围的整个通信堆栈(共享内存的分配和管理,将消息复制到其中并从中复制消息并向消费者发信号通知新消息已准备好被消费).我在Windows上看到了显示IPC方法体系结构的图片(http://blogs.msdn.com/b/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-in-net-4 .aspx)似乎这些方法已经使用了MMF.所以通过我所描述的 - 我不会通过重新实现Named Pipes已经做的事情来重新发明轮子.或者我实际上可以实现比命名管道提供的协议快得多的协议?

编辑1:将frgotten链接添加到图片,显示命名管道建立在MMF之上(http://blogs.msdn.com/b/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files- in-net-4.aspx)

Han*_*ant 6

是的,管道是位于内核内存池中的共享内存之上的抽象.内存映射文件位于底部,为您提供对共享内存的原始访问,而无需任何帮助您正确操作的内容,由您来仲裁对内存的访问和信号更改.

您引用的消息速率并不接近让管道很难跟上.典型的开销大约是1微秒的恒定OS开销加上复制消息所需的时间,由存储器总线的带宽设置.在最低端的具有DDR2 RAM的消费者PC上,每秒至少5千兆字节.具有本地环回的Socket具有完全相同的开销.在托管程序中的MMF也是如此,除非使用指针,否则复制数据是相当不可避免的.