消息传递与锁定

Pup*_*ppy 8 concurrency message-passing

在性能方面,消息传递并发方案和基于锁的并发方案之间究竟有什么区别?正在等待锁定的线程阻塞,因此其他线程可以运行.因此,我没有看到消息传递如何比基于锁的并发更快.

编辑:具体来说,我正在讨论像Erlang中的消息传递方法,与使用锁(或原子操作)的共享数据方法相比.

seh*_*seh 9

正如其他人所建议的("苹果和橘子"),我认为这两种技术是正交的.这里的基本假设似乎是选择一个或另一个:我们要么使用锁定和共享资源,要么我们将使用消息传递,而另一个则不需要,或者另一个甚至不可用.

就像一个元气流评估者一样,这里的真实原语并不明显.例如,为了实现消息传递,您可能需要原子CAS和特定的内存可见性语义,或者可能需要一些锁定和共享状态.可以根据锁实现原子操作,或者可以根据原子操作实现锁(就像Java在其java.util.concurrent.locks类型中所做的那样).

同样,虽然不可否认是一个延伸,但可以通过消息传递实现锁定.询问哪一个表现更好一般来说没有多大意义,因为这实际上是一个关于哪个是建立在哪个方面的问题.最有可能的是,处于较低级别的程序员可以由一个有能力的程序员驱动,而不是建立在最高级别的程序员 - 直到最近一直是手动变速器汽车的情况(在那里也是一场辩论).

通常,消息传递方法不是为了获得更好的性能,而是为了安全和方便,并且通常通过拒绝程序员对锁定和共享资源的控制来销售.结果,它打击了程序员的能力; 如果程序员无法获得锁定,他就无法做得很差并且减慢了程序的速度.就像关于手动内存管理和垃圾收集的争论一样,有些人会声称自己是"好的驱动因素",充分利用手动控制; 其他人 - 特别是那些实施和推广使用垃圾收集器的人 - 将声称,总的来说,收集者可以做得比"不太好的司机"更好,可以通过手动管理.

没有绝对的答案.这里的区别在于程序员的技能水平,而不是他们可能使用的工具.


aru*_*esh 5

恕我直言,消息传递可能不完全是并发方案。它基本上是(IPC)进程间通信的一种形式,是共享对象的替代方案。Erlang 只是喜欢将消息传递给共享对象。

共享对象的缺点(消息传递的优点):

  • 在多个线程并发运行的上下文中,可变/共享对象的状态更难推理。
  • 同步共享对象会导致算法本质上是非wait free或非lock free.
  • 在多处理器系统中,共享对象可以跨处理器缓存复制。即使使用不需要同步的基于比较和交换的算法,也可能会花费大量处理器周期向每个处理器发送缓存一致性消息。
  • 由消息传递语义构建的系统本质上更具可扩展性。由于消息传递意味着消息是异步发送的,因此在接收方对消息进行操作之前,不需要发送方阻塞。

共享对象的优点(消息传递的缺点):

  • 一些算法往往要简单得多。
  • 需要锁定资源的消息传递系统最终将退化为共享对象系统。当程序员开始使用 ets 表等来存储共享状态时,这有时在 Erlang 中很明显。
  • 如果算法是无等待的,您将看到性能提高和内存占用减少,因为新消息形式的对象分配要少得多。


Era*_*man 2

当您只想锁定时使用消息传递是错误的。在这些情况下,请使用锁定。然而,消息传递给您带来的不仅仅是锁定——正如其名称所暗示的,它允许您在线程或进程之间传递消息,即数据。