从 select、poll、epoll 回答IO多路复用

news2024/11/29 6:24:17

前言

先大概了解一下这方面的知识

  • IO多路复用指的是单个进程或者线程能同时监听处理多个IO请求,

  • select、epoll、poll是LinuxAPI提供的复用方式。本质上是由操作系统内核缓存fd文件描述符, 使得单个进程线程能监视多个文件描述符。

  • select是将所有文件描述符的集合从用户空间拷贝到内核空间,底层是数组

  • poll和select相似,主要区别是底层采用链表,从而使得监听文件描述符个数不再受限, 但是还是需要多次内核与用户的复制,并且用户空间需要通过轮询O(n)才能确定哪些文件描述符上发生了事件。

  • epoll底层采用红黑树,在内核空间创建需要关注的文件描述符的红黑树,内核监听时会将发生事件的描述符加入队列中,返回到用户空间的时候只需要返回队列中的数据即可。

  • epoll通过这种方式使得减少了每次用户到内核的复制过程,同时用户空间通过O(1)复杂度就可以知道哪些文件描述符发生了事件。

回答

传统的BIO,NIO,AIO有一个缺点就是每执行一次io事件就会执行一次系统调用,系统调用需要从用户态陷入到内核态中,非常影响性能。

而IO多路复用可以降低系统调用的次数从而达到提升效率的效果。IO多路复用提供三种实现方式分别是select,poll和epoll

select

1.在select中,会通过轮循的方式去执行select,若当前没有就绪事件即select函数返回值为0,那么便会阻塞直到有就绪事件进入结束阻塞然后将数据从内核态拷贝到用户态再去处理数据。处理完毕后开始下一次的select轮循。select函数包括如下参数:

  1. nfds:当前监听的事件描述符的最大值加一,因为select只会返回有事件就绪不会告诉你那些事件就绪,所以需要去遍历并判断,加入该参数就可以缩小遍历范围提高效率。

这三个参数既可以用于调用函数时作为需要监听的判断集合(集合本身是一个数组,长度为1024,所以select类型有

监听事件的数量限制,数组内容种0表示不需要监听,1表示需要监听),同时也可以作为select返回后的就绪事件的

集合(0表示未就绪,1表示就绪),因为其双重功能的原因,所以在每次系统调用时都需要重置这三个集合。

  1. timeout:0表示执行超时,-1表示出现异常。select函数的返回值为当前就绪事件的个数

  2. poll方式的执行效果和select类型,它通过以链表来记录事件的方式解决了每次都需要重设监听描述符集合的问题和监听描述符数量有限的问题

poll

poll函数参数列表:

  • 用来记录监听描述符和就绪描述符的链表。链表的每个节点记录了当前监听节点的描述符的值和它是否已经就绪判断。

  • nfds:需要监听的描述符个数,和select类似

  • timeout,超时时间,和select类似。返回值及其意义和select函数相同。但是poll依然存在着每次系统调用都需要传入fd和不知道具体那些描述符就绪需要遍历的问题。

epoll系统调用包含三个方法

epoll_create(epoll对象创建)

需要传入一个监听描述符个数的参数size。生成一个epoll对象并将其放入到内核态中并返回该epoll的描述符,在内核态的该epoll对象有三个属性分别是:

epoll_crtl(事件注册)

将具体的事件通过该方法注册到epoll对象中并再内核态生成一个epitem来关联epoll对象,同时epitem还会关联一个回调函数,当该事件就绪后通过epoll_wait()进入回调函数将数据从内核态赋值到用户态并处理。

epoll_wait()

会先去判断epoll对象的就绪列表中是否有内容。若没有则阻塞,只有事件就绪。若有则取调用相应的回调函数处理数据。epoll通过注册和更新红黑树的形式来存储fds使得其不用每次系统调用是都传入fds。通过就绪队列的方式实现了不用一一判断就绪事件

epoll缺点是

1,只支持在linux中使用,移植性较差。

2,对于请求较少的情况效果反而没有select好

补充

当进行一次IO访问,数据会会先被拷贝到操作系统内核的缓冲区,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间,所以,当一个read操作发生时,会经历两个阶段,先等待数据准备就绪,然后将数据从内核拷贝到进程中

由于这两个阶段,Linux系统产生了下面五种网络模式的方案:

select、poll、epoll本质上也是同步IO,因为他们都需要在读写事件就绪后自己负责读写,也就是这个过程是阻塞的,

