同步异步阻塞非阻塞补遗
同步异步阻塞非阻塞补遗
原创作品,转载请注明出处:http://taoxiaoran.top/2016/06/02/io-model.html
看了一些这两个概念的解释,感觉不分场景的笼统理解是不对的,下面陈述一下我的理解:
这是两对概念,用在不同的语境会有一些不同的含义,不能一概而论。
整体来说,同步就是两种东西通过一种机制实现步调一致,异步是两种东西不必步调一致。
一、同步调用与异步调用:
在用在调用场景中,无非是对调用结果的不同处理。
我理解同步调用就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。调用一但返回,就能知道结果。异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。异步返回时不一定知道结果,还得通过其他机制来获知结果。
这里的同步调用不一定会阻塞,例如立即返回失败的结果。
而异步调用立即返回时,你还拿不到结果的。
二、同步线程与异步线程:
同步线程:即两个线程步调要一致,要相互协商。两个线程的运行进度各不相同,怎么才能步调一致呢?我们直观的理解就是,快的等慢的呗!快的阻塞一下等到慢的步调一致即可。
异步线程:步调不用一致,各自按各自的步调运行,不受另一个线程的影响。
同步是指两个线程的运行是相关的,其中一个线程可能要阻塞等待另外一个线程的运行;
异步的意思是两个线程毫无相关,自己运行自己的。
三、同步通信与异步通信:
这里的同步和异步是指:发送方和接收方是否协调步调一致!
同步通信是指:发送方和接收方通过一定机制,实现收发步调协调。如:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式
异步通信是指:发送方的发送不管接收方的接收状态,如:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。
四、阻塞和非阻塞
阻塞和非阻塞就比较容易理解了,没有上面那么多场景,阻塞就是这个事情阻到这儿了,不能继续往下干事了,非阻塞就是这个事情不会阻碍你继续干后面的事情。
阻塞
阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。 有人也许会把阻塞调用和同步调用等同起来,实际上它是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。例如,我们在CSocket中调用Receive函数,如果缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会继续处理各种各样的消息。
非阻塞
非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
阻塞可以是实现同步的一种手段!例如两个东西需要同步,一旦出现不同步情况,我就阻塞快的一方,使双方达到同步。
同步是两个对象之间的关系,而阻塞是一个对象的状态。
另外在写这个以前参考的文章:
http://www.cnblogs.com/albert1017/p/3914149.html
https://www.zhihu.com/question/19732473
欢迎留言指出问题!
本文系本人个人公众号「梦回少年」原创发布,扫一扫加关注。