IO复用-epoll基础

news2024/9/24 1:20:45

文章目录

  • IO复用
  • 认识epoll
  • epoll原理
    • 重要结构体
  • epoll的ET、LT
  • epoll高效的原因
  • epoll需要解决的问题
  • 对于使用epoll的建议

IO复用

IO=等待+拷贝

IO复用是一种通过减少等待时间,来提高IO效率的方式。 其原理是通过同时管理多个IO接口(文件描述符),将等待的时间重叠,这样使得在相等的时间内,出现满足条件的文件描述符的概率增大。

在这里插入图片描述

左图是一般的阻塞/非阻塞IO,右图是IO复用

很明显看出,IO复用的单位时间内文件描述符准备好的概率更大,这就代表其单位时间内等待准备的时间更短,所以IO更高效

认识epoll

epoll是一种通过IO复用提高IO效率的方式,是基于select、poll的提升版本,其克服了select、poll的主要缺陷

1234
select同时等待的fd有上限输入输出参数混合,每次都要重新设定内核和用户之间的数据拷贝多底层监视多个fd时,OS会在内部进行遍历检测
pollnullnull内核和用户之间的数据拷贝多底层监视多个fd时,OS会在内部进行遍历检测
epollnullnullnullnull

下图是《Linux高性能服务器编程》中对三种多路转接的方式的比较

在这里插入图片描述

epoll原理

谈论epoll的原理离不开3点:

  1. 红黑树
  2. 就绪队列(双向链表)
  3. 回调机制

在这里插入图片描述

  1. 创建实例

    • 调用epoll_create()创建一个eventpoll实例,其内部存储了红黑树根节点双链表等重要结构。
  2. 事件注册

    • 当使用epoll_ctl函数向epoll实例中添加需要监视的文件描述符时,可以指定对该文件描述符感兴趣的事件类型(如可读、可写等)。

    • 在这个过程中,epoll会在内核中创建一个epitem结构体来表示这个监视关系,并将该结构体插入到红黑树中,以便快速查找和更新。

  3. 事件就绪检测

    • 当文件描述符上的事件发生时(如数据到达socket缓冲区),内核会检测到这一变化,并触发相应的处理逻辑(回调机制)。
    • epoll使用回调函数来处理这些就绪事件。这些回调函数是内核在检测到事件时自动调用的,而不是由用户显式调用的。
  4. 事件通知

    • 当回调函数被调用时,它会将就绪的文件描述符从红黑树中取出,并添加到就绪链表中(实际上并非取出,而是更改其内部的双链表指针,这是Linux独特的双链表结构,使用强转和位偏移可以找到对象任意位置)。
    • 用户进程通过调用epoll_wait函数来等待和接收就绪事件。epoll_wait函数会阻塞用户进程,直到有就绪事件发生或超时(可以设置为非阻塞)。
    • 当epoll_wait返回时,它会将就绪链表中的事件复制到用户提供的数组中,并返回就绪事件的数量

重要结构体

// epoll实例,调用epoll_create创建的结构体
struct eventpoll {
	spinlock_t lock;
	struct mutex mtx;
	wait_queue_head_t wq;
	wait_queue_head_t poll_wait;
	struct list_head rdllist;
	struct rb_root rbr;
	struct epitem *ovflist;
	struct user_struct *user;
};
// 红黑树节点
struct epitem {
	struct rb_node rbn;
	struct list_head rdllink;
	struct epitem *next;
	struct epoll_filefd ffd;
	int nwait;
	struct list_head pwqlist;
	struct eventpoll *ep;
	struct list_head fllink;
	struct epoll_event event;
};
struct rb_node
{
	unsigned long  rb_parent_color;
	struct rb_node *rb_right;
	struct rb_node *rb_left;
} __attribute__((aligned(sizeof(long))));
struct list_head {
	struct list_head *next, *prev;
};

上图是Linux2.6源码中调用epoll_ctl创建新的文件描述符时创建的节点结构体

  • struct rb_node rbn:存储该节点的颜色、左右孩子、以及父亲节点(这里rb_node结构体中虽然没有用rb_node*来存储父节点,但是通过rb_parent_color可以推断出,Linux为了节省存储开销,将父节点的地址和颜色结合在了一起(联合字段))
  • struct epoll_event event:存储该节点对应的事件
  • struct list_head rdllink:指向双链表
  • struct eventpoll *ep:指向其所属的eventpoll对象
  • struct epoll_filefd ffd:事件句柄信息、文件描述符

红黑树的作用

利用红黑树的平衡原理,使得插入、删除、查找变得高效。当一个文件描述符状态发生变化时(硬件能够检测到),可以高效的遍历到该文件描述符所对应的节点,进而对其属性进行修改。

就绪队列

就绪队列采用双链表,将所有准备就绪的文件描述符链入该队列中,确保了用户读取使用的时候,无需进行任何遍历,直接按顺序recv就行。

