epoll 和 select 的区别
来源:互联网 发布:mysql创建数据表 编辑:程序博客网 时间:2024/05/07 02:43
面试linux的时候,很多面试官都会问的一个问题是epoll和select的区别,而我总是答的不够完整,今天总结一下epoll和select的区别。
首先select是posix支持的,而epoll是linux特定的系统调用,因此,epoll的可移植性就没有select好,但是考虑到epoll和select一般用作服务器的比较多,而服务器中大多又是linux,所以这个可移植性的影响应该不会很大。
其次,select可以监听的文件描述符有限,最大值为1024,而epoll可以监听的文件描述符则是系统对整个进程限制的最大文件描述符。
接下来就要谈epoll和select的性能 比较了,这个一般情况下应该是epoll表现好一些,否则linux也不会去特定实现epoll函数了,那么epoll为什么比select更高效呢?原因有很多,第一点,epoll通过每次有就绪事件时都将其插入到一个就绪队列中,使得epoll_wait的返回结果中只存储了已经就绪的事件,而select则返回了所有被监听的事件,事件是否就绪需要应用程序去检测,那么如果已被监听但未就绪的事件较多的话,对性能的影响就比较大了。第二点,每一次调用select获得就绪事件时都要将需要监听的事件重复传递给操作系统内核,而epoll对监听文件描述符的处理则和获得就绪事件的调用分开,这样获得就绪事件的调用epoll_wait就不需要重新传递需要监听的事件列表,这种重复的传递需要监听的事件也是性能低下的原因之一。除此之外,epoll的实现中使用了mmap调用使得内核空间和用户空间共享内存,从而避免了过多的内核和用户空间的切换引起的开销。
然后就是epoll提供了两种工作模式,一种是水平触发模式,这种模式和select的触发方式是一样的,即只要文件描述符的缓冲区中有数据,就永远通知用户这个描述符是可读的,这种模式对block和noblock的描述符都支持,编程的难度也比较小 ; 而另一种更高效且只有epoll提供的模式是边缘触发模式,只支持nonblock的文件描述符,他只有在文件描述符有新的监听事件发生的时候(例如有新的数据包到达)才会通知应用程序,在没有新的监听时间发生时,即使缓冲区有数据(即上一次没有读完,或者甚至没有读),epoll也不会继续通知应用程序,使用这种模式一般要求应用程序收到文件描述符读就绪通知时,要一直读数据直到收到EWOULDBLOCK/EAGAIN错误,使用边缘触发就必须即将缓冲区中的内容读完,否则有可能引起死等,尤其是当一个listen_fd需要监听到达连接的时候,如果多个连接同时到达,如果每次只是调用accept一次,就会导致多个连接在内核缓冲区中滞留,处理的办法是用while循环抱住accept,直到其出现EAGAIN。这种模式虽然容易出错,但是性能要比前面的模式更高效,因为只需要监听是否有事件发生,发生了就直接将描述符加入就绪队列即可。
- Select和epoll的区别
- Select和epoll的区别
- Select和epoll的区别
- select和epoll的区别
- Select和epoll的区别
- select和epoll的区别
- Select和epoll的区别
- Select和epoll的区别
- epoll 和 select 的区别
- select和Epoll的区别
- epoll和select的区别
- epoll和select的区别
- epoll和select的区别
- Select和epoll的区别
- select和epoll的区别
- select 和 epoll的区别
- select和epoll的区别
- epoll和select的区别
- C指针声明解读之右左法则
- java设计模式之——代理模式
- CEP 与 JMS 结合的参考文章
- 公司不能上有道自己保存点东西
- Android 屏幕适配方案
- epoll 和 select 的区别
- 使用迭代器(Iterator)来实现链表的相关操作
- Android开发中对.gitignore文件的配置
- <开局>灯塔在此,前路无忧!
- UI中的响应时间:3个重要的界限
- 时间序列相关函数
- qt 指针 自动删除?
- 所谓的洗脑——都是竞争
- 用L脚本语言开发一个简单的web服务器