首页 > 其他分享 >epoll使用与原理

epoll使用与原理

时间:2024-06-12 13:24:02浏览次数:15  
标签:epoll read 句柄 ET fd 使用 原理 wait

使用要点

边缘模式(ET)与水平模式(LT)区别

下面内容来自linux man page

The  epoll event distribution interface is able to behave both as edge-triggered (ET) and as level-triggered (LT).  The difference between he two mechanisms can be described as follows.  Suppose that this scenario happens:
       1. The file descriptor that represents the read side of a pipe (rfd) is registered on the epoll instance.
       2. A pipe writer writes 2 kB of data on the write side of the pipe.
       3. A call to epoll_wait(2) is done that will return rfd as a ready file descriptor.
       4. The pipe reader reads 1 kB of data from rfd.
       5. A call to epoll_wait(2) is done.

       If the rfd file descriptor has been added to the epoll interface using the EPOLLET (edge-triggered) flag, the call to  epoll_wait(2)  done in step 5 will probably hang despite the available data still present in the file input buffer; meanwhile the remote peer might be expecting a response based on the data it already sent.  The reason for this is that edge-triggered mode delivers events only when changes occur on  the  monitored  file descriptor.  So, in step 5 the caller might end up waiting for some data that is already present inside the input buffer.  In the above example, an event on rfd will be generated because of the write done in 2 and the event is consumed in 3.  Since theread operation done in 4 does not consume the whole buffer data, the call to epoll_wait(2) done in step 5 might block indefinitely.

简单来说,如果使用ET模式,对于同一个事件,内核只会上报一次。如果代码没有读取完所有可读取的数据,然后继续调用epoll_wait那么是不会收到事件的。ET模式一般要设定成setnonblocking模式,并且等到读取数据返回EAGAIN或者

如果使用LT模式,则调用epoll_wait后会继续有事件触发。LT模式与poll保持一样的语义,区别是比poll的性能更好一些。

读取数据要点

  • 对于流式连接,例如pipe、fifo、tcp等,通过判定read的返回值比指定读取的小,来判断缓冲区中的数据已经读完了
  • 对于数据报,例如udp等,则通常需要需要持续读取到EAGAIN返回,才能判断缓冲区数据已经读完了
  • 每次从epoll_wait返回后都需要调用epoll_ctl往epoll中继续增加事件

惊群问题解决

  • EPOLLEXCLUSIVE 当多个fd指向同一个文件,并且都被添加到epoll中,那么就可能产生惊群问题:一旦这个文件有被写入,那么read事件会触发给多个fd。加了这个标志后,保证至少一个能收到事件。

ET模式下的饥饿现象

某一个文件,可能来的数据非常多,持续的多,那么这个文件会不停的进行read(按照我们前面说的返回EAGAN或者返回小于指定大小的思路)。由于整个运行时单线程的,那么其他fd就会一直等待,造成了所谓的饥饿现象

epoll的饥饿模式如何避免?linux man page中给出的答案时,不直接在epoll_wait返回后直接读取数据,而是将可读的fd放到一个list里面。然后再对这个list中的fd分别执行read,可以通过限制每个fd一次read的字节数来控制切换到其他fd,当一个fd 读完后从list删除掉。

处理使用 epoll ET 模式下文件描述符出现饥饿的情况_epoll wait防饥饿-CSDN博客

句柄数限制

/proc/sys/fs/epoll/max_user_watches 中记录系统范围内,限制加入到epoll中的句柄数,实际上是限制句柄相关的内存(64位下160字节,32位下90字节)最多只能占用内存的4%。

内核实现原理

epoll_wait是如何实现的

  • 用户调用epoll_wait,会通过syscall指令执行系统调用
  • 系统调用统一入口根据系统调用号走到内核对应的sys_epoll_wait处理函数(内核用call指令 执行)
  • 然后回判断epoolfd里面关联的文件句柄是否有可读的句柄
  • 如果暂时没有那么epoll_wait线程就会等待在这些句柄的queue上
  • 一旦这些文件句柄(例如socket),有数据进来后,内核的ksoftirqd线程会尝试唤醒线程,并从上次线程切换的位置宠幸执行sys_epoll_wait

