AMP -> Chapter 3 Concurrent Objects -> Notes<1>

并发对象(Concurrent Objects

这一章的主体是并发对象,之后所有的一切内容,都是围绕并发对象来谈的。

浅显地说,处理并发对象,就是寻求一种机制,能够将对象方法的并发执行,转换为顺序执行,然后只需对该顺序执行进行分析即可。

问题就在这里,从并发执行到顺序执行的转化,需要满足什么样的约束条件,才能保证其正确性,或者换句话说,需要在这个转化过程中,将正确性保持到什么样的程度。这些,应该是本章要解决的问题。

(事实上,这里要讨论的是: 偏序关系的保留性,并发对象方法的实时关系在线性化过程中的保留性。

以后所有的讨论,都基于这样一个目的,将一组并发执行,转化成一个线性的序列,根据对这个线性序列的不同约束条件,产生了不同的结果)

四条Principles,描述了三种转化的标准:静态一致性(Quiescent Consistency)、顺序一致性(Sequential Consistency)、可线性化(Linearizability)。

Principle 1Method calls should appear to happen in a one-at-a-time sequential order.

Principle 2Method calls separated by a period of quiescence should appear to take effect in their real-time order.

Principle 3Method calls should appear to take effect in program order.

Principle 4Each method call should appear to take effect instantaneously at some moment between its innovation and response.

Principle 1 是最基本的要求,就是说:如果将一个并发执行,转化为一个线性的方法执行序列,要满足条件,使得每个序列中的方法执行都是单个的,独立的,one-at-a-time,不存在有某个时刻同时又多个方法产生了效果。

       这条是最基本的约束,我觉得可以称作是保持了并行对象方法执行的独立性。

但是,这个约束是最弱的,real-time是什么样的?对各个方法执行之间的关系没有做任何的约束。前面说的偏序关系的保留性,这里一点都没有保留。

Principle 2 Principle 1 共同组成了静态一致性。

所谓静态一致性,针对的是单个对象。意思是说,单个对象的方法调用,在有明确时间间隔,对于这个间隔(静态时间点),之前发生的方法调用一定会在之后发生的方法调用的前面。非形式化地,在任意时刻,若对象变为静态,那么到此时刻为止的执行等价于目前已完成的所有方法调用的某种顺序。

注意,静态一致性不对对象之间的情况作任何的保证。在多线程的情况下,只考虑单个对象的静态一致性满足,至于线程之间的关系如何,无约束的情况的下就可以任意假设。

由上,静态一致性,是对并发执行转化后的串行序列提出的一个在单个并发对象上的约束条件。仅保证单个并发对象的方法调用的偏序保持。

Principle 3 Principle 1 共同组成了顺序一致性。

顺序一致性,是从CPU的角度,对串行序列的约束。非形式化地,顺序一致性要求方法调用的执行行为具有按照某种顺序次序的执行效果,并且这种顺序执行的次序应该与程序次序保持一致。

就是说,在并发执行过程中,一个CPU对方法调用的执行次序必须在转化得到的串行序列中得到保持。

由上,顺序一致性仅仅村CPU的角度对串行序列做约束,不含并发对象相关的约束,不含对不同线程之间的情况的约束。

我觉得,方法调用的方法隶属于某个并发对象,该方法在某个CPU上得到执行,所以从对象的角度,以及从CPU的角度,可以对方法调用提出不同的约束。这两个角度是不相关的,所以,静态一致性和顺序一致性之间也没有什么关联

Principle 4Principle 1 共同组成了可线性化性。

可线性化性的要求更高,是要求转化得到的串行序列,满足方法调用的调用和相应之间的某个实时状态。非形式化地说,就是方法调用的实时行为必须被保持。

可线性化可以借助指定可线性化点来实现,能指定可线性化点的都是可线性化的,但是可线性化的有可能找不到可线性化点。

posted @ 2010-01-25 15:26  郝玉琨  阅读(500)  评论(0编辑  收藏  举报