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

本篇将想给详细解释一下什么是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(异步非阻塞):线程只需要告诉内核,等缓冲区数据准备好以后直接返回或者通过回调方法直接进行返回就行了(想象蛋糕店点餐,手机点餐,餐品准备好后手机小程序会提示你取餐)

希望你能有所收获~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UE5学习笔记21-武器的射击功能

一、创建C类 创建武器子弹的类,创建生产武器子弹的类,创建弹壳的类,生产武器子弹的类的父类是武器的类 创建后如图,ProjectileMyWeapon类(产生子弹的类)继承自weapon类,Projectile(子弹的类),Casing(弹壳声…

如何使用QT完成记事本程序的UI界面布局

每日QT技巧查询表-CSDN博客 会持续更新记事本编写的全部过程,关注不迷路 一、相关控件 ①水平和垂直布局 ②按键 ③文本框 ④水平弹簧 ⑤标签 ⑥Widget 二、控件使用方法 1、PushButton 拖出三个按键,并对其进行命名,两处地方命名可以不一…

【Echarts】vue3打开echarts的正确方式

ECharts 是一个功能强大、灵活易用的数据可视化工具,适用于商业报表、数据分析、科研教育等多种场景。那么该如何优雅的使用Echarts呢? 这里以vue3为例。 安装echarts pnpm i echarts封装公用方法 // ts-nocheck import * as echarts from echarts; // 我们这里借…

C++:入门基础

一.C参考文档 https://legacy.cplusplus.com/reference/ https://zh.cppreference.com/w/cpp https://en.cppreference.com/w/ 二.C的第一个程序 #include <iostream> using namespace std;int main() {cout << "Hello world!" << en…

无人机PX4飞控ROS应用层开发:MAVROS 功能包介绍与飞控消息汇总(一)

概述 这个软件包提供了针对各种自动驾驶仪(如PX4,Ardupilot)使用 MAVLink 通信协议的通信驱动程序。 此外&#xff0c;它还提供了用于地面控制站&#xff08;例如 QGroundControl&#xff09;的 UDP MAVLink 桥接功能。 通常与PX4的offboard模式联合使用 Offboard控制背后的想…

单机docker-compose部署minio

单机多副本docker-compose部署minio 简单介绍 如果服务器有限可以单机挂载多硬盘实现多副本容错&#xff08;生产不推荐&#xff09; 部署好的文件状态 有两个重要文件 docker-compose.yaml和nginx.conf docker-compose.yaml是docker部署容器的配置信息包括4个minio和1个ng…

c中 int 和 unsigned int

c语言中&#xff0c;char、short、int、int64以及unsigned char、unsigned short、unsigned int、unsigned int64等等类型都可以表示整数。但是他们表示整数的位数不同&#xff0c;比如&#xff1a;char/unisigned char表示8位整数&#xff1b; short/unsigned short表示16位整…

菜鸟入门Docker

初始Docker Docker的概念 Docker的用途 DOcke的安装 Docker架构 配置Docker镜像加速器 Docker常用命令 Docker服务相关的命令。 Docker镜像相关的命令 Docker容器相关的命令 容器的数据卷 数据卷的概念和作用 配置数据卷 Docker应用部署 Docker部署mysql Docker…

Unity同时启动多个Editor

HardLinkShellExt tool https://schinagl.priv.at/nt/hardlinkshellext/linkshellextension.html 作用&#xff1a; 1.网络Online项目方便调试&#xff0c;MMO项目 2.方便发布不同平台的包&#xff0c;快速开发测试 使用方法&#xff1a;

easy-es动态索引支持

背景 很多项目目前都引入了es&#xff0c;由于es弥补了mysql存储及搜索查询的局限性&#xff0c;随着技术的不断迭代&#xff0c;原生的es客户端使用比较繁琐不直观&#xff0c;上手代价有点大&#xff0c;所以easy-es框架就面世了&#xff0c;学习成本很低&#xff0c;有空大…

【Gateway】Gateway Filter Factories

Predicate决定了请求由哪一个路由处理,如果在请求处理前后需要加一些逻辑,这就是Filter(过滤器)的作用范围了.Filter分为两种类型:Pre类型和Post类型 滤器的两种类型 Pre 类型过滤器: 执行时机: 在请求被转发到后端服务之前执行。作用: 可以用来执行鉴权、限流、请求日志记录、…

Django笔记一:搭建Django环境与URL路径访问

博主之前学从Java后端开发&#xff0c;后面获取到读研资格&#xff0c;想着未来转算法岗&#xff0c;初学Python&#xff0c;发现Python还挺有趣的&#xff0c;由于之前所学后端缘故&#xff0c;有点后端情节&#xff0c;想学习一下Django框架&#xff08;python的web框架&…

什么是交换机级联?

在现代计算机网络中&#xff0c;交换机级联是一种广泛应用的技术&#xff0c;有助于提升网络的扩展性和灵活性。本文将深入探讨交换机级联相关知识&#xff0c;详细介绍其基本概念和连接配置方法&#xff0c;并对常见技术问题进行解答。 交换机级联概述 交换机级联是指通过将…

线性基大发现

一.构造方法 1.贪心法&#xff08;每一个数往里插入即可&#xff09; /*贪心法构造线性基的特点&#xff1a; 1.从小到大排列 2.各个基的高位可能存在重复的1 2.线性基不是唯一的&#xff0c;与原集合的元素顺序有关*/ void insert(int x){//贪心法for(int i63;i>0;i--){i…

c#中给winform定义快捷键的几种方式

快捷键的使用在日常的开发中频率比较高&#xff0c;这里总结了最常见的各种快捷键的设置方式&#xff0c;需要的时候大家直接照抄就可以了&#xff0c;不用再去查询如何实现了。 文章目录 一、按钮快捷键二、菜单快捷键三、全局快捷键1、重写ProcessCmdKey2、使用KeyPreview属…

Word使用手册

修改样式 编辑word文档时&#xff0c;标题和正文文本通常有不同的格式&#xff0c;如果能将这些格式保存为样式&#xff0c;下一次就能直接调用样式&#xff0c;而不需要重复手动设置格式。 可以将样式通常保存为不同的 样式模板.docx&#xff0c;要调用不同样式集&#xff0…

MATLAB基础应用精讲-【数模应用】卡方拟合优度检验(附MATLAB、python和R语言代码实现)

目录 前言 几个高频面试题目 卡方分布与拟合优度的卡方检验是什么关系? 算法原理 什么是卡方检验 卡方是什么? 如何使用卡方表计算器? 什么是卡方拟合优度检验 使用条件 基本原理 数学模型 卡方检验自由度 理论频数计算 需要注意的事项 卡方检验分类 1、 独…

校园管理系统创新:Spring Boot框架应用案例

第4章 系统设计 4.1 系统体系结构 校园管理系统的结构图4-1所示&#xff1a; 图4-1 系统结构 登录系统结构图&#xff0c;如图4-2所示&#xff1a; 图4-2 登录结构图 校园管理系统结构图&#xff0c;如图4-3所示。 图4-3 校园管理系统结构图 4.2开发流程设计 系统流程的分…

走进低代码表单开发(一):可视化表单数据源设计

在前文&#xff0c;我们已对勤研低代码平台的报表功能做了详细介绍。接下来&#xff0c;让我们深入探究低代码开发中最为常用的表单设计功能。一个完整的应用是由众多表单组合而成的&#xff0c;所以高效的表单设计在开发过程中起着至关重要的作用。让我们一同了解勤研低代码开…

网络安全要点总结

1. 入侵检测与防御: 1)入侵检测与系统IDS(intrusion detection system):防火墙之后的第二道闸门; IDS的部署:采用镜像端口或者集线器方式;部署在:服务器交换机上,internet接入路由器后面的第一台交换机上; IRSintrusion response system入侵响应系统: 2).IPS(…