BIO、NIO、AIO三者的区别及其应用场景(结合生活例子,简单易懂)

再解释三者之前我们需要先了解几个概念:

  1. 阻塞、非阻塞:是相较于线程来说的,如果是阻塞则线程无法往下执行,不阻塞,则线程可以继续往下 执行。
  2. 同步、异步:是相较于IO来说的,同步需要等待IO操作完毕后再往下执行,异步等待IO执行完毕后被通知去操作数据就好了。

此时我们将这四个概念组合起来就是BIO、NIO和AIO了。

1、BIO(Blocking I/O):

        BIO是同步阻塞模型,他再进行IO操作时需要进行等待,等待IO操作完成才能继续往下执行,再没有数据可读时,它会阻塞再这里,不继续往下执行,直到有数据可读。这样的模型时很浪费资源的。 而且这种同步阻塞模式下,一个线程只能监测一个socket端口,因为如果检测两个socket,一个因为第一个socket迟迟没有可读操作,一直阻塞着,则第二个socket即便有可读操作也无法进行读取,因为线程没有执行到那里。两个就如此麻烦,跟不用说更多socket了。所以再这种情况下需要创建很多线程。

        例如,当我们去散步,路过早餐店买早点,但包子还要一会儿才能熟,我们要在这一直等,等到熟了买好了才能继续散步,而不是先去散步,等散步回来后路过再买。这个等待时间也是成本。

适用场景:

BIO模型适用于简单的I/O操作,特别是在单线程环境下。由于BIO模型使用阻塞式I/O操作,它在处理少量并发连接时可能会比较简单和直观。因此,对于一些简单的网络服务或小型应用程序来说,BIO模型可能是一个合适的选择。

2、NIO(Non-blocking I/O):

        NIO是同步非阻塞模型,这个模型通过使用多路复用器将进行分离,由一个选择器(select)大量的文件描述符(一个文件描述符代表着一个socket,因为再linux中万物皆文件),当有事件发生时,选择器会接收到消息并将这些有事件发生的管道返回给应用程序进行处理。当然选择器返回给应用程序的是哪些管道有事件发生,并没有进行操作,所以读取这些操作还得有自己进行读取,再这里就是同步。并不进行阻塞,因为通过选择器将监测读取进行了分离,使这个模型不再阻塞。

        这就相当于早餐店老板充当选择器,当我想买包子时虽然还没好,但我会告诉老板我想要买包子,等包子好了和我说,当包子好了时,老板会打电话告诉所有预约包子事件的人(比如我),包子好了,快来拿。此时我就需要自己回去取包子吃。

适用场景:

NIO模型适用于需要处理大量并发连接的场景。由于NIO模型使用非阻塞式I/O操作和事件驱动的方式,它能够更高效地处理大量的并发连接,适合于构建高性能的网络服务或服务器应用程序。

3、AIO(Asynchronous I/O):

        AIO是异步非阻塞模型,它允许应用程序在发起I/O操作后继续执行其他任务,例如再NIO中他不需要自己去等待,而是待有事件发生时再去读取,而AIO则可以做到连读取都不需要自己读取,而是系统内核帮忙把数据都读取好了,自己再过去处理数据就好了。

        相当于当包子熟了后不是自己过去取包子,而是包子店老板把包子打包好送到你面前吃就好了。

适用场景:

        AIO模型适用于需要处理大量I/O操作且每个操作耗时较长的场景,比如数据库访问、磁盘读写、网络数据传输等。由于AIO模型使用异步I/O操作,它能够在等待I/O操作完成时执行其他任务,提高了系统的并发性能和资源利用率。

4、总结:

        再前面我并没有说异步阻塞,因为我觉得这两者的组合并没有什么用,好像也没有具体实现的模型,所有我并没有说它。

        总的来说,选择合适的I/O模型需要考虑到应用程序的需求、系统的特性以及预期的并发连接数量和I/O操作类型。不同的场景可能需要选择不同的I/O模型来获得最佳的性能和效率。

ps:在Java中,AIO模型的实现是通过NIO.2来实现的。NIO.2提供了对AIO模型的支持,使得开发者可以更方便地使用异步I/O操作来构建高性能的应用程序。

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

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

相关文章

Outlook邮件视图设置怎么修复

故障现象 Outlook邮箱显示不对 故障截图 故障原因 邮箱视图设置不对 解决方案 1、在Outlook上方工具栏找到视图按钮,以此选择视图→视图设置→列,打开选择的列 2、在视图→邮件预览里面,选择1行,在阅读格式选择靠右&#xff…

AI创作系统ChatGPT网站源码+支持最新GPT-Turbo模型+支持DALL-E3文生图/AI绘画源码

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

Nodejs操作缓存数据库-Redis

Hi I’m Shendi Nodejs专栏 Nodejs操作缓存数据库-Redis 在服务端开发中,缓存数据库也是不可或缺的,可以提高程序并发以及方便后续扩展,而目前最常用的莫过于Redis了 安装依赖 和之前的mysql一样,redis的依赖最常用的就是redis …

自学SLAM(8)《第四讲:相机模型与非线性优化》作业

前言 小编研究生的研究方向是视觉SLAM,目前在自学,本篇文章为初学高翔老师课的第四次作业。 文章目录 前言1.图像去畸变2.双目视差的使用3.矩阵微分4.高斯牛顿法的曲线拟合实验 1.图像去畸变 现实⽣活中的图像总存在畸变。原则上来说,针孔透…

51单片机应用从零开始(三)

51单片机应用从零开始(一)-CSDN博客 51单片机应用从零开始(二)-CSDN博客 详解 KEIL C51 软件的使用建立工程-CSDN博客 详解 KEIL C51 软件的使用设置工程编绎与连接程序-CSDN博客 目录 1. 用单片机控制第一个灯亮 2. 认识单片…

