`
chong_zh
  • 浏览: 69981 次
  • 来自: 杭州
社区版块
存档分类
最新评论

非阻塞、无锁、无等待算法的核心与区别

 
阅读更多
本文是一系列并发编程文章的学习笔记之一,意在厘清非阻塞、无锁、无等待着三个概念。

非阻塞
阻塞是操作系统层面的概念,发生阻塞的准确含义为:当前执行上下文通过调用操作系统的接口,使自己进入等待某一事件发生的状态。在这种等待中,该上下文将被从操作系统的调度队列中移除,而将不获得任何CPU执行时间。直到等待的事件发生,才被从新纳入调度。

因此,所谓非阻塞算法是指,算法中不存在任何位置将使当前上下文进入阻塞的状态。

无锁
无锁是一种比非阻塞更强的条件,也就是说所有无锁算法都是非阻塞的,但是非阻塞算法不一定是无锁的。

无锁算法指的是,在不用互斥锁的情况下解决并发执行环境的Race Condition。无锁算法与非阻塞算法的关键区分在于:无锁算法在执行过程中,某一上下文因为任何原因无法继续执行需要暂时搁置时,其他上下文能否继续执行,如果可以则该算法是无锁算法,否则该算法就不是无锁算法,顶多只有可能是非阻塞算法。

例如,自旋锁(Spin-lock)算法:某一执行上下文在获得锁之后,其他上下文需要循环忙等,
就是一种非阻塞算法但不是无锁算法。因为在自旋锁算法中,所有上下文在并发冲突时都是忙等,没有通过调用操作系统的接口把自己从操作系统的调度队列中移除。但它不是无锁算法,因为当获得锁的上下文无法继续执行时,其他所有上下文都必须忙等而无法继续执行。

无等待
无等待是一种比无锁更强的条件,无等待算法要求在无锁算法的定义基础上,增加一个条件:所有上下文的执行都必须在有限的步骤内可以完成,而不依赖于其他上下文的状态。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics