Data Race Free 的前世此生

Data Race Free 是多线程程序是很是重要的概念,由于Java 和 C++的内存模型都是基于 Data Race Free 的,这篇文章将介绍这个概念的由来,另外一篇文章《对Data Race Free的理解》介绍它的主要思想。程序员

事情要追溯到遥远的1979年, Lamport 在他的著名论文 How to make a multiprocessor computer that correctly executes multiprocess programs 中提出了从此在内存模型领域被普遍使用的概念 :sequential consistency,即顺序一致性。这篇文章告诉咱们,你要作一台多处理器的计算机,须要知足什么条件,才能保证程序的正确性。固然,这里的程序跑在不一样处理器上,共享同一块内存。虽然如今不说多处理器了,都说多核,多线程,可是问题的本质是没有变的。就是多个执行单元一块儿完成一个任务,而且经过共享存储单元的方式通讯,在这种状况下,底层的系统须要提供什么样的支持,才能保证计算的结果和程序员的预期是同样的。安全

7年后的1986年,Dubois, Scheurich , Briggs 三人在论文 Memory access buffering in multiprocessors 中对 Lamport 的工做进行了扩展,他们提出了一种框架,用于分析共享内存的多处理器系统中的一致性问题。文中引入了三个 states,以此为基础提出了strong ordering的概念,并说明了他与Lamport提出的sequential consistency是一致的。可是,strong ordering对内存操做的限制太强了,对系统性能是一个阻碍,因此,他们又提出了 weak ordering的概念,以此提升系统性能。 知足weak ordering的系统并非 sequential consistency的,程序员们须要本身去声明同步变量,以保证程序的正确性。多线程

又过了4年,到了1990年,Adve大妈出手了,大妈如今是内存模型这个领域的权威,Java和C++内存模型的确立都有大妈的功劳,而Java和C++内存模型中至关重要的Data Race Free 概念就是Adve大妈在这一年提出的。app

在这篇名为 Weak ordering—a new definition的文章中,Adve对Dubois等人提出的Weak Ordering进行了新的定义,并作出了一些修改以便进一步提升系统的性能。 新的定义出于这样一种想法,程序员习惯使用 sequential consistency来推断程序的运行结果,而底层的系统要想取得更高的性能,又不能使用sequential consistency内存模型来运行程序。那么框架

如何使得程序员可使用sequential consistency推断程序结果,底层的实现又能够进行种种优化呢?性能

解决方案是:对程序自己进行足够的同步。优化

这种内存模型保证:若是你的程序进行了足够的同步,那么在个人weak oerding内存模型上运行,我能够保证结果和你在sequential consistency模型下运行的结果同样。spa

这样一来,程序员保证程序正确同步,就可使用sequential consistency推断程序结果,而底层又能够灵活地进行各类优化,提升系统性能。.net

这里有一个关键问题:线程

什么叫“足够的同步”

Adve提出了Data Race Free的概念,也就是说,你的程序要是知足Data Race Free的条件了,你的同步就足够了,“足够”的意思就是说,这程序在weak ordering上跑和在sequential consistency上跑,结果是同样同样的~

Adve对weak ordering给出的新定义是:

Hardware is weakly ordered with respect to a synchronization model if and only if it appears sequentially consistent to all software that obey the synchronization model.

这里的synchronization model的一种实现方式,就是 Data Race Free。

Data Race Free 后来成为了 Java 和 C++ 内存模型的基础。

Java 的内存模型最先出如今1995年,可是自1997年起,这一内存模型被发现了许多严重的错误和缺陷,它阻碍了不少优化措施,对程序的安全性也没有足够的保证。2001年JSR 133被确立下来,由William Pugh领导,专家组的成员包括了Adve,Doug Lea, William Pugh等。2004年,JSR 133最终版本发布。2005年,Manson Jeremy, William Pugh, 和 Sarita V. Adve 一同发表了论文 The Java memory model,描述了最新的Java内存模型,这一内存模型在Java 5.0中引入,一直沿用至今。

Java 内存模型的关键是:若是多线程程序知足Data Race Free,那么内存模型保证程序执行结果和sequentially consistent模型下同样。另外,Java 内存模型的复杂之处还在于,为了保证程序的安全性,即便多线程程序不知足Data Race Free,咱们也要对它进行必定程度的限制,这种限制必须恰到好处,太强会阻碍合理的优化,太弱保证不了程序的安全性。

三年后的2008年,Hans-J. Boehm 和 Sarita V. Adve 一同发表了文章 Foundations of the C++ concurrency memory model,描述了C++内存模型的基础,这一内存模型为C++ 11标准中的线程提供了明确的语义。

C++内存模型与的关键在于:若是多线程程序知足Data Race Free,那么内存模型保证程序执行结果和sequentially consistent模型下同样。与Java内存模型不一样,对于那些不知足 Data Race Free的多线程程序,C++内存模型不对其结果提供任何保证。另外,C++内存模型提供了一些特性用以实现不一样的内存模型。

相关文章
相关标签/搜索