关于阻塞与非阻塞的讨论,一般是针对IO请求来定义的:
如果用户程序发出一个IO请求,但此时内核没有准备好数据,用户程序将处于等待状态,知道数据准备好,并完成拷贝。这个过程就是阻塞的。
如果用户程序发出一个IO请求,但此时内核没有准备好数据,会立即返回未准备好的响应,用户不需要等待。这个过程就是非阻塞的。
关于同步与异步的讨论,同样以IO为例:
当发出一个IO请求,之后进行一系列数据准备、拷贝过程,最后完成操作,对于用户来说,他需要等待整个执行过程完成,之后才能执行其他操作,这就是同步。
当发出一个IO请求,之后用户就可以继续处理其他工作,当IO请求完成时,内核会通知用户执行完成,这个就是异步。

知乎上的回答。链接:https://www.zhihu.com/question/19732473/answer/347355452

  • 阻塞和非阻塞
    阻塞:IO请求发出后应用一直等待,直到数据准备好返回。(窗口点盘菜的,一直站在窗口等着不干其他事直到菜好了端走)
    非阻塞:IO请求发出后,如果数据还没准备好,直接返回,应用可以做其他事情,之后再调用接口查询数据是否准备好。(窗口点盘菜,然后回到座位做其他时不时过来问问,菜好了拿走)
  • 同步和异步
    同步:发出一个请求,需要自己去问,否则不会有人通知,回调。
    异步:发出一个IO请求,立刻返回做其他事,数据准备好了,会有人过来通知你过来处理数据

注意:

上面提到的同步的含义,是相对于异步来说的,或者是在IO流的概念上来谈的,是一个进程中的概念。
而对于多个进程同步则有另外一个含义:所谓同步,就是并发进程在一些关键点上可能需要相互等待与互通消息,这种相互制约的等待与互通消息成为进程同步。