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

在这里插入图片描述

相关内容

热门资讯

电视安卓系统哪个品牌好,哪家品... 你有没有想过,家里的电视是不是该升级换代了呢?现在市面上电视品牌琳琅满目,各种操作系统也是让人眼花缭...
安卓会员管理系统怎么用,提升服... 你有没有想过,手机里那些你爱不释手的APP,背后其实有个强大的会员管理系统在默默支持呢?没错,就是那...
安卓系统软件使用技巧,解锁软件... 你有没有发现,用安卓手机的时候,总有一些小技巧能让你玩得更溜?别小看了这些小细节,它们可是能让你的手...
安卓系统提示音替换 你知道吗?手机里那个时不时响起的提示音,有时候真的能让人心情大好,有时候又让人抓狂不已。今天,就让我...
安卓开机不了系统更新 手机突然开不了机,系统更新还卡在那里,这可真是让人头疼的问题啊!你是不是也遇到了这种情况?别急,今天...
安卓系统中微信视频,安卓系统下... 你有没有发现,现在用手机聊天,视频通话简直成了标配!尤其是咱们安卓系统的小伙伴们,微信视频功能更是用...
安卓系统是服务器,服务器端的智... 你知道吗?在科技的世界里,安卓系统可是个超级明星呢!它不仅仅是个手机操作系统,竟然还能成为服务器的得...
pc电脑安卓系统下载软件,轻松... 你有没有想过,你的PC电脑上安装了安卓系统,是不是瞬间觉得世界都大不一样了呢?没错,就是那种“一机在...
电影院购票系统安卓,便捷观影新... 你有没有想过,在繁忙的生活中,一部好电影就像是一剂强心针,能瞬间让你放松心情?而我今天要和你分享的,...
安卓系统可以写程序? 你有没有想过,安卓系统竟然也能写程序呢?没错,你没听错!这个我们日常使用的智能手机操作系统,竟然有着...
安卓系统架构书籍推荐,权威书籍... 你有没有想过,想要深入了解安卓系统架构,却不知道从何下手?别急,今天我就要给你推荐几本超级实用的书籍...
安卓系统看到的炸弹,技术解析与... 安卓系统看到的炸弹——揭秘手机中的隐形威胁在数字化时代,智能手机已经成为我们生活中不可或缺的一部分。...
鸿蒙系统有安卓文件,畅享多平台... 你知道吗?最近在科技圈里,有个大新闻可是闹得沸沸扬扬的,那就是鸿蒙系统竟然有了安卓文件!是不是觉得有...
宝马安卓车机系统切换,驾驭未来... 你有没有发现,现在的汽车越来越智能了?尤其是那些豪华品牌,比如宝马,它们的内饰里那个大屏幕,简直就像...
p30退回安卓系统 你有没有听说最近P30的用户们都在忙活一件大事?没错,就是他们的手机要退回安卓系统啦!这可不是一个简...
oppoa57安卓原生系统,原... 你有没有发现,最近OPPO A57这款手机在安卓原生系统上的表现真是让人眼前一亮呢?今天,就让我带你...
安卓系统输入法联想,安卓系统输... 你有没有发现,手机上的输入法真的是个神奇的小助手呢?尤其是安卓系统的输入法,简直就是智能生活的点睛之...
怎么进入安卓刷机系统,安卓刷机... 亲爱的手机控们,你是否曾对安卓手机的刷机系统充满好奇?想要解锁手机潜能,体验全新的系统魅力?别急,今...
安卓系统程序有病毒 你知道吗?在这个数字化时代,手机已经成了我们生活中不可或缺的好伙伴。但是,你知道吗?即使是安卓系统,...
奥迪中控安卓系统下载,畅享智能... 你有没有发现,现在汽车的中控系统越来越智能了?尤其是奥迪这种豪华品牌,他们的中控系统简直就是科技与艺...