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就通知有事件发生。
由于笔者的水平有限,出错在所难免,恳请读者拍砖指正,谢谢阅读。
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就通知有事件发生。
由于笔者的水平有限,出错在所难免,恳请读者拍砖指正,谢谢阅读。
相关文章推荐
- 不容易系列之(3)—— LELE的RPG难题
- S3C2416裸机开发系列十六_sd卡驱动实现
- UWP开发入门(六)——对多设备不同分辨率显示效果的讨论
- 网络编程-TCP程序实例(文本大写转化器)
- AVL树的实现与演示
- FFmpeg avformat_open_input函数打开acc,h264失败的错误问题
- NYOJ 845 无主之地1
- 解析Tomcat内部结构和请求过程
- android输入法属性使用,软键盘隐藏、显示状态控制大揭秘
- 开源项目mobile_technology开篇
- 杂七杂八
- 八大排序算法的Python实现
- dp递推 zoj 3747 Attack on Titans
- ART中 MIR --> LIR --> 机器码 的流程
- 教你怎么用迅雷下载LOL
- IIS理解
- 脚本(一键)安装zabbix
- Javascript 闭包详解!
- 简单的栈
- android Paint 和Canvas的简单使用