在 ZeroMQ 中,"inproc + PAIR" 比 "inproc" 快吗?

In ZeroMQ, is "inproc + PAIR" faster than "inproc"?

在 ZeroMQ 的指南中,是这样的:

If you use inproc and socket pairs, you are building a tightly-bound application, i.e., one where your threads are structurally interdependent. Do this when low latency is really vital.

我非常关心我的应用程序的延迟。

问题:

inproc-ness 肯定会成为其中的重要组成部分。我猜测对于 inproc 传输,与操作系统的交互是最低限度的;因此,在 OS 开销最少的情况下(消息传输可能比 memcpy 多一点,可能是一个或两个信号量,或类似的)它尽可能快。

与其他传输、ipc、tcp 等相比;他们都深入到需要大量工作的 OS 中。例如,ipc(管道)涉及从源缓冲区复制到 OS 缓冲区,然后从该缓冲区复制回目标缓冲区,以及从用户到 OS 执行上下文的所有转换,以及如果消息长度 > 4kB(或者系统页面大小是多少),就会有更多消息。对于 inproc 传输,不存在转换(信号量可能有一个或两个)并且可能少一个 memcpy。同样,深入研究 tcp 堆栈需要很多可变性。

PAIR 对分发模式的复杂性和开销也最小。严格来说是一对一,仅此而已。所以这也很低的开销。这是我对 this section in The Guide 的解读,您已经看到了。 PUB/SUB,等等都有更多的事情发生,比一对一的交流所必需的更多。

最小化 OS 交互和复杂性相结合,以最大限度地减少延迟。 OS 交互的最小值也将在某些平台上帮助保持延迟相当一致。

我对 ZeroMQ 的内部结构了解不深,但是在实时 OS 之上的 inproc+PAIR 很有可能在延迟方面提供非常好的一致性。通常,延迟的一致性与延迟的短小一样重要。

如果你从未使用过 ZeroMQ,
在深入了解更多细节之前,您可能会喜欢先看看 "ZeroMQ "


Q : is it the "inproc-ness" alone that makes it low-latency?

是的,。 . .由于bazza昨天已经放了一般,让我补充几分钱:

1) inproc://-transport-class是stack-更少、无协议和纯(因此快速且几乎为零延迟)RAM 内存区域映射工具

(如第二个问题中所问)

Q : Or is there something special about "inproc + PAIR" that is faster than inproc + "WHATEVER"?

2) PAIR/PAIR-Scalable-Formal-Communication-Pattern archetype 没有添加额外的,Pattern 的原型相关,多(多)方行为握手(与其他一些分布式有限状态自动机(表达 模式的原型行为所有分布式对等点之间的状态和转换-不具有PAIR/PAIR排他性一对一digital fire-hose ) 所以这里没有添加任何东西,除了两侧的线程安全本地指针机制加上一些 Context()-instance 信号 - 顺便说一句。你可能已经注意到,对于一个纯 inproc://-transport-class 应用程序,您可以实例化具有 Zero-I/O-threads 的 Context( 0 ),在这些情况下,Context()-signaling 根本不需要它们,因为它只是管理本地 RAM 内存区域上的指针技巧——太可爱了,不是吗?)