当前位置: 首页 > news >正文

【I/O多路复用】

基于I/O多路复用的并发编程

  • I/O
    • 实现I/O多路复用
      • select
        • 优缺点
      • poll
      • epoll
        • 优点

I/O

I/O复用是基于一个单进程或单线程的一个执行流当中监控多个输入输出流的技术(网络套接字或者文件描述符进行监控)。单进程或单线程,允许多个用户对单进程发起连接进行I/O事件的处理。不在需要每一个连接创建一个独立的进程或线程单独服务,减少了操作系统的资源消耗和提高了运行效率。一旦某一个文件描述符的读或写事件就绪,就执行相应的I/O事件。

实现I/O多路复用

实现I/O多路有三种方法,select,poll,和epoll。实现的原理都是将多个描述符进行监听,当某一个描述符的读或写事件就绪时,OS就会进行回调,用户层通过对所有的文件描述符进行循环遍历,执行对应的I/O事件。

select

select使用一个fd_set的数据类型来表示多个描述符。每个比特位表示描述符的数字,比特位的0和1表示事件的是否就绪,相当于一个位图。select可以关心三种事件进行关心,读,写和异常事件(超时)的关心。对于select这三种事件都有各自的fe_set数据类型所关心的事件变量。当有事件就绪时,便返回到用户层,用户层通过遍历保存了描述符的数组进行遍历,执行对应的I/O事件。当有新的网络连接到来时,连接先不会进行I/O的处理,而是先将新连接的套接字给select进行事件监控,不在需要等待对方发送数据到自己时这段时间回阻塞,一旦事件就绪了,系统调用就会通知上层。一旦accept成功,不能直接进行I/O处理,因为数据可能没有就绪,如果直接调用recv或read可能会导致阻塞或者其他连接无法通信。服务器调用select函数后,会进入无限循环,监测两种事件,一种是对端发起新的连接,一种是已经连接好的描述符事件已经就绪。每次有新连接的描述符,就添加到用户层管理的数组和内核态fd_set类型的关心读写或异常的变量中。每当有一个连接关闭,就把相应的描述符关闭然后置为无效。

int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);

nfds表示描述符中最大的描述符值加1。
timeout是设置select对某个描述符得等待时长,如果位nullptr,则阻塞等待事件,直到有事件就绪。如果timeout设置{0,0}表示非阻塞的轮询等待。{num,0}表示在0到num时间内没有事件到来则进行返回。返回值是大于一个位0的数,则表示有多少个描述符读写或异常数据就绪了,0为表示超时发送,事件的状态没有方式改变。-1表示出错。

//处理描述机会的宏
void FD_ZERO(fd_set *set);/*将事件的描述符集全部清空*/
void FD_SET(int fd, fd_set *set);/*将文件描述符设置到集合中,表示对该文件描述符的事件关心*/
void FD_CLR(int fd, fd_set *set);/*将对应的文件描述符在集合中清理*/
int  FD_ISSET(int fd, fd_set *set);/*判断该文件描述符是否在集合中*/

在这里插入图片描述

优缺点

优点:可以对多个描述符进行事件的监控,提高I/O效率。
缺点:因为是使用一个fd_set的数据类型对于描述符的,该类型的能关心的事件只有1024个描述符,有上限的问题。每次有新的事件到来,都要用户层对事件进行重新设置,就要重用户态转到内核态。每次事件就绪,用户层就要到内核态,内核态需要遍历描述符集。造成效率低下。

poll

poll也可以对多个描述符进行监控等待事件的就绪。在网络连接中,当有listen套接字创建成功的时候,可以对pollfd类型的数据进行填充。poll的相较于select,不在需要用户层在对事件的重新设置,事件的关心由一个结构体pollfd关心,

 struct pollfd{int fd;			/* File descriptor to poll.  */short int events;		/* Types of events poller cares about.  */short int revents;		/* Types of events that actually occurred.  */};
int poll(struct pollfd *fds, int nfds, int timeout);

pollfd由一个整形文件描述符,和两个short int类型的事件组成,events和revents,表示关心的事件和返回的事件。*fds表示的是一个数组的首元素,nfds表示个数,timeout为等待事件。因为poll的事件关心分离了,不像select需要每次都需要重置对事件的关心。

