🍁 作者:知识浅谈,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是通过监听有事件了就返回。