同步与阻塞,异步与非阻塞的区别
异步非阻塞
充分利用了系统资源,执行代码无须阻塞等待某种操作完成,有限的资源可以用于其他的任务。 其非常适合于后端的网络服务编程。
阻塞
《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