多路转接之epoll的两种触发方式(LT,ET的效率对比,原理,epoll读取数据的过程)

目录

EPOLL的触发方式

水平触发 LT(Level Triggered)

边沿触发 ET(Eage Triggered)

比喻

过程

总结

回到epoll

效率

为什么要一次读完?

如何确保读完了所有数据?

举例

回到epoll

效率对比总结

本质


epoll接口介绍 -- epoll接口介绍,epoll模型介绍+原理,接口和模型的关系,epoll优点(和select/poll进行对比)-CSDN博客

EPOLL的触发方式

水平触发 LT(Level Triggered)

epoll的默认方式

  • 如果我们没有处理[已就绪的事件],会一直通知我们

可以把已就绪的事件看作高电平,通知看作有效

  • 水平触发就是,只要处于高电平,就有效

边沿触发 ET(Eage Triggered)

数据/连接有变化的时候,才会通知,且只通知一次

  • 变化 -- 从无到有,从有到多

 

比喻

过程

可以把这两个模式看做是两个快递员送货的方式

  • a快递员 -- 当有快递送到,而你不去取/取了一部分,会一直打电话通知让你来取,直到取完
  • b快递员 -- 也会在快递送到时通知,区别在于:如果你没有取/只取了一部分,他不会将剩下的部分留在那里,而是带走 ; 并且他这次通知了之后就不管了,直到有新快递到来,才又会通知我们,然后带上之前你剩下的快递

总结

乍眼一看,可能会觉得a方式更好

但因为b的特性,如果我们没有一次取完,可能导致货物丢失什么的,或是等待下一个货物等待了很久

  • 所以,会倒逼我们在收到通知后,就一次取走所有货物

并且,对比a和b,我们会发现,b可以通知到更多的人

  • 因为一个快递员在一定时间内打出的电话次数是有限的
  • a可能一直在打重复电话,而b通知到的人数更多

回到epoll

效率

也就是说:

  • ET的特性会倒逼程序员,在处理通知时,需要一次将收到的数据全部读取,否则会错过这一次发来的完整数据,直到对方向我们发来新的数据,才能接收到上一轮剩下的数据
  • 所以,ET的io效率更高 -- 通知一次,就把数据全部取走

联系到tcp层:

  • 如果一次就能把数据全部取走,接收缓冲区就会更大的空间,从而向对方发送一个更大的窗口,这样对方一次就能发送更多的数据(和延迟应答的原理类似)

因为ET下可以通知更多的进程

  • 所以通知效率也更高

为什么要一次读完?

如果不强制要求,可能会导致通信双方无法完成正常通信

  • 假设,a收到了b的10k数据,但a只读取了1k,剩下的还在内核缓冲区里
  • 然后就会卡在这里: a在等待b的通知,想要继续读取数据 ; 而b在等待a的应答,收到应答后才会继续发送数据
  • 这就尴尬了
  • 所以,必须一次读完

如何确保读完了所有数据?

举例

假如a月初领了1000块,到了月中的时候,你找他借钱,此时你并不知道他现在有多少钱

如果你想把他手里的钱全部借走,怎么做?

  • 可以先借100,如果要多少给多少,说明他手里还有钱,可以继续要
  • 直到给的比要的少,有零有整的,说明此时已经要完了
  • 如果此时再继续要,他就会说自己已经没有钱了
回到epoll

总结一下就是 -- 保证全部取走 = 循环读取,直到没有数据

注意:

  • 如果是阻塞io,recv/read函数在没有数据可以读取的情况下,会阻塞至有数据到达
  • 但这不是我们希望的,因为我们写的是个单进程,一旦阻塞,整个服务器就寄了
  • 所以,我们要在ET模式下设置为非阻塞模式

我们之前实验过,如果当前没有数据,会返回[错误码为11]的错误

效率对比总结

但并不是说ET的效率就一定比LT方式高

  • 普遍情况下,确实是这样的,但还是取决于代码的具体实现