leetcode:476. 数字的补数

一、题目 476. 数字的补数 - 力扣(LeetCode) 函数原型: int findComplement(int num) 二、思路 将num的每一位取出来,取反后,乘以2的位次方,最终所有结果相加即可得到结果。 如何取出num的每一位&#xff1…

<MySQL> 查询数据进阶操作 -- 联合查询

目录 一、什么是笛卡尔积? 二、什么是联合查询? 三、内连接 3.1 简介 3.2 语法 3.3 更多的表 3.4 操作演示 四、外连接 4.1 简介 4.2 语法 4.3 操作演示 五、自连接 5.1 简介 5.2 自连接非必要不使用 六、子查询(嵌套查询) 6.1 简介 6.…

电源电压范 围宽、功耗小、抗干扰能力强的国产芯片GS069适用于电动工具等产品中,采用SOP8的封装形式封装

GS069电动工具直流调速电路是CMOS专用集成电路,具有电源电压范 围宽、功耗小、抗干扰能力强等特点。通过外接电阻网络,改变与之相接 的VMOS 管的输出,达到控制电动工具转速的作用。该电路输出幅值宽, 频率变化小,占空比…

自己动手实现一个深度学习算法——六、与学习相关的技巧

文章目录 1.参数的更新1)SGD2)Momentum3)AdaGrad4)Adam5)最优化方法的比较6)基于MNIST数据集的更新方法的比较 2.权重的初始值1)权重初始值不能为02)隐藏层的激活值的分布3&#xff…

04-学成在线之系统管理服务模块之查询数据字典表中的内容,前后端联调测试

前后端联调 配置前端环境 实际开发中先由后端工程师将接口设计好并编写接口文档并交给前端工程师,前后端的工程师就开始并行开发 前端开发人员先自己mock数据即使用假数据进行开发,当后端代码完成后前端工程师尝试请求后端接口获取数据然后渲染到页面 第一步: 首…

计算机网络之物理层

物理层 1. 物理层的基本概念 2.物理层下面的传输媒体 传输媒体可分为两类,一类是导引型传输媒体,另一类是非导引型传输媒体。 3.传输方式 3.1 串行传输和并行传输 串行传输:串行传输是指数据是一个比特依次发送的,因此在发送端…

C/C++轻量级并发TCP服务器框架Zinx-框架开发002: 定义通道抽象类

文章目录 2 类图设计3 时序图数据输入处理:输出数据处理总流程 4 主要实现的功能4.1 kernel类:基于epoll调度所有通道4.2 通道抽象类:4.3 标准输入通道子类4.4 标准输出通道子类4.5 kernel和通道类的调用 5 代码设计5.1 框架头文件5.2 框架实…

wx.canvasToTempFilePath生成图片保存到相册

微信小程序保存当前画布指定区域的内容导出生成指定大小的图片&#xff0c;记录一下 api&#xff1a;wx.canvasToTempFilePath 效果&#xff1a; 代码&#xff1a;wxml <canvas style"width: {{screenWidth}}px; height: {{canvasHeight}}px;" canvas-id"my…

2023.11.15 每日一题(AI自生成应用)【C++】【Python】【Java】【Go】 动态路径分析

目录 一、题目 二、解决方法 三、改进 一、题目 背景&#xff1a; 在一个城市中&#xff0c;有数个交通节点&#xff0c;每个节点间有双向道路相连。每条道路具有一个初始权重&#xff0c;代表通行该路段的成本&#xff08;例如时间、费用等&#xff09;。随着时间的变化&am…

CentOS修改root用户密码

一、适用场景 1、太久没有登录CentOS系统&#xff0c;忘记管理密码。 2、曾经备份的虚拟化OVA或OVF模板&#xff0c;使用模板部署新系统后&#xff0c;忘记root密码。 3、被恶意攻击修改root密码后的紧急修复。 二、实验环境 1、VMware虚拟化的ESXI6.7下&#xff0c;通过曾经…

javaweb---maventomcat使用教程

文章目录 今日内容0 复习昨日1 Maven1.0 引言1.1 介绍1.2 下载1.3 安装1.3.1 解压1.3.2 配置环境变量1.3.3 测试 1.4 仓库1.5 Maven配置1.5.1 修改仓库位置1.5.2 设置镜像 2 IDEA - MAVEN2.1 idea关联maven2.2 创建java项目2.3 java项目结构2.4 pom2.5 导入依赖2.5.1 查找依赖2…

如何计算掩膜图中多个封闭图形的面积

import cv2def calMaskArea(image,idx):mask cv2.inRange(image, idx, idx)contours, hierarchy cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)for contour in contours:area cv2.contourArea(contour)print("图形的面积为", area) image是…

C语言从入门到精通之【char类型】

char类型用于储存字符&#xff08;如&#xff0c;字母或标点符号&#xff09;&#xff0c;但是从技术层面看&#xff0c;char是整数类型。因为char类型实际上储存的是整数而不是字符。计算机使用数字编码来处理字符&#xff0c;即用特定的整数表示特定的字符。 char类型占1个字…

2023年09月 Python(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 阅读以下代码,程序输出结果正确的选项是?( ) def process_keywords(keywords_list):unique_keywords = list(set(keywords_list))

基于STM32的无线通信系统设计与实现

【引言】 随着物联网的迅速发展&#xff0c;无线通信技术逐渐成为现代通信领域的关键技术之一。STM32作为一款广受欢迎的微控制器&#xff0c;具有丰富的外设资源和强大的计算能力&#xff0c;在无线通信系统设计中具有广泛的应用。本文将介绍如何基于STM32实现一个简单的无线通…