epoll

news/2025/2/22 23:29:58/文章来源:https://www.cnblogs.com/jaqennnnn/p/18731639

在 Linux 的 epoll 中,主要有两种触发模式:水平触发(Level Triggered, LT)边缘触发(Edge Triggered, ET)。它们的行为有较大的区别:


水平触发(LT)

  • 基本原理
    当文件描述符处于“可读”或“可写”的状态(即缓冲区中有数据,或有缓冲区可用于写入)时,只要进入 epoll_wait 就总是返回这个文件描述符,无论你在之前是否已经处理过这些数据。

  • 优点
    编程较简单,不必担心一次未处理完数据时无法再次收到通知的问题。
    数据未处理完毕的话,下一次 epoll_wait 调用仍会收到事件。

  • 缺点
    可能会频繁通知,导致重复处理同一事件(需要设计合适的处理逻辑)。


边缘触发(ET)

  • 基本原理
    ET 模式只在状态发生变化时触发,例如从无数据到有数据,从不可写到可写。
    如果数据到达后,你没有将缓冲区中的所有数据全部读取,ET 模式不会再次通知;同理,对于写操作,也需确保一次性写完或者正确处理 EAGAIN 的情况。

  • 特点
    高效:减少重复的事件通知,特别适合高并发场景。
    责任在用户:需要采用循环不断读取或写入直到返回 EAGAIN,确保所有数据处理完毕,防止数据“遗留”在缓冲区中后却没有再收到进一步的通知。

  • 注意事项
    如果不注意循环读取/写入,很可能会导致部分数据没有处理而陷入阻塞状态,因为没有新的状态变化来生成新的事件通知。


总结

  • LT 模式:只要缓冲区有数据,每次调用 epoll_wait 都会返回该文件描述符(只要它仍处于可读/可写状态)。
  • ET 模式只在状态从不可用变为可用时触发通知,例如数据刚刚到达;如果数据一次没有读取干净,程序必须遍历读取到 EAGAIN,否则不会再次收到事件。

正确选择和使用这两种模式需要根据应用场景考虑:

  • 如果希望简单且容错性较强,可以选择 LT 模式;
  • 如果追求性能,并且能够保证一次性处理完所有数据,那么可以选择 ET 模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/888222.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux中nano和vim用法

Linux下nano,vim使用Linux 编辑器使用指南:nano 和 vim 在 Linux 系统中,编辑文本文件是非常常见的任务。对于大多数 Linux 用户来说,nano 和 vim 是两个最常用的命令行文本编辑器。虽然它们都可以用来编辑文件,但它们的功能和使用方式有很大不同。本篇文章将介绍这两个编辑…

final关键字、Object类

1.规则 被final修饰的变量,名称都要大写,多单词的名称则需_来分隔1.修饰方法method方法已经不能被重写了,因为修饰该方法的是final2.修饰类 当一个类中所有的成员方法都不想被重写时,可以直接在类上加上final,无需再一个一个写在方法上2.object类: 是所有类的祖宗,每一个…

Java要记-持续补充中

1. ArrayList操作自定义对象进行removeAll()时,移除失效原因 由于底层最用调用的是Object的equals()方法进行比较的,比较的是地址,两个对象地址当然是不同的了,移除自然会失败。解决方案:重写equals方法。【注意重写equals方法记得也要重写hashCode方法】同时:retainAll(…

this和super--java进阶day01

1.this和super的代表super是父类的标识符,如堆内存中的标志 2.this和super的访问重点说访问构造方法,super()访问父类构造方法我们已经清楚,但是this()访问本类构造方法,我们不清楚有什么用意义 如以下情境 假设在公司制作一个系统,1.0有三位角色随着版本更新,1.1要新…

软件开发与创新课程设计第一次作业---小游戏《勇者冒险》改写

《勇者冒险》小游戏代码优化 一、项目名称与来源 题目为《勇者冒险》(原项目没有名字,是作者取的),代码来源是CSDN,链接如下: https://blog.csdn.net/zjx120307/article/details/126221342?sharetype=blog&shareId=126221342&sharerefer=APP&sharefrom=qq 本…

多周期处理器debug记录

这篇随笔记录的是从普通的多周期处理器到加入握手信号和axi-lite协议sram的处理器。 在之前的多周期处理器里,由于结构比较简单,所以我给ifu和exu的握手信号加入的是时序逻辑,idu由于只做解码,所以握手信号放在了组合逻辑里,差不多就和透传差不多。但是加入sram握手信号以…

继承内存图--java进阶 day01

主方法进栈,有new进堆堆内存中先存自己类中有的变量又因为继承了父类,所以父类中的变量也要存入 即使被私有化,依旧可以继承,只是没有权限使用!创建对象时,会调用构造方法,所以走构造方法,实参传形参.....继续走到super,访问父类的构造方法,父类构造方法进栈,形参继…

离散化学习笔记

离散化学习笔记 OP:又是一如既往的周更。。。水死了 定义离散化:将数字映射为是第几小的数,其保证数据在Hash之后仍然保持原来的全/偏序关系,能够解决:通过元素相对大小即可解决的问题。 其实本质上就是哈希的一种特殊规则而已。(离散化简化了不止亿点)目标将一堆乱序且…

java知识面试day2

1.说出java和c++的区别java是一个纯粹的面向对象语言,所有的对象都继承于java. lang.Object,C++兼容C,不但支持面向对象也支持面向过程 java有着一次编译四处运行的跨平台特性。 java不具有指针,但具有垃圾回收。 java不支持多重继承,只能通过实现多个接口去达到相同目的2.…

继承中构造方法访问特点--java 进阶day01

1.子类不可以继承父类的构造方法构造方法的名称必须与类名一致,上图中类名是Zi,而构造方法名是Fu,肯定不行 2.子类在初始化之前,需要对父类初始化 子类在初始化的过程中,很有可能会调用到父类的数据,如果父类没有提前初始化,子类就无法调用这些数据3.通过在子类中访问父…

Mysql莫名其妙爆出拒绝访问问题的原因及解决方案

本文记录使用Mysql作为数据库时发生拒绝访问问题的解决方案Mysql出现拒绝连接问题 ⛄问题原因 : Mysql密码错误,本机上并不是只有一个Mysql服务,我们在开机时启动了并非以前使用的那个Mysql服务,所以造成了密码的错误🌟解决方案 :手动关闭当前正在启用的Mysql服务,尝试找…