同步、异步 阻塞、非阻塞

1、同步与异步

  同步与异步主要是从消息通知机制的角度来说的。

  所谓同步就是说一个任务的完成需要依赖另一个任务,只有当被依赖的任务完成后,依赖的任务才能算完成,只是一种可靠的任务序列。所谓异步就是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。

  当一个同步调用发出后,调用者要一直等待返回消息通知后,才能进行后续的执行;当一个异步调用发出后,调用者不能立刻得到返回消息,实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。如果使用状态来通知的话,那么调用者需要每隔一定时间检查一次,效率比较低;如果使用通知或者回调的方式,则效率很高。

2、阻塞与非阻塞

  阻塞与非阻塞这两个概念与程序等待消息时的状态有关,也就是说阻塞与非阻塞主要是程序(线程)等待消息通知时的状态角度来说的。

  阻塞调用是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能执行其他业务。

  非阻塞和阻塞的概念相反,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回,虽然表面上非阻塞可以明显提高CPU的利用率,但是也带来了另一种后果就是系统的线程切换增加。增加的CPU执行时间能不能补偿系统的切换成本需要好好评估。

   很多人可能会把同步调用和阻塞调用等同起来,其实他们是不一样的:

   对于同步调用来讲,很多当前线程可能还是激活的,只是从逻辑上讲当前函数没有返回而已,此时这个线程可能也会处理其他的消息,如果这个线程在等待当前函数返回的同时还在执行其他的消息处理,这种情况就叫做同步非阻塞,如果没有执行其他的消息处理,而是处于挂起等待状态,那么就叫做同步阻塞。

   对于阻塞调用来讲,则当前线程就会被挂起等待当前函数退出。

  综上所述,同步和异步仅仅是关注消息如何通知的机制,而阻塞和非阻塞是等待消息通知时的状态。也就是说在同步的情况下,是由处理消息者自己去等待消息是否被触发,而异步的情况下是由触发机制来通知处理消息者,所以在异步机制中,处理消息者和触发机制之间就需要一个连接的桥梁。

原文地址:https://www.cnblogs.com/shark-cf/p/5451300.html