美文网首页大数据Java
Java的BIO与NIO模型

Java的BIO与NIO模型

作者: Java弟中弟 | 来源:发表于2021-11-18 13:34 被阅读0次

来聊一聊Java的BIO和NIO及一些底层原理,有时间下期更新Netty相关内容~

模型基本说明

  • 什么是I/O模型:就是用什么样的通道进行数据发送和接收,很大程度上决定了程序通信的性能
  • Java共支持3种网络编程模型I/O模式: BIO、NIO、AIO传统Java的I/O模型

BIO:同步并阻塞(传统阻塞型)

  • 服务器为每一个新连接建立一个 新线程 进行处理,如果连接没有数据也会 阻塞等待 (不做任何事情)造成不必要的线程开销(示意图如下) PS:BIO -> blocking io
Java的BIO与NIO模型

现在Java的I/O模型

NIO:同步非阻塞

  • 服务器的一个线程能处理多个请求(连接),客户端发送的连接请求会注册到多路复用器上,多路复用器轮询到连接有I/O请求就进行处理(示意图如下) PS:NIO -> non-blocking io
Java的BIO与NIO模型

AIO:异步非阻塞(非重点)

  • 引入了异步通道的概念,采用Proactor模式,简化了程序编写,有效的请求才会启动线程,它的特点是先由操作系统完成后才通知服务端程序启动线程去处理,一般适用于连接数较多且连接时长较长的应用BIO、NIO、AIO使用场景分析
  • BIO适用于连接数小且固定的架构,对服务器资源占用高,一般只在JDK1.4以前(唯一选择)
  • NIO适用于连接数目多且连接比较短的架构,如聊天服务器,弹幕系统,编程复杂,JDK1.4开始才有
  • AIO适用于连接数目多且连接比较长的架构,如相册服务器,充分调用OS参与并发操作,JDK1.7后出现Java BIO 编程BIO基本介绍
  • Java BIO就是传统的Java I/O编程,其相关类和接口在 java.io
  • BIO(Blocking IO):同步阻塞,服务器为每个连接请求建立新的线程,如果没有事情做也会阻塞等待,直到断开链接,这样会造成 不必要的线程开销
  • 对于BIO的架构可以通过线程池机制改善(多个客户连接服务器)
  • BIO 占用资源高 ,适用于连接数比较小且固定的架构,但是代码简单Java BIO 工作机制

BIO工作流程

  1. 服务端启动一个 ServerSocket
  2. 客户端启动 Socket 对服务器进行通信,服务器对每一个客户端线程之间建立通讯
  3. 客户端线程请求结束后,断开链接,服务端线程结束Java BIO问题分析
  • 每个请求都需要创建独立的线程,为客户端数据Read/Write
  • 当并发数大的时候,要创建大量线程来处理链接,系统资源占用大
  • 建立连接后,线程如果暂时没有数据可读,就阻塞在Read上,造成线程资源浪费Java NIO 编程NIO基本介绍
  • Java NIO 全称 Java non-blocking IO 是JDK1.4开始提供的新API,是 同步非阻塞
  • NIO相关类都放在java.nio包下,并对原 java.io 包中的很多类进行改写
  • NIO有三大核心部分: Channel(通道)、Buffer(缓冲区)、Selector(选择器)
  • NIO是 面向缓冲区,或者面向块编程 的,不是简单的read和write,数据读取到一个它稍后处理的缓冲区,也可按需要在缓冲区前后移动读取数据
  • NIO的 非阻塞模式 :一个线程从某通道读取数据的时候, 仅能得到目前可用的数据 ,当没有可用的数据时,什么都不会获取,会去做别的事情( 因为数据是块的,所以等它攒到一定大小直到可用的时候再给就行,而不会因为数据是散装的要一直阻塞等待浪费线程!!! )
  • 这样就能将很多请求交由一个线程处理,大幅度减少线程开销NIO和BIO
  • BIO以 的形式处理数据,NIO以 的形式处理数据
  • BIO是 阻塞的 ,NIO是 非阻塞的
  • BIO的流是 字节流字符流而NIO的块基于 Channel(通道) Buffer(缓冲区) 读取数据Selector(选择器) 监听多个通道的 事件(连接请求,数据到达)NIO三大核心关系图
  • 每一个Channel都会对应一个Buffer
  • Selector对应一个服务器线程,一个线程对应多个Channel
  • Selector选择哪个是由Channel的 事件Event 决定的
  • Selector会根据事件安排在各个通道上 切换
  • Buffer是缓冲区,其实就是一个内存块,底层就是一个数组(bytebuffer)
  • Buffer的读写是双向,既可以读也可以写,像底层操作系统的系统通道也是双向的缓冲区(Buffer)