回调机制

当你向计算机内输入数据的时候(无论键盘还是网络),计算机的中断机制都会将该数据读取到,然后告知上层。在epoll中,可以提前设置回调函数,当网络中来数据时,OS会发现,并调用该回调函数,然后就可以修改红黑树中的节点状态并将该节点链入就绪队列中。

epoll的ET、LT

LT(Level Trigger 水平触发-epoll默认方式) 、ET(Edge Trigger 边沿触发)

LT:当文件描述符准备好后,只要该文件描述符没有进行处理,那么epoll_wait()就会一直响应该文件描述符,告诉用户你要进行处理了,直到你读取了文件描述符内的数据

ET:只有当文件描述符首次准备好、以及后续有新的内容到达时,epoll_wait()才会通知用户读取数据。一旦你没有进行处理,同时后续也没有新的数据到达,那么该文件描述符内的数据也就读不到了。

注意!!ET模式下,所有的文件描述符都需要是非阻塞状态

  1. 避免阻塞在epoll_wait上
  2. 确保数据读取的完整性

由于上述原因,所以处于ET模式下的epoll要求:程序员必须马上把我文件描述符内的数据读完,不然你可能就再也读不到了。当然处理LT模式下的也可以这么做,但是由于LT不是硬性要求赶快读完,所以就有容错空间。

epoll高效的原因

这里只对epoll相较于select、poll的高效作原因分析

  1. select、poll的fd都是用户态设置的,所以会存在多次的用户内核态切换。而epoll的fd是常驻内核的,减少了状态的切换和拷贝。
  2. select、poll只支持LT模式, 而epoll还支持ET模式。在ET模式下,epoll会尽快接收完报文,然后较快的返回TCP应答报文中的窗口字段值,这样发送方就可以更快、更多的发送数据。
  3. select、poll在检测文件描述符状态的时候,都需要遍历fd。而epoll不需要,大大减少了遍历带来的开销。

epoll需要解决的问题

如何保证数据读取的完整性?

这种问题普遍存在于多路转接中:

当某个文件描述符已经准备好了,调用recv读取数据的时候,发现这个文件描述符内的内容并不完全,此时如果再去调用别的文件描述符,那么原先缓冲区的内容就会被覆盖,原先读到的内容也没了

解决方案:Reactor模式

原理:为每一个文件描述符设置一个缓冲区,在上层通过协议来确保读取到的数据是完整的

对于使用epoll的建议

epoll这么好,是不是所有的服务都要使用epoll呢?不是!

  1. epoll虽然好,但是其体量较大,对于一些嵌入式设备,开销和收益(带来的性能提升)不成正比
  2. epoll出来的较晚,并非所有的系统都兼容epoll,而select出现较早,兼容性较好

不管怎样,epoll的性能优势还是很大的,在具体情况下还是需要具体分析来判断使用epoll还是select

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

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

相关文章

VS2022搭建Linux开发环境

一、VS2022按钮Linux开发组件 双击启动后 选择Linux开发组件 点击修改,开始按钮Linux组件 二、创建新项目 三、远程连接Linux系统 选择工具,点击选项 选择跨平台中的连接管理器,点击添加 配置信息,输入你需要连接到的Linux…

《论面向服务架构设计及其应用》写作框架,软考高级系统架构设计师

论文真题 面向服务架构(Service-Oriented Architecture, SOA) 是一种应用框架,将日常的业务应用划分为单独的业务功能服务和流程,通过采用良好定义的接口和标准协议将这些服务关联起来。通过实施基于SOA的系统架构,用户可以构建、部署和整合服务,无需依赖应用程序及其运…

PyCharm的安装步骤

如何在本机上下载和安装PyCharm,请看以下讲解; 目录 一、下载 二、安装 第 1 步: 第 2 步: 第 3 步: 第 4 步: 第 5 步: 三、配置 第 1 步: 第 2 步: 第 3 步…

基于SpringBoot+Vue+MySQL的实训管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 在当今信息化高速发展的时代,实训管理系统的建设对于提升教育机构的教学效率、优化资源配置、增强师生互动具有重要意义。本系统基于SpringBoot框架构建后端服务,利用其高效、简洁的特点,快速…

U盘文件及文件夹带锁修复

