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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,接下来我会详细介绍 epollepoll 是 Linux 内核提供的一种 I/O 事件通知机制,与 select 和 poll 相比,它具有更高的性能和更强的扩展性。 epoll 的特点如下: 1. 支持边缘触发和水平触发两种模式。 2. 采用基于事件驱动的方式,可以同时监听大量的文件描述符。 3. 支持添加、修改和删除事件,可以动态地改变监听的文件描述符。 4. 可以通过 epoll_wait 函数等待事件的发生,避免了轮询的效率问题。 epoll使用流程如下: 1. 调用 epoll_create 函数创建一个 epoll 实例。 2. 调用 epoll_ctl 函数向 epoll 实例添加、修改或删除事件。 3. 调用 epoll_wait 函数等待事件的发生。 4. 处理已经发生的事件。 下面是一个简单的使用 epoll 的示例: ```c #include <sys/epoll.h> int main() { int fd = socket(AF_INET, SOCK_STREAM, 0); struct epoll_event event, events[10]; int epfd, nfds; epfd = epoll_create(1); event.data.fd = fd; event.events = EPOLLIN | EPOLLET; epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &event); while(1) { nfds = epoll_wait(epfd, events, 10, -1); for(int i = 0; i < nfds; i++) { if(events[i].data.fd == fd) { // 处理文件描述符 fd 的事件 } } } return 0; } ``` 在这个示例中,我们创建了一个 epoll 实例,并向其中添加了一个文件描述符,然后使用 epoll_wait 函数等待事件的发生,并处理已经发生的事件。 需要注意的是,epoll 的事件驱动模型并不是线程安全的,因此在多线程环境下需要进行同步处理。 希望这份介绍对你有所帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值