epoll

epoll模型则可以管理在内存大小允许数量的文件描述符,epoll模型有两个重要的数据构,一个是红黑树,一个是队列,红黑树对文件描述符进行管理监听,当某个文件描述符的事件就绪时,就将文件描述符添加到队列,队列的都是事件就绪的文件描述符,操作系统对就绪队列的事件进行执行。

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);//添加文件描述符到epoll模型
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);//监听epoll模型的文件描述符事件是否就绪
优点

没有最大并发限制:epoll所支持的FD(文件描述符)上限是最大可以打开文件的数目。这使得epoll能够轻松处理成千上万的并发连接,而不会像select或poll那样受到文件描述符数量的限制。

高效处理大量并发连接:epoll通过红黑树管理所有的socket描述符,并且只返回那些活跃的、即准备就绪进行I/O操作的事件。这避免了遍历整个文件描述符集合的需求,从而显著提高了效率。

减少不必要的内存拷贝:epoll通过内核与用户空间mmap同一块内存来实现消息的传递,避免了传统模型中用户态和内核态之间频繁的内存拷贝。这种机制减少了数据传输的开销,提高了整体的性能。

事件驱动机制:epoll采用事件驱动的方式来处理I/O事件,这意味着它只会在有事件发生时才通知应用程序。这与传统的轮询机制相比,极大地减少了无效的检查和等待时间,提高了系统的响应速度和吞吐量。

相关文章:

【I/O多路复用】

基于I/O多路复用的并发编程 I/O实现I/O多路复用select优缺点 pollepoll优点 I/O I/O复用是基于一个单进程或单线程的一个执行流当中监控多个输入输出流的技术(网络套接字或者文件描述符进行监控)。单进程或单线程,允许多个用户对单进程发起连…...

【python报错已解决】“IndexError: list index out of range”

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引言 你是否在处理Python列表时遇到了“IndexError: list index out of range”的错误?这个错误可能会让你的程序中…...

oracle和mysql查询某字段在哪个表中

oracle和mysql查询某字段在哪个表中 oracle的 select TABLE_NAME from user_tab_columns where COLUMN_NAME字段名mysql的: select table_schema ,table_name from information_schema.columns where column_name ‘字段名’ 查询结果table_schema为数据库名&a…...

TCP vs UDP:揭秘可靠性与效率之争

概述 今天我们开始主要讲解TCP的相关知识点。在之前讲解分层章节的时候,我们提到过一个重要观点。在网络层及以下几层,更多的是让主机与主机建立连接,也就是说你的电脑需要知道另一台电脑在哪里才能连接上它。然而,在网络中的通信…...

“树”的高度的计算——CSP-J1真题详解

如同树有高度一样,数据结构中的“树”也有高度,只不过这个高度指的是第几“层”。就像武功可以修炼到第几层一样,树也可以长到第几层。 需要指明的是,树的根节点属于第几层是没有严格的定义的,一般被认为是处于第0层或…...

Docker介绍、docker安装以及实现docker的远程管理

1.Docker介绍 1.Docker介绍 Docker 是⼀个开源的应用容器引擎,可以实现虚拟化,完全采用“沙盒”机制,容器之间不会存在任何接口。 Docker 通过 Linux Container(容器)技术将任意类型的应用进行包装,变成一…...

【UE5】基于摄像机距离逐渐剔除角色

效果 步骤 1. 新建一个工程,在内容浏览器中添加第三人称游戏内容包 2. 找到第三人称角色的材质实例“MI_Quinn_01”并打开 找到材质实例的父项材质“M_Mannequin” 打开材质“M_Mannequin” 在材质图表中添加如下节点 此时运行效果如文章开头所示。 参考视频&#…...

LabVIEW优化内存使用

在LabVIEW中,优化内存使用的关键在于理解LabVIEW的内存管理机制并采用一些最佳实践。以下是一些可能帮助减少内存占用的方法: 1. 减少数据副本的生成 避免不必要的数据复制:每当你在程序中传递数组或子数组时,LabVIEW可能会创建副…...

多进程和多线程基础概念LINUX

