Linux开发讲课50--- epoll、poll、select的原理和区别

一、什么是epoll?

epoll是一种I/O事件通知机制,是linux 内核实现IO多路复用的一个实现。IO多路复用是指,在一个操作里同时监听多个输入输出源,在其中一个或多个输入输出源可用的时候返回,然后对其的进行读写操作。 epoll有两种工作方式, LT-水平触发 和ET-边缘触发(默认工作方式),主要区别是: LT,内核通知你fd是否就绪,如果没有处理,则会持续通知。而ET,内核只通知一次。 什么是I/O? 输入输出(input/output)的对象可以是文件(file), 网络(socket),进程之间的管道(pipe)。在linux系统中,都用文件描述符(fd)来表示。 什么是事件? IO中涉及到的行为,建立连接、读操作、写操作等抽象出一个概念,就是事件,在jdk中用类SelectionKey.java来表示,例如:可读事件,当文件描述符关联的内核读缓冲区可读,则触发可读事件(可读:内核缓冲区非空,有数据可以读取);可写事件,当文件描述符关联的内核写缓冲区可写,则触发可写事件(可写:内核缓冲区不满,有空闲空间可以写入)。 什么是通知机制? 通知机制,就是当事件发生的时候,则主动通知。通知机制的反面,就是轮询机制。

二、epoll的三个函数

int epoll_create(int size)

  • size参数告诉内核这个epoll对象处理的事件大致数量,而不是能够处理的最大数量。
  • 在现在的linux版本中,这个size函数已经被废弃(但是size不要传0,会报invalid argument错误)。
  • 内核会产生一个epoll 实例数据结构并返回一个文件描述符,这个特殊的描述符就是epoll实例的句柄,之后针对该epoll的操作需要通过该句柄来标识该epoll对象。

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)

  • 将被监听的描述符添加到红黑树或从红黑树中删除或者对监听事件进行修改
  • 返回:0表示成功,-1表示错误,根据errno错误码判断错误类型
  • op参数说明操作类型: EPOLL_CTL_ADD:向interest list添加一个需要监视的描述符 EPOLL_CTL_DEL:从interest list中删除一个描述符 EPOLL_CTL_MOD:修改interest list中一个描述符
  • epoll_event取值: EPOLLIN:描述符处于可读状态 EPOLLOUT:描述符处于可写状态 EPOLLET:将epoll event通知模式设置成edge triggered EPOLLONESHOT:第一次进行通知,之后不再监测 EPOLLHUP:本端描述符产生一个挂断事件,默认监测事件 EPOLLRDHUP:对端描述符产生一个挂断事件 EPOLLPRI:由带外数据触发 EPOLLERR:描述符产生错误时触发,默认检测事件

int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);

  • 阻塞等待注册的事件发生,返回事件的数目,并将触发的事件写入events数组中
  • events: 用来记录被触发的events,其大小应该和maxevents一致
  • maxevents: 返回的events的最大个数
  • 参数timeout描述在函数调用中阻塞时间上限,单位是ms: timeout = -1表示调用将一直阻塞,直到有文件描述符进入ready状态或者捕获到信号才返回; timeout = 0用于非阻塞检测是否有描述符处于ready状态,不管结果怎么样,调用都立即返回; timeout > 0表示调用将最多持续timeout时间,如果期间有检测对象变为ready状态或者捕获到信号则返回,否则直到超时。
三、epoll原理图解

1.通过调用epoll_create,在epoll文件系统建立了个file节点,并开辟epoll自己的内核高速cache区,建立红黑树,分配好想要的size的内存对象,建立一个list链表,用于存储准备就绪的事件。 2.通过调用epoll_ctl,把要监听的socket放到对应的红黑树上,给内核中断处理程序注册一个回调函数,通知内核,如果这个句柄的数据到了,就把它放到就绪列表。 3.通过调用 epoll_wait,观察就绪列表里面有没有数据,并进行提取和清空就绪列表,非常高效。

四、epoll与select、poll的对比
1. 用户态将文件描述符传入内核的方式
  • select:创建3个文件描述符集并拷贝到内核中,分别监听读、写、异常动作。这里受到单个进程可以打开的fd数量限制,默认是1024。
  • poll:将传入的struct pollfd结构体数组拷贝到内核中进行监听。 结构体结构如下:

  • epoll:执行epoll_create会在内核的高速cache区中建立一颗红黑树以及就绪链表(该链表存储已经就绪的文件描述符)。接着用户执行的epoll_ctl函数添加文件描述符会在红黑树上增加相应的结点
