简单谈谈BIO,NIO,AIO

目录

IO 概述

阻塞 IO (BIO)

基本理解

非阻塞 IO(NIO) 

​核心部分 

Channel

Buffer

Selector

Channel Buffer Selector 三者关系

 异步非阻塞 IO(AIO)


IO 概述

IO 的操作方式通常分为几种:同步阻塞 BIO、同步非阻塞 NIO、异步非阻塞 AIO。

(1)在 JDK1.4 之前,我们建立网络连接的时候采用的是 BIO 模式。

(2)Java NIO(New IO 或 Non Blocking IO)是从 Java 1.4 版本开始引入的一个新的IO API,可以替代标准的 Java IO API。NIO 支持面向缓冲区的、基于通道的 IO 操作。NIO 将以更加高效的方式进行文件的读写操作。BIO 与 NIO 一个比较重要的不同是, 我们使用 BIO 的时候往往会引入多线程,每个连接对应一个单独的线程;而 NIO 则是 使用单线程或者只使用少量的多线程,让连接共用一个线程。

(3)AIO 也就是 NIO 2,在 Java 7 中引入了 NIO 的改进版 NIO 2,它是异步非阻塞的IO 模型。 下面我们来详细介绍这几种 IO 方式

阻塞 IO (BIO)

基本理解

阻塞 IO(BIO)是最传统的一种 IO 模型,即在读写数据过程中会发生阻塞现象,直至 有可供读取的数据或者数据能够写入。

(1)在 BIO 模式中,服务器会为每个客户端请求建立一个线程,由该线程单独负责 处理一个客户请求,这种模式虽然简单方便,但由于服务器为每个客户端的连接都采 用一个线程去处理,使得资源占用非常大。因此,当连接数量达到上限时,如果再有 用户请求连接,直接会导致资源瓶颈,严重的可能会直接导致服务器崩溃。

(2)大多数情况下为了避免上述问题,都采用了线程池模型。也就是创建一个固定大 小的线程池,如果有客户端请求,就从线程池中取一个空闲线程来处理,当客户端处 理完操作之后,就会释放对线程的占用。因此这样就避免为每一个客户端都要创建线 程带来的资源浪费,使得线程可以重用。但线程池也有它的弊端,如果连接大多是长 连接,可能会导致在一段时间内,线程池中的线程都被占用,那么当再有客户端请求 连接时,由于没有空闲线程来处理,就会导致客户端连接失败。传统的 BIO 模式如下 图所示:

非阻塞 IO(NIO) 

 基于 BIO 的各种弊端,在 JDK1.4 开始出现了高性能 IO 设计模式非阻塞 IO(NIO)。

I/O复用结合线程池就是Reactor模式基本设计思想

(1)NIO 采用非阻塞模式,基于 Reactor 模式的工作方式,I/O 调用不会被阻塞,它 的实现过程是:会先对每个客户端注册感兴趣的事件,然后有一个线程专门去轮询每 个客户端是否有事件发生,当有事件发生时,便顺序处理每个事件,当所有事件处理 完之后,便再转去继续轮询。如下图所示:

 (2)NIO 中实现非阻塞 I/O 的核心对象就是 Selector,Selector 就是注册各种 I/O 事件地方,而且当我们感兴趣的事件发生时,就是这个对象告诉我们所发生的事件, 如下图所示:

 (3)NIO 的最重要的地方是当一个连接创建后,不需要对应一个线程,这个连接会被 注册到多路复用器上面,一个选择器线程可以同时处理成千上万个连接,系统不必创 建大量的线程,也不必维护这些线程,从而大大减小了系统的开销。

核心部分 

Java NIO 由以下几个核心部分组成:

- Channels

- Buffers

- Selectors

虽然 Java NIO 中除此之外还有很多类和组件,但 Channel,Buffer 和 Selector 构成 了核心的 API。其它组件,如 Pipe 和 FileLock,只不过是与三个核心组件共同使用的 工具类。

Channel

首先说一下 Channel,可以翻译成“通道”。Channel 和 IO 中的 Stream(流)是差不 多一个等级的。只不过 Stream 是单向的,譬如:InputStream, OutputStream.而 Channel 是双向的,既可以用来进行读操作,又可以用来进行写操作。

