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

  • 相关阅读:
    Python入门11 —— 基本数据类型的操作
    Win10安装7 —— 系统的优化
    Win10安装6 —— 系统的激活
    Win10安装5 —— 系统安装步骤
    Win10安装4 —— 通过BIOS进入PE
    Win10安装2 —— 版本的选择与下载
    Win10安装1 —— 引言与目录
    Win10安装3 —— U盘启动工具安装
    虚拟机 —— VMware Workstation15安装教程
    Python入门10 —— for循环
  • 原文地址:https://www.cnblogs.com/WcxyBlog/p/14056686.html
Copyright © 2011-2022 走看看