Linux:epoll 工作模式

news2024/11/25 18:38:46

        边缘触发(Edge Triggered,简称ET)和 水平触发(Level Triggered,简称LT)是epoll两种不同的工作模式,它们在处理I/O事件时有不同的行为。

1:水平触发(LT)模式

        1:只要条件满足,就会持续触发事件。例如,如果读取缓冲区有数据,epoll_wait 会持续返回EPOLLIN事件,直到缓冲区为空 。

        2:编程模型相对简单,因为应用程序不需要担心是否读取或写入了所有数据 。

        3:可能会导致性能问题,因为即使数据已经被读取,只要缓冲区非空,就会持续触发事件。

2:边缘触发(ET)模式

        1:仅在状态发生变化时触发事件。例如,如果数据从未可读变为可读,epoll_wait 会触发一次EPOLLIN事件。

        2:如果数据继续可读,除非有新数据到达,否则不会再次触发EPOLLIN 。

        3:适用于高并发场景,因为它可以减少不必要的事件通知,提高效率 。

        4:需要应用程序在每次通知后处理所有可用数据,否则可能会导致事件丢失 。

        5:必须使用非阻塞I/O,因为如果读取或写入操作未能一次性处理完所有数据,内核不会再次通知应用程序,直到有新数据到达。

3:举个例子

        1. 我们已经把一个 tcp socket 添加到 epoll 描述符。

        2. 这个时候 socket 的另一端被写入了 2KB 的数据。

        3. 调用 epoll_wait, 并且它会返回. 说明它已经准备好读取操作。

        4. 然后调用 read, 只读取了 1KB 的数据。

        5. 继续调用 epoll_wait......。

水平触发 Level Triggered 工作模式

        epoll 默认状态下就是 LT 工作模式

        1:当 epoll 检测到 socket 上事件就绪的时候, 可以不立刻进行处理. 或者只处理一部分。

        2:如上面的例子, 由于只读了 1K 数据, 缓冲区中还剩 1K 数据, 在第二次调用epoll_wait 时, epoll_wait 仍然会立刻返回并通知 socket 读事件就绪。

        3:直到缓冲区上所有的数据都被处理完, epoll_wait 才不会立刻返回。

        4:支持阻塞读写和非阻塞读写。

边缘触发 Edge Triggered 工作模式

   将 socket 添加到 epoll 描述符的时候使用了 EPOLLET 标志, epoll 进入 ET 工作模式。

4:ET vs LT 

        1:LT 是 epoll 的默认行为。

        2:使用 ET 能够减少 epoll 触发的次数. 但是代价就是强逼着程序员一次响应就绪过程中就把所有的数据都处理完。

        3:相当于一个文件描述符就绪之后, 不会反复被提示就绪, 看起来就比 LT 更高效一些. 但是在 LT 情况下如果也能做到每次就绪的文件描述符都立刻处理, 不让这个就绪被重复提示的话, 其实性能也是一样的。

        4:另一方面, ET 的代码复杂程度更高了。

5:理解 ET 模式和非阻塞fd

        使用 ET 模式的 epoll, 需要将文件描述设置为非阻塞. 这个不是接口上的要求, 而是 "工程实践" 上的要求。

        假设这样的场景: 服务器接收到一个 10k 的请求, 会向客户端返回一个应答数据.。如果客户端收不到应答, 不会发送第二个 10k 请求。

        如果服务端写的代码是阻塞式的 read, 并且一次只 read 1k 数据的话(read 不能保证一次就把所有的数据都读出来, 参考 man 手册的说明, 可能被信号打断), 剩下的 9k 数据就会待在缓冲区中直到下一次客户端再给服务器写数据。epoll_wait 才能返回。

