探究IO多路复用select/poll/epoll的实现原理及优缺点

news2024/11/24 19:29:02

IO多路复用

多路多个文件描述符复用指使用一个线程

IO多路复用通俗的理解就是一个线程监视多个文件描述符****,一旦某个文件描述符就绪,就通知应用程序对其进行读写操作

select

select会将三个fd_set文件描述符集合(bitMap),即读集合(readfds)、写集合(writefds)和异常集合(exceptfds),拷贝进内核,内核会遍历整个bitMap,并标记bitMap中感兴趣的文件描述符(待监听的文件描述符,值为1的),若有对应事件发生标记为1否则标记为0,然后将修改过的bitMap元素从内核拷贝到用户态中,并返回就绪的文件描述符个数,最后用户态程序遍历整个集合找出发生了事件的文件描述符并进行响应处理。

优点
  1. 跨平台。select由操作系统内核提供实现,各操作系统(如 Linux、Windows、macOS 等)都提供了与其兼容的内核底层实现。
  2. 简单易用。通过接受三个位图集合来监听文件描述符的状态变化,简单易用。
不足
  1. 操作系统默认文件描述符表大小位1024,所以这对select能监听的文件描述符数量有所限制。
  2. 用户态程序需要自己遍历整个文件描述符集合才能获得就绪的文件描述符。
  3. 发生两次数据拷贝,无法避免大规模数据拷贝问题。

poll

poll是一种基于事件驱动的多路复用机制,通过轮询并缓存就绪文件描述符,实现高并发IO操作。

poll不再采用selcet的位图数据结构,转而使用pollfd数据结构。

pollfd由三部分构成:fd表示待监听的文件描述符,events表示感兴趣的事件(可读、可写、异常),revents表示实际发生的事件类型(由内核填充完成)。

poll执行的具体过程与select基本一致:

  1. 先将pollfd数组拷贝进内核
  2. 内核会遍历pollfd并将就绪pollfd的revents置为对应的事件(可读、可写、异常)
  3. 然后将就绪的pollfd拷贝会内核态,并返回就绪的事件个数
  4. 最后由用户态程序遍历整个pollfd数组检查revents字段获得并处理就绪的事件
优点
  1. 无需遍历多个监测集合来查找就绪事件。
  2. poll从理论上突破了文件描述符个数1024的限制。
不足
  1. 发生两次数据拷贝,无法避免大规模数据拷贝问题。
  2. poll 虽然可以处理的文件描述符数量没有上限,但是它仍然会受到系统限制而无法监测所有的文件描述符

epoll

epoll是基于

epoll的执行过程:

  1. epoll在内核中维护了一个文件描述符的集合(采用红黑树结构,可以高效的维护文件描述符,增删查一般时间复杂度是 O(logn)),用户态无需每次重新传入,只需要告诉内核修改的部分即可,可以大幅度减少内核和用户空间之间的数据拷贝的资源消耗
  2. epoll采用的是事件驱动机制,不需要通过轮询来找到对应的那个文件描述符。当某个文件描述符就绪的时候,会通过回调函数,把它放到一个就绪链表中记录起来,内核就不用遍历文件描述符了
  3. 当epoll_wait触发时,内核只返回就绪的文件描述符集合,也就是上面提到的那个就绪链表,因为返回给用户态的肯定是已经就绪了的,所以用户态可以拿来即用,也无需做多余的遍历

在这里插入图片描述
epoll支持两种触发模式,分别是边缘触发(ET)和水平触发(LT)

  • 边缘触发ET
    被监控的文件描述符上有可读/可写事件发生时,服务端只会从epoll_wait中苏醒一次。即使没有调用read从内核读取数据,也依然苏醒一次,所以要保证一次性将内核数据读完。

  • 水平触发LT
    被监控的文件描述符上有可读/可写事件发生时,服务端会从epoll_wait中不断苏醒,直到内核缓冲区数据被读完。

