IO中同步与异步、阻塞与非阻塞的超级通俗版解释

虽说是通俗版解释,但是在本文的开头,还是有必要先做一个极简化的介绍。

IO其实有好多种,在此仅以网络IO(相对清晰一点)来说。

我们列举这四种IO:

同步(synchronous) IO & 异步(asynchronous) IO,阻塞(blocking) IO & 非阻塞(non-blocking)

先谈阻塞and非阻塞:

阻塞就是网络数据没有ready的话,一直hold住当前的process,直到数据ready,从kernel拷贝数据到用户内存,然后放行process。

非阻塞是网络数据没有ready的话,就返回一个信号(比如btError)。等到有数据了,再根据网络模型的不同,采取相应的处理方式。

同步就是网络数据如果ready的话,会等待数据从kernel拷贝到用户内存的这个行为完成。

异步就是网络数据即使ready的话,也是直接返回一个信号(比如nReady)。

如果不求严谨的话,大可以把阻塞非阻塞视为网络IO底层的socket的自身行为,把同步异步视为操作socket的处理方式。

通俗而言

阻塞就是倔强的,不管老子准备好没有,你都得TM等老子。

非阻塞就是理智的,如果我没有准备好的话,您就别等我了,等我准备好了再说吧。

同步就是体贴的顾及他人感受的,如果您好了的话,我就会等您把东西给我,如果您没好的话,那我就可能先走了,不过这取决于您是阻塞还是非阻塞。

异步就是无视他人反馈的,老子不管你是啥情况(阻塞或者非阻塞),老子都不关心,反正老子就告诉你一下要取数据,告诉完就没老子啥事了。

本文是为帮助那些急需要知道这四种IO区别的人理解而写的,知识有限,文中难免有错误之处,望各位大侠指出。

若要真正去理解IO,还是请认真查阅各种权威资料,毕竟学知识是没什么捷径的。

你可能感兴趣的:(综合)