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

【Linux】I/O多路复用

文章目录

  • I/O多路复用
    • select()
      • select()缺点
    • poll()
      • poll()缺点
    • epoll()
      • LT(水平触发模式)
      • ET(边缘触发模式)
      • 具体函数

I/O多路复用

  • 多进程和多线程实现并发会消耗大量的资源,主进程/线程用于监听和接受连接,再创建多个子进程/子线程来完成与连接的各个客户端的通信。
  • I/O多路复用使程序能够同时监听多个文件描述符,能够提高程序的性能,Linux下实现I/O多路复用的系统调用主要有select、poll、epoll。
  • 监听文件描述符的I/O请求实际上是检测其相应的I/O缓冲区是否有数据

select()

  • 构造一个文件描述符列表,限制1024个,将指定的需要被监听的文件描述符添加到该列表中,采用位视图法。
  • 调用一个系统函数监听列表中的文件描述符,直到这些描述符中的一个或者多个进行I/O操作时,该函数返回,该函数是阻塞的且由内核完成对文件描述符的检测操作,将用户态的文件描述符列表拷贝到内核态进行检测。
  • 返回时,会通知进程有几个文件描述符要进行I/O操作,将内核态检测的文件描述符列表更新再拷贝到用户态,具体是哪些文件描述符还需要从监听的文件描述符开始再次遍历更新后的文件描述符列表。
  • 因为内核会改变原本的文件描述符列表,所以需要设置两个列表,一个记录需要监听的文件描述符,仅在添加或删除文件描述符时改变,另一个负责送入内核进行检测并进行交互。
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
//成功时,返回准备好的文件描述符数量。被信号打断时,返回-1,超时时,返回0。//nfds: 需要监控的文件描述符集合中最大的文件描述符加1,即监控多少个文件描述符。//readfds: 指向一个fd_set文件描述符列表结构的指针,用于存放需要检查可读性的文件描述符集合,由内核完成对文件描述符的检测操作。//writefds: 同上,但用于存放需要检查可写性的文件描述符集合。//exceptfds: 同上,用于存放需要检查异常事件(如错误状态)的文件描述符集合。//timeout: 指定select调用的最长等待时间。如果为NULL,select将一直阻塞直到有描述符准备好;如果指向一个非零超时时间,则等待指定的时间,到期后无论是否有描述符准备好都将返回。fd_set read;//创建文件描述符列表,判断读
FD_ZERO(&read);//初始化列表
FD_SET(3,&read);//将文件描述符3添加到列表中
FD_SET(5,&read);//将文件描述符5添加到列表中
FD_SET(100,&read);//将文件描述符100添加到列表中
select(101,&read,NULL,NULL,NULL);//送入内核检测文件描述符的IO操作,并返回个数
FD_ISSET(3,&read);//判断文件描述符3是否在列表中
FD_CLR(100,&read);//将文件描述符100从列表中清除

select()缺点

  • 每次调用select都需要将文件描述符列表从用户态复制到内核态,开销较大
  • 在内核中每次都要遍历这个文件描述符列表,开销较大
  • select的文件描述符列表大小仅有1024个,个数较少
  • 文件描述符列表每次都要重置,需要两个文件描述符列表,一个用于记录需要监听的,另一个则和内核交互。

poll()

  • 使用pollfd结构体数组来记录需要监听的文件描述符和相应的事件,改进了select限制1024个文件描述符的大小,可以自行指定。
  • 结构体中还有events以及revents表示监听的事件和返回时触发的事件,不需要像select一样重置文件描述符列表。
  • 结构体数组需要拷贝到内核中,由内核对需要进行I/O操作的文件描述符进行检测
  • 返回时,会通知进程有几个文件描述符要进行I/O操作,具体是哪些文件描述符还需要遍历数组。
