北漂IT民工 的博客

阻塞与非阻塞, 异步与同步分别表示什么含义?

计算机中的阻塞与非阻塞,同步与异步

阻塞与非阻塞

相对于进程或者线程的状态来讲的。因为阻塞线程或者进程才有一种状态。
阻塞是指导致线程被操作系统挂起。
非阻塞是指不会导致线程被操作系统挂起

产生阻塞的原因是计算机关键资源的竞争造成的,所以一般只有IO这样的竟争性资源才会导致阻塞,非意争资源是不会导致阻塞的,比如纯计算的算法。
但是纯计算,如果操作系统的时间片分配或者优先级分配的不好,可能会导致机器响应慢,但是并没有阻塞。

同步与异步

同步与异步是相对于代码的执行或者具体的操作来说的。
因为线程或者进程是不存在同步或者异步的问题。
同步是指按顺序执行,线性执行的方式,如果没有执行完成,那么就不会继续执行。
异步是指非线性的调用方式即使在没有执行完成时也可以返回的操作方式。

阻塞非阻塞与同步异步的关系

阻塞并不一定就是同步
非阻塞并不一定是异步

IO与阻塞非阻塞,同步异步

阻塞IO是相对于非身IO操作来说的。所以一个阻塞IO执行一定会导致一个阻塞线程,但是并不一定导致调用的阻塞。
所以阻塞并不一定导致同步。因为同步与异步是代码执行的问题。而通过各种机制,语言是可以实现阻塞IO,异步方式调用的。

同理,非阻塞IO,不会导致一个阻塞线程,但是实现时仍可以用一个独立的线程通过OS实现一个阻塞的调用,从而完成一个同步的执行。

所以一定要区分阻塞,非阻塞,同步,非同步他们所面对的问题域,区分概念,才能准确的理解并正确的使用他们。

当我们在说阻塞IO或者非阻塞IO时,是指IO模型本身。
当我们在说异步或者同步IO时,是指调用IO的方式。