还不懂BIO,NIO,AIO吗

BIO(Blocking I/O)、NIO(Non-blocking I/O)和 AIO(Asynchronous I/O)是 Java 中三种不同的 I/O 模型,主要用于处理输入 / 输出操作。

一、BIO(Blocking I/O)

  1. 定义与工作原理:

    • BIO 即阻塞式 I/O(同步阻塞,传统IO)。在这种模型下,当一个线程发起一个 I/O 操作(如读取文件或网络数据)时,此线程会被阻塞,直到操作完成才返回。

    • 例如,当一个程序使用 BIO 从网络读取数据时,发起读取操作的线程会一直等待数据到来,在此期间不能进行其他操作。

  2. 缺点:

    • 代码中的read,accept操作时阻塞操作,如果客户端连接服务器后,服务器不发送数据,将会一直阻塞当前线程,浪费资源

    • 若连接数很多,创建的线程数量也多,服务器压力很大,后续优化成线程池处理方式,勉强解决了此问题。

  3. 适用场景:

    • 适用于连接数目比较小且固定的架构,这种模式对服务器资源要求较高,但程序复杂度比较低。

    • 例如,一些简单的文件传输程序或者小型的服务器应用,连接数量有限且对性能要求不高。

    • Socket通信

二、NIO(Non-blocking I/O)

NIO在BIO的基础上进行了升级,将阻塞换成非阻塞,虽然只是模式变了下,但是代码复杂量却增加了不少。在NIO模型中,服务端可以开启一个线程处理多个连接,它是非阻塞的,客户端发送的数据都会注册到多路复用器selector上面,当selector (selector的select方法是阻塞的)轮询到有读、写或者连接请求时,才会转发到后端程序进行处理,没有数据的时候,业务程序并不需要阻塞等待。

数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择区)用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个线程可以监听多个数据通道。

  1. 定义与工作原理:

    • NIO 即非阻塞式 I/O(同步非阻塞)。在这种模型下,当线程发起一个 I/O 操作时,它不会被阻塞,而是立即返回。线程可以通过轮询的方式不断检查 I/O 操作是否完成。

    • 例如,使用 NIO 从网络读取数据时,线程发起读取操作后会立即返回,然后可以继续执行其他任务。过一段时间后,线程再回来检查读取操作是否完成。

  2. 适用场景:

    • 适用于连接数目多且连接时间短的架构,比如聊天服务器等。

    • 例如,在一个高并发的即时通讯服务器中,可能同时有大量的客户端连接和断开。使用 NIO 可以在一个线程中处理多个连接的 I/O 操作,提高服务器的性能和可扩展性。

NIO有三大组件:

Channel(通道)、Buffer (缓存区)、Selector(选择器) Channel 类似于流,但是它是一个双向的流,他是连接服务端和客户端的通道,不管是客户端还是服务端,都可以使用通道进行读写数据。 Buffer 它就是一个缓冲区,用来存放数据的载体,它借助通道,在客户端和服务端之间传递数据 Selector 它对应一个或多个channel,客户端的连接都会注册到selector上面,然后由selector去调用后端处理程序

备注:

 Channel

首先说一下 Channel,国内大多翻译成“通道”。Channel 和 IO 中的 Stream(流)是差不多一个

等级的。只不过 Stream 是单向的,譬如:InputStream, OutputStream,而 Channel 是双向

的,既可以用来进行读操作,又可以用来进行写操作。

NIO 中的 Channel 的主要实现有:

\1. FileChannel

\2. DatagramChannel

\3. SocketChannel

\4. ServerSocketChannel

这里看名字就可以猜出个所以然来:分别可以对应文件 IO、UDP 和 TCP(Server 和 Client)。

下面演示的案例基本上就是围绕这 4 个类型的 Channel 进行陈述的。

 Buffer

Buffer,故名思意,缓冲区,实际上是一个容器,是一个连续数组。Channel 提供从文件、

网络读取数据的渠道,但是读取或写入的数据都必须经由 Buffer。

上面的图描述了从一个客户端向服务端发送数据,然后服务端接收数据的过程。客户端发送

数据时,必须先将数据存入 Buffer 中,然后将 Buffer 中的内容写入通道。服务端这边接收数据必

须通过 Channel 将数据读入到 Buffer 中,然后再从 Buffer 中取出数据来处理。

在 NIO 中,Buffer 是一个顶层父类,它是一个抽象类,常用的 Buffer 的子类有:

