IO模型---BIO、NIO、IO多路复用、AIO详解

news2024/11/19 3:37:47

本篇将想给详细解释一下什么是BIO、NIO、IO多路复用以及AIO~

同步的阻塞(BIO)和非阻塞(NIO)的区别

BIO:线程发来IO请求后,一直阻塞着IO线程,需要缓冲区这边数据准备好之后,才会进行下一步的操作。

举个🌰:你去店里买蛋糕,但是店里只有一位服务员,这个时候你选中某个蛋糕并告诉服务员后,服务员会给你现做,所以这个时候你需要进行等待,直到店员给你做好后你才能离开。

        如果说有两个人同时来点餐,这时店员还是只有一个,那这样就只能是店员先做完你的蛋糕之后,再去询问另外一个客户需要什么,然后再去做另外一个客户的蛋糕~

NIO:线用户线程不用原地等待IO缓冲区数据准备好后再去做其他操作,在这期间用户线程也可以做其他操作。

再举个🌰:你去店里买蛋糕,这个时候你点完蛋糕后,可以走开,店员可以服务下一个客户,但是你需要是不是看看你的蛋糕有没有做好

理解了文字后,看图应该就好理解了:

好,现在理解了同步的IO逻辑,再来看看异步的~

异步AIO

因为都异步了,所以就不存在阻塞的问题了,所以这里就只有异步非阻塞(AIO)的概念

这里先说一下NIO实际上还是堵塞的,每次我们都需要去通过轮询的方法去查看有没有准备好数据,所以也相当于有一段等待的时间

AIO:用户线程只需要告诉内核,等缓冲区数据准备好以后,通知我或者执行我给你的绘制函数就行了。

举个🌰:还是你去买蛋糕,同样只有一个服务员,这个时候你选择完蛋糕后,服务员会给你做,但是这个时候就不是时不时盯着看有没有做好了,因为做好了会直接通知你,就像是现在的手机点餐一样,餐品准备好以后,手机小程序就会提醒你取餐,在这之前,你可以离开蛋糕店,去做其他的事情。

AIO异步非阻塞:

那NIO和IO多路复用有什么区别呢?

对于IO多路复用来说,就像是你去购买蛋糕,这个时候你只需要在手机上点餐就行了,一旦服务员出餐你就需要看看是不是你的(不一定是定时查看);对于NIO来说,你需要排队去点餐,而且点完餐之后你需要不断定时检查你的蛋糕有没有做好。

NIO(Non-blocking I/O)

  1. 非阻塞模式:NIO允许线程发起I/O请求后立即返回,不必等待I/O操作完成。线程可以继续执行其他任务,当I/O操作准备好时,线程会被通知。
  2. 缓冲区(Buffer):NIO使用缓冲区来处理数据,这意味着数据读写都是通过缓冲区进行的,提供了更灵活的数据操作方式。
  3. 通道(Channel):NIO通过通道来读取和写入数据,通道是双向的,可以用于读取也可以用于写入。
  4. 选择器(Selector):NIO引入了选择器,它允许单个线程管理多个通道的I/O操作。选择器轮询注册在其上的通道,当某个通道准备好进行I/O操作时,选择器会通知相应的线程进行处理。

IO多路复用(I/O Multiplexing)

  1. 非阻塞模式:类似于NIO,IO多路复用也允许线程非阻塞地发起I/O请求。
  2. 事件驱动:IO多路复用通过监听多个I/O通道上的事件(如连接打开、数据到达等),并根据事件来执行相应的操作。
  3. 一对一关系:尽管IO多路复用可以同时监控多个I/O通道,但通常每个通道还是需要一个独立的线程来处理。
  4. 效率提升:通过减少线程数量,IO多路复用可以提高系统处理大量并发连接的能力。

总结

  • NIO 提供了非阻塞I/O操作,使用缓冲区、通道和选择器来实现高效的并发I/O处理。
  • IO多路复用 也提供了非阻塞I/O操作,但通常需要为每个通道分配一个线程,它通过监听事件来处理I/O操作。

听完这些概念后,可能你就有点儿糊涂了,没关系,我们现在再来梳理总结一下~

BIO(同步阻塞):线程发来IO请求后,一直阻塞线程直到缓冲区数据准备好返回后才会释放(就像蛋糕店一个服务员必须做完你的蛋糕才能去做下一个蛋糕)

NIO(同步非阻塞):线程IO不用等待缓冲区数据准备好,在这期间可以执行其他线程,后面通过轮询的方式查看缓冲区数据有没有准备好(你需要去前台告诉服务员需要什么,你需要定时去看你的餐有没有做好)

IO多路复用:我的理解意思差不多和NIO意思差不多,只不过NIO需要通过轮询来从缓冲区查看数据有没有准备好,但是IO多路复用不需要

AIO(异步非阻塞):线程只需要告诉内核,等缓冲区数据准备好以后直接返回或者通过回调方法直接进行返回就行了(想象蛋糕店点餐,手机点餐,餐品准备好后手机小程序会提示你取餐)

希望你能有所收获~

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

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

相关文章

2024秋季云曦开学考

web ezezssrf 打开环境,代码审计 看起来有点多,要绕过五层 第一层:存在弱比较,使用数组或0e绕过 yunxi[]1&wlgf[]2 yunxis878926199a&wlgfs155964671a 第二层:存在强比较,此处使用string限制…

c++(继承、模板进阶)

一、模板进阶 1、非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。 非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中…

装饰器模式decorator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/decorator 将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为 调用过程 当你调用 encoded.writeData(salaryRecords); 时,控制流首先进入 CompressionDecorator 的 writeData …