struct pollfd {int fd; /* 文件描述符 */short events;/* 监视的事件,可以是 POLLIN(读)、POLLOUT(写)、POLLERR(错误)等 */short revents;/* 返回时,被触发的事件 */
};
#include <poll.h>int poll(struct pollfd *fds, nfds_t nfds, int timeout);
//fds: 指向pollfd结构体数组的指针,每个结构体代表一个要监控的文件描述符及其相关的事件。//nfds: 数组fds中元素的个数,即要监控的文件描述符的数量。//timeout: 指定poll()函数的等待时间,单位为毫秒。可以是正值(等待指定的毫秒数后返回)、0(立即返回,不管文件描述符是否就绪)、-1(无限等待,直到至少有一个文件描述符就绪)

poll()缺点

  • 在处理文件描述符时,仍需要将结构体数组拷贝到内核且仍需遍历整个pollfd数组。
  • 返回值依然是需要执行I/O操作的文件描述符的个数,还需要遍历具体是哪些文件描述符。
  • 与select()一样,当监控的文件描述符数量巨大时,poll()需要维护一个较大的数组,这会消耗较多的内存

epoll()

  • epoll与poll大致相同但是epoll更为高效,采用红黑树作为底层的数据结构,通过epoll对象来监听处理多个文件描述符,epoll不仅会返回需要进行IO的文件描述符个数,也会直接返回具体的需要进行I/O的文件描述符,存储在epoll_event结构体数组中。
  • 创建对象后,内核维护的eventpoll结构体存储与epoll对象相关的信息,包括但不限于:
    一个红黑树(rb_root),用于快速插入和删除文件描述符(通过文件描述符的值作为键)。
    一个双向链表(rdlist),用于维护就绪事件epoll_event的列表,以供epoll_wait快速检索。
    一个等待队列头(wq),用于存放等待epoll_wait调用的进程。
  • epoll_event结构体
struct epoll_event {uint32_t events;   // 指定的和发生的事件掩码epoll_data_t data; // 用户定义的数据,可以存储文件描述符或其他信息
};//events字段可以是如下标志的组合:
/*
EPOLLIN:可读事件。
EPOLLOUT:可写事件。
EPOLLERR:错误事件。
EPOLLHUP:挂起事件。
EPOLLET(边缘触发)和EPOLLLEVEL(水平触发)等。
*/

LT(水平触发模式)

  • 在这种模式下,只要文件描述符上的事件(如可读、可写)保持激活状态,每次调用epoll_wait时,都会报告该事件。
  • 即使应用程序未完全处理完缓冲区中的数据,下次调用epoll_wait时,只要数据仍然可读(或可写),事件还会被触发。
  • 可能导致同一事件被多次报告,因此,应用程序需要能够处理重复的事件通知。

ET(边缘触发模式)

  • 在这种模式下,epoll_wait仅在文件描述符的就绪状态发生变化时报告一次事件,之后不会重复报告,除非该事件状态再次改变。
  • 一旦某个事件被消费(比如读取了新到的数据),直到又有新的数据到达或状态再次改变之前,epoll_wait不会再报告相同的事件。
  • 需要应用程序一次性完全处理事件,否则可能会错过后续的通知。例如,如果缓冲区中有数据可读但应用程序没有读完,下次调用epoll_wait可能不会再次通知,直到有新的数据到来。
  • 需要使用非阻塞的接口避免把处理多个文件描述符的任务饿死。
fcntl(fd, F_SETFL, fcntl(fd,F_GETFL,0)| O_NONBLOCK)//获取并设置非阻塞
  • 更节省资源,减少不必要的唤醒和上下文切换,适合处理高负载和高吞吐量的场景。

具体函数

