IO 多路复用中的 Select/poll/epoll 总结全乎了

举报
知识浅谈 发表于 2022/09/04 09:20:49 2022/09/04
【摘要】 IO 多路复用中的 Select/poll/epoll 总结全乎了

在这里插入图片描述

🍁 作者:知识浅谈,CSDN博客专家,阿里云签约博主,InfoQ签约博主,华为云云享专家
📌 擅长领域:全栈工程师、爬虫、ACM算法
💒 公众号:知识浅谈
🔥 联系方式vx:zsqtcc

IO多路复用中的Select/poll/epoll总结
🤞这次都给他拿下🤞

正菜来了⛳⛳⛳

🎈什么是IO多路复用

在客户端请求服务端的时候,会在服务端的socket的文件中写入文件描述符fd,如果每一次请求都创建一个线程来为指定的客户端服务的话,那创建的线程可就多了,cpu上下文切换消耗的资源也就多了。

所以就出现了一个服务端一个线程监听多个客户端的文件描述符,这就叫做IO的多路复用。

IO的多路复用有三种机制,从最早的select机制到改进的poll机制再到最新的epoll机制。

🎈三种模型比较

🍮Select模型

因为客户端和服务端链接之后,对应的文件描述符是在用户态的bitmap数组中,bitmap中有对应的文件描述符其bitmap变为1,因为文件描述符是一个数字,最大能存储1024个fd(32位电脑中),判断是否有事件就绪时,会把文件描述符拷贝到内核态,因为内核态的速度跟快,在内核是通过轮询的方式不断地检查是否有fd对应的事件,有的话就返回事件创建IO线程去处理,并把bitmap置位。

🍮poll模型

相比于select模型,其保存fd的方式发生了变化,使用的是pollfd的一种结构,然后用链表进行保存,pollffd中有三个元素,分别为fd:文件描述符,event:读写和异常时间,revent:返回的事件类型,解决了bitmap中限制大小和置位的问题,遍历文件描述符和select一样,都是到内核态进行遍历。

🍮epoll模型

相比于select和poll,epoll的时间复杂度是O(1)会先通过epoll_create创建一个poll示例,epoll会把fd注册到内核中,避免了用户态到内核态的拷贝,内核中保存fd使用的是红黑树的结构,当红黑树种有就绪事件时候,会把它放到双向链表中,当用户diaoyongwait方法时,会从双向链表中返回。

epoll种有两种触发模式,LT(level trigger)和ET()

LT:当wait检测到描述符到达时,不立即处理该事件,等下次调用wait方法时,再通知进程。默认为LT

ET:边缘触发,当调用时,立即处理该事件,下次调用wait就不会再通知。

🍚总结

其实往深了不太好理解,select和poll就是通过循环判断是否有事件,而epoll是通过监听有事件了就返回。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。