关于Epoll,你应该知道的那些细节.doc
《关于Epoll,你应该知道的那些细节.doc》由会员分享,可在线阅读,更多相关《关于Epoll,你应该知道的那些细节.doc(6页珍藏版)》请在三一文库上搜索。
1、关于Epoll,你应该知道的那些细节Epoll,位于头文件sys/epoll.h,是Linux系统上的I/O事件通知基础设施。epoll API为Linux系统专有,于内核2.5.44中首次引入,glibc于2.3.2版本加入支持。其它提供类似的功能的系统,包括FreeBSD kqueue,Solaris /dev/poll等。Epoll APIEpoll API实现了与poll类似的功能:监测多个文件描述符上是否可以执行I/O操作。支持边缘触发ET和水平触发LT,相比poll支持监测数量更多的文件描述符。以下API用于创建和管理epoll实例:epoll_create:创建Epoll实例,并
2、返回Epoll实例关联的文件描述符。(最新的epoll_create1扩展了epoll_create的功能)create_ctl:注册关注的文件描述符。注册于同一epoll实例的一组文件描述符被称为epoll set,可以通过进程对应的/proc/pid/fdinfo目录查看。epoll_wait:等待I/O事件,如果当前没有任何注册事件处于可用状态,调用线程会被阻塞。水平触发LT与边缘触发ETEpoll事件分发接口可以使用ET和LT两种模式。两种模式的差别描述如下。典型场景:1 管道(pipe)读端的文件描述符(rfd)注册于Epoll实例。2 写者(Writer)向管道(pipe)写端写2
3、KB的数据。3 epoll_wait调用结束,返回rfd作为就绪的文件描述符。4 管道读者(pipe reader) 从rfd读1KB的数据。5 下一次epoll_wait调用。如果rfd文件描述符使用EPOLLET(边缘触发)标记加入Epoll接口,第5步对epoll_wait的调用可能会挂住,尽管文件输入缓冲区中仍然有可用数据;与此同时,远端实体由于已经发送数据,可能正在等待回应。其原因是边缘触发模式仅在所监控的文件描述符状态发生变化时才投递事件。所以,第5步的调用方可能最终一直在等待数据到来,但数据其实已经在输入缓存区。经过第2步的写操作和第3步的事件处理,rfd上只会产生一次事件。由于
4、第4步的读操作没有读完全部的缓冲区数据,第5步对epoll_wait的调用可能会永远阻塞。使用EPOLLET标记时,应该设置文件描述符为非阻塞,以避免阻塞读写,使处理多个文件描述符的任务饿死。因此,使用Epoll 边缘触发(EPOLLET)模式的接口,以下有两点建议:1 使用非阻塞的文件描述符2 只有在read或write返回EAGAIN之后,才继续等待事件(调用epoll_wait)相比之下,当Epoll作为水平触发接口(LT,默认模式)使用时,epoll相当于一个更快的poll,可以用于poll适用的任何场景,因为二者语义相同。在边缘触发模式下,当收到多个数据块时也可能会产生多个事件,调用
5、方可以通过设置EPOLLONESHOT标记,告诉epoll当通过epoll_wait收到事件时,取消关联的文件描述符。当给epoll设置EPOLLONESHOT标记时,调用方需要通过epoll_ctl对文件描述符设置EPOLL_CTL_MOD标记。使用范例当Epoll作为水平触发接口使用时与poll语义相同,而作为边缘触发接口使用时需要注意应用层事件循环的细节,以避免错误。以下举例。设想一个非阻塞的socket为监听者,可以在该socket上调用listen。函数do_use_fd()处理新就绪的文件描述符,直到遇到读(read)或写(write)返回EAGAIN。事件驱动的状态机应用,应该在
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 关于 Epoll 应该 知道 那些 细节
链接地址:https://www.31doc.com/p-3387602.html