《JDK源码分析》IO模型详解:第一章:IO模型演进(JAVA 小虚竹)

Posted 小虚竹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《JDK源码分析》IO模型详解:第一章:IO模型演进(JAVA 小虚竹)相关的知识,希望对你有一定的参考价值。

❤️作者简介:Java领域优质创作者🏆,CSDN博客专家认证🏆,华为云享专家认证🏆
❤️技术活,该赏
❤️点赞 👍 收藏 ⭐再看,养成习惯

前言

本系列IO模式详解 主要介绍BIO,NIO和AIO内容,深入了解源码+实战。目标是让小伙伴们可以快速了解IO的阻塞、同步、异步的现象、概念和特征以及优缺点。

第一章:I/O模型演进

I/O 模型基本说明

Java 3种常用的网络编程/IO 模型:BIO-同步阻塞IO(Blocking IO)、NIO-IO多路复用模型( IO multiplexing )(JAVA New IO)、AIO-异步IO(Asynchronous IO)
实际通信需求下,要根据不同的业务场景和性能需求决定选择不同的I/O模型

V1.0:I/O模型 BIO

**BIO(blocking I/O) ** :同步并阻塞(传统阻塞型),服务器实现模式为一个连接一个线程,即客户端有连接请求时,服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销 。

JDK支持的版本:JDK1.4以前

Java BIO 就是传统的 java io 编程,其相关的类和接口在java.io

传统的 java.io包,它基于流模型实现,提供了我们最熟知的一些 IO 功能,比如 File 抽象、输入输出流等。交互方式是同步、阻塞的方式,也就是说,在读取输入流或者写入输出流时,在读、写动作完成之前,线程会一直阻塞在那里,它们之间的调用是可靠的线性顺序。

很多时候,人们也把 java.net下面提供的部分网络 API,比如 Socket、ServerSocket、HttpURLConnection 也归类到同步阻塞 IO 类库,因为网络通信同样是 IO 行为。

BIO优点 :是代码比较简单、直观,方便实现。

BIO缺点 :则是 IO 效率和扩展性存在局限性,容易成为应用性能的瓶颈。

BIO适用场景 :适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中。

V2.0:I/O模型 NIO

Java NIO(New IO) : 同步非阻塞,服务器实现模式为一个线程处理多个请求(连接),即客户端发送的连接请求都会注册到多路复用器 上,多路复用器轮询到连接有 I/O 请求就进行处理

JDK支持的版本:JDK1.4开始支持

Java NIO 相关类都被放在 java.nio 包及子包下,提供了 Channel、Selector、Buffer 等新的抽象,可以构建多路复用的、同步非阻塞 IO 程序,同时提供了更接近操作系统底层的高性能数据操作方式。

NIO优点 :NIO 是可以做到用一个线程来处理多个操作的。假设有 1000 个请求过来,根据实际情况,可以分配20 或者 80个线程来处理。不像之前的阻塞 IO 那样,非得分配 1000 个。。

NIO缺点 : 技术实现复杂度高,增加维护成本。

NIO适用场景 :适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,弹幕系统,服务器间通讯等

V3.0:I/O模型 AIO

AIO(NIO2.0)(Asynchronous IO) : 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理,一般适用于连接数较多且连接时间较长的应用。

可以简单理解为,应用操作直接返回,而不会阻塞在那里,当后台处理完成,操作系统会通知相应线程进行后续工作。

JDK支持的版本:JDK1.7开始支持

Java AIO :主要在Java.nio.channels包下增加了下面四个异步通道:

	AsynchronousSocketChannel
	AsynchronousServerSocketChannel
	AsynchronousFileChannel
	AsynchronousDatagramChannel

AIO优点 :NIO的IO行为还是同步的,AIO更进一步,AIO是异步操作,效率进一步提高。

AIO缺点 :技术实现复杂度高,增加维护成本。

AIO适用场景 :适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用 OS 参与并发操作。

下一章预告:

第二章:JAVA BIO深入剖析

参考

B站:https://www.bilibili.com/video/BV1gz4y1C7RK?p=49

今天是持续写作的第 19 / 100 天。
可以关注我,点赞我、评论我、收藏我啦。

以上是关于《JDK源码分析》IO模型详解:第一章:IO模型演进(JAVA 小虚竹)的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点# Netty源码分析之Reactor线程模型详解

Linux epoll模型详解及源码分析

Linux epoll模型详解及源码分析

Libevent源码分析--- IO多路复用模型

Libevent源码分析--- IO多路复用模型

大白话详解5种网络IO模型