原始同步操作的相对能力
在设计新的多处理器时,我们面临着一个关键问题:应该包含哪些类型的原子指令?可供选择的指令众多,如内存读写、 getAndDecrement() 、 swap() 、 getAndComplement() 、 compareAndSet() 等等。支持所有这些指令既复杂又低效,而支持错误的指令可能会使解决重要的同步问题变得困难甚至不可能。
1. 评估同步指令的能力
我们的目标是找出一组强大的原始同步操作,以解决实际中可能出现的同步问题。为了实现这一目标,我们需要评估各种同步原语的能力,包括它们能解决哪些同步问题以及解决的效率如何。
在并发编程中,有两个重要的概念:无等待(wait-free)和无锁(lock-free)。如果每个方法调用都能在有限步骤内完成,则该并发对象的实现是无等待的;如果能保证无限次中有某些方法调用在有限步骤内完成,则该方法是无锁的。评估同步指令能力的一种方法是看它们对共享对象(如队列、栈、树等)实现的支持程度。我们关注的是无等待或无锁的解决方案,即不依赖外部支持就能保证进展的方案。
研究表明,并非所有的同步指令都是等价的。同步原语存在一个无限的层次结构,处于某一层次的原语无法用于对更高层次原语进行无等待或无锁的实现。每个类在这个层次结构中都有一个相关的共识数(consensus number),它表示该类对象能够解决一个称为共识(consensus)的基本同步问题的最大线程数。在一个有 n 个或更多并发线程的系统中,不可能用共识数低于 n 的对象来构造一个共识数为 n 的对象的无等待或无锁实现。 <
同步操作的共识能力分析
超级会员免费看
订阅专栏 解锁全文
8万+

被折叠的 条评论
为什么被折叠?