int epoll = epoll_create(1); // 创建epoll对象,参数通常设为1,成功时返回新的epoll文件描述符,同时内核会生成一个eventpoll结构体用来负责维护一个高效的事件等待列表,以及处理文件描述符的添加、修改、删除和事件的等待与通知,epoll文件描述符用来标识该eventpoll结构体。struct epoll_event event;
event.events = EPOLLIN | EPOLLET; // 监听读事件,使用边缘触发模式event.data.fd = socket_fd; // 监听的socket描述符int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
//控制epoll对象上的文件描述符监控事件,可以添加、修改或删除监控。
//成功时返回0,失败时返回-1并设置errno。
//epfd:由epoll_create返回的epoll文件描述符,标识eventpoll。
//op:操作类型,可以是
/*
EPOLL_CTL_ADD(添加)、EPOLL_CTL_MOD(修改)、EPOLL_CTL_DEL(删除)。
*/
//fd:要操作的文件描述符。
//event:指向epoll_event结构体的指针,指定了要监控的事件类型。int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
//等待一个或多个epoll事件的发生,获取准备就绪的epoll_enent事件。
//成功时返回就绪的文件描述符数量,0表示超时,-1表示出错。
//epfd:epoll文件描述符。
//events:指向epoll_event结构体数组的指针,用于存放发生的事件信息。
//maxevents:events数组的最大容量,即最多可以返回的事件数量。
//timeout:等待超时时间,单位为毫秒,-1表示无限等待,0表示立即返回,正值为等待的最长时间。

相关文章:

【Linux】I/O多路复用

文章目录 I/O多路复用select()select()缺点 poll()poll()缺点 epoll()LT(水平触发模式)ET(边缘触发模式)具体函数 I/O多路复用 多进程和多线程实现并发会消耗大量的资源&#xff0c;主进程/线程用于监听和接受连接&#xff0c;再创建多个子进程/子线程来完成与连接的各个客户端…...

ubuntu20.0.4下安装PyTorch

参考文档 https://datawhalechina.github.io/thorough-pytorch/%E7%AC%AC%E4%B8%80%E7%AB%A0/1.2%20PyTorch%E7%9A%84%E5%AE%89%E8%A3%85.html 1&#xff1a;安装Anaconda 登录Anaconda | Individual Edition&#xff0c;https://www.anaconda.com/download/success &#xff…...

Android屏幕旋转流程(1)

&#xff08;1&#xff09;Gsensor的注册和监听 App -->I2C过程&#xff1a;App通过SensorManager.getSystemServer调用到SystemSensorManager&#xff0c;SystemSensorManager通过jni调用到SensorManager.cpp&#xff0c;后通过binder调用到SensorService。SensorService通…...

JS常见的运算符有哪些?

在JavaScript中&#xff0c;常见的运算符可以分为以下几类&#xff1a; 算术运算符&#xff1a; &#xff1a;加法-&#xff1a;减法*&#xff1a;乘法/&#xff1a;除法%&#xff1a;取余&#xff08;模运算&#xff09;&#xff1a;递增--&#xff1a;递减**&#xff1a;幂运…...

【scikit-learn入门指南】:机器学习从零开始

1. 简介 scikit-learn是一款用于数据挖掘和数据分析的简单高效的工具&#xff0c;基于NumPy、SciPy和Matplotlib构建。它能够进行各种机器学习任务&#xff0c;如分类、回归和聚类。 2. 安装scikit-learn 在开始使用scikit-learn之前&#xff0c;需要确保已经安装了scikit-le…...

MEMS:Lecture 17 Noise MDS

讲义 Minimum Detectable Signal (MDS) Minimum Detectable Signal&#xff08;最小可检测信号&#xff09;是指当信号-噪声比&#xff08;Signal-to-Noise Ratio, SNR&#xff09;等于1时的输入信号水平。简单来说&#xff0c;MDS 是一个系统能够分辨出信号存在的最低输入信号…...

Windows运维:找到指定端口的服务

运维过windows的或多或少都遇到过需要找到一个端口对应的服务&#xff0c;或者是因为端口占用&#xff0c;或者是想看下对应的服务是哪个&#xff0c;那么如何操作呢&#xff1f;看看本文吧。 1、按照端口找到进程ID 例如想找8000端口的进程ID netstat -ano | findstr :8000 2…...

Linux文件系统讲解!