ByteBuffer、IntBuffer、 CharBuffer、 LongBuffer、 DoubleBuffer、FloatBuffer、

ShortBuffer

 Selector

Selector 类是 NIO 的核心类,Selector 能够检测多个注册的通道上是否有事件发生,如果有事

件发生,便获取事件然后针对每个事件进行相应的响应处理。这样一来,只是用一个单线程就可

以管理多个通道,也就是管理多个连接。这样使得只有在连接真正有读写事件发生时,才会调用

函数来进行读写,就大大地减少了系统开销,并且不必为每个连接都创建一个线程,不用去维护

多个线程,并且避免了多线程之间的上下文切换导致的开销

三、AIO(Asynchronous I/O)

  1. 定义与工作原理:

    • AIO 即异步 I/O。在这种模型下,当线程发起一个 I/O 操作后,它不需要等待操作完成,而是注册一个回调函数。当 I/O 操作完成时,系统会自动调用回调函数通知线程。

    • 例如,使用 AIO 从网络读取数据时,线程发起读取操作并注册一个回调函数,然后可以继续执行其他任务。当数据读取完成后,系统会自动调用回调函数,将数据传递给线程进行处理。

  2. 适用场景:

    • 适用于连接数目多且连接时间长的架构,对性能要求较高的场景。

    • 例如,大规模数据传输、高性能的文件服务器等。在这些场景下,AIO 可以充分发挥异步操作的优势,提高系统的吞吐量和响应速度。

四、区别总结

其实NIO基于BIO,AIO基于NIO,后面技术大多都基于NIO实现,如Netty

  1. 阻塞方式:

    • BIO 是完全阻塞的,线程在 I/O 操作期间一直等待。

    • NIO 是非阻塞的,线程可以在 I/O 操作期间执行其他任务,但需要不断轮询检查操作是否完成。

    • AIO 是异步的,线程在发起 I/O 操作后无需等待,而是通过回调函数获取结果。

  2. 线程使用:

    • BIO 通常为每个连接创建一个线程,资源消耗较大。

    • NIO 可以使用一个或几个线程处理多个连接,通过轮询的方式管理 I/O 操作。

    • AIO 通常由系统内核管理异步操作,减少了线程的开销。

  3. 适用场景:

    • BIO 适用于连接数量少、对性能要求不高的场景。

    • NIO 适用于连接数量较多、连接时间短的场景。

    • AIO 适用于连接数量多、连接时间长、对性能要求高的场景。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ANSA联合ABAQS基于梁单元的螺栓预紧力分析实例

1、在螺栓孔之间创建一个模拟螺栓 ABAQUS界面→AUXILIARIES→bolt→分鳖选择上下两圈节点,这样在螺栓孔中间就会生成一个梁单元。 中键确定,因为螺杆使用的是变形体,所以接下来需要为其创建一个属性: 单击ok,完成虚拟螺栓的创建,该螺栓两端是刚性MPC,中间是弹性的梁单元…

美畅物联丨科技赋能校车安全:智慧监控管理系统的创新应用

1、背景 1.1应用需求 孩子,作为国家未来的希望之星和民族发展的潜力所在,其安全与健康向来都是社会瞩目的核心要点。校车,作为孩子们日常出行的关键交通载体,其安全性更是时刻牵动着每一个家庭的敏感神经。然而,不可…

利用TCP编程实现FTP功能

模拟FTP核心原理:客户端连接服务器后,向服务器发送一个文件。文件名可以通过参数指定,服务器端接收客户端传来的文件(文件名随意),如果文件不存在自动创建文件,如果文件存在,那么清空…

828华为云征文|使用sysbench对Mysql应用加速测评

文章目录 ❀前言❀测试环境准备❀测试工具选择❀测试工具安装❀mysql配置❀未开启Mysql加速测试❀开启Mysql加速测试❀总结 ❀前言 大家好,我是早九晚十二。 昨天有梳理一篇关于华为云最新推出的云服务器产品Flexus云服务器X。当时有说过,这次的华为云F…

【科研小白系列】使用screen创建虚拟终端,实现本地关机后服务器仍然跑模型

博主简介:努力学习的22级计算机科学与技术本科生一枚🌸博主主页: 是瑶瑶子啦往期回顾: 【科研小白系列】模型训练已经停止(强行中断)了,可GPU不释放显存,如何解决? 每日一言🌼: “生…

k8s网络

pod 网络 在K8S集群里,多个节点上的Pod相互通信,要通过网络插件来完成,比如Calico网络插件。 使用kubeadm初始化K8S集群时,有指定一个参数–pod-network-cidr10.18.0.0/16 它用来定义Pod的网段。 而我们在配置Calico的时候&#…

