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

Concurrency 什么';消息传递模型和共享内存模型之间的区别是什么?,concurrency,shared-memory,message-passing,Concurrency,Shared Memory,Message Passing,这个问题与所问问题的主题重复 我想要求就不同的观点作进一步澄清 在分布式计算中,内存一致性最终是通过网络通道上的消息传递实现的,并带有分布式锁定等功能。消息传递IIUC并不总是消除并发性,除非是在非常低的级别,因为进程通常仍然会影响彼此的状态。他们这样做,以他们认为一贯的方式 例如,可以在消息传递的基础上实现一个简单的命令解释器,命令可以作为多个熟悉进程并行执行的多个远程事务的一部分发送。因此,在大多数情况下,高级交互需要并发设计。也就是说,在IMO中,流程不太可能没有长期操作的事务语义 此外,

这个问题与所问问题的主题重复

我想要求就不同的观点作进一步澄清

在分布式计算中,内存一致性最终是通过网络通道上的消息传递实现的,并带有分布式锁定等功能。消息传递IIUC并不总是消除并发性,除非是在非常低的级别,因为进程通常仍然会影响彼此的状态。他们这样做,以他们认为一贯的方式

例如,可以在消息传递的基础上实现一个简单的命令解释器,命令可以作为多个熟悉进程并行执行的多个远程事务的一部分发送。因此,在大多数情况下,高级交互需要并发设计。也就是说,在IMO中,流程不太可能没有长期操作的事务语义

此外,发送值处于一致状态的消息不能保证正确性。重要的是,这个值是如何产生的,以及在提供输入数据的消息和发布转换结果的消息之间发生了什么

另一方面,与物理内存的低级交互本质上总是通过总线传递某种消息。因此,在最低级别上,共享内存和消息传递是相同的

在每指令级别,通常保证对齐的加载和存储的原子性。所以,对我来说,区别仍然很模糊

在散文中,共享内存与消息传递的选择与并发性有什么关系?这仅仅是选择解决并发的技术模式和定义和分析并行进程交互的数学模型的问题,还是这些技术也是体系结构模式,当系统地应用时,它们从根本上影响系统中的并发问题

谢谢

编辑(一些附加备注):

显然,这两种方法在正确性和性能上是不同的。但是我有以下关于这种区别的问题

我知道消息可以像大的分散的虚拟数据的传输一样。然而,“按值”方法不能保证在原子读取非统一(或程序生成)逻辑数据之外没有同步的一致性。通过一致性,我暗示了一些东西,比如因果关系或变化的顺序,等等。事实上,随着消息传递,每个进程只会改变它自己的记忆。进程的行为就像其私有内存的控制器。这类似于在消息传递的基础上进行共享,由拥有数据的进程序列化,但以消息为基础(类似于内存以逐字或逐缓存线的方式序列化)。应用程序程序员仍有责任保证发送消息所涉及的事务的同步。也就是说,从多个熟悉的进程发送到一个进程的消息必须按照与这些进程正在执行的操作的语义相对应的一致顺序发送。可以通过控制消息发送给所属进程,也可以通过竞争者之间的直接协调,但是对消息并发性的一些限制很可能是必要的

对于本地进程间通信(忽略争用),共享内存确实可以更快,但对于跨机器通信,为什么会出现这种情况呢?分布式计算的共享内存是在网络通信的基础上实现的。因此,除了缓存的好处外,共享内存的速度也不可能更快


技术显然不同。我似乎无法理解的是,当两者都没有本质上的好处时,如何将它们广泛地相互比较。必须假设平台提供了什么,软件试图实现什么,而这种假设不可能普遍成立。

如果您正在设计分布式和/或多线程应用程序,则需要确保其性能优于单进程单线程应用程序

对于分布式应用程序,即潜在多个系统上的多个进程,通信节点之间的延迟是一个主要问题。随着微服务器的出现,延迟和功耗显著降低,软件开发人员应该开始考虑如何设计、开发、调试、部署等多核/微服务器应用程序

在开发多进程应用程序时,通常归结为在最底层使用两组操作系统调用来实现进程间通信:共享内存,如使用shmget、shmat、shmctl等;消息传递,如使用套接字、接受、发送、recv等

对于共享内存,延迟可以忽略不计。一旦获得对共享内存缓冲区的引用,应用程序就可以转到共享内存的任何部分并对其进行修改。当然,进程必须使用锁、互斥锁等进行协作,以确保数据结构的完整性得到维护,并确保应用程序正常工作。这个解决方案的问题是,在无法控制上下文切换何时发生的情况下,如何测试保持完整性的所有情况

通过消息传递,不会共享任何数据。所有通信都是通过交换缓冲区进行的。这样就不必担心锁、互斥等问题,但现在必须确保应用程序能够处理网络超时、带宽、延迟等问题

为了开发能够扩展到单个系统之外的应用程序,最常用的方法是使用消息传递。如果通信进程恰好在同一台主机上,则