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

时间:2009-12-05 20:04:31

标签: concurrency shared-memory message-passing

如果我错了,请纠正我,但我很惊讶以前没有问过这里......

10 个答案:

答案 0 :(得分:90)

这是一个非常简单的区别。在共享内存模型中,多个工作程序都对相同的数据进行操作。这开辟了许多并行编程中常见的并发问题。

消息传递系统使工作人员通过消息传递系统进行通信。消息使每个人都分开,这样工作人员就无法修改彼此的数据。

通过类比,假设我们正在与一个项目团队一起工作。在一个模型中,我们都围着桌子挤满了所有的论文和数据。我们只能通过改变桌子上的东西进行交流。我们必须要小心,不是所有人都试图同时对同一条数据进行操作,否则会让人感到困惑,事情会变得混乱。

在一个消息传递模型中,我们都坐在办公桌旁,拿着自己的一套文件。当我们想要时,我们可以将纸张作为“消息”传递给其他人,并且该工作人员现在可以用它做他们想做的事情。我们只能访问我们面前的任何内容,因此我们永远不必担心有人会在我们处理它们的过程中达到并更改其中一个数字。

好的,傻比喻!

答案 1 :(得分:15)

  1. 在共享内存模型中,内存由协作进程共享,协作进程可以通过读写数据来交换信息,但是消息传递通过协作进程之间交换的消息进行通信。
  2. 共享内存有助于同时运行进程,但邮件传递不能。
  3. 消息传递工具有两个操作:send(消息)和receive(消息)。其过程具有固定或可变的大小。
  4. 消息传递对于交换较少量的数据很有用,因为不需要避免冲突。与用于进程间通信的共享内存相比,消息传递更容易实现。
  5. 在共享内存系统中,仅需要系统调用来建立共享内存区域。一旦建立了共享内存,所有访问都被视为例行内存访问,并且不需要内核的帮助。
  6. 更快

    共享内存可以实现最大的通信速度和便利性,因为它可以在计算机内以内存速度完成。共享内存比消息传递更快,因为消息传递系统通常使用系统调用来实现,因此需要更耗时的内核干预任务。

答案 2 :(得分:10)

消息传递模型(例如Erlang)没有任何共享状态;通过交换消息完成所有同步和通信。共享内存模型通过读/写共享内存块进行通信,共享内存块受信号量或类似内容保护。

答案 3 :(得分:4)

消息传递是证明数据合理性的好方法,但它的响应时间较慢,以便更快地进行通信。但是在共享内存模型中,数据是从一个内存中提取的,而工作组可以在相同的数据上进行不同的工作

答案 4 :(得分:3)

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

答案 5 :(得分:2)

虽然你要求消息传递模型和共享内存模型之间的差异,并且已经有关于它们的性能,交换信息的方式和并发问题的良好答案,我想指出:

  

关于它们的可计算性(在某些条件下),它们之间可能存在 no 的基本差异。

您可以在基础消息传递系统上模拟共享内存。这使得可以将共享内存模型视为用于在异步分布式消息传递系统中设计算法的更高级语言。

特别是,本文ABD@JACM'95显示了

  

基于原子,单写入器(和多写入器)多读取器寄存器的任何无等待算法都可以在消息传递系统中自动模拟,前提是至少大多数处理器没有故障并保持连接。这些仿真引入的开销是系统中处理器数量的多项式。

答案 6 :(得分:1)

要区分消息传递和共享内存,请考虑以下五点:

  1. 通信: - 在消息传递的情况下,通信依赖于程序员,以及它将与之通信的进程。 但是在共享内存通信的情况下会自动完成。
  2. 数据分发:-m.p(手动) S.M(自动)
  3. H / W支持: - m.p(简单) s.m(广泛,因为它必须是智能的,以自动检测进程间)
  4. 正确性:-m.p(难) s.m(不太困难)
  5. 性能:-m.p(难) s.m(非常困难)`

答案 7 :(得分:1)

已经给出的答案是有用的,但是大多数人提到共享内存比消息传递更快的想法,这实际上是一个非常幼稚的声明。在任何执行有用操作的实际系统中,共享内存访问都需要使用锁定机制来控制来自单独线程的访问,与使用消息传递来实现同一系统相比,这几乎总是慢得多。

答案 8 :(得分:0)

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

答案 9 :(得分:0)

在DTU的一门课程中进行了一次计算PI的测试,并且在HPC上,MPI(消息传递)通常比pthreads或OpenMP(共享内存)要好。