Buffer的本质 -> 可以读写的数据内存块(容器对象)

数据的读写必须经过buffer

Java的BIO与NIO模型

Buffer类的基本信息

Java的BIO与NIO模型

Buffer类相关方法(比较灵活)

Java的BIO与NIO模型

通道(Channel)

NIO通道与BIO的流的区别

  • 通道可以同时进行读写,流只能读或者写
  • 通道可以异步读写数据,流只能同步
  • 通道可以从缓冲区读&写数据

常用Channel类

  • BIO的Stream是 单向 的,NIO的Channel是 双向
  • 常用的Channel类: ServerSocketChannel (类似ServerSocket)和 SocketChannel (类似Socket)
  • Filechannel ->文件读写通道
  • DatagramChannel -> UDP数据读写通道
  • ServerSocketChannel & SocketChannel -> TCP读写通道

Selector(选择器)

  • Java的NIO,用非阻塞IO模式,得益于 Selector
  • 多个Channel以事件的方式注册到同一个Selector -> 这样Selector可监控多个通道是否有事件发生 -> 一个线程管理多个通道的连接和请求
  • 只有有事件发生时才回去读写,减少线程开销(线程上下文切换)
  • 线程在非阻塞IO的空闲时间在其他有需要的通道上执行IO操作,节约了时间
  • Netty的IO线程NioEventLoop(事件)

示意图

Java的BIO与NIO模型

相关文章

  • 1.Netty基本-io模式,线程模型,Reactor模式都啥呀

    关于IO模式,线程模型? Java的io模型分为三种,(BIO,NIO,AIO),Netty现在主要推荐的(NIO...

  • 第一篇 Java网络编程

    本篇主要从学习角度整理java的几个网络模型,包括: BIO通信模型 伪异步通信模型 NIO通信模型 NIO2.0...

  • Netty基础-JAVA IO模型

    java - IO模型 BIO NIO AIO 同步与异步,阻塞与非阻塞 同步与异步是面向多个线程协作的情况。 假...

  • grpc线程模型

    BIO 线程模型 在 JDK 1.4 推出 Java NIO 之前,基于 Java 的所有 Socket 通信都采...

  • Java的BIO与NIO模型

    来聊一聊Java的BIO和NIO及一些底层原理,有时间下期更新Netty相关内容~ 模型基本说明 什么是I/O模型...

  • NIO教程 ——检视阅读(上)

    NIO教程 ——检视阅读 参考 BIO,NIO,AIO 总结 Java NIO浅析 Java NIO 教程——极客...

  • java nio的理解

    java nio是一种区别BIO的新I/O模型,nio即new I/O。它应该包括我们常说的同步非阻塞模型,以及异...

  • BIO,NIO,AIO 总结

    BIO,NIO,AIO 总结 Java 中的 BIO、NIO和 AIO 理解为是 Java 语言对操作系统的各种 ...

  • BIO,NIO,AIO 总结

    BIO,NIO,AIO 总结 Java 中的 BIO、NIO和 AIO 理解为是 Java 语言对操作系统的各种 ...

  • Java原生Nio编程

    原生Nio编程 NIO提供了与传统BIO模型中的Socket和ServerSocket相对应的SocketChan...

网友评论

    本文标题:Java的BIO与NIO模型

    本文链接:https://www.haomeiwen.com/subject/xgbdtrtx.html