zoukankan      html  css  js  c++  java
  • 同步与阻塞,异步与非阻塞

    同步与阻塞,异步与非阻塞的区别


    异步非阻塞

    充分利用了系统资源,执行代码无须阻塞等待某种操作完成,有限的资源可以用于其他的任务。 其非常适合于后端的网络服务编程。

    阻塞

    《node.js开发指南》是这样定义的:执行绪在执行中如果遇到(I/O 操作)如磁盘读写或网络通讯,通常要耗费较长的时间,这时作业系统会剥夺这个执行绪的 CPU 控制权,使其暂停执行,同时将资源让给其他的工作执行绪,这种执行绪排程方式称为 阻塞。 当I/O操作完毕时,操作系统将这个执行绪的阻塞状态解除,恢复其对CPU的控制权,令其继续执行。 这种 I/O 模式就是通常的同步式 I/O(Synchronous I/O)或阻塞式 I/O(Blocking I/O)。

    非阻塞

    非阻塞是这样定义的,当执行绪遇到I/O操作时,不会以阻塞的方式等待I/O操作的完成或数据的返回,而只是将I/O请求传送给作业系统,继续执行下一条语句。 当操作系统完成 I/O 操作时,以事件的形式通知执行 I/O 操作的线程,执行绪会在特定时候处理这个事件。

    对比阻塞和非阻塞

    阻塞模式下,一个线程只能处理一项任务,要想提高吞吐量必须通过多线程。

    非阻塞模式下,一个线程永远在执行计算操作,这个线程所使用的CPU核心利用率永远是100%,I/O以事件的方式通知。

    IO的阻塞和非阻塞

    阻塞模式的I/O会造成应用程序等待,直到I/O完成。 同时操作系统也支持将I/O操作设定为非阻塞模式,这时应用程序的呼叫将可能在没有拿到真正数据时就立即返回了,为此应用程序需要多次呼叫才能确认I/O操作完全完成。

    参照《node.js入门经典》中对同步的解释,同步的代码意味着每一次执行一个操作,在一个操作完成之前,代码的执行会被阻塞,无法移到下一个操作上。 也就是说代码的执行会在函式返回前停止。 直到函数返回后,代码才会继续执行。

    相反,异步就意味着函式的执行无需等待某个操作的结果就可以继续执行,其操作的结果会在事件发生时由回拨来处理。

    整理自前辈的博客https://www.itread01.com/content/1545089941.html

  • 相关阅读:
    《BI那点儿事》数据流转换——聚合
    《BI那点儿事》数据仓库建模:星型模式、雪片模式
    《BI那点儿事》Cube的存储
    《BI项目笔记》创建多维数据集Cube(2)
    《BI项目笔记》增量ETL数据抽取的策略及方法
    类对象切割对虚函数调用的影响
    类对象切割对虚函数调用的影响
    显示调用析构函数潜在隐患分析
    显示调用析构函数潜在隐患分析
    PeekMessage和GetMessage函数的主要区别
  • 原文地址:https://www.cnblogs.com/WcxyBlog/p/14056686.html
Copyright © 2011-2022 走看看