IO多路复用技术、select、poll、epoll联系与区别

目录

  • IO多路复用技术
    • select:
    • poll:
    • epoll(Linux特有):
  • epoll select poll的区别
  • epoll是同步还是异步
  • epoll详解

IO多路复用技术

  • 通信双方都有一个socket,以一个文件描述符的形式存在,那这个fd也对应了内核当中的一块缓存区,缓冲区里有读缓冲区和写缓冲区,一端写另一端读,IO也就是指这样对缓冲区的操作多路复用能够让程序同时监听多个文件描述符

I/O多路复用技术是一种允许单个进程或线程同时监视多个输入/输出(I/O)通道的技术,如网络连接、文件描述符等。当某个I/O通道有数据可读或可写时,操作系统通知应用程序进行相应的操作。这种技术可以提高应用程序的效率和性能,特别是在处理大量并发I/O操作时。以下是几种常见的I/O多路复用技术:

select:

select是最早的I/O多路复用技术之一。它允许程序指定一组文件描述符,然后查询这些描述符中哪些已经准备好进行读取或写入操作。

poll:

poll与select类似,但它使用不同的数据结构(pollfd结构体数组),并且没有select中的文件描述符数量限制。

epoll(Linux特有):

epoll是Linux下的一种高效的I/O多路复用技术。它使用一组系统调用(epoll_create、epoll_ctl、epoll_wait)来管理事件和通知机制。epoll使用红黑树和事件列表来提高性能,特别是对于大量并发连接。

epoll select poll的区别

select/poll/epoll 都是内核提供给用户态的多路复用系统调用

  1. select和poll要检测的文件描述符集合是在用户态下创建的,每次调用都需要从用户态拷贝到内核中。而epoll从创建开始就是在内核空间创建的。
  2. 判断是否有文件描述符就绪,select和poll需要遍历整个文件描述符的集合,遍历的时间复杂度都是O(n)。而epoll利用了内核的事件驱动机制,只有当文件描述符就绪时才会返回,在硬件的支持下是O(1)的时间复杂度。
  3. select和poll都只能工作在相对低效的LT模式下,而epoll同时支持LT和ET模式。
  • 水平触发:当文件描述符就绪时,它们会一直通知应用程序直到应用程序处理完该事件
  • 边缘触发:它只会通知应用程序一次,所以我们一般会循环的从文件描述符中读写数据,一次性尽可能多的读取数据。
  • 一般来说,边缘触发的效率比水平触发的效率要高,因为边缘触发可以减少系统调用次数,减少开销的。
  • 当监测的fd数量较小,建议使用select和poll;当监听的fd数量较多,使用epoll会明显提升性能。
  • epoll 在内核里使用「红黑树」来关注进程所有待检测的 Socket

epoll是同步还是异步

epoll 通常被认为是一种介于传统同步 I/O 和完全异步 I/O 之间的机制。
同步的:epoll 通过 epoll_wait() 系统调用来通知应用程序哪些文件描述符已经准备就绪,应用程序在接收到通知后就要自己去执行实际的 I/O 操作。这种模式更接近于同步 I/O。
异步的:epoll 允许应用程序先注册对特定的 I/O 事件,当这些事件发生之后操作系统会自动通知应用程序,这是异步 I/O 的一个关键特征。
所以总体而言它是同步的,但又提供了一种接近异步 I/O 的编程模型。

epoll详解

epoll 是 Linux 内核提供的一种高效的 I/O 多路复用技术,用于监控大量文件描述符(file descriptors)的 I/O 事件。与传统的 select 和 poll 相比,epoll 在处理大量并发连接时具有显著的性能优势。以下是 epoll 的一些关键特性和概念:

数据结构:

epoll 使用红黑树来组织和管理文件描述符,这使得查找、添加和删除操作都非常高效。
系统调用:

epoll 提供了三个主要的系统调用:
epoll_create:创建一个新的 epoll 实例。
epoll_ctl:用于添加(EPOLL_CTL_ADD)、修改(EPOLL_CTL_MOD)或删除(EPOLL_CTL_DEL)感兴趣的文件描述符。
epoll_wait:等待 I/O 事件的发生,并返回就绪的文件描述符列表。
事件类型:

epoll 支持多种类型的事件,包括读(EPOLLIN)、写(EPOLLOUT)、错误(EPOLLERR)等。
事件触发模式:

