一口气说出 种 IO 模型,蒙圈了!.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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担

文档评论(0)

bob157641554 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档