Trm理论 2(Word2Vec)

神经网络模型(NNLM)和Word2Vec NNLM模型是上次说过的模型,其目的是为了预测下一个词。 softmax(w2tanh(w1x b1)b2) 会得到一个副产品词向量 而Word2Vue就是专门求词向量的模型 softmax(w2*(w1*x b1)b2) Word2Vec softmax(w2*(w1*x b1)b…

jmeter性能测试HTML测试报告生成详解

作用:jmeter支持生成HTML测试报告,方便查看测试计划中获得图表和统计信息 命令: jmeter -n -t [jmx file] -l [result file] -e -o [html report folder] 示例:jmeter -n -t login.jmx -l result.jtl -e -o ./report jmx文件&a…

Gmsh:一个开源的三维有限元网格生成工具

Gmsh 是一个开源的三维有限元网格生成工具,主要用于在计算流体力学(CFD)和有限元分析(FEA)中生成复杂几何体的网格。它具有强大的几何建模、网格生成、求解器接口和后处理功能。Gmsh 适用于多种物理领域的模拟,包括流体力学、结构分析、电磁学等。 下载地址:https://gm…

【HarmonyOS】- 内存优化

文章目录 知识回顾前言源码分析1. onMemoryLevel2. 使用LRUCache优化ArkTS内存原理介绍3. 使用生命周期管理优化ArkTS内存4. 使用purgeable优化C++内存拓展知识1. Purgeable Memory总结知识回顾 前言 当应用程序占用过多内存时,系统可能会频繁进行内存回收和重新分配,导致应…

Java中Date类型上的注解

在日常开发中,涉及到日期时间类型Date和常用的注解DateTimeFormat和JsonFormat java.util.Date; org.springframework.format.annotation.DateTimeFormat; com.fasterxml.jackson.annotation.JsonFormat; 一 Date类型字段不使用注解 Data AllArgsConstructor N…

开源还是封闭?人工智能的两难选择

这篇文章于 2024 年 7 月 29 日首次出现在 The New Stack 上。人工智能正处于软件行业的完美风暴中,现在马克扎克伯格 (Mark Zuckerberg) 正在呼吁开源 AI。 关于如何控制 AI 的三个强大观点正在发生碰撞: 1 . 所有 AI 都应该是开…

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥…

【软件设计师真题】下午题第一大题---数据流图设计

解答数据流图的题目关键在于细心。 考试时一定要仔细阅读题目说明和给出的流程图。另外,解题时要懂得将说明和流程图进行对照,将父图和子图进行对照,切忌按照常识来猜测。同时应按照一定顺序考虑问题,以防遗漏,比如可以…

Einsum(Einstein summation convention)

Einsum(Einstein summation convention) 笔记来源: Permute和Reshape嫌麻烦?einsum来帮忙! The Einstein summation convention is a notational shorthand used in tensor calculus, particularly in the fields of …

[数据集][目标检测]西红柿缺陷检测数据集VOC+YOLO格式17318张3类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):17318 标注数量(xml文件个数):17318 标注数量(txt文件个数):17318 标…

张飞硬件11~19-电容篇笔记

电容作用 作为源,对后级电路提供能量,对源进行充电。简单讲就是放电和充电。在电路设计中,源往往与负载相隔很远,增加电容就可以起到稳定作用。电容两端的电压不能激变,增加电容可以稳定电压。 电容可以类比为水坝&a…

(javaweb)mysql---DDL

一.数据模型,数据库操作 1.二维表:有行有列 2. 3.客户端连接数据库,发送sql语句给DBMS(数据库管理系统),DBMS创建--以文件夹显示 二.表结构操作--创建 database和schema含义一样。 这样就显示出了之前的内容…

系统编程--线程

这里写目录标题 线程概念什么是线程简介图解 内核原理图解 线程共享资源与非共享资源共享资源非共享资源 线程优缺点 线程控制原语pthread_self、pthread_create简介代码总结 循环创建多个子线程错误代码 线程间全局变量共享pthread_exit简介代码 pthread_join(回收…

传统CV算法——基于Sift算法实现特征点检测

图像尺度空间 在一定的范围内,无论物体是大还是小,人眼都可以分辨出来。然而,计算机要具备相同的能力却很难。因此,为了让机器能够对物体在不同尺度下有一个统一的认知,就需要考虑图像在不同尺度下所存在的特点。这就…