io多路复用:select、poll和epoll

1、为什么使用多路复用:

     1.1单线程BIO监听socket

        多路复用一般用于网络io当中,提到网络io我们肯定能想到socket。如果我们想要一个线程单纯的用向下文的方式监听很多个socket看他是否有事件发生,那这样是不可行。

但上一个socket1没有可读事件时会阻塞,则此时socket2有可读事件也无法读取到。 

    1.2多线程监听socket

        如果使用多线程监听socket的话,每来一个连接就创建一个新的线程,那这种方法光听着就效率低下,因为线程之间的切换是要消耗资源的。线程过多导致线程切换频繁,效率低。

     1.3多路复用机制的诞生

        多路复用其实就是使用一个线程监听多个socket,那为什么现在不会出现前面讲的那个单线程问题呢,因为现在这个线程只是监听是否有io事件发生,并不真正的进行读取。再Linux系统中每一个socket就是一个文件,每个文件由唯一一个文件描述符表示。当这个多路复用器想要监听放入到一个集合当中,当有事件发生时会将有事件发生的文件描述符特殊标记,表示它有事件发生,然后再将这个io事件分发给真正做事的线程去完成。所以复用是复用再事件的检测方面。让事件检测和事件处理进行解耦。

2、多路复用器的类别及说明

        多路复用器有三中,分别为select、poll和epoll。现在大部分使用的都是epoll。如redis使用的就是epoll。

     2.1 select(假设只检测可读事件):

        select实现多路复用的方式就是想要监听的Socket放入到一个fds(文件描述符集合)当中。它会先把这个集合拷贝到内核空间当中,然后遍历fds看看里面有没有可读事件,如果没有的话会进行阻塞,直至有可读事件发生,当有可读事件发生时(超过超时时间也会停止阻塞),线程会被唤醒并再遍历一遍将可读事件给进行标记。此时将这个集合再次拷贝从内核到用户态。然后用户监听要再次遍历这个集合将其有可读事件的socket找出来然后仍给工作线程进行处理。

        select使用的时固定长度的BitsMap来作为fds。所以说它可监听的socket是有限制的,在Liunx当中默认最多监听1024个socket文件。

从上面的描述当中我们可以看到select有着一些明显的缺点。例如:它使用的是固定长度的BItsMap来作为fds,导致所监听的socket文件数量有限制。还有我们可以看到这个监听的过程中有着两次的fds的拷贝,当次数、数量多起来后这也是性能的一大痛点。还有他对于查询有可读事件的时候要线性遍历fds,返回到用户态时用户还得再次线性遍历一次,查出哪些具有可读状态。

    2.2poll

        poll其实和select没有太大的区别,它两唯一大的区别就是poll改用动态数组来作为fds(文件描述符集合)。这样就解决了select在监听数量上的限制了,但在效率方面并没有改进,还是需要进行拷贝和线性遍历。

    2.3 epoll(相较于前两个效率有了很大的提升)

        这个就是epoll的结构。首先我们需要使用epoll_create方法在内核当中创建epoll对象。再epoll对象中有一个红黑树。这个红黑树的作用就相当于fds(文件描述符集合)。再这颗树上存着要检测的socket文件。再之前的select/poll中是没有再内核中专门创建存放fds的空间的,导致每次调用都要将fds拷贝一遍到内核当中。而此时epoll使用红黑树将fds一直存在内核当中,不再需要每次进行拷贝,当需要增加新的带检测的socket时直接调用epoll_ctl进行添加就行,时间复杂度为(logn)。

        对于事件的检测epoll使用了事件驱动,也就是当某个socket有事件发生时,内核会有回调方法将其加入到就绪队列当中。这个就绪队列就是记录被检测socket中有事件发生的socke。此时我们不需要进行遍历所有socket查询是哪个socket具有事件。

        当我们调用epoll_waitl方法时,它的第二个参数是一个epoll_even结构数组指针,当有就绪链表不为空时,就会将链表链表复制到这个数组当中,返回值为一个数值,表示有多少个事件发生。此时可以通过操作这个数组直接进行数值处理,不用遍历一整个fds。

3、总结

        select,poll,epoll都是IO多路复用机制,即可以监视多个描述符,一旦某个描述符就绪(读或写就绪),能够通知程序进行相应读写操作。 但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。

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

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

相关文章

Codewhisperer 使用评价

最近亚⻢逊推出了一款基于机器学习的 AI 编程助手 Amazon CodeWhisperer,可以实时提供代码建议。在编写代码时,它会自动根据现有的代码和注释给出建议。Amazon CodeWhisperer 与GitHub Copilot类似,主要的功能有: 代码补全注释和文档补全代码…

Banana Pi BPI-W3之RK3588安装Qt+opencv+采集摄像头画面.

场景:在Banana Pi BPI-W3 RK3588上做qt开发工作RK3588安装Qtopencv采集摄像头画面 2. 环境介绍 硬件环境: Banana Pi BPI-W3RK3588开发板、MIPI-CSI摄像头( ArmSoM官方配件 )软件版本: OS:ArmSoM-W3 Debian11 QT:QT5…

MySQL/Oracle用逗号分割的id怎么实现in (逗号分割的id字符串)。find_in_set(`id`, ‘1,2,3‘) 函数,

1.MySQL 1.1.正确写法 select * from student where find_in_set(s_id, 1,2,3); 1.2.错误示范 select * from student where find_in_set(s_id, 1,2 ,3); -- 注意,中间不能有空格。1、3 select * from student where find_in_set(s_id, 1,2, 3); -- 注意…

【vue】Vue项目中如何在父组件中直接调用子组件的方法

