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现在你在金字塔的顶部(第一行)&…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...