【发布时间】:2010-12-23 14:55:56
【问题描述】:
如果我错了,请纠正我,但我很惊讶以前没有在这里问过这个问题......
【问题讨论】:
标签: concurrency shared-memory message-passing
如果我错了,请纠正我,但我很惊讶以前没有在这里问过这个问题......
【问题讨论】:
标签: concurrency shared-memory message-passing
这是一个非常简单的区别。在共享内存模型中,多个工作人员都对相同的数据进行操作。这会引发很多并行编程中常见的并发问题。
消息传递系统使工作人员通过消息系统进行通信。消息将每个人分开,因此工作人员无法修改彼此的数据。
以此类推,假设我们正在与一个团队一起开展一个项目。在一个模型中,我们都挤在一张桌子旁,我们所有的论文和数据都摆好了。我们只能通过改变桌面上的东西来交流。我们必须小心,不要试图一次对同一条数据进行操作,否则会变得混乱,事情就会混淆。
在消息传递模型中,我们都坐在办公桌前,拿着自己的一套文件。当我们想要的时候,我们可以将一篇论文作为“信息”传递给其他人,而那个工人现在可以用它做他们想做的事。我们只能访问我们面前的任何东西,所以我们永远不必担心有人会在我们总结它们的过程中伸手改变其中一个数字。
好吧,愚蠢的类比!
【讨论】:
共享内存可实现最大的通信速度和便利性,因为它可以在计算机内以内存速度完成。共享内存比消息传递更快,因为消息传递系统通常使用系统调用实现,因此需要更耗时的内核干预任务。
【讨论】:
消息传递模型(例如 Erlang)没有任何共享状态;所有同步和通信都是通过交换消息来完成的。共享内存模型通过读/写共享内存块进行通信,共享内存块受信号量或类似的保护。
【讨论】:
消息传递是证明数据合理性的好方法,但它的响应时间很慢以加快通信速度。但是在共享内存模型中,数据是从一个内存中提取的,工作组可以对相同的数据执行不同的工作
【讨论】:
对于一些需要快速响应时间的应用程序来说,消息传递系统的吞吐量可能太低,但如果您需要更高的速度或实时处理,那么您可以使用共享内存系统。
【讨论】:
虽然您在询问消息传递模型和共享内存模型之间的差异,并且已经就它们的性能、交换信息的方式和并发问题得到了很好的答案,但我想指出:
它们之间在可计算性方面可能没有根本差异(在某些条件下)。
您可以在底层消息传递系统上模拟共享内存。这使得可以将共享内存模型视为用于在异步分布式消息传递系统中设计算法的高级语言。
尤其是这篇论文ABD@JACM'95 表明
只要至少大多数处理器没有故障并保持连接,任何基于原子、单写入器(和多写入器)多读取器寄存器的无等待算法都可以在消息传递系统中自动模拟.这些仿真引入的开销是系统中处理器数量的多项式。
【讨论】:
已经给出的答案提供了丰富的信息,但大多数人都提到了共享内存比消息传递更快的想法,这实际上是一个非常幼稚的说法。在任何有用的实际系统中,共享内存访问都需要锁定机制来控制来自单独线程的访问,这几乎总是比使用消息传递实现相同的系统要慢。
【讨论】:
要区分消息传递和共享内存,请考虑五件事:
【讨论】:
共享内存 S/m 要求通信过程共享一些变量。进程按预期通过使用这些共享变量来交换信息。在共享内存方案中,提供通信的责任在于应用程序程序员。操作系统只需要提供共享内存。
【讨论】:
在 DTU 计算 PI 的课程中进行了测试,MPI(消息传递)在我们的 HPC 上通常优于 pthreads 或 OpenMP(共享内存)。
【讨论】: