Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Concurrency 什么';消息传递和共享内存并发模型之间的区别是什么?_Concurrency_Shared Memory_Message Passing - Fatal编程技术网

Concurrency 什么';消息传递和共享内存并发模型之间的区别是什么?

Concurrency 什么';消息传递和共享内存并发模型之间的区别是什么?,concurrency,shared-memory,message-passing,Concurrency,Shared Memory,Message Passing,如果我错了,请纠正我,但我很惊讶以前没有人在这里问过这个问题…消息传递模型(例如Erlang)没有任何共享状态;所有的同步和通信都是通过交换消息来完成的。共享内存模型通过读/写共享内存块进行通信,共享内存块受信号量或类似的保护。这是一个非常简单的区别。在共享内存模型中,多个工作进程都对同一数据进行操作。这打开了许多并行编程中常见的并发问题 消息传递系统使工人通过消息传递系统进行通信。消息将每个人分隔开,以便工作人员无法修改彼此的数据 打个比方,假设我们正在和一个团队一起进行一个项目。在一个模型中

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

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

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

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

打个比方,假设我们正在和一个团队一起进行一个项目。在一个模型中,我们都围坐在一张桌子旁,所有的文件和数据都摆出来了。我们只能通过改变桌子上的东西来交流。我们必须小心,不要所有人都试图同时对同一块数据进行操作,否则它会变得混乱,事情会变得混乱

在信息传递模式中,我们都坐在办公桌前,拿着自己的一套文件。当我们想要的时候,我们可以把一张纸作为“信息”传递给其他人,而这个工人现在可以用它做他们想做的事情。我们只有接触到我们面前的任何东西,所以我们不必担心当我们在总结它们的时候,有人会到达并改变其中的一个数字。
好吧,愚蠢的类比

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

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

  • 在共享内存模型中,内存由协作进程共享,协作进程可以通过读写数据来交换信息,但在消息传递中,通信是通过协作进程之间交换的消息进行的
  • 共享内存有助于并发运行进程,但消息传递不能
  • 消息传递工具有两个操作:发送(消息)和接收(消息)。具有固定或可变大小的过程
  • 消息传递对于交换少量数据很有用,因为不需要避免冲突。对于进程间通信,消息传递也比共享内存更容易实现
  • 在共享内存系统中,系统调用仅用于建立共享内存区域。一旦建立了共享内存,所有访问都被视为例行内存访问,不需要内核的帮助
  • 更快
    共享内存允许最大的通信速度和便利性,就像在计算机中以内存速度进行通信一样。共享内存比消息传递更快,由于消息传递系统通常使用系统调用来实现,因此需要更耗时的内核干预任务。

    尽管您正在询问消息传递模型和共享内存模型之间的差异,并且已经对它们的性能、交换信息的方式有了很好的回答,以及并发性问题,我想指出:

    在可计算性方面(在某些条件下),它们之间不可能有根本的区别

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

    特别是,本文表明

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


    <>区分消息传递和共享内存考虑五个方面:

  • 通信:-在消息传递的情况下,通信取决于程序员,比如它将与哪个进程通信。 但在共享内存的情况下,通信是自动完成的
  • 数据分布:-m.p(手动) s、 m(自动)
  • H/W支持:-m.p(简单) s、 m(广泛,因为它必须智能地自动检测进程间)
  • 正确性:-m.p(困难) s、 m(难度较小)
  • 绩效:-m.p(难度) s、 m(非常难)`

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

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

    在DTU计算PI的课程中做了一个测试,MPI(消息传递)通常比我们HPC上的pthreads或OpenMP(共享内存)好。

    愚蠢的类比,但创造力+1。:)@SashaChedygov你们或者Chris愿意解释为什么这是一个愚蠢的类比吗?@Donbhupi,我的意思是