写点什么

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

作者:知识浅谈
  • 2022 年 9 月 04 日
    吉林
  • 本文字数:888 字

    阅读完需:约 3 分钟

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

🍁 作者:知识浅谈,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 使用的是红黑树的结构,当红黑树种有就绪事件时候,会把它放到双向链表中,当用户调用 wait 方法时,会从双向链表中返回。


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


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


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

🍚总结

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

发布于: 刚刚阅读数: 4
用户头像

知识浅谈

关注

公众号:知识浅谈 2022.06.22 加入

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

评论

发布
暂无评论
IO多路复用中的Select/poll/epoll总结全乎了_IO多路复用_知识浅谈_InfoQ写作社区