磁盘管理修复工具Disks磁盘管理–针对U盘文件及文件夹带锁修复 本文章只针对统信系统 文章目录 功能概述一、安装工具二、数据备份三、检查文件系统1. 通过启动栏中的“磁盘”或者桌面的“磁盘”启动文件来启动应用:2. 选择U盘设备3. 点击“检查文件系统”按钮(如果无此按钮…

【计算机毕设-大数据方向】基于大数据的健康美食推荐系统设计与实现

💗博主介绍:✌全平台粉丝5W,高级大厂开发程序员😃,博客之星、掘金/知乎/华为云/阿里云等平台优质作者。 【源码获取】关注并且私信我 【联系方式】👇👇👇最下边👇👇&…

存储卡照片丢失:高效恢复策略与实战指南

一、引言:存储卡照片丢失的烦恼 在数字化时代,存储卡作为便携的数据存储介质,广泛应用于数码相机、智能手机、无人机等各类电子设备中,成为我们记录生活点滴、捕捉美好瞬间的重要工具。然而,随着使用频率的增加&#…

理解BSV的最新节点软件Teranode

​​发表时间:2024年8月27日 随着Teranode的引入,BSV区块链生态系统即将迎来重大变革,这一备受期待的节点升级将彻底改变网络的效率和可扩展性。随着BSV网络实现了百万级TPS的突破性里程碑,对开发者和技术爱好者来说,理…

网络安全宣传周 | 安全防护小贴士,远离网络威胁!

网络安全日益重要 网络环境复杂性增加 威胁种类多样,影响广泛 网络安全防护知识小贴士 简单有效,便于实践 提升自我保护能力,远离网络威胁 一起守护网络安全! 1、安装并配置防火墙 防火墙是网络安全的第一道防线,监控并控制…

知乎广告投放,知乎推广开户费用介绍!

知乎凭借其庞大的用户群体和深厚的社区文化,成为了品牌寻求突破的新阵地。云衔科技,作为业界领先的数字营销解决方案提供商,致力于帮助企业轻松驾驭知乎营销,实现品牌价值的最大化。 一、知乎广告投放的独特优势 知乎用户普遍具…

详解ImageNet著名子数据集ILSVRC2012基于Python的下载、解析及可视化

目录 ImageNet简介WordNet简介ILSVRC2012简介ILSVRC2012下载ILSVRC2012评价指标ILSVRC2012开发套件DevelopmentKit获取Synset的标签描述Python读取及可视化PyTorch读取API基于PyTorch的API接口加载及可视化自定义读取接可视化Python脚本 参考文献 摘要:本篇文档详细…

电子邮件加密软件哪个好用?分享这五款加密工具,防范邮件泄密!2024企业必备!

"密语藏锋刃,安全重于山。" 在数字洪流中,电子邮件是企业沟通的重要桥梁,其安全性不容忽视。 因此,选择一款高效可靠的电子邮件加密软件,是企业保障信息安全的关键。 本文将为您推荐五款2024年企业必备的电…

Kotlin协程之协程的结构化详解

前言 上一篇文章介绍了协程概念的具像化,算是对协程的概念进一步进行加深,本篇文章来看一下协程结构化的概念。 结构化 是协程中一个非常重要且非常实用的一个特性,它可以帮助我们更好的管理协程的生命周期。 如果说 挂起函数 解决了并发任…

今日leetCode 19.删除链表的倒数第N个结点

19. 删除链表的倒数第 N 个结点 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入:head [1], n 1 输出&…

每日OJ_牛客_简单错误记录(文件模拟)

目录 简单错误记录(文件模拟) 解析代码 简单错误记录(文件模拟) 简单错误记录__牛客网 开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。 处理: 1、 记录最多8条错误记录&a…

说说精益生产管理咨询公司排名的那些事

面对市场上琳琅满目的精益生产管理咨询公司,企业如何做出明智选择,避免陷入“坑”中,成为了一个值得探讨的话题。本文将从多个维度出发,为大家揭晓精益生产管理咨询公司排名的那些事,助您找到最适合的合作伙伴。 一、认…

日本IT工作内容---一篇梗概

日本IT工作现场是一个充满活力、技术导向且多元化的工作环境。以下是对日本IT工作内容的详细概述: 1. 软件开发(Software Engineering, SE) 主要任务:编写、测试和维护软件,以满足客户需求。这包括使用多种编程语言和…

Tuxera NTFS for Mac破解版下载 Tuxera NTFS for Mac2023激活码 mac电脑ntfs磁盘软件

Tuxera NTFS for Mac是一款优秀的Mac系统完全读写软件,提供Fat32、NTFS、Exfat、mac os扩展格式的转换,稳定性好,传输速度极快。Tuxera NTFS for Mac功能丰富,能修复NTFS卷、创建NTFS磁盘映像、创建NTFS分区等等。同时软件支持所有…

英伟达25年收购案例盘点:从3dfx到Mellanox,如何通过技术并购建立护城河

英伟达(NVIDIA)作为全球领先的GPU制造商,近年来通过一系列高效的收购活动,不断扩大其技术布局,并稳固其在AI、数据中心等核心领域的行业领先地位。在过去25年中,英伟达通过软硬件全栈式收购策略&#xff0c…

Qt绘制动态仪表(模仿汽车仪表指针、故障灯)

背景: 项目需要,可能需要做一些仪表显示。此篇除了介绍实现方法,还要说明心路历程。对我而言,重要的是心理,而不是技术。写下来也是自勉。 本人起初心里是比较抵触的,从业20多年了,深知所谓界…