非阻塞IO和异步IO的区别
非阻塞IO
非阻塞IO是同步IO的一种,指的是client发生一个调用函数,但是该调用不立即返回计算结果,而是传递一个error,这样client就知道还没准备好。client可以做其他事情。等到IO处理完毕,该调用则返回计算结果。也就是说client在主动等待这个结果。
在下图中,我们可以看到非阻塞IO的流程,一直都是client在主动询问对方准备好了没。一共传输两次数据,一次error,代表没准备好,还有最后一次的询问直接返回计算结果。
异步IO
而异步IO的方式,会让调用函数立即返回(注意和非阻塞IO的error是传递回来的,而不是返回,也就是它的调用函数一直在等),同时留下一个回调接口,让IO线程在处理完后通过回调接口通知client。
IO多路复用
IO多路复用是基于非阻塞IO的,也就是有一个函数(select,poll,epoll)会不断的轮询一个它所监视的socket(一个或多个),一旦有请求到达则立即处理,这样就可以用一个线程(运行函数的线程)处理多个socket。
select和poll的区别在于poll不限制socket数量。
epoll和其他两者的区别在于,epoll能返回有数据准备好的具体socket,而不用再对socket扫描一次,做一次复杂度O(n)的遍历。一旦通道数量多了,浪费的时间还是很多的。