消息传递和共享内存并发模型有什么区别?

59

如果我说错了,请纠正我,但是我很惊讶这个问题在这里之前竟然没有被问过...

10个回答

125
这是一个相当简单的区别。在共享内存模型中,多个工作进程都会操作相同的数据。这会引发许多并行编程中常见的并发问题。
消息传递系统使工作进程通过消息传递来进行通信。消息使每个工人都分开,因此工作者无法修改彼此的数据。
类比一下,假设我们一起在项目中与团队合作。在一个模型中,我们都挤在桌子周围,所有的文件和数据都摆在那里。我们只能通过更改桌子上的东西来沟通。我们必须小心,不要同时尝试操作同一个数据,否则会变得混乱,事情也会搞砸。
在消息传递模型中,我们都坐在各自的桌子前,有自己的一堆纸。当我们想要时,我们可以将一张纸传递给其他人作为“消息”,然后该工作者现在可以随心所欲地使用它。我们只能够访问我们面前的内容,因此我们永远不必担心有人在我们正在求和过程中更改数字之一。
好吧,这个比喻有点傻!

21
愚蠢的类比,但创意值得赞赏。 :) - Sasha Chedygov
1
@SashaChedygov,你们两个或者Chris能否解释一下为什么这个比喻很愚蠢? - Donbhupi
@Donbhupi 我只是觉得这个场景不太现实,所以有点傻。它作为类比非常好,并且与概念很相似,只是在我的脑海中产生了一个有趣的形象。仅此而已。 :) - Sasha Chedygov
2
@SashaChedygov 哦,好的...我认为Chris可能是以一种谦虚的方式表达的,而且我实际上觉得这个比喻非常出色和创新,所以只是想确保我没有错过任何特别的细节。感谢回复。 - Donbhupi

20
  1. 在共享内存模型中,进程共享内存,可以通过读写数据交换信息;而在消息传递中,进程之间通过交换消息进行通信。
  2. 共享内存可以帮助进程并发运行,而消息传递不能。
  3. 消息传递设施有两个操作:发送消息和接收消息。它们的过程具有固定或可变大小。
  4. 消息传递对于交换少量数据很有用,因为无需避免冲突。消息传递比共享内存更容易实现进程间通信。
  5. 在共享内存系统中,只需要使用系统调用来建立共享内存区域。一旦共享内存建立,所有访问都被视为例行内存访问,不需要内核的帮助。

Faster

共享内存允许最大限度地提高通信的速度和便利性,因为在计算机内部进行时,通信速度可以达到内存速度。与消息传递相比,共享内存更快,因为消息传递系统通常使用系统调用来实现,从而需要更耗时的内核干预任务。


6
关于第二点,我认为在消息传递模型中可以实现并发,方法是将消息广播给其他可以同时开始工作的工作者。显然,需要其他编排方法来合并输出结果。我同意在共享内存模型中可能更快,但消息传递模型确实支持并发进程执行。 - Juan Zamora
4
现在,由于系统调用的原因,我们不能说共享内存比消息传递更快。来自操作系统概念书籍(Abraham Silberschatz)的最新研究结果表明,在多核处理器系统中,消息传递提供比共享内存更好的性能。共享内存存在缓存一致性问题,这是由于共享数据在几个缓存之间移动而产生的。随着系统处理器核心数量的增加,可能会看到消息传递成为进程间通信的首选机制。 :) - serkan kucukbay
2
#2和#5是错误的(#5可能在形式上是正确的,但实际上,您需要在数据同步上进行同步,这反过来又需要轮询或内核同步)。 - No-Bugs Hare

12

消息传递模型(例如Erlang)没有任何共享状态;所有同步和通信都是通过交换消息来完成的。共享内存模型则通过读写共享的内存块来通信,这些内存块受到信号量或类似机制的保护。


4

消息传递是一种良好的数据处理方法,但在实现更快速的通信时响应时间较慢。而在共享内存模型中,数据从一个内存中提取出来,一个工作组可以对同一数据进行不同的处理。


2
这个答案几乎和Juned Ahmed的一样。你有什么要补充的吗? - Artemix

4
虽然你询问了消息传递模型和共享内存模型之间的区别,并已经得到了关于它们性能、信息交换方式和并发问题的良好答案,但是我想指出一点:
在某些条件下,它们在可计算性方面没有根本区别。您可以在基础消息传递系统上模拟共享内存。这使得可能将共享内存模型视为在异步分布式消息传递系统中设计算法的高级语言。
特别地,本文 ABD@JACM'95 表明:
任何基于原子、单写者(和多写者)多读者寄存器的无等待算法都可以自动在消息传递系统中仿真,只要至少大多数处理器不故障并保持连接。由这些仿真引入的开销在系统中的处理器数量多项式级别。

4
已经给出的答案非常有用,但大多数人提到了共享内存比消息传递更快的想法,这实际上是一个相当幼稚的陈述。在任何真正有用的系统中,进行共享内存访问需要锁定机制来控制来自不同线程的访问,这几乎总是比使用消息传递实现相同系统更慢。

2

对于某些需要快速响应时间的应用程序而言,消息传递系统的吞吐量可能过低,但如果需要更高的速度或实时处理,则可以使用共享内存系统。


0

共享内存 S/m需要通信进程共享一些变量。这些进程预计通过使用这些共享变量来交换信息。在共享内存方案中,提供通信的责任在于应用程序员。操作系统只需要提供共享内存。


0

为了区分消息传递和共享内存,请考虑以下五个方面:

  1. 通信:在消息传递的情况下,通信取决于程序员,例如它将与哪个进程进行通信。但是,在共享内存的情况下,通信是自动完成的。
  2. 数据分配:m.p(手动),s.m(自动)
  3. 硬件支持:m.p(简单),s.m(广泛),因为它必须智能地自动检测进程间的交互
  4. 正确性:m.p(困难),s.m(较不困难)
  5. 性能:m.p(困难),s.m(非常困难)

2
请编辑您的答案,使其更易于阅读。将其放入表格格式中会使理解更容易。 - Tim Morton

0
在DTU的一门课程中进行了一个计算PI的测试,结果发现MPI(消息传递)在我们的HPC上通常比pthreads或OpenMP(共享内存)更好。

1
嗨,金姆,请在回答下一个问题之前阅读有关撰写答案的内容!祝编码愉快 :) - Diggy.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接