【问题标题】:What's the difference between the message passing and shared memory concurrency models?消息传递和共享内存并发模型有什么区别?
【发布时间】:2010-12-23 14:55:56
【问题描述】:

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

【问题讨论】:

    标签: concurrency shared-memory message-passing


    【解决方案1】:

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

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

    以此类推,假设我们正在与一个团队一起开展一个项目。在一个模型中,我们都挤在一张桌子旁,我们所有的论文和数据都摆好了。我们只能通过改变桌面上的东西来交流。我们必须小心,不要试图一次对同一条数据进行操作,否则会变得混乱,事情就会混淆。

    在消息传递模型中,我们都坐在办公桌前,拿着自己的一套文件。当我们想要的时候,我们可以将一篇论文作为“信息”传递给其他人,而那个工人现在可以用它做他们想做的事。我们只能访问我们面前的任何东西,所以我们永远不必担心有人会在我们总结它们的过程中伸手改变其中一个数字。

    好吧,愚蠢的类比!

    【讨论】:

    • 愚蠢的类比,但对创造力 +1。 :)
    • @SashaChedygov 你们或克里斯愿意解释一下为什么这是一个愚蠢的类比吗?
    • @Donbhupi 我的意思是这很愚蠢,因为它不是现实世界的场景。它作为一个类比非常有效,并且很好地映射了概念,它只是在我的脑海中创造了一个有趣的图像。就这样。 :)
    • @SashaChedygov 啊好的...我认为 Chris 的意思可能是谦虚的,我实际上发现这个类比非常出色和创新,所以只是想确保我没有错过任何特定的细节。感谢您的回复。
    【解决方案2】:
    1. 在共享内存模型中,内存由协作进程共享,它们可以通过读取和写入数据来交换信息,但在消息传递中,通信是通过协作进程之间交换的消息进行的。
    2. 共享内存有助于同时运行进程,但消息传递不能。
    3. 消息传递工具有两个操作:发送(消息)和接收(消息)。进程大小固定或可变。
    4. 消息传递对于交换少量数据很有用,因为不需要避免冲突。消息传递也比用于进程间通信的共享内存更容易实现。
    5. 在共享内存系统中,系统调用只需要建立共享内存区域。建立共享内存后,所有访问都被视为常规内存访问,无需内核提供帮助。

    更快

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

    【讨论】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 这个答案与朱纳德·艾哈迈德的答案几乎相同。你还有什么要补充的吗?
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        虽然您在询问消息传递模型和共享内存模型之间的差异,并且已经就它们的性能、交换信息的方式和并发问题得到了很好的答案,但我想指出:

        它们之间在可计算性方面可能没有根本差异(在某些条件下)。

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

        尤其是这篇论文ABD@JACM'95 表明

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

            要区分消息传递和共享内存,请考虑五件事:

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

            【讨论】:

            • 请编辑您的答案,使其更易于阅读。把它变成表格格式会更容易理解。
            【解决方案9】:

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

            【讨论】:

              【解决方案10】:

              在 DTU 计算 PI 的课程中​​进行了测试,MPI(消息传递)在我们的 HPC 上通常优于 pthreads 或 OpenMP(共享内存)。

              【讨论】:

              • 嗨,Kim,在回答您的下一个问题之前,请阅读writing answers!快乐编码:)
              猜你喜欢
              • 2012-11-27
              • 2021-01-29
              • 1970-01-01
              • 2013-10-31
              • 2012-10-31
              • 2012-12-15
              • 2015-01-13
              • 2012-08-11
              • 2011-04-03
              相关资源
              最近更新 更多