1.首先介绍一下阻塞,非阻塞,同步和异步的关系;
所谓阻塞即在调用结果没有返回之前,线程一直挂起;非阻塞则是无论结果是否返回,则都不会阻塞当前线程;
同步:即调用方法或者函数的时候必须有结果才返回,而非同步则调用完方法则直接返回了;
2.io模型:
同步阻塞,同步非阻塞,异步阻塞,异步非阻塞;例子具体可见:http://blog.youkuaiyun.com/barnetthe/article/details/48933935
3;同步非阻塞的代表则是IO复用:
目前IO复用的主要有select,poll和epoll;
select是基于数组实现的,将注册的事件存入数组,然后每次遍历整个数组来查看的事件的是就绪,由于是基于数组是实现的所以他的存储事件的是有限的,受限于FD_SIZE;
而poll是基于链表的的,所以相比起select就少了一次内存的拷贝过程,但是两者都有一个共同点就是需要每次遍历整个数组或者链表将所以的事件状态都查询一边,而针对一些大事件本来就没有执行完,却还是浪费时间去查询,这样也造成了性能的损失;
epoll解决了上述的问题,其是基于事件驱动的方式,避免了每次都要将整个fdsize扫描一遍,而epoll只会返回就绪的td;epoll是基于nmap内存映射的技术避免了内存考培的开销;
4:Java的1.4出现了NIO类库,这里的NIO是通过select多路复用实现的;而AIO在jkd1.7出现,称之为NIO2.-,而这也是真正的异步非阻塞的IO;