几个I/O模型的功能和特性对比

BIO:Block IO 传统的阻塞模型(ServerSocket/Socket),一个客户端对应一个I/O线程,为同步I/O,使用简单,可靠性非常差,吞吐量低

伪异步I/O:线程池+阻塞队列。为同步I/O,使用简单,可靠性差,吞吐量中。

非阻塞I/O(NIO):M:1(一个客户端线程(反应器)处理多个客户端连接,然后在调用业务线程进行处理操作,多路复用器轮询可读写数据,执行业务操作,线程池大小由jvm底层决定),非阻塞I/O(客户端连接操作是异步的,可以通过多路复用器注册OP_CONNECT等待后续结果),是同步I/O(I/O多路复用),使用非常复杂,可靠性好,吞吐量高。(linux上底层原理为epoll,存在空轮询bug)。

异步非阻塞I/O(AIO):M:0(不需要启动额外的I/O线程,被动回调),非阻塞I/O,异步I/O,使用复杂,可靠性好,吞吐量高。(JDK1.7之后提供的nio2.0,对应unix网络编程事件驱动的AIO)。

综上,我们可以看出,在并发量和吞吐量高的场合,选择异步非阻塞IO是最佳的选择,但是开发比较复杂。

扩展:
在网络上看到了netty和mima这两个NIO框架,可以降低nio编程的难度,且框架性能优秀,又结合业界的使用情况,社区活跃度、产品成熟度等多方面的考虑,想学习NIO编程的朋友可以看下netty,我近期也会学习netty。




猜你喜欢

转载自xiaoyun34286136.iteye.com/blog/2286628