开发者社区> 星拱北辰> 正文

Java语言BIO、NIO、AIO模型

简介: 本文介绍Java语言BIO、NIO、AIO模型
+关注继续查看

前言

我们知道,UNIX环境下常见的网络I/O模型有5种:

  • 同步阻塞
  • 同步非阻塞
  • I/O复用
  • 信号驱动
  • 异步非阻塞

那么基于上述五种模型,Java中,随着NIO和AIO(NIO 2.0)的引入,一般具有以下三种网络编程模型:

  • BIO
  • NIO
  • AIO

这次,我们就简单聊聊这三种网络编程模型。

BIO

BIO是一个经典的网络编程模型,是通常我们实现一个服务器端程序的过程。

步骤如下:

  • 主线程accept请求阻塞。
  • 请求到达,创建新的线程来处理这个socket,完成对客户端的响应。
  • 主线程继续accept下一个请求。

这个模型的一个明显的缺点:

当客户端连接快速增长时,服务器端创建的线程也会骤增,系统性能可能会骤降。

因此,在该模型的基础上,可以创建线程池,从而避免对每个客户端线程都创建一个新的服务器端线程,进而提升性能(创建线程是很耗费资源的,尽管线程可以看做轻量级进程)。

可参考Tomcat的BIO Connector。

这种方式也有被称为“伪异步I/O”,因为它是把请求抛到线程池中异步等待处理。

NIO

Java的NIO类库从JDK1.4(Java4)开始引入,这里NIO主要指非阻塞I/O,主要使用Selector多路复用器来实现的。

Selector在Linux等主流操作系统中是通过epoll实现的。

epoll 详解

epoll 百度百科

Java NIO Selector 剖析

NIO的实现流程类似于select:

  • 创建ServerSocketChannel监听客户端连接并绑定监听窗口,设置为非阻塞模式。
  • 创建Reactor线程,创建多路复用器Selector并启动线程。
  • 将ServerSocketChannel注册到Reactor线程的Selector上。监听accept事件。
  • Selector在线程run方法中无限循环轮询准备就绪的key。
  • Selector监听到新的客户端接入,处理新的请求,完成TCP三次握手,建立物理连接。
  • 将新的客户端连接注册到Selector上,监听读操作。读取客户端发送的网络消息。
  • 客户端发送的数据就绪则读取客户端请求,进行处理。

AIO

传说中的AIO其实是NIO 2.0,Java的AIO类库从JDK1.7(Java7)引入,它提供了异步文件通道和异步socket通道的实现。

AIO底层在Windows上是通过IOCP实现的,在Linux上则是通过epoll实现的。

IOCP 解读

IOCP 百度百科

LinuxAsynchronousChannelProvider.java

UnixAsynchronousServerSocketChannelImpl.java

流程:

  • 创建AsynchronousServerSocketChannel,绑定监听端口。
  • 调用AsynchronousServerSocketChannel的accpet方法,传入自己实现的CompletionHandler。包括上一步都是非阻塞的。
  • 连接传入,回调CompletionHandler的completed方法,在里面,调用AsynchronousSocketChannel的read方法,传入负责处理数据的CompletionHandler。
  • 数据就绪,触发负责处理数据的CompletionHandler的completed方法。继续做下一步处理即可。
  • 写入操作类似,也需要传入CompletionHandler。

AIO比起NIO,有了不少的简化。

对比

对比指标同步阻塞IO伪异步IONIOAIO
客户端数目 : 服务器端 I/O 线程数目1 : 1m : nm : 1m : 0
网络 I/O 模型同步阻塞 I/O同步阻塞I/O同步非阻塞I/O异步非阻塞I/O
吞吐量较低一般较高较高
编程复杂度比较简单比较简单非常复杂比较复杂

说明

本文首发于CSDN,为博主本人创作,修改后搬运至阿里云开发者社区发表。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java 最常见面试题:BIO、NIO、AIO 有什么区别?
Java 最常见面试题:BIO、NIO、AIO 有什么区别?
19 0
阿里一面被问到BIO、NIO和AIO,我:……,面试官:“出门右转”
阿里一面被问到BIO、NIO和AIO,我:……,面试官:“出门右转”
21 0
通俗易懂的JAVA BIO NIO AIO 原理白话文解释,区别,优缺点及代码使用案例
通俗易懂的JAVA BIO NIO AIO 原理白话文解释,区别,优缺点及代码使用案例
39 0
BIO&NIO&AIO
BIO&NIO&AIO
18 0
简论BIO NIO AIO
简论BIO NIO AIO
34 0
Java NIO、BIO、 AIO 与 同步、阻塞、非阻塞、异步IO 简析
我相信大部分人看到这些名词,都是一头雾水的,如果你去搜索引擎搜索,那么恭喜你,你又会被各种文章中的高大上的名词搞得云里雾里。那么,我们应该怎么理清这么名词之间的关系呢? 所谓 同步/异步/阻塞/非阻塞 IO ,是指操作系统中的对 IO 处理的不同方法,而 Java 对这些不同操作方法做了一些包装,由此有了 BIO / NIO / AIO 几种操作接口。 我不想复制一些高大上的概念,只是想尽量好好说话,说清楚他们之间的关系。 需求 有 A、B、C、D 四个线程可以生产文件,假设他们的返回的文件是一样的,对应我们的服务端 有 E、F、G、H 四个线程在随机时间向服务端上传一个文本,并且要求
52 0
Web中间件——Tomcat中的BIO、NIO、APR模式
Tomcat在我们日常开发B/S项目时常常进行使用,当然在Spring全家桶中我们现在也是使用的内置tomcat,但是很多人可能不会对于tomcat进行深入性研究,其实在我们的产品进行性能提升时,web中间件的优化也是占有很大一部分,而tomcat中采用不同的模式对应的使用场景下性能也是不一样的,因此本篇文章将对于这几个模式进行简单讲解,后续我们会对于不同的模式进行配置方式讲解。
43 0
网络编程:IO 通信模型—BIO&;NIO|学习笔记
快速学习网络编程:IO 通信模型—BIO&;NIO
33 0
即时通讯技术文集(第9期):Java NIO和Netty入门系列 [共19篇]
为了更好地分类阅读52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第9 期。
36 0
+关注
星拱北辰
居其所而众星拱之
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Java工程师必读手册
立即下载
Java应用提速(速度与激情)
立即下载
Java单元测试实战
立即下载