进程和程序的区别 程序是静态的,它是保存在磁盘上的指令的有序集合,没有任何执行的概念进程是一个动态的概念,它是程序执行的过程,包括了动态创建、调度和销毁的整个过程 并行:在 cpu 多核的支持下,实现物…...

React Native的Android端fetch的网络请求FormData请求错误:TypeError:Network request failed

// formdataconst formData new FormData();formData.append("code", appUserCode);formData.append("wallet", appName);// const formDataStr code appUserCode &wallet appName;// 参数形式//const _body code${appUserCode}&wallet${app…...

python之matplotlib (1 介绍及基本用法)

介绍 matplotlib是Python中的一个绘图库,它提供了一个类似于 MATLAB 的绘图系统。使用matplotlib你可以生成图表、直方图、功率谱、条形图、错误图、散点图等。matplotlib广泛用于数据可视化领域,是 Python 中最著名的绘图库之一。 同样matplotlib的安…...

ROS2常用指令

ROS2(Robot Operating System 2)是一个用于机器人软件开发的灵活框架,它提供了一套丰富的工具和库来支持机器人的开发、模拟、部署和测试。ROS2的常用指令可以大致分为几个类别,包括功能包管理、节点管理、话题管理、服务管理、动…...

SQL注入(原理、分类、union、POST注入)

目录 【学习目标、重难点知识】 【学习目标】 【重难点知识】 SQL注入简介 SQL注入原理 SQL注入类型 MySQL与SQL注入的相关知识 information_schema 数据库的结构 数据库查询语句 limit的用法 需要记住的几个函数 注释符号 SQL注入探测方法 SQL注入漏洞攻击流程…...

【勒索病毒应急响应流程】

概述 不同应急事件响应方式不同,建议大家阅读以下案例,解决自己当前的困扰,当然也可以根据自己的经验对文章进行补充和修正,欢迎在评论区留言。 案例1 事件概述 某安服团队接到某政府部门的远程应急响应求助,要求对被勒索服务器进行排查分析并溯源。 排查溯源 1、应…...

C ++初阶:C++入门级知识点

目录 🌞0.前言 🚈1.C输入输出 🚈2.缺省参数 🚝2.1全缺省参数 🚝2.2半缺省参数 🚈3.函数重载 🚝3.1参数类型不同 🚝 3.2参数个数不同 🚝3.3参数类型顺序不同 ​…...

php中如何高效地实现一个函数以判断给定日期是否位于多个预定义的时间范围内,同时确保代码的可读性、可维护性和性能优化

背景信息: 我有一个包含多个时间范围的数组,每个时间范围由起始日期和结束日期组成(目前以字符串形式给出),例如: $ranges [[start > 2023-01-01, end > 2023-03-31],[start > 2023-06-01, end …...

存在重复元素 II(LeetCode)

题目 给你一个整数数组 nums 和一个整数 k &#xff0c;判断数组中是否存在两个 不同的索引 i 和 j &#xff0c;满足 nums[i] nums[j] 且 abs(i - j) < k 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 解题 """ 时间复杂度…...

认知杂谈21

今天分享 有人说的一段争议性的话 I I 自在之“坏”&#xff1a;真实自我的绽放 在社交场合中&#xff0c;听到“他不是个好人”这句话可能会让人惊讶&#xff0c;但其实被贴上“坏人”标签的人往往敢于跳出规则框架&#xff0c;展现真实自我。他们不做表面和谐的牺牲品&am…...

2024前端面试题-工程化篇

1.webpack&#xff08;模块打包工具&#xff09;五大核心 Entry入口&#xff0c;Output定义输出路径和命名规则&#xff0c;Loader模块转换器&#xff0c;Plugin扩展插件&#xff0c;Mode模式&#xff08;Webpack使用相应模式的配置&#xff09; 2.谈一谈你对Loader和Plugin的…...

【附源码】Python :PYQT界面点击按钮随机变色

系列文章目录 Python 界面学习&#xff1a;PYQT界面点击按钮随机变色 文章目录 系列文章目录一、项目需求二、源代码三、代码分析3.1 导入模块&#xff1a;3.2 定义App类&#xff1a;3.3 构造函数&#xff1a;3.4 初始化用户界面&#xff1a;3.5 设置窗口属性&#xff1a;3.6 …...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...