您的位置:首页 > 其它

select 和 epoll 的区别总结

2016-01-19 21:15 302 查看
在Linux中,select 和epoll函数,都是为了监控大量的描述符,是一种I/O多路复用技术。下面总结它们的区别:

select 与 epoll区别

1、打开的最大描述符数量限制

select 文件描述符使用的是linux ext3,因此打开数量受限制,一般默认为1024

epoll自己实现了一个虚拟文件系统,因此打开的描述符数就和机器内存有关,这个数值会很大

2、描述符传递方式

a、 select 每次调用时,都要传入描述符集,都要从用户空间拷贝内核空间,不仅如此,还会把传入的fd_set描述符 集清空,还必须对重新把每个描述符加入到fd_set中。

epoll 只需第一次传入,内核会保存描述符集,是保存在内核空间和用户空间共同mmap的一块空间,这样省去 由用户空间拷贝到内核空间的过程,并且epoll_ctl 可以对描述符增、删、改。

b、 select 返回的只是就绪描述符的个数,必须遍历描述符集找到就绪的描述符,显然描述符过多,成为效率瓶颈。

epoll 把就绪描述符保存在传出参数 epoll_event数组中

3、内部轮询机制

select 每次调用都要遍历所有的描述符来发现描述符是否就绪,因此随着描述符数量增加,效率直线下降

epoll 只是判断链表rdlist是否为空即可,因为每次添加描述符时,会注册一个回调函数,使该事件与相应的网卡设 备驱动程序建立回调关系,当描述符就绪时,就会调用回调函数,把这个描述符添加到rdlist,rdlist 就是一个 就绪描述符的链表。

4、事件触发模式

select 只支持水平触发

epoll 支持两种触发模式ET(边角触发)和LT(水平触发),这其实和电路中高电平触发和边沿触发的模式是一样 的,ET模式是指描述符由不可读或者不可写变为可读或者可写时,epoll才通知有事件发生LT模式则是描述符 只要可读或者可写,epoll就通知有事件发生。

由于笔者的水平有限,出错在所难免,恳请读者拍砖指正,谢谢阅读
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: