epoll的两种触发方式

本文详细介绍了epoll的两种触发模式——水平触发和边缘触发,分析了各自的优缺点以及在实际应用中的难点,包括accept函数的触发方式选择、边缘触发为何不处理EINTR、为何使用非阻塞fd等。同时,还讨论了如何处理EPOLLIN和EPOLLOUT事件的触发时机,提供了处理这两种触发模式的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

几种IO模型的触发方式

select(),poll()模型都是水平触发模式,信号驱动IO是边缘触发模式,epoll()模型即支持水平触发,也支持边缘触发,默认是水平触发
从表象看epoll的性能最好,但是在连接数少,并且连接都十分活跃的情况下,select和poll的性能可能比epoll好,毕竟epoll的通知机制需要很多回调函数来完成

epoll的两种触发方式

Level_triggered(水平触发):当被监控的文件描述符上有可读写事件发生时,epoll_wait()会通知处理程序去读写。如果这次没有把数据一次性全部读写完(如读写缓冲区太小),那么下次调用 epoll_wait()时,它还会通知你在上次没读写完的文件描述符上继续读写

Edge_triggered(边缘触发):当被监控的文件描述符上有可读写事件发生时,epoll_wait()会通知处理程序去读写。如果这次没有把数据全部读写完(如读写缓冲区太小),那么下次调用epoll_wait()时,它不会通知你,也就是它只会通知你一次,直到该文件描述符上出现第二次可读写事件才会通知你

由此可见,水平触发时如果系统中有大量你不需要读写的就绪文件描述符,而它们每次都会返回,这样会大大降低处理程序检索自己关心的就绪文件描述符的效率,而边缘触发,则不会充斥大量你不关心的就绪文件描述符,从而性能差异,高下立见

关于两种触发方式的难点整理

  1. accept函数调用时使用哪种触发方式?
    accept除了在某些特殊情况下(如连接已完成三次握手、进入就绪队列中等待被accept,然后客户端又断开),一调用就直接返回,因此讨论起fd的阻塞非阻塞无意义,nigix的实现中,accept函数调用使用水平触发的socket fd,是出于对丢失连接的考虑(边缘触发时,accept只会执行一次接收一个连接,内核不会再去通知有连接就绪),当然,若使用while
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值