11.Java IO 模型

I/O 模型简单的理解: 就是数据的发送和接收使用哪种通道, 这个通道决定了程序通讯性能.

Java 共支持3中网络编程模型: BIO NIO AIO.

BIO

特点: BIO 是 blocking I/O, 同步阻塞, 就是传统的 Java 原生阻塞模型.

采用 BIO 通信模型的服务端, 通常由一个独立的 Acceptor 线程负责监听客户端的连接, 它接收到客户端连接请求之后 为每个客户端创建一个新的线程进行链路处理, 处理完成之后, 通过输出流返回应答给客户端, 线程销毁. 这就是典型的一请求一应答通信模型.

该模型最大的问题就是缺乏弹性伸缩能力, 当客户端并发访问量增加后, 服务端的线程个数和客户端并发访问数是 1:1 的关系.

当线程数过多之后, 系统性能就会下降, 系统也会发生线程堆栈溢出、创建新线程失败等问题, 最终导致进程宕机或者僵死, 不能对外提供服务.

在这里插入图片描述
阻塞: 如果没有读到数据, 则会阻塞到读方法.

NIO

特点: NIO 全称 java non-blocking IO 同步非阻塞, 它是对 BIO 的一个改进.

一个线程处理多个请求(连接), 即客户端发送的连接请求都会注册到多路复用器上, 多路复用器轮询到连接有 IO 请求就进行处理.

Selector 就是一个多路复用器, 多路表示多个通道(连接), 复用表示复用一个或多个线程.

在这里插入图片描述
上图是它们三个的关系图, 下面说明以下:

  1. 每一个 Channel 都对应一个 Buffer.
  2. 一个线程对应一个 Selector, 一个 Selector 可以管理多个 Channel.
  3. Selector 选择哪个 Channel 是由 Channel 事件决定的.
  4. Buffer 就是一个内存块, 而且数据的读/写都是通过 Buffer. 注意: 和 BIO 不同, 这里的 Buffer 是双向的, 但是需要使用 flip 方法进行切换; 而在 BIO 中要么是输入流, 要么是输出流.
  5. Channel 也是双向的.

AIO(NIO.2)

特点: 异步非阻塞.

AIO 引入异步通道的概念, 采用了 Proactor 模式, 简化了程序编写, 有效的请求才启动线程, 它的特点是先由操作系统完成后才通知服务端程序启动线程去处理, 一般适用于连接数较多切连接时间较长的应用.

BIO NIO AIO 适用场景分析

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

NIO 方式适用于连接数目多且连接比较短的架构, 比如聊天服务器, 弹幕系统, 服务器间通讯等.

AIO 方式适用于连接数目多且连接比较长的架构, 比如相册服务器, 充分调用 OS 参与并发操作.

NIO 和 BIO 的比较

BIO 以流的方式处理数据, NIO 以块(缓冲区)的方式处理数据, 块 IO 的效率比流 IO 高很多.

BIO 是阻塞的, NIO 则是非阻塞的.

BIO 基于字节流和字符流操作, 而 NIO 基于 Channel 和 Buffer 进行操作, 数据总是从通道读取到缓冲区中, 或者从缓冲区写入到通道中. Selector 用于监听多个通道的事件(比如: 连接请求, 数据到达等), 因此使用单个线程就可以监听多个客户端通道.

参考文章

Java NIO系列教程(一) Java NIO 概述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值