阻塞/非阻塞,同步/异步 的区别。(此处为本人的理解,如有不对或者不妥当的地方,欢迎大家批评指正)
有这么一个过程要处理,假如条件不满足该过程无法继续执行,有这么两种方式可以选择。一种是将该线程挂起,一直等到条件满足,然后继续执行该线程直到返回执行结果;再一种方式就是,线程直接返回,不等待,那要怎么才能知道条件满足了呢,可以通过不停的轮询来查询结果是否满足。第一种处理方式就是所谓的阻塞调用,后者当然就是非阻塞调用了;譬如服务器端等待客户端连接的accept函数,如果没有客户端连接,也就是相对应的I/O没有数据到来,该函数执行过程中就挂起,直到有客户端连接上来,如果要是使用非阻塞调用,accept就直接返回,然后程序通过轮询来检测是否有客户端连接了上来。
同步和异步是另一种情况。还有这么一个过程需要处理,譬如有一段内存要拷贝,可以有两种方式来处理,一种就是线程一直在拷贝直到拷贝结束,然后线程继续执行返回执行结果;再一种就是线程直接返回,通过其他的方式来获取拷贝结果。前者就是所谓的同步,而后者就是异步。
考虑上述两种情况,这两组概念的其实是有本质的区别,“异步不见得就是非阻塞”!在“信号驱动 I/O”这篇博文里我还特意测试了一下,socket异步的时候accept是不是就成了非阻塞的,测试结果是“no”!
通常阻塞/非阻塞通常是指接口的性质,但是同步/异步是指用户程序获取结果的时刻(是及时还是非及时)。
关于这两组概念的相应实例,在以后的实例代码中也会标出来的。
阅读(1959) | 评论(0) | 转发(0) |