select、poll、epoll简介

select、poll、epoll都是IO多路复用机制,都可实现同时监听多个I/O事件的状态,多路复用就是通过一种机制监视多个描述符,一旦某个描述符读或者写就绪就能通知代码进行读写操作。本质他们都是同步I/O,都需要读写时间就绪后自己负责读写,并且读写过程阻塞,而异步IO实现不会自己读写和阻塞,会负责把数据从内核拷贝到用户空间

1.select和poll实现原理
select 基于轮询机制,在一段指定时间内,监听用户所感兴趣的文件描述符上的可读、可写和异常事件。
select缺点:
所能监视的文件描述符的数量有限制,sizeof(fd_set)=128,说明能监视的描述符的最大值为128*8=1024个
同时每次调用select都需要在内核遍历传递进来的所有fd,当fd很多时性能会下降
由于当有事件发生时,select返回后会修改三个事件集,所以,每次都需要把fd集合从用户区拷贝到内核区,当需要监视的fd数量增多时,性能会下降
适用场景:
适用于所监视的文件描述符数量较少的场景
poll差异:
只是描述fd集合的方式不同,poll使用pollfd结构而不是select的fd_set结构
poll优点:
没有fd数量的限制
不用每次都把fd集合从用户区拷贝数据到内核,它使用一个 struct pollfd结构体来维护fd

2.epoll实现原理
epoll基于os支持的I/O通知机制,epoll支持水平触发和边沿触发两种模式。epoll使用一组函数来完成,把用户关心的文件描述符上的事件放在内核的一个事件表中,无须向select、poll那样每次调用都要重复传入文件描述符集或事件集,但epoll需要用一个额外的文件描述符来表示内核中的这个事件表。
优点:
1.没有fd数量的限制,它所支持的fd上限是最大可以打开文件的数目,具体数目可cat /proc/sys/fs/file-max察看,一般来说这个数目和系统内存关系很大
2.epoll_ctl每次注册新的事件到epoll句柄中时(在epoll_ctl中指定EPOLL_CTL_ADD),会把所有的fd拷贝进内核,而不是在epoll_wait的时候重复拷贝,epoll保证了每个fd在整个过程中只会拷贝一次
3.epoll的解决方案不像select或poll一样每次都把current轮流加入fd对应的设备等待队列中,而只在epoll_ctl时把current挂一遍(这一遍必不可少)并为每个fd指定一个回调函数,当设备就绪,唤醒等待队列上的等待者时,就会调用这个回调函数,而这个回调函数会把就绪的fd加入一个就绪链表)。epoll_wait的工作实际上就是在这个就绪链表中查看有没有就绪的fd。
适用场景:
当活动连接比较多的时候,epoll_wait的效率未必比select和poll高,因为此时回调函数被触发的过于频繁,因此epoll_wait适用于连接数量多,但活动连接较少的情况。
epoll对文件描述符的操作有两种模式:
LT(水平触发):这种模式是默认的工作模式,此时,epoll相当于效率较高的poll,
当往epoll内核事件表中注册一个文件描述符上的EPOLLET事件时,epoll将以ET模式来操作该文件描述符
ET(边沿触发):ET模式是epoll的高效工作模式,它在很大程度上降低了同一个epoll事件被重复触发的次数
参考:
1.select、poll、epoll之间的区别总结
2.一文搞懂select、poll和epoll

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值