【Linux】从零开始使用多路转接IO --- 理解EPOLL的 LT水平触发模式 与 ET边缘触发模式

在这里插入图片描述

当你偶尔发现语言变得无力时,
不妨安静下来,
让沉默替你发声。
--- 里则林 ---

从零开始认识多路转接

  • 1 EPOLL优缺点
  • 2 EPOLL工作模式

1 EPOLL优缺点

poll 的优点(和 select 的缺点对应)

  1. 接口使用方便:虽然拆分成了三个函数,但是逻辑清晰,使用起来更方便高效。不需要每次循环都设置关注的文件描述符,并且做到了输入输出参数分离开!
  2. 数据拷贝轻量:只在合适的时候调用 EPOLL_CTL_ADD 将文件描述符结构拷贝到内核中,这个操作并不频繁(而 select/poll 都是每次循环都要进行拷贝)。
  3. 事件回调机制:避免使用遍历, 而是使用回调函数的方式,将就绪的文件描述符结构加入到就绪队列中。epoll_wait 返回直接访问就绪队列就知道哪些文件描述符就绪。这个操作时间复杂度 O(1). 即使文件描述符数目很多,效率也不会受到影响。
  4. 没有数量限制:理论上,文件描述符数目是无上限。epoll的接口支持无上限的文件描述符!

网上说:epoll 中使用了内存映射机制

  • 内存映射机制: 内核直接将就绪队列通过 mmap 的方式映射到用户态。 避免了拷贝内存这样的额外性能开销。

这种说法是不准确的。我们定义的 struct epoll_event 是我们在用户空间中分配好的内存。势必还是需要将内核的数据拷贝到这个用户空间的内存中的。

可以这么说epoll几乎没有缺点!

2 EPOLL工作模式

select、poll、epoll都存在一个现象:当有事件就绪时,用户不处理就会一直通知用户处理,循环打印日志信息。

EPOLL的工作模式有两种:

  1. LT水平触发
  2. ET边缘触发

上面现象是LT模式下的产物,那么怎么理解LT与ET呢?我们通过快递小哥的例子进行讲解:

有两名快递员张三李四,他们一个温和老实,一个严肃霸道。
小明前几天买了5个包裹,今天一起送到了快递站。张三李四分别分到了小明的3个包裹和2个包裹。
张三首先到达了小王所在的小区,他给该小区所以的收件人都打了一遍电话:“请你下来拿快递”。小明这时正在和舍友打无畏契约,拿不了快递。过了一会张三再次给小明打电话让他下来拿快递,小明下去取了一个就立马回去了。张三一看,还有两个包裹啊,于是又给小王打电话!这时李四过来了,把两个快递交给了张三。张三就在这里一直打电话
第二天,又有小明的5个包裹,这次李四来到小区门口,开始打电话:我只给你打一次电话,你有快递到了,不拿我就走人。小明一听,这快递小哥这么硬气,哎我就不拿,那你怎么办。于是小明就没有去拿,结果李四真的走了。一会碰到了张三,张三把小明的包裹给了李四,于是李四又来到小区门口,再一次强硬的打电话。小明决定去拿了,快递不拿他是真走啊!

这里我们可以总结出来:

  1. 张三:只有底层有快递,就一直打电话给小王。
  2. 李四:只有包裹变化的时候,我才来通知你拿快递。

在这个例子中,快递就是数据,张三对应LT水平触发模式,李四对应ET边缘触发模式。一般情况下是LT水平触发模式。

这两种模式哪一个更加高效呢?ET模式更加高效!毕竟李四比张三打的电话少的多得多!

