IO总结看这里
创始人
2025-06-01 09:09:22
0

IO模型

IO读写在用户缓冲区和内核缓冲区交互

在这里插入图片描述

1、阻塞IO

阻塞IO在两个阶段都会阻塞等待:数据就绪,数据拷贝(内核到用户)

执行流程

1、用户调用recvfrom发起系统调用请求内核

2、等待数据就绪(没有准备好数据则会阻塞)

3、从内核拷贝数据到用户(没有完成则会阻塞等待)

4、拷贝完成发送标记给用户,处理数据

在这里插入图片描述

2、非阻塞IO

相较于阻塞IO,非阻塞IO的recvfrom操作会立即返回结果而不是阻塞用户

在这里插入图片描述

如果数据没有准备就绪,那么不会阻塞用户而是返回block标记,反复请求recvfrom

缺点

1、进程需要反复调用recvfrom,等待数据准备、拷贝完成后结束

2、频繁的recvfrom相较于阻塞IO并没有提高效率,并且盲等机制会造成CPU空转

3、IO多路复用

无论是阻塞IO还是非阻塞IO,差别在于第一阶段准备数据就绪的处理不同;

比如服务器处理客户端Socket请求时,在单线程情况下,一次只能处理一个Socket,一旦正在处理的Socket未就绪(不可读或者不可写)线程便会阻塞,这是所有的客户端Socket都必须等待,性能自然会很差;

在这里插入图片描述

类比用户排队点餐,阻塞IO即第一个用户在思考要吃什么,后续的用户都会阻塞等待,而非阻塞IO的区别在于前台会一直询问你想好了吗

解决方案

1、增加更多的服务员(多线程,资源消耗大)

2、不排队,谁想好了吃什么(数据就绪),服务员就给谁点餐(处理数据)

用户进程如何知道资源准备就绪?

文件描述符简称FD是一个从0开始递增的无符号整数,用来关联Linux中的每一个文件,在Linux中一切皆文件,如常规文件,音频硬件设备,当然也包括Socket网络套接字

多路复用是利用单个线程来同时监听多个FD,从而在某个FD可读或者可写时得到通知,避免CPU进行无效的等待

在这里插入图片描述

执行

1、进程调用select同时监听多个Sockets,数据准备就绪后返回readbale可读标记

2、进程反复调用recvfrom等待返回成功标志

监听FD的方式

三者的区别在于selectpoll只知道通知用户进程有FD就绪,而不知道具体是哪个FDepoll 则会通知用户进程FD就绪的同时,把已经就绪的FD写入用户空间

select

在这里插入图片描述

这里的FD存储单位是1比特,可以存储1024个比特位的FD标识;

参数包括:

1、监听的FD集合(读写和异常集合)

2、监听的最大fd+1

3、超时时间

在这里插入图片描述

流程

1、创建fd_set即1024比特的监听数组

2、标记监听的fd(由低位到高位)

3、执行select函数参数有读写异常数组、标记个数、最大fd+1

4、将fd_set拷贝到内核空间进行监听,等待超时后清除未就绪的标记,将fd_set拷贝回用户空间

5、用户空间仍然不知道那些是标记的,需要遍历得到结果

存在的问题

1、需要在用户态拷贝到内核态后,再次拷贝回用户态,且用户态无法得知被标记的fd,需要遍历

2、监听的数量只有1024

poll

性能提升相较于select仍然没有较大提升

在这里插入图片描述

IO流程

1、创建pollfd数组,向其添加关注的fd信息,数组大小自定义

2、调用poll函数,将pollfd数组拷贝到内核态,链表存储无上限

3、遍历fd,判断是否就绪

4、数据就绪或者超时后,拷贝pollfd数组到用户空间,返回就绪fd的数量n

4、用户进程判断n是否大于0

5、大于0则遍历pollfd数组,找到就绪的fd

存在的问题

相较于select监听,监听的数量提升了,但是遍历fd效率会降低

epoll

在这里插入图片描述

流程

1、epoll_create

会在内核创建eventpoll结构体(存储fd集合的红黑树,存储就绪fd集合的链表)

2、epoll_ctl(添加监听的fd,关联callback事件)