方案一&#xff1a;通过ref直接调用子组件的方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 //父组件中 <template> <div> <Button click"handleClick">点击调用子组件…

在Windows系统中查找GitBash安装位置

使用注册表可以轻松获取&#xff1a; reg query HKEY_LOCAL_MACHINE\SOFTWARE\GitForWindows /v InstallPath | findStr InstallPath此时输出一串字符&#xff0c; 通过字符串切割即可获取&#xff1a;

【PTA题目】6-20 使用函数判断完全平方数 分数 10

6-20 使用函数判断完全平方数 分数 10 全屏浏览题目 切换布局 作者 张高燕 单位 浙大城市学院 本题要求实现一个判断整数是否为完全平方数的简单函数。 函数接口定义&#xff1a; int IsSquare( int n ); 其中n是用户传入的参数&#xff0c;在长整型范围内。如果n是完全…

「Verilog学习笔记」使用8线-3线优先编码器Ⅰ实现16线-4线优先编码器

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 当EI10时、U1禁止编码&#xff0c;其输出端Y为000&#xff0c;GS1、EO1均为0。同时EO1使EI00&#xff0c;U0也禁止编码&#xff0c;其输出端及GS0、EO0均为0。由电路…

软件测试/人工智能丨深入人工智能软件测试:PyTorch引领新时代

在人工智能的浪潮中&#xff0c;软件测试的角色变得愈发关键。本文将介绍在人工智能软件测试中的一些关键技术&#xff0c;以及如何借助PyTorch深度学习框架来推动测试的创新与升级。 PyTorch&#xff1a;深度学习的引擎 PyTorch作为一种开源的深度学习框架&#xff0c;为软件…

LeetCode【36】有效的数独

题目&#xff1a; 思路&#xff1a; https://blog.51cto.com/u_15072778/3788083 代码&#xff1a; public boolean isValidSudoku(char[][] board) {// 二维数组第一个标识 0-9行&#xff0c;第二个表示 0-9数字&#xff0c;存的内容boolean 表示第0-9行&#xff0c;0-9这些…

浏览器内置NoSQL数据库IndexedDB

IndexedDB - 浏览器内容数据库 indexedDB 是一种浏览器内置的NoSQL数据库&#xff0c;它使用键值对存储数据&#xff0c;用于在客户端存储大量结构化数据。它支持离线应用程序和高效的数据检索&#xff0c;可以在 Web 应用程序中替代传统的 cookie 和 localStorage。 IndexDB是…

安装系统时无raid驱动处理办法

场景描述 安装系统时可以进入安装界面&#xff0c;但是无法识别到硬盘&#xff0c;查看服务器硬件均无异常且从bios或者raid配置界面中能正常看到raid信息及硬盘信息&#xff0c;运行lspci 命令查看到服务器有raid卡&#xff0c;但是未加载驱动。 获取驱动程序模块 查看raid…

CV计算机视觉每日开源代码Paper with code速览-2023.11.15

点击CV计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【基础网络架构&#xff1a;CNN】PadChannel: Improving CNN Performance through Explicit Padding Encoding 论文地址&#xff1a;https:/…

CentOS 7.9 安装 epel-release

查看版本 # cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)安装EPEL软件仓库,用于提供额外的软件包 yum install -y epel-releaseyum install -y jqyum install -y htopyum install -y nload参考 EPEL到底是什么&#xff0c;为何经常要安装epel-release软件…

【教3妹学编程-java基础6】详解父子类变量、代码块、构造函数执行顺序

-----------------第二天------------------------ 本文先论述父子类变量、代码块、构造函数执行顺序的结论&#xff0c; 然后通过举例论证&#xff0c;接着再扩展&#xff0c;彻底搞懂静态代码块、动态代码块、构造函数、父子类、类加载机制等知识体系。 温故而知新&#xff…

用户增长模型:3A3R策略模型

一、概述 A - A - A - R - R - R 增长模型&#xff0c;即3A3R策略模型&#xff0c;由海盗模型演变而来&#xff0c;是目前使用最多、适用范围最广的增长策略模型。原始的海盗模型由 Acquisition &#xff08;获客&#xff09;、 Activation &#xff08;活跃&#xff09;、 Re…

华夏ERP打包手册

Maven安装及环境配置 1.下载 浏览器搜索maven点击apache Maven 2.选择安装目录&#xff0c;注意不能有中文 3.环境变量配置 点击计算机右键属性>高级系统设置>环境变量 新建系统变量 MAVEN_HOME 变量值是安装目录 进入path点击新建点击编辑&#xff0c;写入% MAVEN_H…

深度学习OCR中文识别 - opencv python 计算机竞赛

文章目录 0 前言1 课题背景2 实现效果3 文本区域检测网络-CTPN4 文本识别网络-CRNN5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习OCR中文识别系统 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;…

Vue3--Vue Router详解--学习笔记

1. 认识vue-router Angular的ngRouter React的ReactRouter Vue的vue-router Vue Router 是Vue.js的官方路由&#xff1a; 它与Vue.js核心深度集成&#xff0c;让Vue.js构建单页应用&#xff08;SPA&#xff09;变得非常容易&#xff1b;目前Vue路由最新的版本是4.x版本。 v…

广州华锐互动:办税服务厅税务登记VR仿真体验让税务办理更加灵活高效

在数字化世界的今天&#xff0c;我们正在见证各种业务过程的转型&#xff0c;而税务办理也不例外。最近&#xff0c;一种全新的交互方式正在改变我们处理税务的方式&#xff1a;虚拟现实&#xff08;VR&#xff09;。 首先&#xff0c;用户需要戴上虚拟现实头显&#xff0c;然后…

VS Code如何使用服务器的Python开发环境

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…