问题

        1:服务器只读到 1k 个数据, 要 10k 读完才会给客户端返回响应数据。

        2:客户端要读到服务器的响应, 才会发送下一个请求。

        3:客户端发送了下一个请求, epoll_wait 才会返回, 才能去读缓冲区中剩余的数据。


        所以, 为了解决上述问题(阻塞 read 不一定能一下把完整的请求读完), 于是就可以使用非阻塞轮训的方式来读缓冲区, 保证一定能把完整的请求都读出来。

        而如果是 LT 没这个问题。只要缓冲区中的数据没读完, 就能够让 epoll_wait 返回文件描述符读就绪。

        这个例子在下一篇博客的Reactor中会有体现!

 6:epoll 的使用场景

        1:epoll 的高性能, 是有一定的特定场景的. 如果场景选择的不适宜, epoll 的性能可能适得其反。

        2:对于多连接, 且多连接中只有一部分连接比较活跃时, 比较适合使用 epoll。

        例如, 典型的一个需要处理上万个客户端的服务器, 例如各种互联网 APP 的入口服务器,这样的服务器就很适合 epoll。

        3:如果只是系统内部, 服务器和服务器之间进行通信, 只有少数的几个连接, 这种情况下用epoll 就并不合适。具体要根据需求和场景特点来决定使用哪种 IO 模型。

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

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

相关文章

4G MQTT网关在物联网应用中的优势-天拓四方

随着物联网(IoT)技术的飞速发展,各种设备和系统之间的互联互通变得日益重要。MQTT(Message Queuing Telemetry Transport)作为一种轻量级的发布/订阅消息传输协议,因其高效、可靠、简单的特性,在…

从 Greenplum 到 Databend,数据仓库的开源新选择

Greenplum 是知名开源数据仓库项目,曾是大数据分析领域的明星产品,在全球范围内尤其是在国内市场上有着重要的地位。今年 6 月, Greenplum 的 GitHub 仓库突然被改为归档模式,访问权限也修改为只读,用户将失去对源代码…

0910作业+思维导图

一、作业(实现一个闹钟) 1、代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//调整标签页大小this->resize(800,400);//lab:显示系统时间…

VS2010程序打包为可执行安装程序

说明 记录一下下次再用时省点事儿,直接进入正题吧 步骤 1. 首先把该装好的软件装好,然后创建一个 安装项目 , 如下图 2. 右键 应用程序文件夹 的 添加 , 如下图可添加要打包的文件(和文件夹,文件夹需要添加文件夹),一般是已经编…

SpringBoot 整合WebSocket 简单实战案例

先是pom.xml添加依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>PS&#xff1a;application.properties不需要添加任何配置 &#xff0c…

元学习之模型诊断元学习(model-agnosticmeta-learning,MAML)

模型诊断元学习&#xff08;model-agnosticmeta-learning&#xff0c;MAML&#xff09;&#xff0c; 另一个是Reptile。这两个算法都是在 2017 年提出来的&#xff0c;而且都是基于梯度下降法进行优化 的。那我们最常用的学习算法是梯度下降&#xff0c;在梯度下降中&#xff0…

基于VUE的在线音乐播放管理系统

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于VUE的在线音乐播放管理系统3是前后端分离项目&#xff0c;拥有两种角色 管理员&#xff1a;用户管理、收藏管理、歌手管理、歌曲管理、歌单管理、评论管理等 用户&#xff1a;登录注…

解锁生活密码,AI答案之书解决复杂难题

本文由 ChatMoney团队出品 介绍说明 “答案之书智能体”是您贴心的智慧伙伴&#xff0c;随时准备为您解答生活中的种种困惑。无论您在工作中遭遇瓶颈&#xff0c;还是在情感世界里迷失方向&#xff0c;亦或是对个人成长感到迷茫&#xff0c;它都能倾听您的心声&#xff0c;并给…

Vscode python无法转到函数定义

今天上午换了电脑&#xff0c;使用Vscode发现找不到对应的函数定义了。 使用了网上的全部教程。一点用没有。重启电脑&#xff0c;重启Vscode也没有作用。最后通过重装vscode&#xff0c;解决问题。&#xff08;也不知道Vscode什么毛病&#xff09; 重点语句&#xff1a; 去官网…

四款免费视频剪辑工具使用感受与优劣势总结