边缘触发可以减少epoll_wait的调用次数,所以边缘触发的效率比水平触发效率高。

一般边缘触发搭配非阻塞式IO。因为若搭配阻塞IO, 对于一个处于阻塞状态的文件描述符,如果它已经准备好了读或写,但是在调用 read 或 write 函数时却被阻塞住了,那么下一次该文件描述符是否就绪都不会被通知。这就会导致程序不能及时处理已经准备好的事件。

select和poll都属与水平触发

优点
  1. 内核通过红黑树维护一个文件描述符集合,减少了内核和用户态之间的数据拷贝,提高了效率和资源利用率
  2. 基于事件驱动机制,不需要通过轮询来找到对应的那个文件描述符
  3. 支持同时监控大量的文件描述符,没有描述符数量的限制,可以随着系统需要而扩展。
不足

不具备跨平台性,只适用与linux系统

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

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

相关文章

java 汽车修理厂修配厂-接单-处理收款 日常经营管理系统 汽车修理信息管理

实现修配厂一体化管理,从业务各个环节整体管理,包括接待,维修,采购,质检,交车,收款等业务操作环节,全方位,闭环管理,精细化管理。充费利用信息技术资源&#…

coreldraw和ai哪个好用?有哪些区别

CorelDRAW和Illustrator是两款常被比较的矢量绘图软件,它们在功能上各具特色,在绘图领域中都有一席之地。大多数效果都可以在这两款软件上完成,因此它们在功能上差异不大。 然而,就操作而言,我必须承认CorelDRAW更加便…

蓝牙资讯|三星发布Galaxy SmartTag 2,苹果Find My引领防丢市场

三星发布新品 —— Galaxy SmartTag 2 防丢器,该产品售价 29.99 美元。外观方面,Galaxy SmartTag 2 采用了全新的椭圆设计取代上代 SmartTag 的菱形设计,钥匙孔也比上代更大,并升级采用金属圆环以防止磨损,新品提供黑色…

Kafka在企业级应用中的实践

前言 前面说了很多Kafka的性能优点,有些童鞋要说了,这Kafka在企业开发或者企业级应用中要怎么用呢?今天咱们就来简单探究一下。 1、 使用 Kafka 进行消息的异步处理 Kafka 提供了一个可靠的消息传递机制,使得企业能够将不同组件…

[UUCTF 2022 新生赛]ezpop - 反序列化+字符串逃逸【***】

[UUCTF 2022 新生赛]ezpop 一、解题过程二、其他WP三、总结反思 一、解题过程 题目代码&#xff1a; <?php //flag in flag.php error_reporting(0); class UUCTF{public $name,$key,$basedata,$ob;function __construct($str){$this->name$str;}function __wakeup(){i…

Vue Router(二)

目录 一、嵌套路由 1、路由定义 2、代码例子 3、重定向 二、懒加载 1、缘由 2、代码例子 三、导航守卫 1、全局前置守卫 2、全局后置守卫 3、meta元信息 四、生命周期 1、解释 2、执行顺序 3、例子 五、keep-alive组件缓存&#xff08;保活&#xff09; 1、介…

AT2659S——L1频段卫星导航射频前端低噪声放大器芯片

AT2659S芯片采用2.9 mm 2.8mm 1.1 mm的6 pin SOT23-6封装。 应用领域&#xff1a; 导航天线 集成导航功能的手机 自动导航 定位功能移动设备 个人导航仪 笔记本/PAD AT2659S 是一款具有低功耗、高增益、低噪声系数的低噪声放大器&#xff08;LNA&#xff09;芯片&#x…

32、Flink table api和SQL 之用户自定义 Sources Sinks实现及详细示例

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

虚拟机Ubuntu18.04安装对应ROS版本详细教程!(含错误提示解决)

参考链接&#xff1a; Ubuntu18.04安装Ros(最新最详细亲测)_向日葵骑士Faraday的博客-CSDN博客 1.4 ROS的安装与配置_哔哩哔哩_bilibili ROS官网&#xff1a;http://wiki.ros.org/melodic/Installation/Ubuntu 一、检查cmake 安装ROS时会自动安装旧版的Cmake3.10.2。所以在…

