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)
- 非阻塞模式:NIO允许线程发起I/O请求后立即返回,不必等待I/O操作完成。线程可以继续执行其他任务,当I/O操作准备好时,线程会被通知。
- 缓冲区(Buffer):NIO使用缓冲区来处理数据,这意味着数据读写都是通过缓冲区进行的,提供了更灵活的数据操作方式。
- 通道(Channel):NIO通过通道来读取和写入数据,通道是双向的,可以用于读取也可以用于写入。
- 选择器(Selector):NIO引入了选择器,它允许单个线程管理多个通道的I/O操作。选择器轮询注册在其上的通道,当某个通道准备好进行I/O操作时,选择器会通知相应的线程进行处理。
IO多路复用(I/O Multiplexing)
- 非阻塞模式:类似于NIO,IO多路复用也允许线程非阻塞地发起I/O请求。
- 事件驱动:IO多路复用通过监听多个I/O通道上的事件(如连接打开、数据到达等),并根据事件来执行相应的操作。
- 一对一关系:尽管IO多路复用可以同时监控多个I/O通道,但通常每个通道还是需要一个独立的线程来处理。
- 效率提升:通过减少线程数量,IO多路复用可以提高系统处理大量并发连接的能力。
总结
- NIO 提供了非阻塞I/O操作,使用缓冲区、通道和选择器来实现高效的并发I/O处理。
- IO多路复用 也提供了非阻塞I/O操作,但通常需要为每个通道分配一个线程,它通过监听事件来处理I/O操作。
听完这些概念后,可能你就有点儿糊涂了,没关系,我们现在再来梳理总结一下~
BIO(同步阻塞):线程发来IO请求后,一直阻塞线程直到缓冲区数据准备好返回后才会释放(就像蛋糕店一个服务员必须做完你的蛋糕才能去做下一个蛋糕)
NIO(同步非阻塞):线程IO不用等待缓冲区数据准备好,在这期间可以执行其他线程,后面通过轮询的方式查看缓冲区数据有没有准备好(你需要去前台告诉服务员需要什么,你需要定时去看你的餐有没有做好)
IO多路复用:我的理解意思差不多和NIO意思差不多,只不过NIO需要通过轮询来从缓冲区查看数据有没有准备好,但是IO多路复用不需要
AIO(异步非阻塞):线程只需要告诉内核,等缓冲区数据准备好以后直接返回或者通过回调方法直接进行返回就行了(想象蛋糕店点餐,手机点餐,餐品准备好后手机小程序会提示你取餐)
希望你能有所收获~
相关文章:

IO模型---BIO、NIO、IO多路复用、AIO详解
本篇将想给详细解释一下什么是BIO、NIO、IO多路复用以及AIO~ 同步的阻塞(BIO)和非阻塞(NIO)的区别 BIO:线程发来IO请求后,一直阻塞着IO线程,需要缓冲区这边数据准备好之后,才会进行下一步的操作。 举个🌰࿱…...

蓝桥杯真题——约翰的牛奶
输入样例: 8 9 10 输出样例: 1 2 8 9 10 本题是宽搜的模版题,不论怎么倒牛奶,A,B,C 桶里的牛奶可以看做一个三元点集 我们只要找到A桶是空的,B,C桶中的状态即可 #include <iostream> #include <cstring…...

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