谁说采用了LT模式就不能将所有fd设置为非阻塞方式,然后循环读取,直到没有数据呢?

  • 如果我们保证在LT模式下,在第一次通知时,就取走全部数据,也就达到了和ET一样的效果
  • 只不过一个是主动,一个是被动这么做

本质

前面我们一直在说的通知,其本质是 -- 添加结点入就绪队列

  • 只要上层调用epoll_wait,就能获取队列中的数据

当然,如果不调用也没办法

  • 毕竟内核也不能强迫调用接口吧,通知就是它能做到的极限了
  • 就像tcp中的psh标志,他也只是催促对方赶紧将收到的数据准备好交给上层,而无法硬塞给上层

epoll读取数据的流程:

  • 就是等就绪队列有数据+调用epoll_wait接口 -> 将就绪队列中的数据读取到tcp层的接收缓冲区中 -> 上层从缓冲区中读出数据(读出的方式就是ET和LT的区别)
  • LT -- 不保证一次读完,但每次都会将未被读取的结点放入队列
  • ET -- 因为只会将结点放入队列中一次,所以必须读完数据

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

AIGC时代!AI的“iPhone时刻”与投资机遇

AIGC时代!AI的“iPhone时刻”与投资机遇 前言AI的“iPhone时刻”与投资机遇 前言 AIGC,也就是人工智能生成内容,它就像是一股汹涌的浪潮,席卷了整个科技世界。它的出现,让我们看到了人工智能的无限潜力,也…

基于协同过滤算法+PHP的新闻推荐系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于协同过滤算法PHPMySQL的新…

【STM32 HAL库】OLED显示模块

【STM32 HAL库】OLED显示模块 前言理论OLED基本参数OLED基本驱动原理OLED坐标轴 应用CubeMx配置底层函数代码高层封装函数printf显示函数 前言 本文为笔者学习 OLED 的总结,基于keysking的视频内容,如有错误,欢迎指正 理论 OLED基本参数 …

react + antDesign封装图片预览组件(支持多张图片)

需求场景:最近在开发后台系统时经常遇到图片预览问题,如果一个一个的引用antDesign的图片预览组件就有点繁琐了,于是在antDesign图片预览组件的基础上二次封装了一下,避免重复无用代码的出现 效果 公共预览组件代码 import React…

【machine learning-十-grading descent梯度下降实现】

grading descent 梯度下降参数更新方法 --导数和学习率 从导数项直观理解梯度下降 grading descent 算法就是更新参数,今天来学习下如何更新w和b 梯度下降 还是以线性回归的均方差损失函数如下为例: 损失函数的可视化图如下 : 横轴和纵轴分…

影刀RPA实战:网页爬虫之苦瓜书籍数据

书籍常常被视为心灵的慰藉,因为它们能够在不同的层面上为人们提供支持和安慰。 1. 书籍对我们的重要性 书籍是人类知识的载体,也是智慧的结晶。它们不仅是学习的工具,更是人类心灵的慰藉。在忙碌的生活中,书籍能够提供知识、启发…

魅思CMS getOrderStatus SQL注入漏洞复现

0x01 漏洞描述: 魅思是一款集成了视频管理、用户管理、手机端应用封装等功能的综合性视频管理系统。该系统不仅以其强大的视频管理功能、灵活的用户管理机制、便捷的手机端应用封装功能以及高安全性和现代化的界面设计,成为了市场上备受关注的视频管理系…

技术美术百人计划 | 《4.5 DOF景深算法》笔记

1. 景深定义 景深(Depth of Field,DOF),是指在摄影机镜头或其他成像器前沿能够取得清晰图像的成像所测定的被摄物体前后距离范围。镜头光圈、镜头焦距、及焦平面到拍摄物的距离是影响景深的重要因素。在聚焦完成后,焦点…

监控IDS和IPS增强网络安全性

入侵检测系统(IDS)和入侵防御系统(IPS)是当今使用的最复杂的网络安全设备之一,它们检查网络数据包并阻止可疑数据包,并提醒管理员有关攻击企图的信息。 在当今威胁不断变化的网络环境中,防火墙…

