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

129 阅读3分钟

“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第3篇文章,点击查看活动详情

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

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是通过监听有事件了就返回。