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

bla*_*ank 44 concurrency message-passing shared-memory

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

Chr*_*man 99

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

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

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

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

好吧,傻比喻!

  • 愚蠢的比喻,但创造力+1.:) (16认同)
  • @SashaChedygov 啊好吧...我认为克里斯可能是以一种谦虚的方式表达的,我实际上发现这个类比非常出色和创新,所以只是想确保我没有错过任何特定的细节。感谢您的回复。 (2认同)

小智 17

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

快点

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

  • 在第2点),我认为通过向可以同时开始工作的其他工作人员广播消息,可以在消息传递模型中实现并发性.显然,它需要其他编排方法来加入输出.我同意这在共享内存模型上可能更快,但消息传递模型确实支持并发进程执行 (4认同)
  • 现在,我们不能因为系统调用而说共享内存比消息传递快。来自操作系统概念书 (Abraham Silberschatz) 的“最近对具有多个处理核心的系统的研究表明,在此类系统上,消息传递提供比共享内存更好的性能。共享内存存在缓存一致性问题,这是因为共享数据在多个处理核心之间迁移而出现的缓存。随着系统上处理核心数量的增加,我们有可能将消息传递视为 IPC 的首选机制。:) (2认同)
  • #2 和 #5 是错误的(#5 可能在形式上是正确的,但实际上,您需要同步数据,而这又需要轮询或内核同步)。 (2认同)

Jes*_*erE 10

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


小智 5

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

  • 这个答案与朱尼德·艾哈迈德的答案几乎相同。您还有什么要补充的吗? (2认同)