2. 内核态检测文件描述符读写状态的方式
  • select:采用轮询方式,遍历所有fd,最后返回一个描述符读写操作是否就绪的mask掩码,根据这个掩码给fd_set赋值。
  • poll:同样采用轮询方式,查询每个fd的状态,如果就绪则在等待队列中加入一项并继续遍历。
  • epoll:采用回调机制。在执行epoll_ctl的add操作时,不仅将文件描述符放到红黑树上,而且也注册了回调函数,内核在检测到某文件描述符可读/可写时会调用回调函数,该回调函数将文件描述符放在就绪链表中。
3. 找到就绪的文件描述符并传递给用户态的方式
  • select:将之前传入的fd_set拷贝传出到用户态并返回就绪的文件描述符总数。用户态并不知道是哪些文件描述符处于就绪态,需要遍历来判断。
  • poll:同select方式。
  • epoll:epoll_wait只用观察就绪链表中有无数据即可,最后将链表的数据返回给数组并返回就绪的数量。内核将就绪的文件描述符放在传入的数组中,所以只用遍历依次处理即可。这里返回的文件描述符是通过mmap让内核和用户空间共享同一块内存实现传递的,减少了不必要的拷贝。
五、总结

1.select和poll的动作基本一致,只是poll采用链表来进行文件描述符的存储,而select采用fd标注位来存放,所以select会受到最大连接数的限制,而poll不会。 2.select、poll、epoll虽然都会返回就绪的文件描述符数量。但是select和poll并不会明确指出是哪些文件描述符就绪,而epoll会。造成的区别就是,系统调用返回后,调用select和poll的程序需要遍历监听的整个文件描述符找到是谁处于就绪,而epoll则直接处理即可。 3.select、poll采用轮询的方式来检查文件描述符是否处于就绪态,而epoll采用回调机制。造成的结果就是,随着fd的增加,select和poll的效率会线性降低,而epoll不会受到太大影响,除非活跃的socket很多。 4.epoll的边缘触发模式效率高,系统不会充斥大量不关心的就绪文件描述符 5.select、poll都需要将有关文件描述符的数据结构拷贝进内核,最后再拷贝出来。而epoll创建的有关文件描述符的数据结构本身就存于内核态中,系统调用返回时利用mmap()文件映射内存加速与内核空间的消息传递:即epoll使用mmap减少复制开销。

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

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

相关文章

MySQL datetime不同长度的影响

MySQL datetime长度的影响 1.背景 MySQL数据库中某张表的某个字段类型设置datetime, 长度为0,在进行插入数据时,MySQL会对该字段进行舍入操作。 2.测试 1.创建一张测试表,里面有两个时间字段都是datetime,但其中一个长度为3 …

数据灾备方案学习

1. 数据灾备 1.1 备份 将数据由一份数据转存为多份数据的过程,即为备份,通常指将数据通过某些手段,将数据存放到其他不同设备中,防止数据丢失。指用户为应用系统产生的重要数据(或者原有的重要数据信息)制…

在centos7中安装SqlDeveloper的Oracle可视化工具

1.下载安装包 (1)在SqlDeveloper官网下载(Oracle SQL Developer Release 19.2 - Get Started)对应版本的安装包即可(安装包和安装命令如下): (2)执行完上述命令后&#x…

矩阵论在深度学习中的应用

摘要: 本文深入探讨了矩阵论在深度学习领域的广泛应用。首先介绍了深度学习中数据表示和模型结构与矩阵的紧密联系,接着详细阐述了矩阵论在神经网络训练算法优化、卷积神经网络(CNN)、循环神经网络(RNN)及其…

AlphaFold 3开源,谷歌DeepMind诺奖AI项目,革新蛋白质结构预测,加速新药和疫苗研发

