【问题标题】:C#.NET MMF: Is implementation of proprietary communication over Memory Mapped file just reinvention of Named Pipes?C#.NET MMF:通过内存映射文件实现专有通信只是对命名管道的重新发明吗?
【发布时间】:2013-09-20 06:39:59
【问题描述】:

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

消息通常每隔几毫秒流动一次(但在几分钟内,每毫秒甚至可以有多达 3-5 条消息),每条消息大约不到 1KB,目标往返延迟最大为 1 毫秒(通过往返 I意味着传递消息,然后以某种方式回调生产者以宣布消费者是否想要“声明”消息)。

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

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

【问题讨论】:

  • 我非常怀疑您是否会在 Windows 上获得这种速度 - 它不是 RTOS。

标签: c# ipc named-pipes memory-mapped-files


【解决方案1】:

是的,管道是位于内核内存池中的共享内存之上的抽象。内存映射文件位于底部,让您可以对共享内存进行原始访问,而无需任何帮助您正确处理它,由您决定对内存的访问和信号更改。

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

【讨论】:

  • 感谢您提供非常详细和技术性的答复! - 我正是在寻找类似的回应。因此,我将其标记为已回答,但您在答案的末尾提到了一个指针,从而引起了我的兴趣。你的意思是这样的:geekswithblogs.net/akraus1/archive/2012/07/25/150301.aspx 还是“不那么疯狂,更受支持”的东西?我很想知道:-)
猜你喜欢
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多