聊聊常见的IO模型 BIO/NIO/AIO 、DIO、多路复用等IO模型
文章目录
- 一、前言
- 1. 什么是IO模型
- 2. 为什么需要IO模型
- 二、常见的IO模型
- 1. 同步阻塞IO(Blocking IO,BIO)
- 2. 同步非阻塞IO(Non-blocking IO,NIO)
- 3. 异步非阻塞IO(Asynchronous IO,AIO)
- 4. 直接内存IO(Direct IO,DIO)
- 三、IO多路复用
- 四、其他补充
- 参考文档
聊聊常见的IO模型 BIO/NIO/AIO/DIO、IO多路复用等IO模型
一、前言
1. 什么是IO模型
IO模型是指在进行输入输出操作时,系统与外部设备之间的数据交换方式。它描述了程序如何与外部设备进行数据的收发。
2. 为什么需要IO模型
在计算机系统中,IO操作是相对较慢的,而应用程序通常需要频繁进行IO操作。不同的IO模型可以提供不同的处理方式,以满足不同的需求。
二、常见的IO模型
1. 同步阻塞IO(Blocking IO,BIO)
- 基本概念和原理:应用程序发起IO操作后,会一直阻塞等待直到数据完全传输或发生错误。
- 优点:简单易用,编程模型直观。
- 缺点:每个IO操作都会阻塞线程,无法提高系统并发能力。
- 应用场景:适用于连接数较少且并发要求不高的场景。
2. 同步非阻塞IO(Non-blocking IO,NIO)
- 基本概念和原理:应用程序不再阻塞等待IO操作的完成,在IO操作返回前可以进行其他任务。
- 优点:可以在等待IO操作的同时处理其他任务,提高系统并发能力。
- 缺点:程序需要不断轮询IO操作的状态,会造成CPU资源浪费。
- 应用场景:适用于连接数较多且并发要求较高的场景。
3. 异步非阻塞IO(Asynchronous IO,AIO)
- 基本概念和原理:应用程序发起IO操作后,不需要阻塞等待,而是继续进行其他任务,当IO操作完成后会通知应用程序。
- 优点:可以在等待IO操作的同时处理其他任务,且无需不断轮询IO操作的状态。
- 缺点:编程模型较复杂。
- 应用场景:适用于高并发的场景,如服务器端编程。
4. 直接内存IO(Direct IO,DIO)
- 基本概念和原理:直接将数据从磁盘读取到应用程序所使用的内存空间,而不需要经过操作系统内核缓冲区。
- 优点:减少数据的拷贝次数,提高读写性能。
- 缺点:需要操作系统支持,适用性较低。
- 应用场景:适用于大文件读写等高性能要求的场景。
三、IO多路复用
-
多路复用的概念和原理:多路复用是在一个线程内同时监听多个IO事件,当有事件发生时,将其所对应的任务分发给不同的处理单元进行处理。
-
select模型:通过select函数监听多个IO事件,当有事件发生时返回,适用于连接数较少的场景。
-
poll模型:与select模型类似,但使用了一个链表结构来管理事件,适用于连接数较多的场景。
-
epoll模型:通过epoll机制来监听IO事件,采用回调机制来处理事件,适用于高并发的场景。
-
kqueue模型:类似于epoll模型,但在Unix-like系统中使用,适用于高并发的场景。
-
优缺点比较:各模型在性能、可伸缩性、易用性等方面有不同的优缺点。
-
应用场景:不同的IO多路复用模型适用于不同的场景,根据实际需求选择合适的模型。
四、其他补充
- 阻塞与非阻塞的区别:阻塞指的是应用程序调用IO操作后,一直等待IO完成;非阻塞指的是应用程序调用IO操作后,可以进行其他任务而不等待IO完成。
- 同步与异步的区别:同步指的是应用程序调用IO操作后,需要等待IO完成;异步指的是应用程序调用IO操作后,不需要等待IO完成。
- 各种IO模型的适用场景比较:根据应用程序的需求,选择合适的IO模型可以提高系统性能和并发能力。
参考文档
相关文章:
聊聊常见的IO模型 BIO/NIO/AIO 、DIO、多路复用等IO模型
文章目录 一、前言1. 什么是IO模型2. 为什么需要IO模型 二、常见的IO模型1. 同步阻塞IO(Blocking IO,BIO)2. 同步非阻塞IO(Non-blocking IO,NIO)3. 异步非阻塞IO(Asynchronous IO,AI…...
Linux- 网络编程初探
原始套接字(Raw Socket) 原始套接字(Raw Socket)是一种提供较低级别网络访问的套接字。通过使用原始套接字,应用程序可以直接发送或接收网络层如IP的数据包,或者传输层如TCP、UDP的段,而无需通…...
AVLoadingIndicatorView - 一个很好的Android加载动画集合
官网 GitHub - HarlonWang/AVLoadingIndicatorView: DEPRECATED 项目简介 AVLoadingIndicatorView is a collection of nice loading animations for Android. You can also find iOS version of this here. Now AVLoadingIndicatorView was updated version to 2.X , If …...
我想设计一套游戏的奖励系统,有什么值得注意的?
游戏上: 游戏成就系统的价值 游戏中的成就可以延长游戏时间,让玩家不仅仅是将游戏通关,而是必须完成游戏内所有挑战及发现秘密,这些成就可以与游戏本身的目标一致,也可以独立于游戏的主要或次要目标之外,…...
精通git,没用过git cherry-pick?
前言 git cherry-pick是git中非常有用的一个命令,cherry是樱桃的意思,cherry-pick就是挑樱桃,从一堆樱桃中挑选自己喜欢的樱桃,在git中就是多次commit中挑选一个或者几个commit出来,也可以理解为把特定的commit复制到…...
QT5|C++|通过创建子线程方式实现进度条更新
背景: 一开始是通过在主线程中写一个for循环,每次加1后睡眠1s进行进度条更新。但这样写的结果是 --> 无法动态显示进度条进度。后通过上一篇文章 [ QT5|C|通过信号槽机制实现进度条更新 ] 中的写信号槽机制实现。实现后 考虑了下有没有其他方式实现&a…...
基于mediasoup的webrtc server,性能压测时发现带宽利用率偏低(40%)
基于mediasoup的webrtc server,进行性能压测时发现,在1gbps的网络条件下,带宽利用率在40%(400Mbps)时,就会出现过高丢包率的(packet loss > 10%)的情况。这个结果是合理的吗?如果不合理,要如何提升性能&…...
Ubuntu Redis开机自启动服务
1. 建立service文件 sudo vim /etc/systemd/system/redis-server.service2. redis service文件 [Unit] DescriptionAdvanced key-value store Afternetwork.target Documentationhttp://redis.io/documentation, man:redis-server(1)[Service] Typenotify ExecStart/usr/bin/…...
Stm32_标准库_呼吸灯_按键控制
Stm32按键和输出差不多 PA1为LED供给正电,PB5放置按键,按键一端接PB5,另一端接负极 void Key_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //APB2总线连接着GPIOBGPIO_InitStructur.GPIO_Mode GPIO_Mode_IPU;GPIO_InitStructur.…...
MySQL作业:索引、视图、存储、函数
学生表:Student (Sno, Sname, Sex , Sage, Sdept) 学号,姓名,性别,年龄,所在系 Sno为主键 课程表:Course (Cno, Cname,) 课程号,课程名 Cno为主键 学生选课表:SC (Sno, Cno, Score) …...
漫谈:C语言 C++ 所有编程语言 =和==的麻烦
这次不只是C语言很麻拐,是所有编程语言都很麻拐了。 赋值和比较是编程语言最基本的操作之二,C和所有类C语言都使用“”和“”来分别表示赋值和比较。 数学上等号“”是个单一的概念,含义是“相等”,左右两边是等价的,很…...
十五、异常(1)
本章概要 异常概念基本异常 异常参数 异常捕获 try 语句块异常处理程序终止与恢复 Java 的基本理念是“结构不佳的代码不能运行”。 改进的错误恢复机制是提高代码健壮性的最强有力的方式。错误恢复在我们所编写的每一个程序中都是基本的要素,但是在 Java 中它显得…...
Redis 哨兵模式搭建教程
一、介绍 本文实战搭建一主两从三哨兵,通过使用哨兵模式,可以有效避免某台服务器的 Redis 挂掉出现的不可用问题,保障系统的高可用。 本文通过虚拟机搭建的三台 Centos7 服务器进行测试,使用的 Redis 版本为 6.25。 二、准备环…...
【C++】gnustl_static 与 c++_shared 的区别
参考:GNU与cSTL的区别与联系-爱代码爱编程 gnustl_static 与 c_shared 的区别: 不同版本的 STL TSL是一个与STL兼容的多线程支持库。 STLport是一个可移植、高度兼容的STL实现。 SGI STL是最早的STL实现之一,对STL的发展起到了重要的作用…...
怎样选择第三方检测机构获取功能测试报告?
数字化时代,软件给人们的生活带来了越来越多的便利,产品功能测试也成为了软件开发方在研发时的重要环节,这关系到用户使用产品的体验感。所以做好软件功能测试对把控产品质量有着很大影响,通过有效的功能测试能够发现系统潜在的问…...
【@PostConstruct、 @Autowired与构造函数的执行顺序】
PostConstruct、 Autowired与构造函数的执行顺序 一、PostConstruct介绍二、Spring框架中在bean初始化和销毁时候执行实现方式三、项目验证1.MyServiceImpl2.测试结果3. 项目源码 最近对同事代码进行codeReview时候发现用PostConstruct注解,特地对此注解执行顺序进行…...
用vite搭建vue3+ts项目
一、环境搭建 1:首先vite环境安装 npm init vite 或者 yarn init vite 2:输入项目的名字,在这里用vue3_test ? Project name: › vite-project 3:选择项目类型,这里选择Vuets 4:出现下图,初始化基本…...
前端求职指南
简历求职指南 为什么没有面试? 1、简历写的不好 2、简历投递不好 简历的定义是什么? 是求职者向未来雇主展示自己专业技能和职业素养的自我推销工具,以找到工作为目的。 什么时候改简历? 每半年或一年更新一次工作中的成长 再工…...
datax同步数据翻倍,.hive-staging 导致的问题分析
一、背景 有同事反馈 Datax 从 Hive 表同步数据到 Mysql 数据翻倍了。通过查看 Datax 任务日志发现,翻倍的原因是多读取了 .hive-staging_xx 开头的文件。接下里就是有关 .hive-staging 的分析。 二、环境 Hive 版本 2.1.1 三、分析 3.1 .hive-staging_hive 产…...
DataGrip 恢复数据
DataGrip 恢复数据 准备数据库 create database chap02; use chap02;恢复数据 运行sql脚本方式恢复数据到刚刚创建的数据库 数据右键—> SQL Scripts —> Run SQL Script… 选择sql脚本...
神经网络建筑负荷预测与供暖优化【附程序】
✨ 长期致力于BP神经网络、负荷预测、空气源热泵、优化控制研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)基于BP神经网络的公共建筑热负荷预测模型&…...
【独家首发】ElevenLabs马拉雅拉姆文支持状态实测报告(含ISO 639-2代码验证、音素对齐误差率<0.8%)
更多请点击: https://intelliparadigm.com 第一章:ElevenLabs马拉雅拉姆文支持的现状与战略意义 ElevenLabs 作为全球领先的语音合成平台,自2023年11月起正式将马拉雅拉姆语(Malayalam,ISO 639-1: ml)纳入…...
别再只会`cmatrix`了!解锁Linux终端屏保的10种炫酷玩法(含快捷键大全)
终端美学革命:10种cmatrix高阶玩法与快捷键全解析 当绿色代码雨第一次在终端流淌而下时,那种黑客帝国般的视觉冲击令人难忘。但你是否知道,这个看似简单的cmatrix命令背后隐藏着一个可编程的视觉艺术工具箱?本文将带你突破基础用法…...
工业智能化落地实践:从边缘AI到预测性维护的ST方案整合
1. 项目概述:一场工业智能化的深度对话最近刚参加完ST(意法半导体)的工业峰会回来,感触颇深。这场活动与其说是一场展会,不如说是一场关于“工业智能化如何落地”的深度行业对话。作为一家长期深耕工业通讯、物联网与嵌…...
别再死记硬背了!用这个‘水管阀门’比喻,5分钟搞懂N沟道和P沟道MOS管工作原理
水管阀门模型:5分钟掌握MOS管的核心逻辑 第一次接触MOS管时,那些载流子、耗尽层、反型层的专业术语就像一堵高墙,把我们对电子世界的好奇心挡在外面。但当我发现可以用厨房水龙头的原理来理解这些抽象概念时,一切都变得清晰起来。…...
从开发板到自研板:RK3568设备树移植与定制编译实战
1. RK3568设备树移植入门指南 第一次接触RK3568设备树移植的工程师,往往会被dts文件中密密麻麻的节点和属性搞得晕头转向。我刚开始做这块的时候,光是看那7000多行的代码就头疼。但其实只要掌握几个关键点,移植工作就会变得清晰很多。 设备树…...
Rust异步任务取消机制:从协作式取消到结构化并发实践
1. 项目概述:当异步任务“半途而废”时在Rust的异步编程世界里,我们常常专注于如何让任务“跑起来”——用async/await优雅地处理并发,用Future描述计算,用tokio或async-std这样的运行时来驱动一切。代码逻辑清晰,从A点…...
FOWFP封装技术:移动设备半导体的尺寸与性能突破
1. 移动设备半导体封装的演进与挑战在智能手机和平板电脑的电路板上,PMIC电源管理芯片的封装尺寸往往决定了主板布局的极限。2016年我在参与某旗舰手机项目时,主板工程师指着BOM表上那个44mm的QFN封装芯片说:"如果能再缩小1mm࿰…...
终极解决Windows风扇控制难题:FanControl完全指南
终极解决Windows风扇控制难题:FanControl完全指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/Fan…...
用Matlab和OptiSystem复现DFB激光器啁啾仿真:从公式到频谱对比的保姆级教程
用Matlab和OptiSystem复现DFB激光器啁啾仿真:从公式到频谱对比的保姆级教程 在光通信系统设计中,DFB(分布式反馈)激光器的啁啾效应一直是影响传输性能的关键因素。当工程师需要验证论文中的理论模型或优化实际系统参数时ÿ…...
