epoll、poll、select区别

本文详细对比了select、poll和epoll三种IO多路复用技术在文件描述符传入内核、检测就绪、传出就绪及重复监听上的差异。epoll以其高效的特性在连接数大但活跃数不多的场景下表现出色,通过回调机制避免了轮询检查的开销。然而,当连接数和活跃数相等时,epoll的性能优势可能不再明显,甚至可能因为回调函数过多而降低效率。
摘要由CSDN通过智能技术生成

1.文件描述符传入内核的方式

select:创建文件描述符集合,拷贝到内核,每个文件描述符会多次拷贝。
poll:创建struct pollfd结构体数组拷贝传入内核。
epoll:epoll_ctr一个一个上树,并建立回调关系,每个文件描述符只会传入一次。

2.内核检测文件描述符就绪的方式

select:轮询,遍历所有fd,最后返回一个是否就绪的mask掩码,并根据掩码给fd_set赋值
poll:轮询遍历,如果就绪,加入到就绪队列继续遍历
epoll:在epoll_ctr上树的时候就在fd和网络设备间建立了回调关系,当数据到达本地后,会触发回调函数,回调函数把事件加入到就绪队列

3.就绪文件描述符传出、用户区处理的方式

select:select()拷贝传出fd_set,并返回就绪个数;但对用户去而言,不知道是哪些fd就绪,需要在遍历这个fd_set,和传入前的fd_set进行比对。
poll:和select一样,拷贝传出struct pollfd数组,返回就绪个数;遍历这个数组。
epoll:epoll_wait()返回就绪个数,它是返回的就绪队列的数据,即返回的都是就绪的fd,只需一次遍历就行,每次遍历都是有用的。

4.重复监听的方式

select:重新组织fd_set,重新拷贝进去。
poll:重新组织struct pollfd数组,重新拷贝进去
epoll:还是沿用之前的那棵树,无需重新传入。

总结:

epoll效率高在传入不重复,传出够具体,内核监听用回调。
但是,epoll是在连接数很多,但是活跃数不太多的情况下高效。当连接数10000,活跃数10000时,epoll和select也没啥区别了甚至更差,因为这时会触发太多的回调函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值