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

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反应器,在一个项

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值