NIO 中的 Channel 的主要实现有:FileChannel、DatagramChannel、 SocketChannel 和 ServerSocketChannel,这里看名字就可以猜出个所以然来:分别 可以对应文件 IO、UDP 和 TCP(Server 和 Client)。

Buffer

NIO 中的关键 Buffer 实现有:ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer,分别对应基本数据类型: byte, char, double, float, int, long, short。

Selector

Selector 运行单线程处理多个 Channel,如果你的应用打开了多个通道,但每个连接 的流量都很低,使用 Selector 就会很方便。例如在一个聊天服务器中。要使用 Selector, 得向 Selector 注册 Channel,然后调用它的 select()方法。这个方法会一直 阻塞到某个注册的通道有事件就绪。一旦这个方法返回,线程就可以处理这些事件, 事件的例子有如新的连接进来、数据接收等。

Channel Buffer Selector 三者关系

(1)一个 Channel 就像一个流,只是 Channel 是双向的,Channel 读数据到 Buffer, Buffer 写数据到 Channel。

 (2)一个 selector 允许一个线程处理多个 channel。

 异步非阻塞 IO(AIO)

(1)AIO 也就是 NIO 2,在 Java 7 中引入了 NIO 的改进版 NIO 2,它是异步非阻塞 的 IO 模型。异步 IO 是基于事件和回调机制实现的,也就是说 AIO 模式不需要selector 操作,而是是事件驱动形式,也就是当客户端发送数据之后,会主动通知服 务器,接着服务器再进行读写操作。

(2)Java 的 AIO API 其实就是 Proactor 模式的应用,和 Reactor 模式类似。 Reactor 和 Proactor 模式的主要区别就是真正的读取和写入操作是有谁来完成的, Reactor 中需要应用程序自己读取或者写入数据,而 Proactor 模式中,应用程序不需 要进行实际的读写过程,它只需要从缓存区读取或者写入即可,操作系统会读取缓存 区或者写入缓存区到真正的 IO 设备。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/22927.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

约瑟夫问题的环形链表实现[Java]

⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章 ⭐作者主页:逐梦苍穹 ⭐如果觉得文章写的不错,欢迎点个关注一键三连😉有写的不好的地方也欢迎指正,一同进步😁…

C++入门预备语法

C入门预备语法 C关键字命名空间C输入&输出初步缺省参数函数重载引用内联函数auto和范围for(C11)指针空值nullptr C关键字 命名空间 命名空间是一种将变量名、函数名、类名和库名称等封装到一个命名空间域中,与其他域的同名量相隔离&…

Go语言环境搭建(内附网P下载地址)

一、Golang语言的官网 首先我们登录Golang的官方网站:https://golang.org/ 因为Google和中国的关系,直接登录Golang的官网,需要翻墙。 当然你也可以登录Golang的国内网站:https://golang.google.cn/ 二、下载 在Mac、Windows和L…

如何基于LiveNVR实现无人机等RTMP推流转成GB28181协议级联到GB28181视频平台

1、需求介绍 目前很多移动终端设备(如无人机等)只支持RTMP推流输出,不支持GB28181协议。但是又有需要通过GB28181协议接入到视频平台的需求。比如有些大疆无人机产品不能直接注册国标平台,只能rtmp推流。那么,项目中如…

Linux-搭建web服务器