epoll 支持两种触发模式:
边缘触发(Edge Triggered,ET):只有状态发生变化时才通知应用程序。
水平触发(Level Triggered,LT):只要条件满足,就会不断通知应用程序。
性能优势:

与 select 和 poll 不同,epoll 不需要在每次调用时传递所有文件描述符的集合,内核维护了文件描述符的状态,这大大减少了数据复制的开销。
就绪列表:

当 epoll_wait 被调用时,内核会将准备好的文件描述符添加到就绪列表中,应用程序可以直接从这个列表中读取事件,而不需要轮询。
可扩展性:

epoll 可以高效地处理成千上万的并发连接,这使得它非常适合用于高性能的服务器应用程序。
内存使用:

尽管 epoll 在性能上优于 select 和 poll,但它可能会使用更多的内存,特别是当监控大量文件描述符时。
编程复杂性:

使用 epoll 编程可能比 select 和 poll 更复杂,需要正确地管理文件描述符的注册、注销和事件处理。
epoll 的高效性能使其成为 Linux 下开发高性能网络应用程序的首选 I/O 多路复用技术之一。然而,开发者需要仔细设计程序,以充分利用 epoll 的优势,同时避免潜在的编程陷阱。

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

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

相关文章

AI 大事件:超级明星 Andrej Karpathy 创立AI教育公司 Eureka Labs

🧠 AI 大事件:超级明星 Andrej Karpathy 创立AI教育公司 Eureka Labs 摘要 Andrej Karpathy 作为前 OpenAI 联合创始人、Tesla AI 团队负责人,他的专业性和实力备受瞩目。Karpathy 对 AI 的普及和教育充满热情,从 YouTube 教程到…

CBSD bhyve Ubuntu 配置vnc登录管理

CBSD介绍 CBSD是为FreeBSD jail子系统、bhyve、QEMU/NVMM和Xen编写的管理层。该项目定位为一个综合解决方案的单一集成工具,用于使用预定义的软件集以最少的配置快速构建和部署计算机虚拟环境。 虽然CBSD没有提供额外的操作系统级功能,但它极大地简化了…

两年经验前端带你重学前端框架必会的ajax+node.js+webpack+git等技术 Day1

黑马程序员前端AJAX入门到实战全套教程,包含学前端框架必会的(ajaxnode.jswebpackgit),一套全覆盖 Day1 你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客 这是我的 github https://github.com/Qiuner ⭐️ ​…

【算法/天梯赛训练】天梯赛模拟题集

L1-009 N个数求和 #include <iostream> #include <algorithm>using namespace std;typedef long long ll; const int N 105;typedef struct node {ll x, y; }node; node a[N];ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a; }int main() {int n;cin >>…

《昇思25天学习打卡营第25天|第9天》

今天是打卡的第九天&#xff0c;今天学习的是使用静态图加速这门课程&#xff0c;从他的背景学起&#xff1a;AI编译框架分为两种运行模式&#xff0c;分别是动态图模式和静态图模式&#xff0c;动态图模式特点&#xff1a;计算图的构建和计算同时发生&#xff0c;缺点&#xf…

Qt Style Sheets-样式表语法

样式表语法 Qt 样式表术语和语法规则几乎与 HTML CSS 的相同。如果您已经了解 CSS&#xff0c;您可能可以快速浏览此部分。 样式规则 样式表由一系列样式规则组成。样式规则由选择器和声明组成。选择器指定哪些小部件受该规则影响&#xff1b;声明指定应在小部件上设置哪些属性…

ThinkPHP6事件系统使用指南

本文由 ChatMoney团队出品 在ThinkPHP 6中&#xff0c;事件系统提供了一种优雅的方式来实现解耦和动态响应。你可以通过注册事件和对应的监听者来处理各种应用逻辑。 事件注册 闭包注册 闭包是最简单的事件监听者&#xff0c;可以直接在注册时定义。 Event::listen("C…

Linux操作系统之多文件管理

makefile: makefile文件用于管理和组织代码工程的编译和链接,被make工具解析并完成相关动作 make: 工程管理工具 语法: 要生成的文件:依赖的所有文件 时间戳: 编译文件时,时间戳更新的文件需要重新加入编译,时间戳没有改变的不需要重新编译 app:main.c add.c sub.c …

如何追查一个packet在linux 系统哪里丢失

