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 是通过监听有事件了就返回。
版权声明: 本文为 InfoQ 作者【知识浅谈】的原创文章。
原文链接:【http://xie.infoq.cn/article/23279bb1893a97c883f87bc5a】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论