LT自动挡,ET手动挡(epoll)

举源码实例来说明epoll之LT和ET模式的区别 立即下载

LT自动挡,ET手动挡(epoll)

转载:http://www.cnblogs.com/napoleon_liu/archive/2010/07/20/1781578.html

epoll有 ET和LT两种模式, 默认是LT模式。

LT模式的时候,epoll_wait 会把有事件的 file 再次加到 rdllist 列表中,以便下次epoll_wait可以再检查一遍。

            if (epi->event.events & EPOLLONESHOT)
                epi->event.events &= EP_PRIVATE_BITS;
            else if (!(epi->event.events & EPOLLET)) { //LT模式
                /*
                 * If this file has been added with Level
                 * Trigger mode, we need to insert back inside
                 * the ready list, so that the next call to
                 * epoll_wait() will check again the events
                 * availability. At this point, noone can insert
                 * into ep->rdllist besides us. The epoll_ctl()
                 * callers are locked out by
                 * ep_scan_ready_list() holding "mtx" and the
                 * poll callback will queue them in ep->ovflist.
                 */
                list_add_tail(&epi->rdllink, &ep->rdllist);
            } 

LT 模式下,状态不会丢失,程序完全可以于 epoll 来驱动。

ET模式下,程序首先要自己驱动逻辑,如果遇到 EAGAIN错误的时候,就要依赖epoll_wait来驱动,这时epoll帮助程序从阻碍中脱离。


所以LT是自动挡, ET是手动挡。 

 

ET 边沿触发的 边沿是 AGAIN错误,属于下降沿触发。

 

ET 的驱动事件依靠 socket的 sk_sleep 等待队列唤醒,这只有在有新包到来才能发生,数据包导致POLLIN, ACK确认导致 sk_buffer destroy从而导致POLLOUT, 但这不是一对一得关系,是多对一(多个网络包产生一个POLLIN, POLLOUT事件)。

 

 ET常见错误:

 recv到了合适的长度, 程序处理完毕后就epoll_wait

 这时程序可能长期阻塞,因为这时socket的 rev_buffer里还有数据,或对端close了连接,但这些信息都在上次通知了你,你没有处理完,就epoll_wait了

 正确做法是:

recv到了合适的长度, 程序处理; 再次recv, 若果是EAGAIN则epoll_wait。 


使用ET模式时, 程序自己驱动下,会发生socket被关闭的情况,这时要处理EPIPE信号和返回值。(如果不处理EPIPE那么会导致程序core掉) 

总结:ET 使用准则,只有出现EAGAIN错误才调用epoll_wait。

 

场景:短连接,短数据包(一个recv和send就可以完成所有的网络操作),这种情形下测试的结果是ET和LT一样的效率。(所以不要以为用了ET效率就有提高)

strace -c -fF ./your_prog 后得到信息是 epoll_ctl 消耗的时间比 recv+send 还多。 

总结原因:整个程序是以网络事件来驱动的,所以每个连接都要epoll_ctl 3次; 如果程序自己主动recv+send, 不行的时候再网络驱动的话,可以节省这些epoll_ctl开销。

 

对于长连接,大数据包应用,因为 LT模式只能设置当时感兴趣的事件(如果不写数据也设置POLLOUT的话,会导致cpu 100%) ,所以要频繁调用epoll_ctl,内核也要多次操作链表,所以效率会比ET模式低。

vasp计算练习1-Si si的vasp训练流程 阅读详情

相关推荐

Windows 10/11 下用 Docker 一键部署 CVAT 标注工具(附 WSL2 配置指南)

本文详细指导如何在Windows 10/11系统上,通过配置WSL2和Docker Desktop,实现CVAT标注工具的一键部署。内容涵盖从环境准备、Docker安装、CVAT服务启动到性能优化与安全配置的全流程,为计算机视觉开发者提供稳定高效的本地标注平台解决方案。

weixin_28839601的博客 461

epoll中的ET和LT模式区别