一、Linux文件系统历史 1、在早期的时候Linux各种不同发行版拥有自己各自自定义的文件系统层级结构。 2、当我用Red hat转向玩Debian时&#xff0c;我进入/etc我都是懵的。 3、后来Linux社区做了一个标准、FHS&#xff08;文件系统标准层次结构&#xff09;。来帮助Linux系统的…...

mysql集群,两主两从,使用mysql-proxy实现读写分离

主从复制 一、IP规划 服务器IP备注master1192.168.100.131master2的从master2192.168.100.132master1的从slave1192.168.100.134slave1的从slave2192.168.100.135slave2的从mysql-proxy192.168.100.137 二、具体配置 1.master1 ​ 配置ip&#xff1a;192.168.100.131 ​ …...

Linux文本处理三剑客+正则表达式

Linux文本处理常用的3个命令&#xff0c;脚本或者文本处理任务中会用到。这里做个整理。 三者的功能都是处理文本&#xff0c;但侧重点各不相同&#xff0c;grep更适合单纯的查找或匹配文本&#xff0c;sed更适合编辑匹配到的文本&#xff0c;awk更适合格式化文本&#xff0c;对…...

Linux启动KKfileview文件在线浏览时报错:启动office组件失败,请检查office组件是否可用

目录 1、导论 2、报错信息 3、问题分析 4、解决方法 4.1、下载 4.2、安装步骤 1、导论 今天进行项目部署时&#xff0c;遇到了一个问题。在启动kkfileview时&#xff0c;出现了报错异常&#xff1a; 2024-06-09 06:36:44.765 ERROR 1 --- [ main] cn.keking.service.Of…...

React <> </>的用法

React &#xff1c;&#xff1e; &#xff1c;/&#xff1e;的用法 介绍为什么使用 <>&#xff1f;例子解释 关于顶级元素总结 介绍 在 React 中&#xff0c;使用 <> 表示一个空标签或片段&#xff08;Fragment&#xff09;&#xff0c;这是一个简洁的方式来包裹一…...

is not null 、StringUtils.isNotEmpty和StringUtils.isNotBlank之间的区别?

这三者主要是针对对象是否为空、是否为空串和是否为空白字符串有不同的功能。 is not null 只是说明该对象不为空&#xff0c;没有考虑是否为空串和空白字符串。 StringUtils.isNotEmpty检查字符串是否不为 null且长度大于零&#xff0c;不考虑字符串中的空白字符。 StringU…...

Git使用-gitlab上面的项目如何整到本地的idea中

场景 一般我们在开发项目或者接手某个项目时&#xff0c;基本都要接触Git&#xff0c;比如上传项目代码&#xff0c;下载同事给你的交接代码等等。 这是一个基本功&#xff0c;小小整理一下日常操作中的使用。 第一步&#xff1a;在 GitLab 上找到你要克隆的项目&#xff0c;复…...

活体检验API在Java、Python、PHP中的使用教程

活体检验API是一种基于生物特征的身份验证技术&#xff0c;通过分析和识别用户的生物信息来确认其身份。这种技术广泛应用于各种领域&#xff0c;如金融、安全、社交媒体等&#xff0c;以提高身份验证的安全性和准确性。以下是描述”活体检验API”背景的一些关键点&#xff1a;…...

智能计算系统-概述

1、人工智能技术分层 2、人工智能方向人才培养 3、课程体系的建议 4、智能系统课程对学生的价值 5、智能计算系统对老师的价值 6、什么是智能计算系统 7、智能计算系统的形态 8、智能计算系统具有重大价值 9、智能计算系统的三大困难 10、开创深度学习处理器方向 11、寒武纪的国…...

SM5101 SOP-8 充电+触摸+发执丝控制多合一IC触摸打火机专用IC

