3

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

消息通常每隔几毫秒就会流动一次(但在几分钟内,每毫秒甚至可能有 3-5 条消息),每条消息的大小都在 1KB 以下,目标往返延迟最大为 1 毫秒(往返是指传递一条消息,然后以某种方式回调生产者以宣布消费者是否想要“声明”该消息)。

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

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

4

1 回答 1

6

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

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

于 2013-09-16T12:07:38.113 回答