顺序性,一致性,原子性:现代多核体系结构与原子操作·CAS与自旋锁·自旋锁与并发编程的原语·语句原子性和编程逻辑的原子性·行锁与数据库事务原子性·binlog与数据库同

本文探讨了现代多核体系结构中的顺序性、一致性与原子性问题。重点讲解了原子操作,如CAS(Compare and Swap)和自旋锁,并分析了它们在并发编程中的应用。还讨论了自旋锁的实现和数据库事务的原子性,特别是在主从同步和binlog中的作用。
摘要由CSDN通过智能技术生成

Table of Contents

 

顺序性:

乱序中间态:

局部顺序性与局部正确中间态:

一致性:

原子性:

1 多核体系结构与多核原子操作

2. 原子操作CAS与自旋锁

 优缺点比较

spinlock系统实现

总结

3 自旋锁与并发编程原语

4 语句原子性和编程逻辑的原子性

5 锁与数据库事务原子性

数据库事务:

6 数据库事务原子性与binlog、主从同步读写分离


顺序性:

乱序执行·逻辑正确性 

现代体系结构的每一个核的指令流水是乱序执行的,但是他能够保证其执行效果正确,即等同于顺序执行。

不过这带来的问题是对于一个核在主观上它的执行状态最终保证正确,但是对于别的核,如果在某一个中间时间点需要观察它呢?看到的是一个不正确的中间状态对应的数据:

乱序中间态:

core1: 

asm write a=x(没提交)

asm write b=y(已提交)

core2:

asm if(b==y)   

           assert(a==x) // 出错了,因为core1乱序提交!

一般情况下,我们可以容忍这类问题发生。

但是当 write b=y 是一个非常重要的多核控制原语的时候,这类问题就无法容忍了。

局部顺序性与局部正确中间态:

杜绝这种问题的关键是让 write b=y操作满足局部顺序性,从而在该操作上得到局部正确中间态:即该操作一旦执行成功,则前面的操作都执行成功。该操作如果没有执行,那么后面的操作也都没有执行。  也即任何时刻只要b==y,那么a==x。

 

一致性:

 

各核及线程缓存·volatile

 

各核缓存及线程缓存不一致是影响并发并行计算正确性的一大问题。

如果上层编程逻辑需要使他们可见的值保持一致,则可以引入volatile。

 

原子性:

1 多核体系结构与多核原子操作

http://my.oschina.net/jcseg/blog/316726

 

 一. 何谓"原子操作":
原子操作就是: 不可中断的一个或者一系列操作, 也就是不会被线程调度机制打断的操作, 运行期间不会有任何的上下文切换(context switch).

多核原子操作:不可打断(原子),不可干扰(互斥=》串行=》最高隔离)。在原子操作基础上,不被其他核上运行的指令干扰的指令操作。如何不被其他核指令干扰?内存是多核共用的,所以当本核访问内存的时候,其他核都不能访问。下文会讲到总线锁。

二. 为什么关注原子操作?
1. 如果确定某个操作是原子的, 就不用为了去保护这个操作而加上会耗费昂贵性能开销的锁. - (巧妙的利用原子操作和实现无锁编程)
2. 借助原子操作可以实现互斥锁(mutex). (linux中的mutex_lock_t)
3. 借助互斥锁, 可以实现让更多的操作变成原子操作. 

三. 单核CPU的原子操作:
在单核CPU中, 能够在一个指令中完成的操作都可以看作为原子操作, 因为中断只发生在指令间.

四. 多核CPU的原子操作:
在多核CPU的时代(确实moore定律有些过时了,我们需要更多的CPU,而不是更快的CPU,无法处理快速CPU中的热量散发问题), 体系中运行着多个独立的CPU, 即使是可以在单个指令中完成的操作也可能会被干扰. 典型的例子就是decl指令(递减指令), 它细分为三个过程: "读->改->写", 涉及两次内存操作. 如果多个CPU运行的多个进程在同时对同一块内存执行这个指令, 那情况是无法预测的

五. 硬件支持 & 多核原子操作:
软件级别的原子操作是依赖于硬件支持的. 在x86体系中, CPU提供了HLOCK pin引线, 允许CPU在执行某一个指令(仅仅是一个指令)时拉低HLOCK pin引线的电位, 直到这个指令执行完毕才放开.  从而锁住了总线, 如此在同一总线的CPU就暂时无法通过总线访问内存了, 这样就保证了多核处理器的原子性(个人理解:另外使得cpu强制串行性,该条指令不能和任何其他指令之间发生乱序提交). (想想这机制对性能影响挺大的).  

 