综合练习:请给openlab搭建web网站 ​ 网站需求: ​ 1.基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! ​ 2.给该公司创建三个子界面分别显示学生信息,教学资料和缴费网站,基于[www.…

javaWebssh车辆保养管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh车辆保养管理系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用 B/S模式开发。开发环境为TOMCAT7.…

湍流的数值模拟方法概述

湍流,又称紊流,是一种极其复杂、极不规则、极不稳定的三维流动。湍流场内充满着尺度大小不同的旋涡,大旋涡尺度可以与整个流畅区域相当,而小漩涡尺度往往只有流场尺度千分之一的数量级,最小尺度旋涡的尺度通过其耗散掉…

IO流详解

IO流 1. 文件 1.1 什么是文件 文件对大家来说都不陌生: 文件是保存数据的地方,它可以保存文字、图片、视频等等例如大家平时使用的word文档、Excel文档、PPT文档等都是文件 1.2 文件流 文件在程序中是以流的形式来操作的流是指数据在数据源&#x…

高通开发系列 - 音频驱动中的APR通道不能打开问题

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 问题概述问题现象问题分析问题解决问题概述 对msm8909平台进行内核升级,相应的其音频驱动也需要进行升级,使用了同平台的音频驱动作…

ZBX_NOTSUPPORTED: Unsupported item key.

问题 ZBX_NOTSUPPORTED: Unsupported item key. 详细问题 笔者安装zabbix后,自定义item key进行测试。需在zabbix-server 端 切换目录: cd /usr/local/zabbix/bin 执行查询命令: ./zabbix_get -s 192.168.174.136 -p 10050 -k “home.file…

六、数据仓库详细介绍(ETL)经验篇

0x00 前言 日常工作中大多数时候都是在做数据开发,ETL 无处不在。虽然最近两年主要做的大数据开发,但感觉日常干的这些还是 ETL 那点事儿,区别只是技术组件全换了、数据量大了很多。 前几年数仓势微,是因为传统的那些工具数据库等…

LeetCode 117. 填充每个节点的下一个右侧节点指针 II

117. 填充每个节点的下一个右侧节点指针 II 描述 给定一个二叉树: struct Node {int val;Node *left;Node *right;Node *next; }填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 …

opencv缺陷检测

随着自动化生产设备的普及,工业机器人在各行各业的应用也越来越广泛,越来越多的生产线由自动化设备取代人工操作,实现自动化生产。在机器人分拣过程中,机器人不仅可以将不同规格和质量的产品准确地放入指定的托盘中,而…

Puppeteer入门实践

环境 1、安装nodejs 官网:https://nodejs.org/zh-cn 下载安装好nodejs只后 验证:node -v 出现版本号表示安装成功,否则需要配置环境变量 2、创建node项目并初始化 随便新建一个文件夹 进入文件夹搜索cmd回车 执行npm init -y 安装依赖 …

软件测试基础知识整理(八)- 软件缺陷

目录 一、软件缺陷 1.1 缺陷定义 1.2 缺陷判定标准 1.3 软件缺陷产生的原因 1.4 软件缺陷产生的根源 1.5 软件缺陷信息 1.5.1 缺陷状态 1.5.2 缺陷严重程度 1.5.3 缺陷优先级 1.6 缺陷报告模板 1.7 缺陷报告注意事项 1.8 缺陷跟踪流程 1.9 缺陷数据分析关注的问题 …

【ETH】以太网----PHY芯片LAN8720A----电路原理图

一、LAN8720A----简介 LAN8720A 是低功耗的 10/100M 以太网 PHY 层芯片,I/0 引脚电压符合EEE802.3-2005 标准,支持通过 RMI 接口与以太网 MAC 层通信,内置 10-BASE-T/100BASE-TX 全双工传输模块,支持 10Mbps 和 100Mbps。 LAN87…

内蒙古自治区住房和城乡建设分析及解决方案

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘 要:为深入贯彻落实《国务院办公厅关于印发新能源汽车产业发展规划(2021—2035年)的通知》(国办发 ﹝2020﹞39号)、《国家发展改革委等部门关于进一步提升…

java前后端分离有详细内容吗?

微服务架构java前后端分离都有哪些具体内容?目前,有不少客户朋友经常询问我们类似的问题。其实,在新的经济发展形势下,提质增效的低代码开发平台微服务架构早已成为不少新老客户的选择,它们不仅能提高办公协作效率&…

多商户商城系统开发功能优势与选择技巧

电商行业的持续发展,让越来越多的商家企业开始选择入驻多商户商城,通过该系统不仅能够为消费者提供更加便捷良好的购物体验,而且也能够为企业提供一个高效稳定的电商平台,可以说是未来电商行业发展的重要趋势。那么多商户商城系统…

Spring之DI(依赖注入)

依赖注入(DI)是一个过程,在这个过程中,对象仅通过构造函数参数、工厂方法的参数或在对象被实例化后通过属性设置来定义它们的依赖项(即与该对象一起工作的其他对象)。然后,容器在创建 bean 时注…