欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-03 10:56:37
...
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。