微信小程序原生支持TS、LESS、SASS能力探究

文章目录 原生支持开始使用旧项目新建项目TS声明文件更新 功能说明less 使用全局变量sass 使用全局变量 可以参考原文 在之前开发小程序中,无法使用 less/sass 等 css 预编译语言,也无法使用 TS 进行开发,但在最新的编辑器版本中&#xff0c…

面向对象程序设计之模板进阶(C++)

在之前我出过一篇博客介绍了模版的初阶:面向对象程序设计(C)模版初阶,接下来我们将进行模版的进阶学习,介绍关于更多模版的知识 1.非类型模版参数 模板参数分类类型形参与非类型形参 类型形参即:出现在模板参数列表中,跟在class或…

如何处理DDOS攻击问题

随着信息技术的飞速发展,网络已成为现代社会不可或缺的一部分,极大地便利了个人社交和商业活动。然而,网络空间在创造无限机遇的同时,也潜藏着诸多威胁,其中分布式拒绝服务攻击(DDoS,Distribute…

利用Idea远程调试

注意:远程调试不要应用在正式环境中,即便是测试环境也只建议在开发网段使用 在实际的开发过程中,为了验证测试环境的一些问题,且问题在本地不可复现,可以使用远程debug的形式来进行问题定位,而不用循环进行…

如何使用智能合约铸造 NFT —— 以 NftMarket 合约为例

系列文章目录 使用Pinata在IPFS上存储NFT图片的实践🚪 scaffold-eth-2使用详细教程🚪 文章目录 系列文章目录前言一、使用到的 OpenZeppelin 库1.1. ERC721 合约1.2. ERC721URIStorage 合约1.3. Counters 合约 二、编写合约代码2.1. 准备NFT元数据2.2. …

【重学 MySQL】二十七、七种 join 连接

【重学 MySQL】二十七、七种 join 连接 union 的使用UNION 的基本用法示例UNION ALL 的用法 七种 join 连接代码实现语法格式小结 union 的使用 UNION 在 SQL 中用于合并两个或多个 SELECT 语句的结果集,并默认去除重复的行。如果希望包含重复行,可以使…

设计模式-行为型模式-访问者模式

访问者模式难以实现,且应用该模式可能会导致代码可读性变差,可维护性变差,除非必要,不建议使用; 1.访问者模式定义 允许在运行时将一个或多个操作应用于一组对象,将操作与对象结构分离; 访问者…

K8s1.28 部署Dashboard获取登录信息

Kubernetes Dashboard 是一个基于 Web 的用户界面,用户可以通过它管理和监控 Kubernetes 集群。它提供了对容器化应用程序的概览、集群资源的状态查看、以及对服务和容器的简单操作管理。 配置 Dashboard 访问的方式: Kubernetes 中的服务类型默认是 C…

语音识别相关概念

声音如何保存成数字信号? 声音是听觉对声波产生的感知,而声波是一种在时间和振幅上连续的模拟量,本质是介质的振动,,比如空气的振动。那么只需要把这个振动信号记录下来,并用一串数字来表达振动信号振动的…

中学生考试成绩在线查询系统

时代在发展,社会在进步,传统的成绩发布方式已经显得力不从心了。老师们,是时候尝试一种更高效、更安全的成绩查询方式了。 还在为如何保护学生隐私而头疼?还在担心成绩的公平性和准确性?易查分小程序将这些这些问题都将…

vue+IntersectionObserver + scrollIntoView 实现电梯导航

一、电梯导航 电梯导航也被称为锚点导航,当点击锚点元素时,页面内相应标记的元素滚动到视口。而且页面内元素滚动时相应锚点也会高亮。电梯导航一般把锚点放在左右两侧,类似电梯一样。 二、scrollIntoView() 介绍 scrollIntoView() 方法会…

加密软件有哪些数据防护功能?

1.文件透明加密:采用透明加密技术,自动对指定类型的敏感文件进行实时加密,确保数据在存储和传输过程中的安全性。 2.权限管理与访问控制:通过细粒度的权限管理,控制员工对敏感数据的访问权限,包括读取、修…

基于SpringBoot+Vue的预制菜平台系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

蓝桥杯真题——数星星

输入样例: 5 1 1 5 1 7 1 3 3 5 5 输出样例: 1 2 1 1 0 分析: 根据题目,是逐行读入数据,我们要求每颗星星左下方的星星数量,就是要迅速求一个区间内的值 于是我们联想到树状数组来解决问题 代码演示…

商业银行零售业务数智运营探索与应用

一、商业银行零售业务面临新形势 根据国家金融监督管理总局近期发布的数据,2024年一季度商业银行净息差降至1.54%,较2023年四季度的1.69%下降15个基点。在当前经营环境复杂、客户投资预期降低等多重因素的叠加作用下,商业银行经营压力日益加大。与此同时,随着数字化转型的不…

【技术调研】三维(3)-ThreeJs-几何体、材质、贴图、灯光及案例

几何体 ​ 几何体是构建模型的基础,模型=几何体+材质。threejs中已内置了很多几何体。这里不一一介绍。 BufferGeometry 是面片、线或点几何体的有效表述。包括顶点位置,面片索引、法相量、颜色值、UV 坐标和自定义缓存属性值。使用 BufferGeometry 可以有效减少向 GPU 传输…

代码随想录训练营Day3 | 链表理论基础 | 203.移除链表元素 | 707.设计链表 | 206.反转链表

今天任务:学习链表理论基础 链表的类型 链表的存储方式 链表的定义…