首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并发和内存模型

并发和内存模型
EN

Stack Overflow用户
提问于 2011-08-27 13:42:20
回答 4查看 1.9K关注 0票数 8

我正在看视频由Herb在GPGPU和新的C++ AMP库。他谈到了内存模型,提到了弱内存模型,然后提到了强内存模型,我认为他指的是读/写排序等,但我不确定。

Google发现了一些关于记忆模型的有趣的结果(主要是科学论文),但是有人能解释什么是弱记忆模型,什么是强记忆模型,以及它们与并发性的关系吗?

EN

回答 4

Stack Overflow用户

发布于 2011-08-31 21:20:38

在并发性方面,内存模型指定数据访问的约束,以及一个线程/核心/处理器写入的数据对另一个线程/核心/处理器可见的条件。

这两个术语有些含糊不清,但基本前提是,强内存模型对硬件设置了许多限制,以确保一个线程/核心/处理器以明确定义的顺序写入其他线程/核心/处理器,同时允许程序员最大限度地自由访问数据。

另一方面,薄弱的模型对硬件的限制很小,而是将确保可见性的责任交给了程序员。

最强的内存模型是序列一致性:所有处理器对所有数据的所有操作形成一个由所有处理器商定的总顺序,这与每个处理器上的操作顺序是一致的。这实质上是每个处理器操作的交织。

最弱的内存模型不会对处理器看到对方写的顺序施加任何限制。同一系统中的不同处理器可能会看到不同顺序的写操作,一些处理器在被另一个处理器写到相同的内存地址之后,可能会在很长一段时间内使用来自自己缓存的“陈旧”数据。有时,整个缓存行被视为一个单一单元,因此对缓存行上的一个变量的写入将导致从其他处理器写入第一个处理器尚未看到的缓存行上的其他变量,从而有效地丢弃这些变量,因为当缓存线最终写入内存时,陈旧的值会被写入顶部。在这种方案下,必须非常小心地确保使用显式同步指令将数据以正确的顺序传送到其他处理器。

例如,英特尔的x86内存模型通常被认为是在更强的一端,因为对于写入对其他处理器可见的顺序有严格的规则,而DEC和ARM处理器通常被认为具有弱内存模型,因为只有在代码中显式地放置顺序指令(内存栅栏或障碍)时,来自一个处理器的写入才需要以特定顺序对其他处理器可见。

有些系统的内存只能由特定处理器访问。因此,在这些处理器之间传输数据需要明确的数据传输指令。单元处理器就是这种情况,GPU也是如此。这可以被看作是弱内存模型的一个极端--只有当您显式调用数据传输时,其他处理器才能看到数据。

编程语言通常将自己的内存模型强加在底层处理器提供的任何东西之上。例如,C++0x指定了一组完整的排序约束,从完全放松到完全顺序一致性不等,因此您可以在代码中指定所需的内容。另一方面,Java有一组非常具体的排序约束,这些约束必须遵守,不能更改。在这两种情况下,编译器必须将所需的约束转换为底层处理器的相关指令,如果在弱有序机器上请求顺序一致性,则可能会涉及到这些指令。

票数 14
EN

Stack Overflow用户

发布于 2011-08-27 15:17:25

这两个术语没有明确的定义,也不是黑白的东西。

内存模型可以是非常弱的,非常强的,或者介于两者之间的任何地方。

它基本上是指对并发内存访问提供的保证。

天真地,您会期望在一个线程上所做的写会立即对所有其他线程可见。而且您也希望事件在所有线程上以相同的顺序出现。

但在较弱的记忆模型中,这两种模式都不成立。

顺序一致性是内存模型的术语,它保证在所有线程中以相同的顺序看到事件。因此,确保顺序一致性的内存模型非常强大。

一个较弱的保证是因果一致性:保证事件在它们所依赖的事件之后被观察。

换句话说,如果首先将值x写入某个地址A,然后将第二个值y写入相同的地址,那么在读取x值之后,没有线程会读取值y。因为这两种写入都指向相同的地址,所以如果不是所有线程都遵守相同的顺序,就会违反因果一致性。但这并没有说明不相关的事件应该发生什么。其他线程在任何时候都可以观察到将第三个值写入不同的内存地址的结果(因此不同的线程可能以不同的顺序观察事件,这与顺序一致性下的情况不同)。

还有许多其他级别的“一致性”,一些更强,一些更弱,并提供各种微妙的保证,你可以依赖什么。

从根本上说,一个更强大的内存模型将提供更多关于事件的观察顺序的保证,并且通常会保证行为更接近您直觉所期望的。

但是较弱的模型为优化提供了更大的空间,特别是,它具有更多的核(因为需要更少的同步)。

顺序一致性在单核CPU上基本上是免费的,在四核上是可行的,但是在32核系统或有4个物理CPU的系统上却要昂贵得多。或者是多台物理机器之间的共享内存系统。

您拥有的核越多,它们之间的距离越远,就越难确保它们都以相同的顺序观察事件。因此,妥协是作出的,你满足于一个较弱的记忆模型,使更宽松的保证。

票数 6
EN

Stack Overflow用户

发布于 2011-08-27 14:26:43

是的,您是对的-弱内存模型和强内存模型之间的区别是可用优化的不同(读/写顺序和相关的栅栏)。

可以通过顺序一致的模型(最严格或最强的模型)开始指定内存模型,然后指定如何引入、删除或移动单个线程的读写操作。 在这个模型中(顺序一致),内存独立于使用它的任何处理器(线程)。该内存通过一个控制器连接到每个线程,该控制器提供来自每个线程的读和写请求。来自单个线程的读和写完全按照线程指定的顺序到达中的,但它们可能以未指定的方式与来自其他线程的读和写交织在一起。

了解低锁定技术在多线程应用程序中的影响

但是,强内存模型和弱内存模型之间没有确切的界限,除非您考虑顺序一致的模型与其他模型。其中有些只是更强/更弱,因此比其他人更容易通过重新排序进行优化。例如,.NET 2.0中的x86内存模型允许对.NET 1.1中的版本进行更多的优化,因此可以将其视为一个较弱的模型。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7214916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档