与多进程和多线程技术相比,IO多路复用的最大优势是系统开销小,系统不必创建进程或线程,从而大大减少了系统的开销,能力更多的连接。 其中IO多路复用的本质就是通过系统内核缓冲IO数据,让单个进程可以监视多个文件描述符(FD),一旦某个描述符读就绪或者写就绪,可以通知程序进行相应的读写操作,也就是使用单个进程同时处理多个网络连接IO,

它的原理就是select、poll、epoll不断轮询所负责的socket,当某个socket有数据达到了,就通知用户进程,select和poll的时间复杂度都是O(n)epoll的时间复杂度是O(1)

Epoll是Linux目前大规模网络并发程序开发的首选,在绝大多数情况下性能远超select和poll,但是在并发连接不高的情况下,多线程+阻塞IO的方式可能会更好

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

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

相关文章

Spire.PDF 8.11.10 supports .NET 7.0 and PDF to PPTX

度娘找破解版Spire.PDF for .NET is a professional PDF API applied to creating, writing, editing, handling and reading PDF files without any external dependencies within .NET ( C#, VB.NET, ASP.NET, .NET Core, .NET 5.0, .NET 6.0, MonoAndroid and Xamarin.iOS )…

如何在表格里面添加表单,并且进行表单验证

通过el-form和el-table的组合使用,在表格里面添加表单 并且进行验证 表单中v-model绑定scope.row中表格的数据 效果如图所示: <template><div><!-- <el-form ref"ruleForm" :model"ruleForm" :rules"rules"><el-form-…

C++ 类的静态成员详解【static】

目录 前言 一、类的静态成员 1.static关键字 2.静态成员变量 3.静态成员函数 二、程序样例 1.程序演示 2.程序截图 总结 前言 本文记录C中 static 修饰类成员成为静态成员&#xff0c;其中包括静态成员类别、作用和程序演示。 嫌文字啰嗦的可直接跳到最后的总结。 一、类的静…

从爆红到被黑,游戏黑产攻防48小时

编者按&#xff1a; 数字化浪潮蓬勃兴起&#xff0c;企业面临的安全挑战亦日益严峻。 腾讯安全近期将复盘2022年典型的攻击事件&#xff0c;帮助企业深入了解攻击手法和应对措施&#xff0c;完善自身安全防御体系。 本篇聚焦某游戏公司新游戏上线后与黑产多轮攻防的48小时里…

Python遥感开发之arcpy批量重采样

Python遥感开发之arcpy批量重采样1. 重采样2. ARCGIS中的重采样3. Python_arcpy代码实现前言&#xff1a;主要介绍使用ARCGIS中自带的重采样工具&#xff0c;以及Python代码实现arcpy批量重采样&#xff0c;使用Python代码更加方便快捷。1. 重采样 作用&#xff1a;更改栅格数…

百度飞桨公布最新成果:凝聚535万开发者,服务20万家企事业单位

11月30日&#xff0c;由深度学习技术及应用国家工程研究中心主办的WAVE SUMMIT2022深度学习开发者峰会如期而至。鹏城实验室主任、中国工程院高文院士&#xff0c;深圳大学电子与信息工程学院院长、深度学习技术及应用国家工程研究中心技术委员会副主任、中国工程院丁文华院士受…

【数据结构】二叉树详解(下篇)

&#x1f9d1;‍&#x1f4bb;作者&#xff1a; 情话0.0 &#x1f4dd;专栏&#xff1a;《数据结构》 &#x1f466;个人简介&#xff1a;一名双非编程菜鸟&#xff0c;在这里分享自己的编程学习笔记&#xff0c;欢迎大家的指正与点赞&#xff0c;谢谢&#xff01; 二叉树&…

c#、wpf开发中页面在win10下被缩放125%引起页面错乱的解决办法。

正常情况下,我们开发的页面页面应该是100%缩放的,这样程序在win7和win10下保持一致,但是win10里面会根据显示器的情况自动调整“缩放与布局”,这使得桌面程序有时候会发生页面错乱,怎么调整就是个问题。 如图:在“缩放与布局”100%显示如下: 而在 “缩放与布局”125%显…

etcd cli选举流程

etcd cli选举流程 创建选举的Session 可配置项&#xff1a; WithTTL&#xff1a;设置session的存活时间&#xff0c;默认60sWithLease&#xff1a;设置session的key的lease&#xff0c;默认新建一个TTL为session TTL的leaseWithContext&#xff1a;设置context&#xff0c;默…

逆势高速增长,毫末征战三年诠释量产为王

作者 | 白日梦想家 编辑 | 王博“1096天&#xff0c;这是一场毫末人自己与自己“死磕”的大战。”11月29日&#xff0c;毫末智行在公司成立三周年的内部信中这样总结。 死磕的事情&#xff0c;包括&#xff1a; 以“自动驾驶三定律”为战略原点&#xff0c;创建了业内独有的毫末…

点餐项目实现

目录项目简介功能设计数据库表设计用户表订单表菜品表订单详情表&#xff08;关联菜品表和订单表)配置类实体类DishOrderDetailOrderInfoUserInfo统一后端返回内容用户模块用户注册功能mapper接口xml文件controller层前端用户登录功能验证用户账号和密码(session存储)session k…

Oracle表空间详细介绍

表空间概述 Oracle的表空间属于Oracle中的存储结构&#xff0c;是一种用于存储数据库对象(如&#xff1a;数据文件)的逻辑空间&#xff0c;是Oracle中信息存储的最大逻辑单元&#xff0c;其下还包含有段、区、数据块等逻辑数据类型。表空间是在数据库中开辟的一个空间&#xf…

GoEXP规则变更通知 l 信创额外奖励活动

一、规则变更 Goby 致力于打造高质量漏洞 EXP&#xff0c;每个环节的细节都不容忽视。为了提升大家在 Goby 上查看、使用 EXP 等环节的体验&#xff0c;我们针对 GoEXP 计划规则中的 EXP 参数部分提出规约。 参数名必须要⻅名思义&#xff0c;禁⽌使⽤套⽤。 反例&#xff1…

Mybatis-Plus--LambdaQueryChainWrapper--使用/实例

原文网址&#xff1a;Mybatis-Plus--LambdaQueryChainWrapper--使用/实例_IT利刃出鞘的博客-CSDN博客 简介 说明 本文用示例介绍Mybatis-Plus的LambdaQueryChainWrapper的用法。 这种用法是使用Mybatis-Plus进行查询最好用的方法&#xff0c;用过一次后就不会再想用其他写法了…

某有色金属集团主数据管理面临的问题和解决方案

某有色金属集团成立于2002年&#xff0c;出资人为省国资委&#xff0c;注册资金12.6亿元人民币。以有色金属、稀有金属、黄金资源开发为主&#xff0c;集地质勘查、采矿、选矿、冶炼、加工、科研设计、机械制造、建筑安装、商贸物流及物资进出口、房地产开发、物业管理为一体的…

获得认证标志证书VMC教程

Verified Mark Certificate(VMC)是由证书颁发机构颁发的用于验证徽标所有权的数字证书。在收到VMC之前&#xff0c;您的徽标必须是注册商标。 VMC验证您的组织是您品牌徽标的合法所有者。使用带有VMC的徽标有助于防止垃圾邮件发送者和其他恶意用户使用他们不拥有的品牌徽标。注…

Linux权限介绍

文章目录Linux权限介绍1. shell命令及原理2. Linux权限的概念3. Linux权限管理3.1 人&#xff08;用户&#xff09;3.2 事物属性(文件类型和访问权限)3.3 文件访问权限的相关设置方法3.3.1 chmod3.3.2 chown3.3.3 chgrp3.4 file指令3.5 目录权限3.6 默认权限3.7 粘滞位3.7.1. 了…

matlab学习笔记(七)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 matlab学习笔记&#xff08;七&#xff09;一、 LTI系统的响应impulse( ) 函数step( )函数lsim( )函数系统无初态时系统有初始状态时二、使用步骤A1&#xff1a;A2&#xff1…

Sentinel原理分析

1.概述 Sentinel(分布式系统的流量防卫兵)是阿里开源的一套用于服务容错的综合性解决方案; Sentinel是面向分布式服务架构的轻量级流量控制组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护等多个维度来帮助您保障微服务的稳定性; 本质要做的就是两件事: …

第2部分 路由器基本配置

目录 2.1 路由器及IOS 简介 2.1.1 路由器简介 2.1.2 IOS 简介 2.1.3 CDP 协议介绍 2.2 路由器基本配置命令汇总 2.1 路由器及IOS 简介 2.1.1 路由器简介 路由器能起到隔离广播域的作用&#xff0c;还能在不同网络间转发数据包。路由器实际上是一台特殊用途的计算机&#…