【发布时间】:2012-11-27 06:12:18
【问题描述】:
问题与here提出的问题的主题重复。
我想就不同的观点要求进一步澄清。
在分布式计算中,内存一致性最终是通过网络通道上的消息传递、分布式锁定等来实现的。消息传递,IIUC,并不总是消除并发性,除非在非常低的级别,因为进程通常仍然会影响彼此的状态。他们以他们认为一致的方式这样做。
例如,可以在消息传递之上实现一个简单的命令解释器,并且可以将命令作为从多个熟悉进程并行执行的多个远程事务的一部分发送。因此,在大多数情况下,高级交互需要设计并发性。也就是说,IMO,进程不太可能没有长期操作的事务语义。
此外,发送具有一致状态值的消息并不能保证正确性。重要的是,这个值是如何产生的,以及在提供输入数据的消息和发布转换结果的消息之间发生了什么。
另一方面,与物理内存的低级交互本质上总是某种通过总线传递的消息。因此,在最低级别,共享内存和消息传递是相同的。
在每条指令级别,对齐加载和存储的原子性通常得到保证。所以,区别对我来说仍然是模糊的。
在散文中,共享内存与消息传递的选择与并发性有何关系?解决并发问题只是选择技术模式,定义和分析并行进程交互的数学模型,还是这些技术也是架构模式,当系统应用时,会从根本上影响系统中的并发问题?
谢谢。
编辑(一些补充说明):
显然,这两种方法的区别在于正确性和性能。但我对这种区别有以下问题。
我知道消息可以像大型分散虚拟数据的传输一样。但是,“按值”方法不能保证一致性,除非在非单一(或程序生成的)逻辑数据的原子读取之外没有同步。通过一致性,我暗示了诸如因果关系或更改的顺序等。实际上,通过消息传递,每个进程只会改变自己的内存。进程的作用就像其私有内存的控制器。这就像在消息传递之上共享,由拥有数据的进程序列化,但在 MESSAGE-BY-MESSAGE 的基础上(类似于内存逐字或逐个缓存行序列化的方式)基础)。应用程序程序员仍然有责任保证发送消息所涉及的事务的同步。也就是说,从多个熟悉的进程到一个进程的消息必须按照与这些进程正在执行的操作的语义相对应的一致顺序发送。可能是对拥有进程的控制消息,或者通过竞争者之间的直接协调,但对消息的并发性进行一些限制应该是最有必要的。
对于本地进程间通信(忽略争用),共享内存确实可以更快,但是为什么跨机器通信会出现这种情况呢?分布式计算的共享内存是在网络通信之上实现的。因此,共享内存除了缓存优势之外,还不能更快。
技术显然不同。我似乎无法理解的是,当对两者都没有本质上的好处时,如何将它们进行广泛的比较。必须假设平台提供什么,以及软件试图完成什么,而这样的假设不能普遍正确。
【问题讨论】:
-
您必须通过消息传递以及共享内存并发来定义您的确切含义。这些术语没有明确定义,对不同的人意味着不同的东西。另外,看你的看法,SM就是MP,MP就是SM。
-
@I GIVE CRAP ANSWERS: 我明白了。但是,如果您查看另一个问题,您会发现它也没有任何说明。它有一个公认的答案,其定义似乎非常简单,并且与维基百科文章中给出的区别一致。问题是我不明白这种区别的主要含义是什么。并且进一步用于区分并行计算和分布式计算(否则可以用诸如“在一个盒子中”与“在多个盒子中”之类的短语来定义。)
-
@I GIVE CRAP ANSWERS:从某种意义上说,您的评论是对我的问题的一种回答,但这些术语在类似的情况下使用非常频繁,我认为它们不那么重载并且没有解释.
-
嗯,我的日常工作是一名 Erlang 程序员。我们通常使用消息传递语义,因为它们在库存硬件的分布式环境中具有某些优势。但请注意,Erlang 还支持称为 ETS 的共享内存元组空间。恐怕我很难说得更具体一些,因为对于 C++ 程序员来说,事情可能会以不同的方式应用为术语。
标签: concurrency shared-memory message-passing