TopoDOT2024.1注册机 道路自动化提取 雷达点云数据

TopoDOT2024.1是一套成熟的点云数据处理及应用系统,全面具备点云数据的存储管理、精度检核、特征自动提取、智能分析、高效建模、成果输出等应用功能。TopoDOT在LiDAR数据应用领域有着多年的实战经验,用户在实际项目中长期使用,尤其在交通领域…

iOS 巨魔神器,Geranium 天竺葵:6大功能,个个都解决痛点

嘿,这是黑猫。如果你装了巨魔,却只知道安装第三方APP,那就是暴殄天物。巨魔的价值不仅是应用侧载,还有强大的玩机工具生态——这也是我花费大量时间,去制作巨魔精选IPA合集的原因。 通过巨魔商店安装的APP&#xff0c…

初学者的鸿蒙多线程并发之 TaskPool 踩坑之旅

1. 背景 目标群体:鸿蒙初学者 版本:HarmonyOS 3.1/4.0 背景:鸿蒙 App 的全局路由管理功能,需要在 App 启动时初始化对 raw 下的相关配置文件进行读取、解析并缓存。App 启动时涉及到了大量模块的初始化,好多模块都涉…

智能绘画Midjourney AIGC在设计领域中的应用

科技的进步,人工智能(AI)正以前所未有的方式渗透进各个领域,尤其是在艺术创作,尤其是绘画。Midjourney作为AI绘画技术的代表,其AIGC(Artificial Intelligence for Generative Content&#xff0…

python SQLAlchemy 数据库连接池

文章目录 前言python SQLAlchemy 数据库连接池1. 安装2. 创建数据库引擎3. 新建表,增删改查demo 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都…

【Linux】—— muduo网络库的安装配置与使用

muduo网络库编程 Linux环境下Epollpthread线程库 Boost库安装与使用 安装Boost库 下载boost库源码,linux环境解压 tar -zxvf boost_1_69_0.tar.gz 解压完成后,进入该目录,查看内容 运行bootstrap.sh工程编译构建程序 ./bootstrap.sh …

JAVA同城生活新引擎外卖跑腿团购到店服务多合一高效系统小程序源码

🚀同城生活新风尚!一站式高效系统,让日常更便捷🛍️ 🍽️【开篇:同城生活,一触即发】🍽️ 在这个快节奏的时代,同城生活的便利性与效率成为了我们追求的新风尚。想象一下…

C# 从字符串中分离文件路径、文件名及扩展名

C# 从字符串中分离文件路径、文件名及扩展名 对文件进行操作时,首先要获取文件路径信息,然后创建文件对象,通过IO流将数据读取大宋内存中并进行处理。在操作文件时,可能还需要提取文件的一些信息,比如,文件…

有效安全计划评估的基本指标

衡量安全计划成功与否的最有效指标是什么? 最直接的指标是:您的组织是否遭到入侵?如果答案是肯定的,那么显然还有工作要做。如果答案是否定的,那么您的状况就更好了——但情况比这更复杂。 即使您没有遭到入侵&#…

SonarWiz 8.0.1注册机 全模块版本侧扫、浅剖、测深软件功能等

SonarWiz 8.0.1是功能强大的测绘软件!提供强大的数据采集、后处理等功能操作,您将获得灵活完整的报告,并提供丰富的选项以便进行定制和更灵活的进行操作,软件功能齐全,包括完整的海底测绘解决方案,方便实时…

chapter15-泛型——(自定义泛型)——day20

目录 561-自定义泛型类 562-自定义泛型接口 563-自定义泛型方法 泛型就是可以接受一种数据类型的类型 564-泛型方法练习 565-泛型继承和通配 566-JUnit使用 568-泛型家庭作业 561-自定义泛型类 562-自定义泛型接口 563-自定义泛型方法 泛型就是可以接受一种数据类型的类型…