SM5101 SOP-8 2.7V 涓流充电 具电池过充过放 触摸控制 发热丝电流控制多功能为一体专用芯片 昱灿-海川 SM5101 SOP-8 充电触摸发执丝控制多合一IC触摸打火机方案 &#xff01;&#xff01;&#xff01; 简介&#xff1a; SM5101是一款针对电子点烟器的专用芯片&#xff0c;具…...

Mysql-题目02

下面列出的&#xff08; DBMS &#xff09;是数据库管理系统的简称。 A、DB&#xff08;数据库&#xff09; B、DBA C、DBMS(数据库管理系统&#xff09; D、DBS&#xff08;数据库系统) 以下选项中&#xff0c;&#xff08; 概念模式 &#xff09;面向数据库设计人员&…...

Swift开发——循环执行方式

本文将介绍 Swift 语言的循环执行方式 01、循环执行方式 在Swift语言中,主要有两种循环执行控制方式: for-in结构和while结构。while结构又细分为当型while结构和直到型while结构,后者称为repeat-while结构。下面首先介绍for-in结构。 循环控制方式for-in结构可用于区间中的…...

Navicat和SQLynx产品功能比较一(整体比较)

Navicat和SQLynx都是数据库管理工具&#xff0c;在过去的二十年中&#xff0c;国内用户主要是使用Navicat偏多&#xff0c;一般是个人简单开发需要&#xff0c;数据量一般不大&#xff0c;开发相对简单。SQLynx是最近几年的数据库管理工具&#xff0c;Web开发&#xff0c;桌面版…...

pip 配置缓存路径

在windows操作平台&#xff0c;默认情况&#xff0c;pip下使用的系统目录 C:\Users\用名名称\AppData\Local\pip C盘是系统盘&#xff0c;如果常常使用pip安装会占用大量的空间很快就满&#xff0c;这时候就有必要变更一下缓存保存路径了。 pip 配置缓存路径&#xff1a; Win…...

大数据开发语言Scala(一) - Scala入门

引言 在当今的大数据时代&#xff0c;数据量和数据处理的复杂性不断增加&#xff0c;传统的编程语言已经难以满足需求。Scala作为一门新兴的编程语言&#xff0c;以其简洁、强大和高效的特性&#xff0c;迅速成为大数据开发的热门选择。本文将详细介绍Scala语言的基础知识&…...

大模型中的计算精度——FP32, FP16, bfp16之类的都是什么???

大模型中的计算精度——FP32, FP16, bfp16之类的都是什么&#xff1f;&#xff1f;&#xff1f; 这些精度是用来干嘛的&#xff1f;&#xff1f;混合精度 mixed precision training什么是混合精度&#xff1f;怎么转换呢&#xff1f; 为什么大语言模型通常使用FP32精度训练量化…...

在矩池云使用GLM-4的详细指南(无感连GitHubHuggingFace)

GLM-4-9B 是智谱 AI 推出的最新一代预训练模型 GLM-4 系列中的开源版本&#xff0c;在多项测试中表现出超越已有同等规模开源模型的性能&#xff0c;它能兼顾多轮对话、网页浏览、代码执行、多语言、长文本推理等多种功能&#xff0c;性能更加强大。其多模态语言模型GLM-4V-9B在…...

大模型日报2024-06-15

大模型日报 2024-06-15 大模型资讯 新技术提升大型语言模型推理能力 摘要: 一种新技术使得像GPT-4这样的大型语言模型能够通过编写Python代码&#xff0c;更准确地解决数值或符号推理任务。 大型语言模型革命性提升蛋白质序列理解 摘要: 研究人员将蛋白质序列与自然语言进行类比…...

【YOLO系列】YOLOv1学习(PyTorch)原理加代码

论文网址&#xff1a;https://arxiv.org/pdf/1506.02640 训练集博客链接&#xff1a;目标检测实战篇1——数据集介绍(PASCAL VOC&#xff0c;MS COCO)-CSDN博客 代码文件&#xff1a;在我资源里&#xff0c;但是好像还在审核&#xff0c;大家可以先可以&#xff0c;如果没有的…...