LT水平触发是默认的,那么一个如何设置成ET边缘触发模式呢?

  • 通过EPOLLET 标志位: 将 EPOLL 设为边缘触发(Edge Triggered)模式, 这是相对于水平触发(Level Triggered)来说的
  1. 水平触发 Level Triggered 工作模式
    • epoll 默认状态下就是 LT 工作模式。
    • 当 epoll 检测到 socket 上事件就绪的时候, 可以不立刻进行处理. 或者只处理一部分。
    • 如上面的例子, 由于只读了 1K 数据,缓冲区中还剩 1K 数据,在第二次调用epoll_wait 时, epoll_wait 仍然会立刻返回并通知 socket 读事件就绪。
    • 直到缓冲区上所有的数据都被处理完, epoll_wait 才不会立刻返回。
    • 支持阻塞读写和非阻塞读写。
  2. 边缘触发 Edge Triggered 工作模式
    • 如果将 socket 添加到 epoll 描述符的时候使用了 EPOLLET 标志,epoll 进入 ET 工作模式。
    • 当 epoll 检测到 socket 上事件就绪时,必须立刻处理。
    • 如上面的例子,虽然只读了 1K 的数据,缓冲区还剩 1K 的数据,在第二次调用epoll_wait 的时候,epoll_wait 不会再返回了。
    • 也就是说, ET 模式下,文件描述符上的事件就绪后,只有一次处理机会。
    • ET 的性能比 LT 性能更高( epoll_wait 返回的次数少了很多). Nginx 默认采用ET 模式使用 epoll。
    • 只支持非阻塞的读写

假如服务端使用ET模式,这时服务端需要的数据是10K,客户端将这10K数据发过来,服务端第一次只读取了1K的数据。由于是ET模式,在客户端发送新的数据之前,服务端一直不会进行读取!所以ET模式下,必须一次性将数据读完,就要进行循环读取直到读取不到!这样也就必须使用非阻塞的读取了(才能支持循环读取)!LT模式没有这种问题。

  • ET模式的这种读取方式也就决定了TCP应答中TCP服务端的窗口更大,客户端下一次可以发送更多的数据!增加IO效率!

那么LT设置成非阻塞呢?那么是不是和ET模式一样了呢?所以一般不能说ET模式一定比LT模式的效率更高。可是,ET强制程序员必须使用非阻塞进行读取!LT不会强制程序员使用非阻塞读取!所以可以认为ET模式更加高效

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

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

相关文章

kafka+zookeeper的搭建

kafka从2.8版本开始,就可以不用配置zookeeper了,但是也可以继续配置。我目前使用的kafka版本是kafka_2.12-3.0.0.tgz,其中前面的2.12表示是使用该版本的scala语言进行编写的,而后面的3.00才是kafka当前的版本。 通过百度网盘分享…

基础数据结构——队列(链表实现)

队列的性质 先进先出(FIFO - First In First Out):最先加入队列的元素最先被移出后进后出(后来的元素排在队尾)只允许在队尾插入元素,在队首删除元素具有先来先服务的特点 链表实现队列 和之前创建链表相…

git原理与上传

