面试中常被问到的(20)select,poll,epoll对比

从以下四个角度进行对比:

  • 用户态将文件描述符传入内核的方式

(1)select:创建三个文件描述符集并拷贝到内核中,分别监听 读,写,异常动作

(2)poll:将传入struct pollfd结构体数组(包含需要监控的描述符及对应事件以及返回实际就绪事件)拷贝到内核中

(3)epoll:调用epoll_create接口,在内核缓冲区中建立一棵红黑树以及双链表,向内核中添加需要监控的文件描述符,在红黑树增加对应节点

  • 内核态检测文件描述符读写状态的方式

(1)select:采用轮询遍历,遍历所有文件描述符fd,找到读写操作就绪状态的描述符

(2)poll:采用轮询遍历,查询每一个fd状态,如果对应事件就绪则在等待队列中加入一项继续遍历

(3)epoll:采用回调机制,执行add操作将文件描述符放到红黑树上,而且注册回调函数,内核在检测到某文件描述符可读,可写时会调用回调函数,通过回调函数将文件描述符对应事件添加到就绪双向链表中

  • 找到就绪文件描述符并传递给用户态的方式

(1)select:将描述符状态集合拷贝到内核,并返回就绪的文件描述符总数。用户态需要遍历来判断哪些文件描述符对应事件处于就绪态

(2)poll:将struct pollfd结构体数组拷贝到内核,并返回就绪的文件描述符总数

(3)epoll:调用epoll_wait监控就绪链表中有无数据,最后将链表的数据返回给数组并返回就绪描述符总数。内核将就绪的文件描述符对应事件放在传入数组中,数组中都是已经就绪的事件只用遍历依次处理即可

  • 重复监听的处理方式

(1)select:将新的监听文件描述符集合拷贝传入内核,继续以上步骤

(2)poll:将新的struct pollfd结构体数组拷贝传入内核,继续以上步骤

(3)epoll:无需重建红黑树,沿用即可

epoll高效的原因:

  • select和poll动作基本一致,poll采用结构体数组进行文件描述符存储,select采用fd二进制标注位来存储,所以select会受到最大监控描述符数上限,而poll和epoll都不会受限
  • select,poll,epoll都会返回就绪描述符数量,但是select和poll都不会具体明确指出是那些描述符对应事件就绪,需要遍历判断,而epoll直接返回就绪描述符对应事件的数组,直接处理即可
  • select和poll都需要将文件描述符集合或结构体数组拷贝进内核监听完成再从中拷贝出来,而epoll中描述符以及事件结构只需要向内核拷贝一次(通过epoll_event保存返回)实现内核中消息传递,减少复制开销
  • select,poll均采用轮询方式来检测事件是否处于就绪态,而epoll采用回调机制,异步阻塞由系统进行监控。随着fd描述符增加,select和poll效率受影响,而epoll影响不大
  • epoll独有边缘触发机制,效率高。若某个描述符有数据接收到,但数据不完整,如果使用水平触发,只要不从缓冲区取空所有数据则一直触发事件,而边缘触发只有新数据到来才会触发事件,查看数据是否完整,有效避免一种事件由于数据不完整不想处理但一直被不断触发的情况。
  • poll/select适用于单个描述符的超时控制,而单个描述符的临时超时控制不适用于epoll,而适用于大量监控中,这是因为epoll会在内核中创建红黑树,双向链表结构,如果监控描述符数量少,反而会增加内存开销
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HT . WANG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值