简单谈谈BIO,NIO,AIO

news2024/12/24 2:10:16

目录

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 设备。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何检查Linux硬盘大小、类型和硬件详细信息?

在Linux系统中,了解硬盘的大小、类型和硬件详细信息对于系统管理和故障排除非常重要。本文将详细介绍如何使用命令行工具来检查Linux硬盘的大小、类型和硬件详细信息。 1. 检查硬盘大小 要检查Linux硬盘的大小,可以使用lsblk命令。该命令显示了系统中所…

chatgpt赋能python:Python取位:介绍和应用

Python取位:介绍和应用 Python是一种解释型,高级,通用编程语言。它在最近几年中变得越来越受欢迎,因为它易于学习和使用,并且具有很强的可读性和简洁性。在Python编程中,取位是一种很常见的操作。在本文中…

chatgpt赋能python:Python中如何取空格之前的内容?

Python中如何取空格之前的内容? 在Python中,我们经常需要从文本中提取关键信息,但有时这些信息的位置并不是固定的,而是被包围在一些无用的字符中,比如空格。那么,在Python中,如何取空格之前的…

springboot医院在线医疗挂号服务系统+jsp网上药店药品商城b254v

选题意义、价值和目标: 随着经济的迅速发展,人们对生活水平和身体健康的要求越来越高,但同时也面临着优质医疗资源紧缺,看病难,看病贵,医患关系危机等各种各样的问题。近些年,越来越多传统行业的服务被迁移到互联网上来。如何使用互联网技术解决当前医疗系统中存在的…

用R语言绘制三维曲面

文章目录 graphics::persplattice::wireframergl::plot3drgl::surface3dscatterplot3d::scatterplot3d graphics::persp x <- seq(-10, 10, length.out 30) y <- x f <- function(x, y) { r <- sqrt(x^2y^2); 10 * sin(r)/r } z <- outer(x, y, f) z[is.na(z)…

chatgpt赋能python:Python中如何去除NaN?-一个有10年python编程经验的工程师

Python中如何去除NaN&#xff1f; - 一个有10年python编程经验的工程师 NaN即Not a Number的缩写&#xff0c;表示非数字&#xff0c;也称为缺失值。在数据分析和机器学习中&#xff0c;经常会遇到数据集中存在NaN的情况。 Python提供了许多实用的库和函数&#xff0c;可以轻…

chatgpt赋能python:Python去掉空格和换行——提升网站的SEO排名

Python去掉空格和换行——提升网站的SEO排名 空格和换行是我们日常生活和编程中经常遇到的问题&#xff0c;特别是在网站开发中&#xff0c;它们会大大影响网站的SEO排名。因此&#xff0c;在这篇文章中&#xff0c;我们将介绍如何使用Python去掉空格和换行&#xff0c;以提升…

linux信号量与PV操作知识点总结

信号量 信号量(semaphore) 与已经介绍过的 IPC 结构不同&#xff0c;它是一个计数器&#xff0c;信号量用于实现进程间的与斥与同步&#xff0c;而不是用于存储进程间通信数据。 1、特点 &#xff08;1&#xff09;信号量用于进程间同步&#xff0c;若要在进程间传递数据需要结…

如何在华为OD机试中获得满分?Java实现【优秀学员统计】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

C++是如何从代码到游戏的

有一个Student类。C怎么创建一个学生类的对象&#xff1f; // 嗯我会&#xff01;有两种方式&#xff1a; Student s; Student *s2 new Student("张三");现在这学生的行为有&#xff1a;吃饭&#xff0c;睡觉&#xff0c;上网课。现在你执行个上网课的行为&#xf…

chatgpt赋能python:Python取数简介

Python取数简介 Python是一款强大的编程语言&#xff0c;可以轻松地处理各种数据类型并进行数据分析。Python的强大功能也使其成为数据科学和机器学习等领域非常受欢迎的编程语言。在这篇文章中&#xff0c;我们将探讨在Python中如何取数。 Python中的取数 Python中有多种方…

C#,码海拾贝(24)——线性方程组求解的复系数方程组的全选主元高斯-约当消去法之C#源代码,《C#数值计算算法编程》源代码升级改进版

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 求解线性方程组的类 LEquations /// 原作 周长发 /// 改编 深度混淆 /// </summary> public static partial class LEquations { /// <summary> …

delphi11.3的WebBrower支持Edge

看到此消息后&#xff0c;立即下载了DelphiCE&#xff08;社区版&#xff09; 安装&#xff0c;创建项目&#xff0c;放TWebBrowers&#xff0c;TButton 配置参数为EdgeOnly F9运行&#xff0c;没反应 配置参数为EdgeIfAvailable F9运行&#xff0c;提示浏览器版本过低 全网搜索…

chatgpt赋能python:Python取两者之间的最大值

Python取两者之间的最大值 介绍 Python是一种高级编程语言&#xff0c;广泛应用于计算机科学、人工智能、数据科学、机器学习等不同领域。它的易用性和灵活性使它成为许多开发人员首选的工具。本篇文章将介绍如何使用Python来取两者之间的最大值。 如何取两者之间的最大值 …

URP自定义屏幕后处理

回到目录 大家好&#xff0c;我是阿赵。这次来说一下URP渲染管线里面怎样使用后处理效果&#xff0c;还有怎样去自定义后处理效果。 一、使用URP自带的后处理效果 要使用URP自带的后处理效果&#xff0c;方法很简单&#xff0c;和Unity内置渲染管线的PostProcessing后处理很…

如何在Linux中更改SSH端口?

SSH&#xff08;Secure Shell&#xff09;是一种安全的远程登录协议&#xff0c;它允许您通过网络远程连接到Linux系统并进行管理操作。默认情况下&#xff0c;SSH使用22端口进行通信。然而&#xff0c;为了增强系统的安全性&#xff0c;有时候我们需要更改SSH端口&#xff0c;…

chatgpt赋能python:Python分解——探究Python语言的精髓

Python分解——探究Python语言的精髓 Python作为一种动态解释性语言&#xff0c;逐渐成为数据科学和人工智能领域的“标配”。Python语言的优势不仅在于其简洁而直观的语法&#xff0c;更在于其开源庞大的生态系统。而Python分解&#xff0c;则是将Python语言的优势、拆分并深…

chatgpt赋能python:Python内连接的重要性

Python内连接的重要性 在数据分析和机器学习领域&#xff0c;内连接是一种非常重要的概念&#xff0c;用于筛选和分析不同数据集之间的共同项。Python语言的强大功能和广泛的库可以帮助我们轻松地实现内连接。在本文中&#xff0c;我们将介绍Python内连接的基础知识、实现方式…

chatgpt赋能python:Python分组:组织你的代码,提升可读性和可维护性

Python 分组: 组织你的代码&#xff0c;提升可读性和可维护性 在编写代码时&#xff0c;组织良好的代码结构和架构是非常重要的。对于大规模的项目&#xff0c;特别是多人合作开发的项目来说&#xff0c;代码管理和组织是至关重要的。Python 分组是一种常用的技术&#xff0c;…

css高级技巧

1. 精灵图 index.png 分析图 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title…