大龙的博客

常用链接

统计

最新评论

epoll使用介绍

linux下的epoll较之传统的select函数比较其优点

     突破了单进程打开SOCKET描述符最大数目的限制,select单进程打开FD的数据是有限制的,由FD_SETSIZE设置,默认值是2048,而这在那此需要支持上万连接数目的网络服务器来说是不能忍受的,虽然这个限制可以通过修改宏重编译内核,但这会给效率带来急剧下降,而epoll却没有这个限制,理论上打开FD的数目跟系统内在有关;

    另外效率不会随连接数的增加而线性下降,它只会对活跃的IO事件进行操作,而select每次调用返回的是线性扫描的全集,不过在一个高速的网络环境里epoll的性能并不比select高多少,因为大部分的socket基本都是活跃的

epoll使用

epoll函数非常简单,epoll_create,epoll_ctl,epoll_wait 3个函数,可用man查看具体函数说明,先使用epoll_create创建一个epoll的句柄,再通过epoll_ctl注册事件,然后epoll_wait检测事件的发生。

epoll二种工作模式的区别

Edge Triggered (ET)、Level Triggered (LT);ET(edge-triggered)是高速工作方式,只支持no-block socket。当IO事件发生时内核通知你后不会再发送更多的通知,一直到你执行的操作导致那个文件描述符事件的改变,如果你不对其进程IO操作,内核不会再通知你。Level Triggered (LT)是缺省的工作方式,并且同时支持block和no-block socket.内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行IO操作。如果你不作任何操作,内核还是会继续通知你的,你可以使用EPOLLONESHOT标志来告诉内核只通知一次,需注意的是操作完后使用带有 EPOLL_CTL_MOD标志epoll_ctl修改处理文件描述符

ET模式使用在epoll_ctl加入事件时使用EPOLLET标志来设置。ET模式在IO处理时需注意使用非阻塞模式,网上有很多这样的例子

ACE及libevent都使用LT模式。而ACE的ACE_Dev_Poll_Reactor反应器不支持线程池,虽然其代码里也类似TP_Reactor通过锁来互斥epoll_wait 操作,但在多线程应用中会出现问题。本人参照TP_Reactort自写了一个L/F线程池支持的epoll反应器,在一个项目中已经在使用。

posted on 2008-12-13 09:49 大龙 阅读(1121) 评论(2)  编辑 收藏 引用

评论

# re: epoll使用介绍 2009-07-20 11:57 freemel

你好, 能不能提供你写的epoll反应器的代码学习学习.
我用select+tp_reactor, 现在想改成epoll, 就担心epoll不支持多线程  回复  更多评论   

# re: epoll使用介绍 2009-07-20 11:58 freemel

我的Email是zangws@iceflow.cn , QQ是10793356, 方便可以切磋切磋  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理