网站首页 > 文章精选 正文
epoll与select、poll的对比
主要有以下四点:
1. 用户态将文件描述符传入内核的方式 select:创建3个文件描述符集并拷贝到内核中,分别监听读、写、异常动作。这里受到单个进程可以打开的fd数量限制,默认是1024。poll:将传入的struct pollfd结构体数组拷贝到内核中进行监听。 epoll:执行epoll_create会在内核的高速cache区中建立一颗红黑树以及就绪链表(该链表存储已经就绪的文件描述符)。接着用户执行的epoll_ctl函数添加文件描述符会在红黑树上增加相应的结点。
2. 内核态检测文件描述符读写状态的方式 select:采用轮询方式,遍历所有fd,最后返回一个描述符读写操作是否就绪的mask掩码,根据这个掩码给fd_set赋值。poll:同样采用轮询方式,查询每个fd的状态,如果就绪则在等待队列中加入一项并继续遍历。epoll:采用回调机制。在执行epoll_ctl的add操作时,不仅将文件描述符放到红黑树上,而且也注册了回调函数,内核在检测到某文件描述符可读/可写时会调用回调函数,该回调函数将文件描述符放在就绪链表中。
3. 找到就绪的文件描述符并传递给用户态的方式 select:将之前传入的fd_set拷贝传出到用户态并返回就绪的文件描述符总数。用户态并不知道是哪些文件描述符处于就绪态,需要遍历来判断。poll:将之前传入的fd数组拷贝传出用户态并返回就绪的文件描述符总数。用户态并不知道是哪些文件描述符处于就绪态,需要遍历来判断。epoll:epoll_wait只用观察就绪链表中有无数据即可,最后将链表的数据返回给数组并返回就绪的数量。内核将就绪的文件描述符放在传入的数组中,所以只用遍历依次处理即可。这里返回的文件描述符是通过mmap让内核和用户空间共享同一块内存实现传递的,减少了不必要的拷贝。
4. 重复监听的处理方式 select:将新的监听文件描述符集合拷贝传入内核中,继续以上步骤。poll:将新的struct pollfd结构体数组拷贝传入内核中,继续以上步骤。epoll:无需重新构建红黑树,直接沿用已存在的即可。epoll更高效的原因 select和poll的动作基本一致,只是poll采用链表来进行文件描述符的存储,而select采用fd标注位来存放,所以select会受到最大连接数的限制,而poll不会
猜你喜欢
- 2025-03-26 面试官:谈谈你对IO多路复用的理解?
- 2025-03-26 linux 内核poll/select/epoll实现剖析(经典)-下
- 2025-03-26 2021年末,写给计算机系大四学弟学妹!超级干货(建议收藏)
- 2025-03-26 作为C++后端开发程序员,应该彻底理解Epoll实现原理
- 2025-03-26 网络编程—IO多路复用详解(io多路复用的通俗理解)
- 2025-03-26 IO模型介绍(select、poll、epoll)
- 2025-03-26 一篇文章让你真正搞懂epoll机制(epolic)
- 2025-03-26 Netty基础—3.基础网络协议(netty 协议)
- 2025-03-26 深入学习IO多路复用select/poll/epoll实现原理
- 2025-03-26 「干货」IO多路复用技术(select、poll、epoll模型)
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 稳压管的稳压区是工作在什么区 (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)