要想追一个包在系统哪里丢失了&#xff0c; 就要了解 一个应用层的包在送出时 要经历那些 检查点 和被丢掉的点。 1. 在传输层&#xff0c;如果是 tcp 包 会有contrack 的 buf 的限制 可能会导致 packets 的丢失。 > 检查办法&#xff1a;查看dmesg日志有报错&#xff1a;k…

MySQL数据库慢查询日志、SQL分析、数据库诊断

1 数据库调优维度 业务需求&#xff1a;勇敢地对不合理的需求说不系统架构&#xff1a;做架构设计的时候&#xff0c;应充分考虑业务的实际情况&#xff0c;考虑好数据库的各种选择(读写分离?高可用?实例个数?分库分表?用什么数据库?)SQL及索引&#xff1a;根据需求编写良…

C# 实体更新记录:如何捕获和记录字段变化到日志

方案一&#xff1a;粗糙但可用 var changes new List<string>();void CompareAndAddChange<T>(string propertyName, T oldValue, T newValue, Func<T, string> descriptionFunc null) {if (!EqualityComparer<T>.Default.Equals(oldValue, newVa…

分支定界法(Branch and Bound, 简称BB)是一种求解整数规划问题的有效算法。

分支定界法&#xff08;Branch and Bound&#xff09;详解与Python代码示例 分支定界法概述 分支定界法&#xff08;Branch and Bound, 简称B&B&#xff09;是一种求解整数规划问题的有效算法。它结合了搜索与迭代的思想&#xff0c;通过系统地枚举候选解来寻找最优解。在…

Java Web常见框架寻找路由技巧

在Java Web代码审计中&#xff0c;寻找和识别路由是很关键的部分。通过注册的路由可以找到当前应用对应的Controller&#xff0c;其作为MVC架构中的一个组件&#xff0c;可以说是每个用户交互的入口点。简单介绍下Java Web中常见框架&#xff08;Spring Web、Jersey&#xff09…

【SASS/SCSS(二)】模块化语法

目录 一、use 1、命名空间 2、私有变量 3、用with改变模块中的默认值 二、forward 1、给forward模块起别名&#xff0c;让成员加前缀 2、利用hide or show手动控制成员的可访问性 三、import 1、不存在命名空间&#xff0c;成员变量在import之后直接公开 2、可以在嵌…

springboot防止重复提交的方案有哪些

在Spring Boot中&#xff0c;防止接口或表单重复提交有多种策略&#xff0c;以下是几种常见且有效的方案&#xff1a; 前端控制&#xff1a; 禁用提交按钮&#xff1a;在表单提交后&#xff0c;使用JavaScript立即禁用提交按钮&#xff0c;防止用户再次点击。响应式提示&#x…

十、Java集合 ★ ✔(模块18-20)【泛型、通配符、List、Set、TreeSet、自然排序和比较器排序、Collections、可变参数、Map】

day05 泛型,数据结构,List,Set 今日目标 泛型使用 数据结构 List Set 1 泛型 1.1 泛型的介绍 ★ 泛型是一种类型参数&#xff0c;专门用来保存类型用的 最早接触泛型是在ArrayList&#xff0c;这个E就是所谓的泛型了。使用ArrayList时&#xff0c;只要给E指定某一个类型…

讲真,现在留给2024年下半年软考的时间还够吗?

常识是个好东西&#xff0c;但是有时候却容易蒙蔽咱们的双眼&#xff0c;就拿下半年软考而言&#xff0c;看起来现在才7月份&#xff0c;刚刚入伏&#xff0c;考试要到11月份&#xff0c;是冬天呢&#xff0c;中间还隔了一个完整的秋季&#xff0c;常识感觉还很遥远&#xff0c…

【Vue3】4个比较重要的设计模式!!

大家好,我是CodeQi! 一位热衷于技术分享的码仔。 在我投身于前端开发的职业生涯期间,曾有一次承接了一个大型项目的维护工作。此项目运用的是 Vue 框架,然而其代码结构紊乱不堪,可维护性极度糟糕😫。 这使我深刻领会到,理解并运用 Vue 中的重要设计模式是何等关键! …

对LinkedList ,单链表和双链表的理解

一.ArrayList的缺陷 二.链表 三.链表部分相关oj面试题 四.LinkedList的模拟实现 五.LinkedList的使用 六.ArrayList和LinkedList的区别 一.ArrayList的缺陷: 1. ArrayList底层使用 数组 来存储元素&#xff0c;如果不熟悉可以来再看看&#xff1a; ArrayList与顺序表-CSDN…

一些常见的网络故障

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…