Thingsboard二次开发---5.在Thingsboard中增加解决方案管理功能

前言 在使用Thingsboard的过程中发现TB虽然非常灵活&#xff0c;但实际的最终用户更希望是针对特定场景的成熟解决方案&#xff0c;页面都做好&#xff0c;不需要再进行配置&#xff0c;所以在原来的基础上增加了解决方案的功能&#xff0c;此方案比较适合给用户提供SaaS化的解…

【Hugging Face】如何从hub中下载文件

huggingface_hub库提供了从存储在Hub上的仓库中下载文件的功能。您可以独立使用这些函数或将它们集成到您自己的库中&#xff0c;使您的用户更方便地与Hub交互。本指南将向您展示如何&#xff1a; 下载并缓存单个文件。下载并缓存整个代码库。将文件下载到本地文件夹。 下载单…

语义分割,实例分割,全景分割梳理

语义分割&#xff08;semantic segmentation&#xff09; 实例分割&#xff08;instance segmentation&#xff09; 全景分割&#xff08;Panoptic Segmentation&#xff09; 下面基于《Panoptic Segmentation 》这篇论文进行这几个概念的梳理 论文链接&#xff1a;https:/…

基于安卓android微信小程序的垃圾废品回收类软件

运行环境 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&a…

软件测试的价值

测试人员可以参与到软件的全生命周期中&#xff0c;一切软件质量相关的活动。具体来说主要有&#xff1a; 1、需求评审&#xff0c;帮助产品梳理业务逻辑 测试人员对产品功能有丰富的业务测试经验&#xff0c;有时会比产品还要熟悉平台的整体业务逻辑&#xff0c;所以需求评审…

【PG】Linux系统部署PostgreSQL单机数据库

安装方式 1 安装包方式 &#xff08;Packages and Installers&#xff09; 支持的操作系统包括 liunxMacosWindowsBSDSolaris 2 源码安装 &#xff08;Source code&#xff09; 下载源码包 通过下载地址PostgreSQL: File Browser 可以看到有各个版本的源码目录 选择13.1…

WPF向Avalonia迁移(二、一些可能使用到的库)

可能使用到的一些库 1. UI库 开源项目&#xff1a;https://github.com/irihitech/Semi.Avalonia 如果想引用他的DataGrid样式还需要添加Semi.Avalonia.DataGrid 2. 图表库 LiveChartsCore.SkiaSharpView.Avalonia 3.SVG库 开源项目&#xff1a;https://github.com/wieslaw…

prometheus使用数据源的timestamp而非server的timestamp

关于timestamp指标的解释 prometheus中的指标timestamp有两个&#xff1a; prometheus拉取时刻的timestamp&#xff0c;即服务端的timestamp&#xff1a;time.Now()&#xff1b;exporter的/metrics接口&#xff0c;除了返回metric&#xff0c;value&#xff0c;还返回timesta…

chromium线程模型(1)-普通线程实现(ui和io线程)

通过chromium 官方文档&#xff0c;线程和任务一节我们可以知道 &#xff0c;chromium有两类线程&#xff0c;一类是普通线程&#xff0c;最典型的就是io线程和ui线程。 另一类是 线程池线程。 今天我们先分析普通线程的实现&#xff0c;下一篇文章分析线程池的实现。&#xff…

asp.net电影院选座系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net电影院选座系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言开发 asp.net电影院选座系统1 二、功能介…

简述CRM系统软件的作用

销售部门作为企业重要的营收部门&#xff0c;做好企业管理意义重大。如今市场竞争激烈&#xff0c;人工管理很难兼顾。不少企业借助CRM销售管理系统优化改进工作流程中各个环节存在的问题。下面小Z来简单说说CRM系统是做什么的&#xff1f; 一、客户档案管理 通过CRM销售管理…