关于为什么本文所讲的“多核原子操作”要锁总线

内存屏障的结果,是在操作原子性基础上实现核间高度隔离以及局部顺序性
1. 核间高度隔离:锁对其他核上的内存操作(不管R/W)互斥,从而为本操作提供最高级别隔离性。
2. 局部顺序性:如上文,加总线锁之后还会使得本核的指令流水在此串行化,防止本指令相对之前和之后的其他指令发生乱序提交,提供局部状态顺序性。
http://blog.codingnow.com/2007/12/fence_in_multi_core.html


六. 哪些操作可以确定为原子操作了?
对于非long和double基本数据类型的"简单操作"都可以看作是原子的. 例如: 赋值和返回. 大多数体系中long和double都占据8个字节, 操作系统或者JVM很可能会将写入和读取操作分离为两个单独的32位的操作来执行, 这就产生了在一个读取和写入过程中一个上下文切换(context switch), 从而导致了不同任务线程看到不正确结果的的可能性.

递增, 递减不是原子操作: i++反汇编的汇编指令: (需要三条指令操作, 和两个内存访问, 一次寄存器修改)

 

?
1
2
3
并行计算是90年代计算技术的一个重要组成部分,它在未来20年的影响可能与微处理器在过去20年的影响一样大。 事实上,随着高度集成的微处理器和内存芯片的发展,使得多处理器系统越来越具有吸引力,这两种技术紧密相连。 从速度最快的超级计算机,到部门计算服务器,再到个人桌面,多处理器已经代表了计算市场几乎每个部分的高能终端。 在过去,计算机供应商采用一系列技术来提高整个产品线的能。 今天,同样最先进的微处理器被广泛使用。 要获得显著的能范围,最简单的方法是增加处理器的数量,而规模经济使这一点极具吸引力。 很快,几个处理器就可以装在一个芯片上。 4 草稿:并行计算机架构8/29/97 虽然并行计算有着悠久而丰富的学术历史,但是与商品技术的紧密结合从根本上改变了这门学科。 对基本架构和外来技术的强调已经让位于定量分析和仔细的工程权衡。 我们写这本书的目的是使新兴的多处理器系统的设计者,从适度并行的个人计算机到大规模并行的超级计算机,了解基本的架构问题和处理设计权衡的可用技术。 同时,我们希望为这些机器的软件系统设计人员提供对体系结构发展的可能方向的理解,以及确定硬件设计将遵循的特定路径的力量。 并行计算机体系结构中最近最令人兴奋的开发是传统上完全不同的方法(即共享内存、消息传递、SIMD和数据流)在一个公共机器结构上的聚合。 这部分是由于共同的技术和经济力量,部分是由于更好地理解并行软件。 这种聚合使我们能够专注于最重要的体系结构问题,并开发一个通用框架,在其中理解和评估体系结构的权衡。 此外,并行软件已经成熟到流行的并行编程模型可以在广泛的机器上使用,并且存在有意义的基准测试。 这一领域的成熟使得对硬件/软件交互进行定量和定研究成为可能。 事实上,它需要这样一种方法。 本书遵循了一系列对所有并行架构都至关重要的问题——通信延迟、通信带宽以及跨整个现代设计的协作工作的协调。 它描述了用于解决每个问题的硬件和软件中可用的一组技术,并探讨了各种技术如何交互。 案例研究提供了一般原则的具体说明,并说明了机制之间的具体相互作用。 我们的最终动机来自于目前我们在斯坦福、伯克利和普林斯顿的课程缺乏足够的课本。 现有的很多教材对材料的涉及面都比较粗略,只是对各种建筑和研究成果进行了总结,并没有对其进行深入的分析。 另一些人专注于特定的项目,但没有认识到可用于替代方法的原则。 该领域的研究报告提供了大量的经验数据,但还没有提炼成一个连贯的画面。 我们希望通过集中注意技术融合背景下的突出问题,而不是使我们走到这一点的丰富和多样的历史,对该领域提供更深刻和更连贯的了解。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值