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,为博主本人创作,修改后搬运至阿里云开发者社区发表。

相关文章
|
17天前
|
网络协议 Dubbo Java
一文搞懂NIO、AIO、BIO的核心区别(建议收藏)
本文详细解析了NIO、AIO、BIO的核心区别,NIO的三个核心概念,以及NIO在Java框架中的应用等。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
一文搞懂NIO、AIO、BIO的核心区别(建议收藏)
|
21天前
|
消息中间件 缓存 Java
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
零拷贝技术 Zero-Copy 是指计算机执行操作时,可以直接从源(如文件或网络套接字)将数据传输到目标缓冲区, 而不需要 CPU 先将数据从某处内存复制到另一个特定区域,从而减少上下文切换以及 CPU 的拷贝时间。
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
|
2月前
|
Java
让星星⭐月亮告诉你,Java NIO之Buffer详解 属性capacity/position/limit/mark 方法put(X)/get()/flip()/compact()/clear()
这段代码演示了Java NIO中`ByteBuffer`的基本操作,包括分配、写入、翻转、读取、压缩和清空缓冲区。通过示例展示了`position`、`limit`和`mark`属性的变化过程,帮助理解缓冲区的工作原理。
31 2
|
3月前
|
存储 网络协议 Java
Java NIO 开发
本文介绍了Java NIO(New IO)及其主要组件,包括Channel、Buffer和Selector,并对比了NIO与传统IO的优势。文章详细讲解了FileChannel、SocketChannel、ServerSocketChannel、DatagramChannel及Pipe.SinkChannel和Pipe.SourceChannel等Channel实现类,并提供了示例代码。通过这些示例,读者可以了解如何使用不同类型的通道进行数据读写操作。
Java NIO 开发
|
2月前
|
Java Linux 应用服务中间件
【编程进阶知识】高并发场景下Bio与Nio的比较及原理示意图
本文介绍了在Linux系统上使用Tomcat部署Java应用程序时,BIO(阻塞I/O)和NIO(非阻塞I/O)在网络编程中的实现和性能差异。BIO采用传统的线程模型,每个连接请求都会创建一个新线程进行处理,导致在高并发场景下存在严重的性能瓶颈,如阻塞等待和线程创建开销大等问题。而NIO则通过事件驱动机制,利用事件注册、事件轮询器和事件通知,实现了更高效的连接管理和数据传输,避免了阻塞和多级数据复制,显著提升了系统的并发处理能力。
64 0
|
5月前
|
Java 大数据
解析Java中的NIO与传统IO的区别与应用
解析Java中的NIO与传统IO的区别与应用
|
7月前
|
存储 监控 Java
深入探索Java语言的NIO(New I/O)技术
深入探索Java语言的NIO(New I/O)技术
|
5月前
|
Java
Java中的NIO编程详解
Java中的NIO编程详解
|
5月前
|
Java 大数据
如何在Java中进行网络编程:Socket与NIO
如何在Java中进行网络编程:Socket与NIO
|
5月前
|
Java
Java中的NIO编程详解
Java中的NIO编程详解