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

server/2024/12/23 6:18:01/

本篇将想给详细解释一下什么是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.ppmy.cn/server/118461.html

相关文章

在Word中,用VBA比较两段文本的相似度

效果1: 去掉字符串中回车,进行改进后效果: 代码: Function LevenshteinDistance(s As String, t As String) As IntegerDim d() As IntegerDim i As IntegerDim j As IntegerDim cost As IntegerDim sLen As IntegerDim tLen As IntegersLen…

新手制作视频用什么软件好?五款剪辑工具分享!

在数字时代,视频制作已成为许多人表达创意、记录生活的重要方式。但对于新手而言,面对琳琅满目的视频编辑软件,往往会感到无所适从。今天,我们就来推荐五款适合新手的视频制作软件,它们分别适用于不同的操作系统平台&a…

leetcode49字母异位词分组

思路一 知道要用hash,但是当时不知道怎么解决字符串的全排列。一个单词可以变成好多单词,我怎么对这些单词枚举呢。结果发现可以sort,那么字母一样的单词一定一样,然后将单词放到hashmap里面,凡是排完序一样的单词都放到一个队列里去。 代码…

JavaScript 事件处理

一、简介 ​ 事件:发生在HTML元素上的事情,可以是用户的行为,也可以是浏览器的行为,如 用户点击了某个HTML元素用户将鼠标移动到某个HTML元素上用户输入数据时光标离开页面加载完成 ​ 事件源:事件触发的源头&#xf…

【智路】智路OS 组件开发基础

https://airos-edge.readthedocs.io/zh/latest/dev_guide/dev_guide.html 智路OS组件开发的整体设计理念是: 框架提供基类及接口,开发者实现派生类派生类将数据通过回调或者参数的方式传递给框架框架加载组件进行运行 所有使用包管理工具创建的文件目…

C++ Primer Plus(速记版)-高级主题

第十七章 用于大型程序的工具 C 解决问题规模多样,对复杂问题尤其需用异常处理、命名空间和多重继承增强代码管理、库整合和概念表达,以适应大规模编程对错误处理、模块组合及高级功能设计的高要求。 17.1. 异常处理 异常处理允许C程序中不同部分通过抛…

计算机毕业设计 毕业季一站式旅游服务定制平台的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

vue中reduce属性的使用@3@

1.reduce方法 ​ reduce方法的使用(数组方法): 遍历数组,求和 ​ 语法:数组名.reduce((pre,current) > {},参数2) ​ pre:上次执行该方法的返回值 ​ current:数据项 ​ 实例代码: let…