epoll中的ET和LT模式一、水平触发(LT)和边沿触发(ET)二、例子1.例子:水平触发(LT)2.例子:边沿触发(ET) 一、水平触发(LT)和边沿触发(ET) 在电路中的有水平触发和边沿触发的概念,在epoll读取事件下,水平触发可以理解为,蓝色那一部分,只要存在可读的情况,就会一直读取。而边沿触发,可以理解为红色箭头所指向,发生跳变的部分,就会触发一次。 在epoll中 events=EPOLLIN 为读取事件,LT模式 events=EPOLLIN|EPOLLET 为读取事件,ET模式 e

菊头蝙蝠的博客 5316

MDT部署实战:除了Office,这些“装机必备”软件也能一键静默安装(含静默参数)

本文详细介绍了如何利用Microsoft Deployment Toolkit(MDT)实现企业级软件的静默安装,包括浏览器、开发工具和系统增强工具等“装机必备”软件的部署方案。通过命令行参数和MSI属性,IT运维团队可以高效构建标准化工作环境,提升部署效率并确保版本一致性。文章还提供了安装顺序控制、结果验证和常见问题排错等高级技巧。

weixin_26985923的博客 171

关于epoll

LT自动挡(水平模式),ET手动挡(epoll垂直模式) 区别ET 边沿触发的 边沿是EAGAIN错误,属于下降沿触发。ET的驱动事件依靠socket的sk_sleep等待队列唤醒,这只有在有新包到来才能发生,数据包导致POLLIN, ACK确认导致 sk_buffer destroy从而导致POLLOUT, 但这不是一对一得关系,是多对一(多个网络包产生一个POLLIN, POLLOUT事

epeaktop的专栏 593

crowdcountingp2p代码复现

前面学习了一下论文:Improved Field-Based Soybean Seed Counting and Localization with Feature Level Considered该论文的模型原型由CrowdCounting-P2PNet改进而来这里先复现一下CrowdCounting-P2PNet模型,然后再学习P2PNet-Soy模型。

m0_73832962的博客 2325

YOLOv8融合改进 更换检测头为Detect_DyHead同时添加C2f_DBB模块

yolov8独家训练测试融合网络结构,提供详细步骤详细代码,手把手教你在yolov8官方包中把检测头更换为Detect_DyHead检测头,并且将原始的C2f模块更换成C2f_DBB模块,提高检测精度,亲测在多个数据集上有涨点!!!!!

分享一些自己改进代码的实例 4747

Linux服务器开发,手把手设计实现epoll

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习 首先,所有的服务器底层都是用的epoll。 strace ./server `查看epoll系统调用 select()函数并发量较低,epoll模型让linux的占有率持续增高。 用户态协议栈实现epoll? ...

sinat_28294665的博客 526

最小二乘(MLS)求点云法向量

MLS算法的基本思想是通过在点云的局部邻域内拟合一个光滑曲面,如平面或多项式曲面,以此来重建和处理点云数据。对于法向量估计,MLS通常在每个点的邻域内拟合局部平面,然后从该平面的法向量作为点的法向量。

twnkie的博客 744

自定义 epoll 的实现

自定义用户态协议栈:epoll 的实现方式

you_fathe的博客 815

数据处理和分析之数据聚类:层次聚类(Hierarchical Clustering):单链接层次聚类方法

单链接层次聚类(Single-Linkage Hierarchical Clustering)是凝聚型层次聚类的一种,它基于数据点之间的最小距离来定义聚类间的相似性。在单链接层次聚类中,两个聚类之间的距离定义为这两个聚类中任意两个数据点之间的最短距离。这种聚类方法倾向于形成链状或线性的聚类,因为聚类的边界是由最远的数据点决定的,而不是聚类的平均或中心位置。单链接层次聚类通过计算簇间最近点的距离来决定簇的合并,这种方法简单直观,但可能导致簇的形状不规则,尤其是在数据点分布不均匀的情况下。

2401_87715305的博客 1441

无需SLAM建图,直接生成Gazebo仿真环境的二维代价地图的功能包pgm_map_creator适配ROS Noetic编译报错及解决方法

在ROS Noetic中,使用`pgm_map_creator`功能包直接生成Gazebo仿真环境的二维代价地图时,可能会遇到各种编译和运行错误。本篇博客详细解析了在适配ROS Noetic过程中常见的报错及其解决方法,包括Boost文件结构更新、C++版本兼容性、Gazebo函数名变更、链接库缺失以及protobuf文件加载错误。通过逐步排查和修改,如更换头文件路径、调整C++标准、更新CMakeLists.txt文件等,成功解决了这些问题,使得`pgm_map_creator`功能包能够顺利编译和运行。

慕羽★的博客 2261

手把手设计实现epoll

前序 Epoll 是 Linux IO 多路复用的管理机制。 作为现在 Linux 平台高性能网络 IO 必要的组件。所有的linux服务器底层全部用的epoll linux在以前只能做嵌入式设备,但是自从有了epoll的存在,就有了linux可以用来做服务器 1 epoll本身的数据结构 epoll本身只用到了两种数据结构 1 所有的fd总集合 红黑树 epoll和poll的一个很大的区别在于,poll每次调用时都会存在一个将pollfd结构体数组中的每个结构体元素从用户态向内核态中的一个链表节点拷

qq_39329062的博客 719

使用Python实现卷积神经网络(CNN)

卷积神经网络是一种专门用于处理具有网格状拓扑结构数据(如图像、声音)的深度学习模型。CNN的核心组件是卷积层和池化层,它们能够有效地从图像中提取特征并实现空间不变性,使得模型能够对图像中的物体进行识别和分类。我们定义一个简单的卷积神经网络模型,包括卷积层、池化层和全连接层。return x# 创建模型实例我们选择交叉熵损失函数作为分类任务的损失函数,并使用随机梯度下降(SGD)作为优化器。

Echo_Wish 4488

深入解析epoll的LT与ET模式:高并发服务器开发指南

I/O多路复用是Linux高并发编程的核心技术,其中epoll作为高效的事件驱动机制,通过红黑树管理文件描述符,大幅提升了服务器处理海量连接的能力。其核心在于两种触发模式:水平触发(LT)会持续通知未处理事件,编程简单但性能一般;边缘触发(ET)仅在状态变化时通知,配合非阻塞I/O可实现极致性能,但需要正确处理EAGAIN等边界条件。在游戏服务器、金融交易等延迟敏感场景中,ET模式能降低30%以上的CPU占用。理解epoll的内核实现原理和调优技巧,是构建高性能服务器的关键,本文通过实测数据展示了如何根据业

weixin_30299709的博客 320

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

从多进程到epoll:深入理解Linux高并发网络编程核心模型

在计算机科学中,I/O多路复用是一种允许单个进程或线程同时监视多个文件描述符(如网络套接字)就绪状态的核心编程模型。其原理在于通过操作系统提供的系统调用(如select、poll、epoll),将多个I/O操作的等待阻塞集中管理,仅当有事件发生时才会唤醒程序进行处理,从而极大地提升了I/O效率。这项技术的核心价值在于,它能够以极高的资源利用率支持海量并发连接,是构建高性能、可扩展网络服务的基石,广泛应用于Web服务器、实时通信、分布式系统等场景。本文聚焦于Linux环境下高性能I/O多路复用的代表——epo

weixin_34098209的博客 317

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C++原生Socket实现即时通讯:Reactor线程池架构与并发编程实践

网络编程是构建分布式系统的核心技术,其核心在于理解数据如何在网络中可靠传输。TCP/IP协议栈提供了端到端的通信保障,而应用层协议设计则解决了消息边界问题。在服务端开发中,高并发处理能力直接决定了系统的性能和可扩展性。通过事件驱动模型与多线程结合,可以高效管理海量连接,这正是现代即时通讯、游戏服务器等实时系统的技术基础。本文以C++实现为例,深入剖析了基于Reactor模式和线程池的架构设计,探讨了如何通过epoll事件循环、自定义二进制协议以及智能指针资源管理,构建稳定高效的服务端程序,并分享了在压力测试

weixin_33829657的博客 464

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

信号驱动IO异步IO的对比理解刨析, epoll地ET,LT

信号驱动IO异步IO的对比理解刨析, 代码实现信号驱动IO, 以及select,poll,epoll三个IO多路复用技术的原理再生活化理解,以及细谈一下epoll的LT和ET

小杰312的博客 3770

epoll下的ET和LT

LT模式:LT是epoll默认的工作方式,支持阻塞和非阻塞两种机制。LT模式下内核会持续通知你文件描述符就绪了,然后你可以对这个就绪的fd进行I/O操作。如果不做任何操作,内核还是会继续通知你的。 ET模式:ET模式相对LT模式更加高效,只支持非阻塞模式。在这个模式下,当描述符从未就绪变为就绪时,内核通过epoll告诉你。然后它会假设你知道文件描述符已经就绪,并且不再为那个文件描述符发生更多的就绪通知。直到你做了某些操作导致那个文件描述符不再为就绪状态了。 ET模式在很大程度上减少了epoll事件被重复

fbj_bai的博客 3341

剖析 epoll ET/LT 触发方式的性能差异

<br />剖析 epoll ET/LT 触发方式的性能差异误解(定性分析)<br /><br />平时大家使用 epoll 时都知道其事件触发模式有默认的 level-trigger 模式和通过 EPOLLET 启用的 edge-trigger 模式两种。从 epoll 发展历史来看,它刚诞生时只有 edge-trigger 模式,后来因容易产生 race-cond 且不易被开发者理解,又增加了 level-trigger 模式并作为默认处理方式。<br /><br />二者的差异在于 level-tri

RTC hacker 2062

【服务器编程】EPOLL的LT和ET模式的区别和理解

【前言】 epoll模型是服务器编程的高性能框架,比select 和 poll模型高效很多,当然还有其它的模型,如kqueue等,具体linux发行版提供不同的模型,一般都支持epoll吧。 【理解】 epoll提供两种工作模式:LT 和 ET。 LT模式是epoll默认的工作方式,相当于一个效率很高的poll模型;而ET是高效的工作方式。 LT 和 ET本质的区别是:

依然那霖哥 2万+

epoll:EPOLLLT和EPOLLET的区别

概念: Level-triggered :水平触发,缺省模式,同时支持block和no-block edge-triggered :边缘触发,只支持no-block 通知模式: LT模式时,事件就绪时,假设对事件没出做处理,内核会反复通知事件就绪 ET模式时,事件就绪时,假设对事件没出做处理,内核不会反复通知事件就绪 针对TCP的测试详请: 1.listenfd设

daiyudong2020的博客 1万+

epoll 的 Et与lt模式的区别

epoll 对文件的描述符的操作有两种模式 : LT(Level Trigger, 电平触发)模式 和 ET(Edge Trigger ,边沿触发)模式。LT模式是默认的工作模式,这个模式下epoll相当于一个效率较高的poll。当往epoll中内核事件表中注册EPOLLET事件时,epoll将以ET模式来操作该文件描述符。ET是epoll的高效模式。         对于采用LT工作的文件描述

sinat_28603977的博客 1476

epoll 事件处理的细节分析2

准确的说epoll事件就是IO事件,包括文件、socket、pipe等,linux把他们统称为文件,统一的接口调用,驱动层不同实现。 这里分成四类: 监听套餐接字,链接套接字,文件,pipe,相应的触发条件 1.监听套接字: 有新链接连上临听套接字,并三次握手成功时 2.链接套接字 有IO读写,且传输层接收/发送完毕 3.普通文件 有IO读写 4.pipe 有IO读写,且有锁保

xiaofei chain 2642

LT(水平触发)和ET(边缘触发)

默认为LT工作模式,data.events只有EPOLLET事件, ET工作模式: 只有当缓冲区中数据由无到有,由少变多时才会区读取数据, 所以一次要将缓冲区中的数据读完,否则剩下的数据可能就读不到了。 正常的读取数据时,我们若是要保证一次把缓冲区的数据读完,意为本次读被阻塞时即缓冲区中没有数据了,可是我们服务器要处理多个用户的请求,read()不能被阻塞,所以采用塞轮询的方式读取数据。 ...

Misszhoudandan的博客 4065
上一篇: 为什么求模运算要用素数(质数)—— 哈希表设计
下一篇: epoll的内部实现 & 百万级别句柄监听 & lt和et模式非常好的解释
xiaofei0859
博客等级 码龄18年 454粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值