callback触发,将就绪的fd添加到redlist

3、epoll_wait检查redlist不为空,返回个数并拷贝就绪的fd集合到events

在这里插入图片描述

相关内容

热门资讯

扫房神器2安卓系统,打造洁净家... 你有没有发现,家里的灰尘就像小精灵一样,总是悄悄地在你不注意的时候跳出来?别急,今天我要给你介绍一个...
安卓完整的系统设置,全面掌控手... 亲爱的手机控们,是不是觉得你的安卓手机用久了,功能越来越强大,但设置却越来越复杂?别急,今天就来带你...
电视安卓系统是几代机子,揭秘新... 你有没有想过,家里的电视是不是已经升级到了最新的安卓系统呢?别小看了这个小小的系统升级,它可是能让你...
安卓系统隐私有经常去,系统级防... 你知道吗?在咱们这个数字化时代,手机可是我们生活中不可或缺的好伙伴。但是,你知道吗?这个好伙伴有时候...
安卓10系统断网软件,轻松实现... 你有没有遇到过这种情况?手机突然断网了,明明信号满格,却连不上网,急得你团团转。别急,今天就来给你揭...
安卓可以改什么系统版本,体验全... 你有没有想过,你的安卓手机其实可以像换衣服一样,换一个全新的“系统版本”呢?没错,这就是今天我们要聊...
最好的平板游戏安卓系统,畅享指... 亲爱的游戏迷们,你是否在寻找一款能够让你在安卓平板上畅玩无忧的游戏神器?别急,今天我就要给你揭秘,究...
华为安卓系统卡顿解决,华为安卓... 你是不是也遇到了华为安卓系统卡顿的问题?别急,今天就来给你支几招,让你的华为手机重新焕发活力!一、清...
安卓建议升级鸿蒙系统吗,探讨鸿... 亲爱的安卓用户们,最近是不是被鸿蒙系统的新鲜劲儿给吸引了?是不是在犹豫要不要把你的安卓手机升级成鸿蒙...
安卓如何变苹果系统桌面,桌面系... 你有没有想过,把你的安卓手机变成苹果系统桌面,是不是瞬间高大上了呢?想象那流畅的动画效果,那简洁的界...
windows平板安卓系统升级... 你有没有发现,最近你的Windows平板电脑突然变得有些不一样了?没错,就是那个一直默默陪伴你的小家...
安卓系统扩大运行内存,解锁更大... 你知道吗?在科技飞速发展的今天,手机已经成为了我们生活中不可或缺的好伙伴。而手机中,安卓系统更是以其...
安卓系统怎么改变zenly,探... 你有没有发现,你的安卓手机上的Zenly应用最近好像变得不一样了?没错,安卓系统的大手笔更新,让Ze...
英特尔安卓子系统,引领高效移动... 你有没有想过,手机里的安卓系统竟然也能和电脑上的英特尔处理器完美结合呢?这可不是天方夜谭,而是科技发...
永远会用安卓系统的手机,探索安... 亲爱的手机控们,你是否也有那么一款手机,它陪伴你度过了无数个日夜,成为了你生活中不可或缺的一部分?没...
有哪些安卓手机系统好用,好用系... 你有没有发现,现在手机市场上安卓手机的品牌和型号真是琳琅满目,让人挑花了眼?不过别急,今天我就来给你...
卡片记账安卓系统有吗,便捷财务... 你有没有想过,用手机记账是不是比拿着小本本记录来得方便多了?现在,手机上的应用层出不穷,那么,有没有...
武汉摩尔影城安卓系统APP,便... 你有没有想过,一部手机就能带你走进电影的世界,享受大屏幕带来的震撼?今天,就让我带你详细了解武汉摩尔...
联想刷安卓p系统,畅享智能新体... 你有没有发现,最近联想的安卓P系统刷机热潮可是席卷了整个互联网圈呢!这不,我就迫不及待地来和你聊聊这...
mac从安卓系统改成双系统,双... 你有没有想过,你的Mac电脑从安卓系统改成双系统后,生活会有哪些翻天覆地的变化呢?想象一边是流畅的苹...