AlphaFold 3是什么? MeoAI了解到这个模型在2024年因其在蛋白质结构预测方面的贡献获得了诺贝尔化学奖。AlphaFold 3 是由 DeepMind 开发的一款人工智能(AI)软件,它能够以前所未有的精确度预测几乎所有生命大分子(蛋白…

Excel如何把两列数据合并成一列,4种方法

Excel如何把两列数据合并成一列,4种方法 参考链接:https://baijiahao.baidu.com/s?id=1786337572531105925&wfr=spider&for=pc 在Excel中,有时候需要把两列或者多列数据合并到一列中,下面介绍4种常见方法,并且提示一些使用注意事项,总有一种方法符合你的要求:…

甲骨文云服务器 (Oracle Cloud) 终极防封、防回收的教程!

1.WindTerm 远程终端连接器:【官方下载】、【备用下载 】 2.AA面板:【安装脚本】 3.开启端口: sudo iptables -P INPUT ACCEPT sudo iptables -P FORWARD ACCEPT sudo iptables -P OUTPUT ACCEPT sudo iptables -F 4.WordPress&#xf…

c++源码阅读__ThreadPool__正文阅读

一. 简介 本章我们开始阅读c git 高星开源项目ThreadPool, 这是一个纯c的线程池项目, 并且代码量极小, 非常适合新手阅读 git地址: progschj / ThreadPool 二. 前提知识 为了面对不同读者对c掌握情况不同的情况, 这里我会将基本上稍微值得一说的前提知识点, 全部专门写成一篇…

环形子数组的最大和

题目 给定一个长度为 n 的环形整数数组 nums ,返回 nums 的非空 子数组 的最大可能和 。 环形数组 意味着数组的末端将会与开头相连呈环状。形式上, nums[i] 的下一个元素是 nums[(i 1) % n] , nums[i] 的前一个元素是 nums[(i - 1 n) % …

二叉搜索树的基本操作(最全面)

目录 二叉搜索的定义: 节点类: 查找关键词对应的值: 非递归 递归: 查找最小关键词对应的值: 方法一: 方法二: 查找最大关键词对应的值: 方法一: 方法二: 存贮关键词对应的值: 查找关键词的前驱值: 查找关键词对应的后继值: 删除节点: 非递归: 递归: 范围 1.…

python爬虫-爬虫常用函数及其用法-1

1、urllib库 urllib库是python中一个最基本的网络请求库。可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据。 (1)urlopen函数 在 python3 的 urllib 库中,所有和网络请求相关的方法&a…

vue3 路由守卫

在Vue 3中,路由守卫是一种控制和管理路由跳转的机制。它允许你在执行导航前后进行一些逻辑处理,比如权限验证、数据预取等,从而增强应用的安全性和效率。路由守卫分为几种不同的类型,每种类型的守卫都有其特定的应用场景。 其实路…

web——sqliabs靶场——第八关——sqlmap的使用

第八关还是用到了盲注,我们来使用kali里的sqlmap工具来搞一下。 1.sqlmap简介 sqlmap 是一款开源的自动化 SQL 注入和数据库接管工具,旨在帮助安全研究人员和渗透测试人员检测和利用 SQL 注入漏洞。它支持多种数据库管理系统(如 MySQL、Post…

如何去掉el-input 中 type=“number“两侧的上下按键

<el-input v-model.trim"row.length" type"number" min"0" placeholder""></el-input> // 如何去掉el-input-number两侧的上下按键 ::v-deep input::-webkit-outer-spin-button, ::v-deep input::-webkit-inner-spin-butt…

【Redis】redis缓存击穿,缓存雪崩,缓存穿透

一、什么是缓存&#xff1f; 缓存就是与数据交互中的缓冲区&#xff0c;它一般存储在内存中且读写效率高&#xff0c;提高响应时间提高并发性能&#xff0c;如果访问数据的话可以先访问缓存&#xff0c;避免数据查询直接操作数据库&#xff0c;造成后端压力过大。 但是可能会面…

统⼀数据返回格式快速⼊⻔

为什么会有统⼀数据返回&#xff1f; 其实统一数据返回是运用了AOP&#xff08;对某一类事情的集中处理&#xff09;的思维。 优点&#xff1a; 1.⽅便前端程序员更好的接收和解析后端数据接⼝返回的数据。 2.降低前端程序员和后端程序员的沟通成本&#xff0c;因为所有接⼝都…

第7章硬件测试-7.6 量产可靠性测试

7.6 量产可靠性测试 7.6.1 生产小批量测试7.6.2 装备测试7.6.3 器件一致性测试7.6.4 工艺规程和单板维修技术说明 产品量产阶段需要通过可靠性测试来保障产品的可靠性。 7.6.1 生产小批量测试 生产小批量测试是发货之前的批量压力测试&#xff0c;有两个目的&#xff1a;一是…

可编辑的 SALV 模型(克服 SALV 模型的限制)

我们都知道 ABAP Object 比传统的 ABAP 非常强大。在这里&#xff0c;我想分享我使用 ABAP 对象克服 SALV mdoel 限制的最佳实验之一。 起源 最初&#xff0c;我在 SCN 上发布了这篇文章 – ABAP 对象的强大功能&#xff1a;克服 SALV 模型的限制&#xff0c;它也受到了很多批…

通过shell脚本分析部署nginx网络服务(详细易懂)

通过shell脚本分析部署nginx网络服务 要求&#xff1a; 接收用户部署的服务名称判断服务是否安装 已安装&#xff1b;自定义网站配置路径为/www&#xff1b;并创建共享目录和网页文件&#xff1b;重启服务 没有安装&#xff1b;安装对应的软件包测试&#xff1a; 判断服务是否…

H.265流媒体播放器EasyPlayer.js H5流媒体播放器如何验证视频播放是否走硬解

随着技术的不断进步和5G网络的推广&#xff0c;中国流媒体播放器行业市场规模以及未来发展趋势都将持续保持稳定的增长&#xff0c;并将在未来几年迎来新的发展机遇。流媒体播放器将继续作为连接内容创作者和观众的重要桥梁&#xff0c;推动数字媒体产业的创新和发展。 EasyPla…