同步、异步、阻塞和非阻塞
最开始看到这四个名词的时候,感觉很困惑,这不都一样吗?后来就查了查。
最近又想起来这几个概念,发现记忆有些模糊,故写此博客。
1. 同步
调用者调用被调用者,当调用者没有获取到调用结果(被调用者正在处理,没有返回调用)时,调用者不执行后续操作。
同步的大致流程,调用者->被调用者->被调用者返回调用结果->调用者获取调用结果->调用者继续执行。
2. 异步
调用者调用被调用者,当调用者发起调用请求后,被调用者立即返回(此时被调用者继续执行调用处理,返回的不是调用结果),调用者执行后续操作。
异步的大致流程,调用者->被调用者->调用者获得调用返回,继续执行(同时,被调用者执行调用处理)->调用者获得调用结果.
从上述流程可以看出,调用者并不是在调用的时候获得调用结果,而是在后续的执行过程中才获取到调用结果。
通常调用者获取调用结果的方式有三种,如下
(1) 轮询
调用者发起调用请求后,轮询被调用者是否处理结束。处理结束获取调用处理结果,否则继续轮询。
(2) 通知
被调用者处理结束后通知调用者处理结果。例如,信号,linux系统中的sigin()。
(3) 回调
被调用者处理结束后,调用调用者提供的回调函数。
最后,可以发现同步和异步在描述调用的过程(流程),程序执行的顺序情况。
3. 阻塞
调用者发起调用请求后,调用者挂起,等待调用执行结束后,获取调用结果,继续执行。
大致执行流程,调用者发起调用请求->调用者挂起->被调用者执行->被调用者执行结束->唤起调用者->调用者继续执行。
4. 非阻塞
调用者发起调用请求后,调用者继续执行其他任务,不挂起。在后续的某个时刻再获取调用结果。
大致执行流程,调用者发起调用请求->调用者继续执行其他任务(同时,被调用者执行调用处理)。
最后,可以发现阻塞和非阻塞主要描述调用过程中线程的状态。
也可以理解为,同步和异步关注的是消息通知的机制,而阻塞和非阻塞关注的是线程等待消息通知时的状态。