如果我错了,请纠正我,但我很惊讶以前没有问过这里......
答案 0 :(得分:90)
这是一个非常简单的区别。在共享内存模型中,多个工作程序都对相同的数据进行操作。这开辟了许多并行编程中常见的并发问题。
消息传递系统使工作人员通过消息传递系统进行通信。消息使每个人都分开,这样工作人员就无法修改彼此的数据。
通过类比,假设我们正在与一个项目团队一起工作。在一个模型中,我们都围着桌子挤满了所有的论文和数据。我们只能通过改变桌子上的东西进行交流。我们必须要小心,不是所有人都试图同时对同一条数据进行操作,否则会让人感到困惑,事情会变得混乱。
在一个消息传递模型中,我们都坐在办公桌旁,拿着自己的一套文件。当我们想要时,我们可以将纸张作为“消息”传递给其他人,并且该工作人员现在可以用它做他们想做的事情。我们只能访问我们面前的任何内容,因此我们永远不必担心有人会在我们处理它们的过程中达到并更改其中一个数字。
好的,傻比喻!
答案 1 :(得分:15)
共享内存可以实现最大的通信速度和便利性,因为它可以在计算机内以内存速度完成。共享内存比消息传递更快,因为消息传递系统通常使用系统调用来实现,因此需要更耗时的内核干预任务。
答案 2 :(得分:10)
消息传递模型(例如Erlang)没有任何共享状态;通过交换消息完成所有同步和通信。共享内存模型通过读/写共享内存块进行通信,共享内存块受信号量或类似内容保护。
答案 3 :(得分:4)
消息传递是证明数据合理性的好方法,但它的响应时间较慢,以便更快地进行通信。但是在共享内存模型中,数据是从一个内存中提取的,而工作组可以在相同的数据上进行不同的工作
答案 4 :(得分:3)
对于需要快速响应时间的某些应用程序,消息传递系统的吞吐量可能太低,但如果您需要更高的速度或实时处理,则可以使用共享内存系统。
答案 5 :(得分:2)
虽然你要求消息传递模型和共享内存模型之间的差异,并且已经有关于它们的性能,交换信息的方式和并发问题的良好答案,我想指出:
关于它们的可计算性(在某些条件下),它们之间可能存在 no 的基本差异。
您可以在基础消息传递系统上模拟共享内存。这使得可以将共享内存模型视为用于在异步分布式消息传递系统中设计算法的更高级语言。
特别是,本文ABD@JACM'95显示了
基于原子,单写入器(和多写入器)多读取器寄存器的任何无等待算法都可以在消息传递系统中自动模拟,前提是至少大多数处理器没有故障并保持连接。这些仿真引入的开销是系统中处理器数量的多项式。
答案 6 :(得分:1)
要区分消息传递和共享内存,请考虑以下五点:
答案 7 :(得分:1)
已经给出的答案是有用的,但是大多数人提到共享内存比消息传递更快的想法,这实际上是一个非常幼稚的声明。在任何执行有用操作的实际系统中,共享内存访问都需要使用锁定机制来控制来自单独线程的访问,与使用消息传递来实现同一系统相比,这几乎总是慢得多。
答案 8 :(得分:0)
共享内存 S / m要求通信过程共享一些变量。预期通过使用这些共享变量来交换信息的过程。在共享内存方案中,提供通信的责任在于应用程序程序员。操作系统仅需要提供共享内存。
答案 9 :(得分:0)
在DTU的一门课程中进行了一次计算PI的测试,并且在HPC上,MPI(消息传递)通常比pthreads或OpenMP(共享内存)要好。