Winform实现弹出定时框功能
1、程序 private void TimeDialogInitialize(){for(int i1; i<30;i){cbbTimeDialog.Items.Add(i);}}private void cbbTimeDialog_SelectedIndexChanged(object sender, EventArgs e){foreach(int i in cbbTimeDialog.Items){if(cbbTimeDialog.SelectedItem!null &&…...

【机器学习(四)】分类和回归任务-梯度提升决策树(GBDT)-Sentosa_DSML社区版
文章目录 一、算法概念一、算法原理(一) GBDT 及负梯度拟合原理(二) GBDT 回归和分类1、GBDT回归1、GBDT分类二元分类多元分类 (三)损失函数1、回归问题的损失函数2. 分类问题的损失函数: 三、G…...

Mini-Omni 语言模型在流式传输中边思考边听说应用
引入简介 Mini-Omni 是一个开源的多模态大语言模型,能够在思考的同时进行听觉和语言交流。它具有实时端到端语音输入和流媒体音频输出的对话能力。 语言模型的最新进展取得了显著突破。GPT-4o 作为一个新的里程碑,实现了与人类的实时对话,展示了接近人类的自然流畅度。为了…...

vue devtools的使用
vue devtools的使用 Vue Devtools 是一个强大的浏览器扩展,旨在帮助你调试和开发 Vue.js 应用。它支持 Chrome 和 Firefox 浏览器,并提供了一些工具和功能,可以让你更轻松地查看和调试 Vue 应用的状态和行为。以下是如何安装和使用 Vue Devtools 的详细指南。 安装 Vue De…...

无人机培训:无人机维护保养技术详解
随着无人机技术的飞速发展,其在航拍、农业、救援、环境监测等领域的应用日益广泛。然而,要确保无人机安全、高效地执行任务,定期的维护保养至关重要。本文将深入解析无人机维护保养的核心技术,涵盖基础构造理解、清洁与防尘、电机…...

Mac 创建 Python 虚拟环境
在 macOS 上,您可以使用以下步骤使用 virtualenv 创建虚拟环境: 首先,确保您已经安装了 Python 和 virtualenv。您可以在终端中运行以下命令来检查它们是否已安装: python --version virtualenv --version如果这些命令没有找到&am…...

安卓玩机工具-----无需root权限 卸载 禁用 删除当前机型app应用 ADB玩机工具
ADB玩机工具 ADB AppControl是很实用的安卓手机应用管理工具,无需root权限,通过usb连接电脑后,可以很方便的进行应用程序安装与卸载,还支持提取手机应用apk文件到电脑上,此外还有手机系统垃圾清理、上传文件等…...

中国科技统计年鉴1991-2020年
(数据收集)中国科技统计年鉴1991-2020年.Excel格式资源-CSDN文库https://download.csdn.net/download/2401_84585615/89475658 《中国科技统计年鉴》是由国家统计局社会科技和文化产业统计司与科学技术部战略规划司共同编辑的官方统计资料书,…...

OpenAI / GPT-4o:Python 返回结构化 / JSON 输出
在调用 OpenAI(比如:GPT-4o)接口时,希望返回的结果是能够在后续任务中自动化处理的结构化 / JSON 输出。GPT 版本:gpt-4o-2024-08-06,提供了这样的功能。 目标:从非结构化输入到结构化数据&…...

通信工程学习:什么是EDFA掺铒光纤放大器
EDFA:掺铒光纤放大器 EDFA,即掺铒光纤放大器(Erbium-Doped Fiber Amplifier),是一种在光纤通信中广泛使用的光放大器件。以下是对EDFA的详细解释: 一、定义与基本原理 EDFA是在石英光纤中掺入少量的稀土元…...

机器学习与深度学习的区别
随着人工智能技术的迅猛发展,机器学习(Machine Learning, ML)和深度学习(Deep Learning, DL)这两个术语越来越频繁地出现在人们的视野中。尽管它们之间有着紧密的联系,但实际上二者存在显著的区别。本文旨在…...

标准库标头 <barrier>(C++20)学习
此头文件是线程支持库的一部分。 类模板 std::barrier 提供一种线程协调机制,阻塞已知大小的线程组直至该组中的所有线程到达该屏障。不同于 std::latch,屏障是可重用的:一旦到达的线程组被解除阻塞,即可重用同一屏障。与 std::l…...

如何测量一个(传输网络)系统的容量
Little 定律就能反算系统容量,但我这篇文章要正着算。 假想一个理发店场景。李大爷拥有一家占地 50 平米的理发店,经理到店里理发如果已经有经理在理发,就要拿个券等待,请问李大爷需要印多少等待券? 这是个系统容量问…...

【MySQL】MySQL和Workbench版本兼容问题
1、安装MySQL WorkBench 最新版本下载:https://dev.mysql.com/downloads/workbench/ 历史版本下载:https://downloads.mysql.com/archives/workbench/ 2、问题描述 本人在Windows下安装了一个旧版本的MySQL(5.1),同…...

项目实战 ---- 商用落地视频搜索系统(10)---后台搜索Cache优化
目录 背景 技术实现策略 视频预处理阶段的cache技术 视频搜索阶段的cache技术 技术实现 预处理阶段cache策略实现 逻辑 代码 运行结果 问题及注意点 搜索阶段cache策略实现 系统配置层面 逻辑 低版本 GPU CPU 本项目的配置 高版本 描述 go ahead 策略 cac…...

客户端(服务器下载文件)
一、客户端代码 客户端代码 //实现TCP客户端通信 #include<stdio.h> #include<unistd.h> #include<sys/stat.h> #include<sys/types.h> #include<sys/socket.h> #include<string.h> #include<netinet/ip.h> #include<netinet/in…...

P1544 三倍经验 (记忆化搜索)
三倍经验 题目描述 数字金字塔由 n n n 行整数组成,第 i ( 1 ≤ i ≤ n ) i(1\le i\le n) i(1≤i≤n) 行有 i i i 个数字,一个示例如下。 73 98 1 02 7 4 4 4 5 2 6 5现在你在金字塔的顶部(第一行)&…...

【在Python中创建简单界面计算器】
在Python中创建带有简单界面的计算器,我们可以继续使用Tkinter库,这是一个非常流行且易于使用的GUI库。下面是一个简单的计算器实现,它支持加、减、乘、除四种基本运算。 首先,确保你的Python环境中已经安装了Tkinter。Tkinter通…...

【四范式】浅谈NLP发展的四个范式
自然语言处理(Natural Language Processing,NLP)是计算机科学,人工智能,语言学关于计算机和人类自然语言之间的相互作用的领域,是计算机科学领域与人工智能领域中的一个重要方向。NLP发展到今天已经进入到了…...

--- 数据结构 优先级队列 --- java
之前提高到队列是一种先进先出的结构,但是在某些情况下操作的数据具有优先级,那么对他先进行操作,这时队列就不能满足需求了,因为队列只能操作对头的元素,而具有优先级的数据不一定是在对头,这样就需要优先…...

鸿萌数据恢复服务:如何恢复 Mac 系统中被擦除的文件?
天津鸿萌科贸发展有限公司从事数据安全服务二十余年,致力于为各领域客户提供专业的数据备份、数据恢复解决方案与服务,并针对企业面临的数据安全风险,提供专业的相关数据安全培训。 公司是多款国际主流数据恢复软件的授权代理商,为…...

片段阅读2_中心理解以外题型
目录 一、标题拟定二、下文推断1.三种简单结构:2.三种不易识别结构:三、语句填入1.在开头2.在中间3.在尾句4.盯细节四、语句排序1.宏观把握2.盯住细节五、细节判断一、标题拟定 题型说明:主旨意图题的变型,就是把主旨意图进行“标题化”的改造;正确选项要求:标题中需包含…...

【网络安全 | 渗透工具】IIS 短文件名枚举工具—shortscan安装使用教程
未经许可,不得转载。 文章目录 shortscan安装使用Shortutil 工具shortscan ShortScan 是一种用于在 Microsoft IIS (Internet Information Services) Web 服务器上进行短文件名枚举的工具。该工具可以帮助攻击者利用 IIS 的文件名处理特性,通过预测性扫描枚举服务器上的文件…...

数据结构——栈和队列(队列的定义、顺序队列以及链式队列的基本操作)
目录 队列(queue)的定义 顺序队——队列的顺序表示和实现 顺序队列(循环队列)的类型定义 顺序队列上溢问题的解决方法 编辑 循环队列的基本操作 队列的基本操作——队列的初始化 队列的基本操作——求队列的长度 队列的…...

el-table 的单元格 + 图表 + 排序
<el-table border :data"tableDataThree" height"370px" style"width: 100%"><el-table-column :key"activeName 8" width"50" type"index" label"序号" align"center"></el…...

FPGA第 9 篇,Verilog 中的关键字和基数
前言 在 Verilog 中,关键字(Keywords)和基数(Radix)是语言的重要组成部分,它们有助于描述和定义硬件设计。上期分享了 Verilog 的基本使用,以及数据类型、逻辑值和算数运算符的简单应用&#x…...

什么是单元测试?怎么做?
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 一、什么是单元测试? 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。至于“单元”的大小…...