- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一口气说出 5 种 IO 模型,蒙圈了!
2021-06-09
来源:/p/127170201
文章相关代码已收录至我的 github,欢迎star:/lsylulu/myarticle有一说一,无套路系统学习下Linux的五种IO模型,顺便献上我的陈年老笔记~
一、基本概念
五种IO模型包括:堵塞IO、非堵塞IO、IO多路复用、信号驱动IO、异步IO。
首先需要了解下系统调用的几个函数和基本概念。
1.1 简约引见几个系统调用函数
由于我对于C言语不生疏,几个系统函数参考了一些文章,假如错误欢迎指出!
recvfrom
Linux系统供应应用户用于接收网络IO的系统接口。从套接字上接收一个消息,可同时应用于面对连接和无连接的套接字。
假如此系统调用前往值0,并且 errno为EWOULDBLOCK或EAGAIN(套接字已标记为非堵塞,而接收操作被堵塞或者接收超时 )时,连接正常,堵塞**接收数据(这很关键,前4种IO模型都设计此系统调用)。
select
select系统调用允许程序同时在多个底层文件描述符上,等待输入的到达或输出的完成。以数组方式存储文件描述符,64位机器默认2048个。当有数据预备好时,无法感知具体是哪个流OK了,所以需要一个一个的遍历,函数的时间简单度为O(n)。
poll
以链表方式存储文件描述符,没有长度限制。本质与select相同,函数的时间简单度也为O(n)。
epoll
是基于大事驱动的,假如某个流预备好了,会以大事通知,晓得具体是哪个流,因而不需要遍历,函数的时间简单度为O(1)。
sigaction
用于设置对信号的处理方式,也可检验对某信号的预设处理方式。Linux使用SIGIO信号来实现IO异步通知机制。
1.2 同步异步
同步和异步是针对应用程序和内核交互而言的,也可理解为被被调用者(操作系统)的角度来说。同步是用户进程触发IO操作并等待或轮询的去查看能否就绪,而异步是指用户进程触发IO操作以后便开头做本人的事情,而当IO操作已经完成的时候会得到IO完成的通知,需要CPU支持
1.3 堵塞非堵塞
堵塞和非堵塞是针对于进程在访问数据的时候,也可理解为调用者(程序)角度来说。依据IO操作的就绪形态来实行的不同的方式。堵塞方式下读取或写入方法将一直等待,而非堵塞方式下读取或写入方法会马上前往一个形态值。
下午撸代码饿了,好久没吃KFC了,打算去整个全家桶 ,这一切都要从一个全家桶说起~
我跑去肯德基买全家桶,但是很不巧,轮到我时,全家桶卖完了,我只能等着新做一份 …
二、堵塞IO模型
学习过操作系统的学问后,可以晓得:不管是网络IO还是磁盘IO,对于读操作而言,都是等到网络的某个数据分组到达后/数据预备好后,将数据拷贝到内核空间的缓冲区中,再从内核空间拷贝到用户空间的缓冲区。
此时我已饥渴难耐,全程盯着后厨,等待着一分一秒(别多想 ),最终全家桶做好了,在此期间虽然什么事也没干,但是最终能吃到全家桶,我很幸福。此处需要一个清新的脑回路,我就是程序,我想要全家桶,于是发起了系统调用,而后厨加工的过程就是在做数据预备和拷贝工作。全家桶最终到手,数据最终从内核空间拷贝到了用户空间。
简约看下执行流程:
接下来发挥看图说话的特长了:堵塞IO的执行过程是进程进行系统调用,等待内核将数据预备好并复制到用户态缓冲区后,进程放弃使用CPU并一直堵塞在此,直到数据预备好。
三、非堵塞IO模型
此时我每隔5分钟询问全家桶好了没,在数次盘问后,最终出炉了。在每一次盘问之前,对于程序来说是非堵塞的,占用CPU资源,可以做其他事情。
每次应用程序询问内核能否有数据预备好。假如就绪,就进行拷贝操作;假如未就绪,就不堵塞程序,内核直接前往未就绪的前往值,等待用户程序下一个轮询。
大致经受两个阶段:
等待数据阶段:未堵塞, 用户进程需要盲等,不停的去轮询内核。
数据复制阶段:堵塞,此时进行数据复制。
在这两个阶段中,用户进程只要在数据复制阶段被堵塞了,而等待数据阶段没有堵塞,但是用户进程需要盲等,不停地轮询内核,看数据能否预备好。
四、IO多路复用模型
排了很长的队,最终轮到我领取后,拿到了一张小票,上面有号次。当全家桶出炉后,会喊相应的号次来取。KFC营业员小姐姐打小票出号次的动作相当于操作系统多开了个线程,特地接收客户端的连接。我只关注叫到的是不是我的号,因而程序还需在服务端注册我想监听的大事类型。
多路复用一般都是用于网络IO,服务端与多个客户端的建立连接。下面是奇特的多路复用执行过程:
相比于堵塞IO模型,多路复用只是多了一个select/poll/epoll函数。select函数会不断地轮询本人所担任的文件描述符/套接字的到达形态,当某个套接字就绪时,就对这个套接字进行处理。select担
您可能关注的文档
- RabbitMQ如何动态创建队列和监听.docx
- Redis 的 大数据类型,写得非常好!.docx
- Redis牛逼!轻松实现实时订阅推送.docx
- Sentinel 实现限流,竟是如此的简单!.docx
- Sentinel流量控制和熔断降级执行流程与源码分析.docx
- Spark性能优化实战手册.pdf.docx
- Spring Boot 无侵入式 实现API接口统一JSON格式返回.docx
- Spring Boot 最流行的 条实践解读,值得收藏!.docx
- SpringBoot 源码解析——SpringBoot 中的日志基础服务.docx
- SpringBoot 源码解析——源码模块功能分析.docx
最近下载
- GB50003-2011 砌体结构设计规范.doc VIP
- 三年级上册劳动人民版雏菊盆景迎重阳教学设计.docx VIP
- 沪教牛津版英语2024七年级上册全册知识清单(记忆版).pdf
- 2025年电子科技大学附属肿瘤医院·四川省肿瘤医院招聘笔试备考题库及答案解析.docx VIP
- 低空空域风切变灾害预警与飞行安全协同控制体系研究.docx VIP
- 2025至2030中国汽车检测行业发展分析及发展趋势分析与未来投资战略咨询研究报告.docx
- 力士乐样本1-液压泵和马达.pdf VIP
- 儿童,颜色,填涂画.docx VIP
- 第六单元+资本主义制度的初步确立+复习课件+2023--2024学年部编版九年级历史上学期.pptx VIP
- 学堂在线 人工智能原理 章节测试答案.docx VIP
文档评论(0)