版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/KentZhang_/article/details/50544930
在Linux中,select 和epoll函数,都是为了监控大量的描述符,是一种I/O多路复用技术。下面总结它们的区别:
select 与 epoll区别
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就通知有事件发生。
由于笔者的水平有限,出错在所难免,恳请读者拍砖指正,谢谢阅读。