在如今这个视频内容如火如荼的时代&#xff0c;如何快速高效地完成视频剪辑成为许多人关心的问题&#xff1b;今天&#xff0c;我们就来轻松愉快地聊一聊本人常用的四款免费的视频剪辑工具&#xff1b;这四款工具各有千秋&#xff0c;让我们一起来看看它们的使用感受和优劣势吧…

Java代码审计篇 | ofcms系统审计思路讲解 - 篇3 | 文件上传漏洞审计

文章目录 0. 前言1. 文件上传代码审计【有1处】1.1 可疑点1【无漏洞】1.1.1 直接搜索upload关键字1.1.2 选择第一个&#xff0c;点进去分析一下1.1.3 分析this.getFile()方法1.1.4 分析new MultipartRequest(request, uploadPath)1.1.5 分析isSafeFile()方法1.1.6 分析request.…

连锁管理系统如何兼批发和零售 连锁收银系统如何配合做好财务

在现代零售环境中&#xff0c;信息化管理系统对连锁企业的运营至关重要。连锁管理系统通过先进的信息技术解决了批发和零售中的众多挑战&#xff0c;同时为财务管理提供了有力支持。商淘云分享如何提高连锁企业的运营效率和财务管理水平&#xff0c;大家点赞收藏。 1、统筹批发…

算法知识点————背包问题

万能头文件#include<bits/stdc.h> 01 背包 定义&#xff1a; 物品只能用1次。01对应选还是不选第i个物品 .N个物品、V容量的最大价值。 思路&#xff1a; &#xff08;1&#xff09;f[ i ] [j] 表示前i个物品容量j的最大价值。 &#xff08;2&#xff09;当前背包容量…

在WPF中使用矢量图标

使用SVG/Path WPF支持绘图&#xff0c;在WPF中定义了一些基本图形&#xff0c;如Line、Rectangle、Ellipse、Path等 其中Path支持使用路径来进行绘图&#xff0c;所以大部分的图标可以通过Path来进行绘制。 因为本文主要是介绍矢量图标&#xff0c;所以不对绘图进行详细介绍…

opencv之图像梯度

图像梯度 图像梯度计算的是图像变化的速度。对于图像的边缘部分&#xff0c;其灰度值变化较大&#xff0c;梯度值也较大&#xff1b;相反&#xff0c;对于图像中比较平滑的部分&#xff0c;其灰度值变化较小&#xff0c;相应的梯度值也较小。一般情况下&#xff0c;图像梯度计…

重命名工具 | Advanced Renamer v4.03 绿色版

Advanced Renamer 是一款专为 Windows 平台设计的强大文件批量重命名工具。它提供了多种重命名方法&#xff0c;包括指定新文件名、改变大小写、移动字符、移除字符串、重编文件名序号、替换字符、添加内容、使用列表或列表文件替换文件名、交换字符位置、去除头部或尾部多余空…

百度Apollo打通与ROS的通信,扩展自动驾驶系统生态

技术文档&#xff5c;打通与ROS的通信&#xff0c;扩展自动驾驶系统生态_Apollo开发者社区 (baidu.com)

-顺序表-

一、小概述 二、代码解析 下面利用顺序表实现增删改查的功能&#xff1a; //动态顺序表 #include <iostream> using namespace std; typedef int SLDataType;//适用于多种类型 typedef struct SeqList {SLDataType* a;//数组int size;//表示数组中存储了多少个元素int …

【车载开发系列】ParaSoft单元测试环境配置(一)

【车载开发系列】ParaSoft单元测试环境配置(一) ParaSoft单元测试环境配置 【车载开发系列】ParaSoft单元测试环境配置(一)一. 什么是bdf文件二. bdf文件构成三. 新规做成bdf文件四. 导入bdf文件创建测试工程五. 获取编译器信息六. 新增自定义编译器Step1:打开向导Step2:…

Xcode 16 RC (16A242) 发布下载,正式版下周公布

Xcode 16 RC (16A242) - Apple 平台 IDE IDE for iOS/iPadOS/macOS/watchOS/tvOS/visonOS 请访问原文链接&#xff1a;https://sysin.org/blog/apple-xcode-16/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org Xcode 16 的新功…