注意:

  • epoll_ctl会将epollfd加入到io句柄的等待队列中

参考资料

标签:epoll,read,句柄,ET,fd,使用,原理,wait
From: https://www.cnblogs.com/bymzy/p/18243741

相关文章

  • C51学习归纳11 --- PWM原理、应用案例
        本节进入到一个更加常用的环节PWM的产生与应用,日常生活中,电机的使用非常普及,如何控制转速?其实就可以应用我的PWM。一、PWM的产生原理    PWM(PulseWidthModulation)即脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需......
  • 程序猿大战Python——容器——列表的基本使用
    列表的定义==目标:==掌握如何定义列表。列表类型为list,是Python中的一种常见类型。列表可以存放各种数据类型的数据,且列表的长度会随着添加数据的变化而变化。列表语法:变量名=[元素1,元素2,元素3,...]说明:列表的多个元素之间使用,逗号分隔。例如,一起来完成:(1)定义......
  • Centos7.9安装Python3.8.16解决yum无法使用问题
    Centos7.9安装Python3.8.16解决yum无法使用问题文章目录前言一、前期准备1.下载到新建目录2.安装依赖二、编译1.解压2.编译安装3.建立命令软链接3-1.查看默认的python及新安装的python3都安装在哪?3-2.修改python3的软链接3-3.修改pip的软链接三、修复yum1.查看python......
  • 工程数学 实验5-MATLAB最优化工具箱的使用
    (1)线性规划应用案例的求解1、基本要求通过一个农业生产计划优化安排的实例求解,培养学生解决实际线性规划问题的初步能力;熟悉线性规划的建模过程;掌握Matlab优化工具箱中线性规划函数的调用。2、主要内容某村计划在100公顷的土地上种植a、b、c三种农作物。可以提供的劳力、粪肥和......
  • Springboot自动配置的原理剖析
    @SpringBootApplication注解分析1、我们都知道Springboot的启动入口来自这个注解@SpringBootApplication,里面详细如下图2、再进一步细化如下图,那么应该是使用哪种方式来加载Springboot的自动配置类呢直接上结论,Springboot的自动配置实现方式是通过@Import注解实现的,首先......
  • 【react】react-redux 使用指南
    React-Redux使用指南如下:一、引言React-Redux是为React框架设计的一个状态管理库,它基于Redux,但提供了更加便捷的方式来与React组件进行交互。通过React-Redux,你可以在整个应用程序中维护一个单一的数据源(即ReduxStore),并通过action和reducer来管理这个数据源......
  • 使用PyTorch Profiler进行模型性能分析,改善并加速PyTorch训练
    如果所有机器学习工程师都想要一样东西,那就是更快的模型训练——也许在良好的测试指标之后加速机器学习模型训练是所有机器学习工程师想要的一件事。更快的训练等于更快的实验,更快的产品迭代,还有最重要的一点需要更少的资源,也就是更省钱。熟悉PyTorchProfiler然后就可以启动te......
  • 小程序必看:https证书强制使用攻略
    为了提升网络安全性和用户数据保护,自2017年1月1日起,微信小程序要求所有的网络请求必须通过HTTPS协议进行。这意味着小程序在与服务器进行数据交互时,必须使用HTTPS加密连接,以确保数据传输的安全性。这样做可以防止数据在传输过程中被窃取或篡改,保障用户的隐私和安全。因此,在开......
  • mongodb的安装使用、mongodb与redis,memcache,mysql的区别优缺点 以及 好用的MongoDB
    一、mongodb的安装使用、与redis,memcache,mysql的区别优缺点    MongoDB是一个介于关系数据库和非关系数据库之间的基于分布式文件存储的数据库。是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数......
  • 京准电钟 | NTP网络时间同步协议原理及其应用介绍
    京准电钟|NTP网络时间同步协议原理及其应用介绍京准电钟|NTP网络时间同步协议原理及其应用介绍京准电子科技官微——ahjzsz摘要:首先对计算机网络时间同步相关技术进行了介绍,然后阐述了时间同步技术在现代计算机网络中的应用与发展,最后指出时间同步网络在下一代网络(N......