Sequential Consistency浅谈

sequential consistency是Java内存模型和C++0x内存模型的一个关键概念,它是一个最直观最易理解的多线程程序执行顺序的模型。另外与sequential consistency经常一起出现的还有cache conherence ,cache coherence是多核CPU在硬件中已经实现的一种机制,简单的说,它确保了对在多核CPU的Cache中一个地址的读操作一定会返回那个地址最新的(被写入)的值。关于它们更具体的描述本文将不做解释


所以应该想到,为什么我们要关心sequential consistency,就是因为现在的编译器和cpu会对当前我们的代码进行优化,为了追求这种效率,他们会把程序员写的代码打乱执行,而编译器这么做的理由就是因为读一个在内存中而不是在cache中的共享变量需要很多周期,所以编译器就”自作聪明“的让读操作先执行,从而隐藏掉一些指令执行的latency,提高程序的性能。实际上这种类似的技术是在单核时代非常普遍的优化方法,但是在进入多核时代后编译器没跟上发展,导致了对多线程程序进行了违反SC的错误优化。为什么编译器很难保证SC?因为对编译器来讲它很难知道多个线程在执行时会按照什么样的交错顺序执行,因为这需要一个整个程序运行时的视角,而只对一份静态的代码做优化的编译器是很难得到这种运行时的上下文的。那么为什么硬件也保证不了呢?因为CPU硬件中的写缓冲区(store buffer)会把要写入memory的值缓存起来,然后当前线程继续往下执行,而这个被缓存的值可能要很晚才会被其他线程“看见”,从而导致多线程程序逻辑出错。其实硬件也提供了一些例如Memory Barrier等解决方案,但是开销是一个比较大的问题,而且很多需要程序员手动添加memory barrier,现在还不能指望CPU或者编译器自动帮你搞定这个问题。为了帮助理解,我引入《Computer organization and architecture designing for performance》chapter4中的out of order executuin logic(乱序执行逻辑)“依据数据相关性和资源可用性调度微操作的执行,于是,微操作可按不同于所取指令流的顺序被调度执行,只要时间许可,此单元调度将来可能需要的微操作的推测执行”。而这种优化会影响多线程程序的正确性,也就是说你用C++编写的多线程程序可能会得到的不是你想要的错误的运行结果。

所以为了既保证正确性又保证性能,在经过十几年的研究后一个新的新的模型出炉了:sequential consistency for data race free programs。简单地说这个模型的原理就是对没有data race的程序可以保证它是遵循sequential consistency的,这个模型在多线程程序的正确性和性能间找到了一个平衡点。对广大程序员来说,我们依赖高级语言内建的内存模型来帮我们保证多线程程序的正确性.


你可能感兴趣的:(Sequential Consistency浅谈)