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

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

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

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

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

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

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

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

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

相关推荐

    非阻塞算法之FIFO

    非阻塞算法的核心思想是让线程在无法立即完成操作时,不进入等待状态,而是尝试其他操作或者直接返回,这样可以提高系统的并发性能并降低资源消耗。 在多线程环境中,当多个线程需要共享一个资源时,通常会用到锁来...

    无锁化编程

    综上所述,无锁化编程涉及多种技术和策略,包括非阻塞、非饥饿、非等待、非锁定等概念,以及CAS操作、内存屏障等关键技术。通过对这些概念和技术的理解与应用,开发者能够在多线程环境中构建高性能、低延迟的并发...

    无锁队列

    无锁队列的性能优势在于其非阻塞的特性,避免了锁导致的线程等待和唤醒,从而减少了CPU上下文切换的次数。然而,无锁算法的实现往往比使用锁更复杂,需要对并发编程有深入的理解。在实际应用中,选择是否使用无锁...

    无锁队列英文论文(具有研究价值).zip

    2. **非阻塞**:任何线程尝试入队或出队时,不应被其他线程的操作阻塞。 3. **顺序一致性**:尽管并发执行,但所有线程看到的执行顺序应与某个线程串行执行时的顺序一致。 论文可能会涉及以下关键概念和技术: - *...

    Java理论与实践:非阻塞算法简介

    非阻塞算法的核心在于原子操作,如比较并交换(Compare and Swap,简称CAS)。`AtomicInteger`类中的`compareAndSet()`方法就是一个例子。这个方法尝试将变量的值从旧值更新为新值,但只有在当前值等于预期的旧值时...

    基于eventloop的java非阻塞网络库,实现了事件驱动,无锁的基于最小堆的定时器,便于扩展的pipeline机.zip

    非阻塞I/O与传统的阻塞I/O不同,它允许一个线程在等待数据时执行其他任务,而不是一直挂起。Java的Selector可以监控多个通道(Channel),当通道准备就绪时,Selector会返回准备好的通道集合,避免了线程间的频繁...

    基于多核处理器的有锁编程与非阻塞算法研究.pdf

    非阻塞算法避免了线程在等待锁释放时的阻塞状态,通过原子操作和数据结构的设计实现并发访问,从而提高系统并行度和整体性能。这种算法在高并发场景下尤其重要,因为它可以减少线程间的同步开销,提升系统的吞吐量。...

    无锁缓冲队列

    总之,无锁缓冲队列是一种重要的并发编程技术,它利用原子操作来实现线程间的非阻塞通信,提高了系统的并行度和效率。理解其工作原理和优缺点,对于编写高效、可靠的并发代码至关重要。在锁_free_queue-master这个...

    Java语言中非阻塞算法的实现.zip

    非阻塞算法,也称为无锁算法,主要特点是避免了线程间的互斥,使得多个线程可以同时进行计算,从而提高了系统的并发性能。在Java中,非阻塞算法主要通过Java并发库(java.util.concurrent)中的工具类和接口来实现,...

    java并发之原子操作类和非阻塞算法

    与传统的锁机制不同,非阻塞算法在数据竞争时不会导致线程阻塞,而是通过循环检测和重试来实现数据一致性。这种算法在多核处理器环境下表现出更好的可扩展性,因为它减少了线程间的同步等待,降低了上下文切换的开销...

    基于多核处理器的有锁编程与非阻塞算法研究 (2010年)

    通过对有锁编程和非阻塞算法的比较分析,可以发现非阻塞算法和无锁编程能够更好地适应多核处理器的特点,减少线程间的等待时间,从而提高程序的整体性能。未来的研究方向可以进一步探讨更高效的无锁算法设计,以及...

    Java并发编程之原子变量与非阻塞同步机制

    非阻塞算法的核心在于利用底层硬件提供的原子操作,如比较并交换(CAS),来保证并发操作的完整性。这种算法避免了线程的等待和唤醒,减少了上下文切换的开销,从而提高了系统的吞吐量。然而,非阻塞算法的设计复杂...

    Algorithm:学习数据结构与算法

    无阻塞算法,也称非阻塞算法,是一种在多线程环境中,避免线程等待其他线程完成操作的编程模式。这种算法允许程序在任何时候都能继续执行,提高了系统的响应性和并发性。在处理大量并发请求时,无阻塞算法能显著提升...

    lfqueue:尽可能减少无锁队列!

    LFQueue(通常指的是Lock-Free Queue)的设计目标是提供一个高性能、非阻塞的数据结构,适用于高度并行的环境。LFQueue的核心思想是利用原子操作来保证在多线程环境下的正确性,而无需显式地锁定资源。这样可以避免...

    2011 Intel 多线程编程大赛 Maze Of Life

    非阻塞容器的核心在于其内部的无锁算法,如CAS(Compare and Swap)操作,这种算法在硬件层面支持,能够在没有锁的情况下保证数据的一致性。通过不断地比较并尝试更新数据,可以在并发环境中实现高效的并发控制,...

    包括并发的基础理论知识、不同并发模型的选择与适用环境、编写并发程序的基本步骤,并发算法的正确性证明与性能评价,以及在编写并发程序时遵循的一些指导原则等

    3. 异步回调:非阻塞I/O模型,避免了线程等待I/O操作完成时的资源浪费。 4. 管道和过滤器:数据流经一系列进程,每个进程对数据进行处理。 5. Actor模型:每个Actor有自己的状态和邮箱,通过消息传递进行通信,避免...

    开源项目-OneOfOne-lfchan.zip

    3. **非阻塞通信**:lfchan 提供的通信方式不会阻塞等待,而是通过返回错误或特殊值来告知用户当前通道的状态,比如满或者空,这有助于提高系统的响应性和吞吐量。 4. **并发控制**:lfchan 可能会采用一种无锁的...

    高并发总结

    4. **阻塞与非阻塞**:阻塞操作会导致线程暂停,等待特定事件发生;而非阻塞操作则允许线程在等待期间执行其他任务,提高了系统效率。 5. **死锁、饥饿和活锁**:死锁是两个或更多线程相互等待对方释放资源导致无法...

Global site tag (gtag.js) - Google Analytics