代码之家  ›  专栏  ›  技术社区  ›  Jan

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

  •  3
  • Jan  · 技术社区  · 12 年前

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

    消息通常每隔几毫秒就会流动一次(但在几分钟的窥视过程中,每毫秒甚至可能有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。 因此,根据我的描述,我真的不会通过重新实现命名管道已经做的事情来重新发明轮子吗。或者,我真的可以实现比命名管道更快的协议吗?

    第1版:将frget链接添加到显示Named Pipes构建在MMF之上的图片中( http://blogs.msdn.com/b/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-in-net-4.aspx )

    1 回复  |  直到 12 年前
        1
  •  6
  •   Hans Passant    12 年前

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

    您所引用的消息速率还不足以让管道很难跟上。典型的开销大约是1微秒的恒定操作系统开销加上复制消息所需的时间,由内存总线的带宽设置。在具有DDR2 RAM的最低消费级PC上,每秒至少5 GB。具有本地环回的套接字具有完全相同的开销。托管程序中的MMF也是如此,除非使用指针,否则复制数据是不可避免的。

    推荐文章