言: git是一个软件,gitee/github是一个网站,这里有什么联系吗?我们身为一个程序员不可能不知道github,但是毕竟这是外国的网站,我们不翻墙的情况下,是无法访问的(或者就是太慢了,或…

亚信安全新一代WAF:抵御勒索攻击的坚固防线

近年来,勒索攻击已成为黑客的主要攻击手段。新型勒索攻击事件层出不穷,勒索攻击形势愈发严峻,已经对全球制造、金融、能源、医疗、政府组织等关键领域造成严重危害。如今,勒索攻击手段日趋成熟、攻击目标愈发明确,模式…

Selenium 高频面试题及答案

在求职面试中,Selenium的相关知识已经成为自动化测试工程师们无法避开的热门考点。想要脱颖而出,提前了解Selenium的高频面试题及其答案显得尤为重要。这篇文章将带你快速掌握Selenium的核心考点和解答,帮助你在面试中应对自如! …

7.qsqlquerymodel 与 qtableview使用

目录 qtableview 委托QStyledItemDelegateQAbstractItemDelegateCheckBoxItemDelegate使用qtableview控制列宽,行高,隐藏拖拽行列 qtableview 委托 //设置单元格委托 void setItemDelegate(QAbstractItemDelegate *delegate); QAbstractItemDelegate *it…

微服务实战系列之玩转Docker(十八)

导览 前言Q:如何保障容器云环境下etcd集群的数据安全一、安全机制身份认证必学必看1. 启动参数2. 授权命令3. 开启认证 二、应用实践1. 访问容器2. 查看认证是否开启3. 查看是否已创建用户4. 创建用户5. 开启认证6. 验证是否开启7. 验证数据 结语系列回顾 前言 etc…

如何基于pdf2image实现pdf批量转换为图片

最近为了将pdf报告解析成为文本和图片,需要将大量多页的pdf文件拆分下单独的一页一页的图像,以便后续进行OCR和图像处理,因此就需要实现将pdf2image,本文主要结合开源的pdf2image和poppler,实现了pdf转换为png格式图片…

Python小游戏23——捕鱼达人

首先,你需要安装Pygame库。如果你还没有安装,可以使用以下命令进行安装: 【bash】 pip install pygame 运行效果展示 接下来是示例代码: 【python】 import pygame import random # 初始化Pygame pygame.init() # 屏幕尺寸 SCREEN…

如何调整pdf的页面尺寸

用福昕阅读器打开pdf,进入打印页面,选择“属性”,在弹出的页面选择“高级” 选择你想调成的纸张尺寸,然后打印,打印出来的pdf就是调整尺寸后的pdf

《重学Java设计模式》之 原型模式

原型模式主要解决的问题就是创建重复对象,而这部分对象内容本身比较复杂,生成过程可能从库或者RPC接口中获取数据的耗时较长,因此采用克隆的方式节省时间。 案例:上机考试抽题,要求打乱题目、答案数据 工厂结构 选择题…

八,附录 A:其他发现流程示例

八,附录 A:其他发现流程示例 八,附录 A:其他发现流程示例8.1 修改后的发现流程8.2 优化后的发现流程8.3 高级发现流程 八,附录 A:其他发现流程示例 以下部分提供了关于修改后的、优化后的和高级的发现流程…

实战:看懂并分析执行计划——Clustered Index Scan

这是 Clustered Index Scan 的执行计划详情,以下是对每一行的含义及其对查询性能的可能影响的解释。 Clustered Index Scan (Clustered) 解释 Physical Operation: Clustered Index Scan (Clustered) 物理操作,表明数据库引擎在整个聚集索引上进行扫描。Clustered Index Sc…

Jenkins声明式Pipeline流水线语法示例

系列文章目录 docker搭建Jenkins2.346.3版本及常用工具集成配置(ldap、maven、ansible、npm等) docker安装低版本的jenkins-2.346.3,在线安装对应版本插件失败的解决方法 文章目录 系列文章目录jenkins流水线基础1、pipeline1.1、什么是pipeline?1.2、为什么使用pi…

OceanBase中,如何解读 obdiag 收集的火焰图 【DBA早下班系列】

1. 前言 在之前的文章 遇到性能问题,如何给OceanBase“拍CT“(火焰图与扁鹊图)中,分享了obdiag 快速收集火焰图的方法,那么,紧接着的问题便是:收集到火焰图和扁鹊图之后,该如何解读…

网站架构知识之Ansible模块(day021)

1.Ansible模块 作用:通过ansible模块实现批量管理 2.command模块与shell模块 command模块是ansible默认的模块,适用于执行简单的命令,不支持特殊符号 案列01,批量获取主机名 ansible all -m command -a hostname all表示对主机清单所有组…

短期电力负荷

🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年11月8日9点40分 论文发表 来自《IEEE Transactions on Smart Grid》2022年7月的13卷第4期,《IEEE Transactions on …

linux tigerVNC使用

简介 TigerVNC是VNC的一种高性能、平台中立实现(虚拟网络计算),一种客户端/服务器应用程序,允许用户启动远程图形应用程序并与之交互机器。TigerVNC提供运行所需的性能级别3D和视频应用程序,并尝试保持普通外观并尽可…

基于redis实现API接口访问次数限制

一,概述 日常开发中会有一个常见的需求,需要限制接口在单位时间内的访问次数,比如说某个免费的接口限制单个IP一分钟内只能访问5次。该怎么实现呢,通常大家都会想到用redis,确实通过redis可以实现这个功能&#xff0c…

uni-app小程序开发(1)

下载软件就不多赘述了。 直接上代码,写过wep端的vue看这个小程序就简单很多,不需要搞那么多麻烦事情,直接编译器就创建好了基础模版。 1、项目结构 暂时知道这么多,后续再补充 2、页面创建、导航栏设置、基础属性设置 在pages中…