原语同步操作的相对能力
在设计新的多处理器时,我们需要考虑应该包含哪些原子指令。文献中提供了众多不同的选择,如内存读写、 getAndDecrement() 、 swap() 、 getAndComplement() 、 compareAndSet() 等等。支持所有这些指令会变得复杂且低效,但如果支持了错误的指令,可能会使解决重要的同步问题变得困难甚至不可能。
我们的目标是找出一组强大到足以解决实际中可能出现的同步问题的原语同步操作。为了实现这一目标,我们需要一种方法来评估各种同步原语的能力,即它们能解决哪些同步问题,以及解决这些问题的效率如何。
1. 基本概念
- 无等待和无锁实现 :一个并发对象的实现如果每个方法调用都能在有限步骤内完成,那么它就是无等待的;如果能保证无限次地有某个方法调用在有限步骤内完成,那么这个方法就是无锁的。在之前的内容中,我们已经见过无等待(因此根据定义也是无锁)的寄存器实现。评估同步指令能力的一种方法是看它们对共享对象(如队列、栈、树等)实现的支持程度。我们关注的是无等待或无锁的解决方案,即不依赖外部支持就能保证进度的方案。
- 同步原语的层次结构 :并非所有的同步指令都是等价的。如果将原语同步指令看作对象,其导出方法就是指令本身(在文献中,这些对象常被称为同步原语),可以证明存在一个无限的同步原语层次结构,使得处于某一层级的原语无法用于对更高层级的任何原语进行无等待或无锁实现。这个层次结构中的每个类都有一个相关的共识数,它是
超级会员免费看
订阅专栏 解锁全文
1575

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



