Netty入门到超神系列-BIO、NIO、AIO的认识

简介: I/O概述I/O其实是Input,Output的缩写,意思是输入和输出,比如:把磁盘中的一个文件读入Java内存中,站在Java内存的角度来看就是输入即input, 可以使用Java提供的输入流如:InputStream#read 来实现。如果是把一个段文本内容从Java内存中保存到磁盘上的某个文件,站在Java内存的角度来说就是输出,可以使用Java提供的输出流:OutputStream#write() 来实现。再比如把一个数据通过网络发送给其他服务器就是输出,或者从其他服务器接收一段数据就是输入。I/O也是有很多种的,比如Java支持三种:BIO,NIO,AIO

前言

本文章是《Netty入门到超神系列》第一章,主要介绍java的三大I/O模型:BIO,NIO,AIO,因为Netty采用了NIO模型,要透彻Netty就得懂NIO原理,NIO又是在BIO基础进行演变,所以我们得对这些I/O都要有一些了解。

I/O概述

I/O其实是Input,Output的缩写,意思是输入和输出,比如:把磁盘中的一个文件读入Java内存中,站在Java内存的角度来看就是输入即input, 可以使用Java提供的输入流如:InputStream#read 来实现。如果是把一个段文本内容从Java内存中保存到磁盘上的某个文件,站在Java内存的角度来说就是输出,可以使用Java提供的输出流:OutputStream#write() 来实现。再比如把一个数据通过网络发送给其他服务器就是输出,或者从其他服务器接收一段数据就是输入。

I/O也是有很多种的,比如Java支持三种:BIO,NIO,AIO

同步/异步/阻塞/非阻塞

为了方便理解几种IO的思想,这里先了解一下同步异步和阻塞非阻塞,这几个概念比较抽象,我举个例子来说明

  • 同步与异步
    假如在A线程 开了一个B线程,如果A线程必须等到B线程执行完成拿到结果之后才能继续执行后续代码,这就是同步。
    反之如果A线程无需等待B线程执行结束就可以继续执行后续代码,这就是异步,A线程通常使用事件或回调机制来得到B线程的返回结果。
  • 阻塞与非阻塞
    阻塞是指I/O操作需要彻底完成后才能返回用户空间 ,非阻塞是指I/O操作被调用后立即返回一个状态值,无需等I/O操作彻底完成
    比如某个线程中通过 read 读取数据,如果当read不到数据时,线程得一直等待,直到read到数据线程才能继续往后执行,那这就是阻塞。
    反之如果线程 read 不到数据也不需要等待,可以继续往后执行,那这就是非阻塞。

BIO理解

BIO被称为 Blocking I/O,是同步并阻塞型IO,服务器实现模式为一个连接一个线程,我们以client / server 为例, 当Client客户端向 Server发起一个请求,Server就会创建一个线程来处理这个请求,如果该线程没有读取到数据,就会一直阻塞在这,等待客户端发送数据,这会造成不必要的线程开销,当并发大的时候会创建大量的线程,比较占用系统资源。优化方案是使用线程池。BIO模型示意图:

BIO是Java传统的IO模型,InputStream,OutputStream等输入输出流都是基于BIO,问题也比较明显,即:一个请求一个线程比较占用资源,另外当read()不到数据时线程会阻塞,导致性能达不到最优,所以BIO适用于并发连接少的业务场景。优点是程序简单容易理解。

NIO理解

NIO是non-blocking I/O 或者 New IO ,是同步非阻塞的IO模型,实现模式是一个线程处理多个请求,客户端发送的请求都会交给多路复用器去处理,多路复用器采用轮询机制,轮询到连接有IO请求就创建线程进行处理。NIO采用非阻塞机制,当线程读取不到客户端发送的数据也不会阻塞,这样该线程就可以做其他的事情。

BIO 和 NIO 的区别

  • BIO以流的方式处理数据,NIO以块(buffer)的方式处理数据,块的IO效率高于流的IO效率
  • BIO是阻塞IO,NIO是非阻塞IO
  • BIO使用字符流,或者字节流进行操作,NIO基于channel通道和buffer缓冲区进行操作
  • BIO适用于并发低的业务场景,NIO适用于并发高的业务场景