Postman接口测试工具详解:揭秘API测试的终极利器

在现代软件开发中&#xff0c;API接口测试是确保应用程序质量和可靠性的重要环节。Postman&#xff0c;作为一款功能强大且用户友好的API测试工具&#xff0c;受到了广大开发者和测试人员的青睐。本文将详细解析Postman的功能和优势&#xff0c;带你领略这款工具的魅力。 一、…...

紫光展锐5G处理器T750__国产手机芯片5G方案

展锐T750核心板采用6nm EUV制程工艺&#xff0c;CPU架构采用了八核设计&#xff0c;其中包括两个主频为2.0GHz的Arm Cortex-A76性能核心和六个主频为1.8GHz的A55小核。这种组合使得T750具备卓越的处理能力&#xff0c;并能在节能的同时提供出色的性能表现。该核心模块还搭载了M…...

基于深度学习的红外船舶检测识别分类完整实现数据集8000+张

随着遥感技术的快速发展&#xff0c;包括无人机、卫星等&#xff0c;红外图像在船舶检测识别中的作用日益凸显。相对于可见光图像&#xff0c;红外图像具有在夜晚和恶劣天气条件下高效检测识别船舶的天然优势。近年来&#xff0c;深度学习作为一种强大的图像处理技术&#xff0…...

SpringCloud跨服务远程调用

随着项目的使用者越来越多&#xff0c;项目承担的压力也会越来越大&#xff0c;为了让我们的项目能服务更多的使用者&#xff0c;我们不得不需要把我们的单体项目拆分成多个微服务&#xff0c;就比如把一个商城系统拆分成用户系统&#xff0c;商品系统&#xff0c;订单系统&…...

安徽省经工建设集团网站/郑州seo优化

一、时间函数 在使用存储过程&#xff0c;sql函数的时候&#xff0c;会遇到一些对时间的处理。比如时间的获取与加减。这里就用到了sql自带的时间函数。下面我列出这些函数&#xff0c;方便日后记忆&#xff0c;使用。 --getdate 获取当前时间select getdate()--dateadd 原有时…...

佛山网站建设收费标准/小程序引流推广平台

北漂未及三月&#xff0c;最最心累的不仅仅从未接触过的工作&#xff08;怎么就从C开发转到大数据开发了&#xff09;&#xff0c;还有让人一筹莫展、咬牙切齿的租房问题。 一筹莫展 我算是运气比较差的那一部分人了&#xff0c;对象在银行&#xff0c;本来在北京可以直接租个一…...

a站是哪个app/如何让百度搜索排名靠前

Jmeter的运行&#xff1a;打开Jmeter安装包&#xff0c;进入\bin中&#xff0c;找到“jmeter.bat”&#xff0c;双击运行即可。打开界面如图所示&#xff1a; 修改简体中文路径&#xff1a;option->choose Language->chinese(simplified) &#xff08;1&#xff09;获取学…...

南昌专业网站制作公司/百度sem

背景。元素的背景显示区域在内容区和内边距区&#xff0c;并且边框是画在背景之上的。这就是说如果边框的样式是dotted之类的&#xff0c;则边框空隙之间是可以看到背景的。 可以设置背景的声明有&#xff1a;background-color、background-image、background-position、backgr…...

网站平台优化/百度客服号码

第2课-数据的艺术 数据结构起源(1) 计算机从解决数值计算问题到解决生活中的问题。 (2) 现实生活中的问题涉及不同个体间的复杂联系。 (3) 需要在计算机程序中描述生活中个体间的。 数据结构主要研究非数值计算程序问题中的操作对象以及它们之间的关系。 关键概念&#xff08;1…...

湘潭响塘乡建设局网站/武汉百度推广外包

龙芯事件、又是个汉芯的后继翻版<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />龙芯事件、又是个汉芯的后继翻版&#xff0c;只是内容比上版充实一些。龙芯事件&#xff0c;无疑又是在十三亿国人脸上重重煽了一个耳光&#xff…...