同步(synchronous)Vs异步(asynchronous)与阻塞(blocking)Vs非阻塞(non-blocking)的困惑

同步(synchronous)Vs异步(asynchronous)与阻塞(blocking)Vs非阻塞(non-blocking)的概念理解有些迷惑,所以Google了一下,开始越看越明白,渐渐地越看越糊涂,为何?因为不同文章间的描述差异比较大,下面选取两篇比较有代表性观点的文章:

看完这些文章后,再说说我的理解,暂不管其对与否:

  • 阻塞:等待直到可操作时才返回;
  • 非阻塞:当不可操作时不等待(例如不能得到接口、不能传递消息等),直接返回;
  • 同步:通知消息并等消息处理完了以后才返回,如果他需要的资源没有就绪,函数就会进入阻塞状态,直到资源就绪后返回继续执行;
  • 异步:通知消息后返回,对消息的处理完成后通过“状态”、“通知”、“回调”等方式得知消息已处理;

接着说说我的一些疑惑:

  1. 阻塞与同步的一个区别就是阻塞还会将进程“挂起”,而同步的进程仍然是激活的,可以处理消息?不知道这个说法是否正确。
  2. 在异步处理中,如果资源没就绪,就马上返回?我认为应该是会被阻塞。
  3. 阻塞的原因正是等待同步结果的返回?这个观点我不太认同。

由于疑惑不少,所以继续搜索,搜到了下面这篇文章:

这篇文章基于I/O的一些操作,得出结论“阻塞的原因正是等待同步结果的返回”,因此认为“阻塞/非阻塞是表现,同步/异步是原因”。这个观点我也不太认同,特写此文以待解惑。