AIO理解

在进行 I/O 编程中,常用到两种模式:Reactor和 Proactor,Java 的 NIO 就是 Reactor ,AIO采用 Proactor 模式。

AIO: NIO2.0,或称为AIO(Asynchronous I/O),是异步非阻塞IO是对NIO的增强,AIO 引入异步通道的概念,简化了程序编写,有效的请求才启动线程,它的特点是先由操作系统完成后才通知服务端程序启动线程去处理,一般适用于连接数较多且连接时间较长的应用。

目前 AIO 还没有广泛应用,Netty 也是基于NIO, 而不是AIO,所以这里不做过多讲解。

三种IO对比

目录
相关文章
|
3月前
|
设计模式
Lettuce的特性和内部实现问题之Netty NIO的性能优于BIO的问题如何解决
Lettuce的特性和内部实现问题之Netty NIO的性能优于BIO的问题如何解决
|
2月前
|
Java
Netty BIO/NIO/AIO介绍
Netty BIO/NIO/AIO介绍
|
19天前
|
Java Linux 应用服务中间件
【编程进阶知识】高并发场景下Bio与Nio的比较及原理示意图
本文介绍了在Linux系统上使用Tomcat部署Java应用程序时,BIO(阻塞I/O)和NIO(非阻塞I/O)在网络编程中的实现和性能差异。BIO采用传统的线程模型,每个连接请求都会创建一个新线程进行处理,导致在高并发场景下存在严重的性能瓶颈,如阻塞等待和线程创建开销大等问题。而NIO则通过事件驱动机制,利用事件注册、事件轮询器和事件通知,实现了更高效的连接管理和数据传输,避免了阻塞和多级数据复制,显著提升了系统的并发处理能力。
34 0
|
3月前
|
缓存 Java UED
BIO、NIO、AIO有什么区别
【8月更文挑战第16天】BIO、NIO、AIO有什么区别
71 4
|
3月前
|
Java
"揭秘Java IO三大模式:BIO、NIO、AIO背后的秘密!为何AIO成为高并发时代的宠儿,你的选择对了吗?"
【8月更文挑战第19天】在Java的IO编程中,BIO、NIO与AIO代表了三种不同的IO处理机制。BIO采用同步阻塞模型,每个连接需单独线程处理,适用于连接少且稳定的场景。NIO引入了非阻塞性质,利用Channel、Buffer与Selector实现多路复用,提升了效率与吞吐量。AIO则是真正的异步IO,在JDK 7中引入,通过回调或Future机制在IO操作完成后通知应用,适合高并发场景。选择合适的模型对构建高效网络应用至关重要。
67 2
|
4月前
|
安全 Java Linux
(七)Java网络编程-IO模型篇之从BIO、NIO、AIO到内核select、epoll剖析!
IO(Input/Output)方面的基本知识,相信大家都不陌生,毕竟这也是在学习编程基础时就已经接触过的内容,但最初的IO教学大多数是停留在最基本的BIO,而并未对于NIO、AIO、多路复用等的高级内容进行详细讲述,但这些却是大部分高性能技术的底层核心,因此本文则准备围绕着IO知识进行展开。
147 1
|
5月前
|
Java 视频直播 数据库连接
Java I/O 模型详解:BIO、NIO 与 AIO 的特性与应用
Java I/O 模型详解:BIO、NIO 与 AIO 的特性与应用
64 2
|
4月前
|
监控 网络协议 Java
Java面试题:解释Java NIO与BIO的区别,以及NIO的优势和应用场景。如何在高并发应用中实现NIO?
Java面试题:解释Java NIO与BIO的区别,以及NIO的优势和应用场景。如何在高并发应用中实现NIO?
65 0
|
5月前
|
存储 监控 Java
深入探索Java BIO与NIO输入输出模型:基于文件复制和socket通信
深入探索Java BIO与NIO输入输出模型:基于文件复制和socket通信
|
4月前
|
Java 大数据
解析Java中的NIO与传统IO的区别与应用
解析Java中的NIO与传统IO的区别与应用