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 伪异步IO NIO AIO
客户端数目 : 服务器端 I/O 线程数目 1 : 1 m : n m : 1 m : 0
网络 I/O 模型 同步阻塞 I/O 同步阻塞I/O 同步非阻塞I/O 异步非阻塞I/O
吞吐量 较低 一般 较高 较高
编程复杂度 比较简单 比较简单 非常复杂 比较复杂

说明

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

相关文章
|
1月前
|
存储 Java 数据处理
|
1月前
|
Java API
java中IO与NIO有什么不同
java中IO与NIO有什么不同
|
7天前
|
监控 Java 开发者
深入理解 Java 网络编程和 NIO
【4月更文挑战第19天】Java网络编程基于Socket,但NIO(非阻塞I/O)提升了效率和性能。NIO特点是非阻塞模式、选择器机制和缓冲区,适合高并发场景。使用NIO涉及通道、选择器和事件处理,优点是高并发、资源利用率和可扩展性,但复杂度、错误处理和性能调优是挑战。开发者应根据需求选择是否使用NIO,并深入理解其原理。
|
2月前
|
移动开发 编解码 网络协议
用Java的BIO和NIO、Netty来实现HTTP服务器(三) 用Netty实现
用Java的BIO和NIO、Netty来实现HTTP服务器(三) 用Netty实现
|
4月前
|
存储 监控 Java
Java输入输出:什么是NIO(New I/O)?
Java输入输出:什么是NIO(New I/O)?
33 1
|
6月前
|
存储 Java API
Java NIO+示例代码
Java NIO(New IO)是 JDK 1.4 引入的一组新的 I/O API,用于支持非阻塞式 I/O 操作。相比传统的 Java IO API,NIO 提供了更快、更灵活的 I/O 操作方式,可以用于构建高性能网络应用程序。 Java NIO 的主要组成部分包括: 1. Channel:通道是一个在应用程序和文件、网络套接字之间的连接。可以通过通道来进行数据的读取和写入。 2. Buffer:缓冲区是一个容器,用于存储数据。在 NIO 中,所有的数据读取和写入都是通过缓冲区进行的。 3. Selector:选择器用于监听多个 NIO 通道的事件,如读写事件。当某个通道发生事件时,选
52 0
|
6月前
|
Java 测试技术 Apache
Java IO 与 NIO:高效的输入输出操作探究
输入输出(IO)是任何编程语言中的核心概念,而在Java中,IO操作更是应用程序成功运行的基石。随着计算机系统变得越来越复杂,对IO的要求也日益增加。在本文中,我们将探讨Java IO和非阻塞IO(NIO)的重要性以及如何在Java中实现高效的输入输出操作。
|
7月前
|
缓存 Java
java NIO
java NIO
40 0
|
2月前
|
网络协议 Java Linux
用Java来实现BIO和NIO模型的HTTP服务器(二) NIO的实现
用Java来实现BIO和NIO模型的HTTP服务器(二) NIO的实现
|
2月前
|
编解码 网络协议 Java
用Java的BIO和NIO、Netty实现HTTP服务器(一) BIO与绪论
用Java的BIO和NIO、Netty实现HTTP服务器(一) BIO与绪论