【理解-IO多路复用】

文章目录

  • 多路复用的介绍
  • select ()
  • poll()
  • epoll()

多路复用的介绍

IO多路复用是一种技术,允许单个线程同时管理多个输入/输出通道,如网络套接字或文件描述符。
在IO多路复用中,这些通道被注册到一个事件管理器,然后通过阻塞方式等待事件(例如数据可读或可写)的发生。一旦有事件发生,线程就会被唤醒,并针对具体事件进行处理。这种技术的优点包括提高系统并发性能、减少资源消耗、简化编程模型、提高可扩展性。但也有缺点,如学习曲线较陡、对编程模型要求较高、不适用于CPU密集型任务。
常见的io多路复用包括select、poll、epoll

select ()

select() 是一种IO多路复用技术,允许一个进程监视多个文件描述符,判断它们中的哪些描述符可以进行IO操作,从而实现非阻塞IO。
在这里插入图片描述

#include <sys/select.h>int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

参数说明:
nfds:要监听的文件描述符集中的最大文件描述符值加1。
readfds、writefds、exceptfds:分别是读、写、异常事件的文件描述符集合,如果对应的事件发生,就会被置为1。
timeout:表示 select() 函数的超时时间,如果设置为 NULL 则表示一直阻塞直到有事件发生,如果设置为 0 则表示不阻塞立即返回,其他情况下表示等待指定的时间。
select() 函数的工作流程如下:
调用 select() 函数时,内核会检查 readfds、writefds 和 exceptfds 中所包含的文件描述符集合,以及设置的超时时间。
如果超时时间已到,select() 函数返回0,表示没有文件描述符就绪。
如果有文件描述符就绪,select() 函数返回就绪的文件描述符数量。
对于就绪的文件描述符,可以通过检查 readfds、writefds 和 exceptfds 来确定是哪种事件。
select() 的一些限制包括:
最大文件描述符数量通常有限(通常是 1024),因此不能用于管理大量文件描述符。
每次调用 select() 都需要将完整的文件描述符集合传递给内核,这可能会产生一定的性能开销。

poll()

poll() 函数是一种IO多路复用技术,用于在单个线程中管理多个IO操作。它与 select() 函数类似,但在一些方面更加灵活和高效。
在这里插入图片描述

#include <poll.h>int poll(struct pollfd fds[], nfds_t nfds, int timeout);

参数介绍:
fds[]:是一个指向 pollfd 结构体数组的指针,每个 pollfd 结构体描述一个待检查的文件描述符以及需要检查的事件。
nfds:是数组中结构体的数量。
timeout:是等待的超时时间,单位为毫秒,可以设置为 -1 表示一直等待直到有事件发生,0 表示立即返回,其他正数表示等待指定的时间。
工作原理:
调用 poll() 函数时,将 fds[] 中描述的文件描述符以及需要检查的事件注册到内核中。
poll() 函数阻塞等待,直到有文件描述符就绪或超时。
当有文件描述符就绪或超时时,poll() 函数返回。
对于就绪的文件描述符,可以通过 revents 字段来确定是哪种事件。
poll()的优点:
没有文件描述符数量的限制,可以同时监视大量的文件描述符。
不需要像 select() 函数一样传递文件描述符集合的大小,因为 nfds 参数已经指定了数组的大小。
poll()使用注意事项:
在高并发环境中,poll() 函数可能会有一定的性能开销,因为它需要遍历整个 fds[] 数组来检查文件描述符的状态。
在某些操作系统上,poll() 的实现可能不如 select() 或 epoll() 高效。

epoll()

epoll() 是 Linux 上一种高性能的 IO 多路复用技术,用于在单个线程中管理大量的 IO 操作。相比于 select() 和 poll(),epoll() 在处理大量并发连接时具有更好的性能和扩展性。
在这里插入图片描述

#include <sys/epoll.h>int epoll_create(int size);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);

epoll_create():创建一个 epoll 实例,返回一个文件描述符,用于后续的操作。
epoll_ctl():向 epoll 实例中添加、修改或删除要监听的文件描述符及其对应的事件。
epoll_wait():等待文件描述符就绪,返回就绪的文件描述符及其对应的事件。
工作原理:
调用 epoll_create() 创建一个 epoll 实例。
调用 epoll_ctl() 向 epoll 实例中添加需要监听的文件描述符及其事件。
调用 epoll_wait() 等待文件描述符就绪。
epoll_wait() 返回就绪的文件描述符及其对应的事件。
epoll的优点:
高性能:epoll() 使用基于事件驱动的方式工作,避免了 select() 和 poll() 中的线性扫描问题,因此在大量并发连接的情况下性能更好。
高扩展性:epoll() 支持边缘触发(edge-triggered)模式和水平触发(level-triggered)模式,使得它更适合于不同类型的应用场景。
没有文件描述符数量的限制:epoll() 支持管理大量的文件描述符,没有 select() 和 poll() 中的数量限制。
边缘触发(Edge-triggered)和水平触发(Level-triggered):
边缘触发模式下,epoll_wait() 只会在文件描述符的状态发生变化时返回就绪事件,需要应用程序自行处理完整的数据。
水平触发模式下,epoll_wait() 会在文件描述符的状态仍然就绪时重复返回事件,直到文件描述符的状态不再就绪。
epoll的注意事项:
epoll() 是 Linux 特有的 API,在其他平台上可能不可用。
使用 epoll() 时需要注意避免内存泄漏和资源耗尽的问题,因为它需要管理大量的文件描述符和事件。
在一些特定场景下,如短连接服务器,epoll() 可能没有太大的优势,甚至可能比 select() 和 poll() 略逊一筹。

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

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

相关文章

Vue列表渲染

一、Vue列表渲染 1.用 v-for 把一个数组对应为一组元素 我们可以用 v-for 指令基于一个数组来渲染一个列表。v-for 指令需要使用 item in items 形式的特殊语法&#xff0c;其中 items 是源数据数组&#xff0c;而 item 则是被迭代的数组元素的别名。 <ul id"exampl…

MATLAB有限元结构动力学分析与工程应用-徐斌|【PDF电子书+配套Matlab源码】

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

Spring Cloud学习笔记:Eureka简介,Eureka简单样例

这是本人学习的总结&#xff0c;主要学习资料如下 - 马士兵教育 [TOC](目录)1、Eureka 1.1、架构 Eureka是SpringCloud Nexflix的核心子模块&#xff0c;其中包含Server和Client。 Server提供服务注册&#xff0c;存储所有可用服务节点。 Client用于简化和Server的通讯复杂…

股票高胜率的交易法则是什么?

股票交易中的高胜率交易法则并非一成不变&#xff0c;而是根据市场状况、个人投资风格和经验等多种因素综合而定的。以下是一些有助于提升交易胜率的法则和策略&#xff1a; 1.趋势跟踪法则&#xff1a;在股票交易中&#xff0c;趋势跟踪是一种有效的策略。通过观察大盘和个股…

算法训练营第二十三天(二叉树完结)

算法训练营第二十三天&#xff08;二叉树完结&#xff09; 669. 修剪二叉搜索树 力扣题目链接(opens new window) 题目 给定一个二叉搜索树&#xff0c;同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[L, R]中 (R>L) 。你可能需要改…

AI技术创业:挖掘未来的黄金机会

前言 在科技飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正逐渐成为引领创新的重要力量。AI技术不仅为各行各业带来了巨大的变革&#xff0c;也为创业者们提供了前所未有的机会。那么&#xff0c;站在AI的风口上&#xff0c;创业者们该如何把握这些机会…

基于 MATLAB 和 App Designer 的 UI 交互框架开发的一款电力系统潮流计算工具

基于 MATLAB 和 App Designer 的 UI 交互框架开发的一款电力系统潮流计算工具 文章目录 基于 MATLAB 和 App Designer 的 UI 交互框架开发的一款电力系统潮流计算工具一、软件介绍二、软件功能1、数据输入 2、潮流作业设置3、 潮流结果报表及可视化三、 软件设计思路1 、牛顿拉…

【Linux的进程篇章 - 进程终止和进程等待的理解】

Linux学习笔记---008 Linux之fork函数、进程终止和等待的理解1、fork函数1.1、什么是fork?1.2、fork的功能介绍1.3、fork函数返回值的理解1.4、fork函数的总结 2、进程的终止2.1、终止是在做什么&#xff1f;2.2、进程终止的3种情况 3、进程的终止3.1、进程终止的三种情况3.2、…

如何用Java后端处理JS.XHR请求

Touching searching engine destroies dream to utilize php in tomcat vector.The brave isn’t knocked down&#xff0c;turn its path to java back-end. Java Servlet Bible schematic of interaction between JS front-end and Java back-end Question 如何利用Java…

夯实智慧新能源数据底座,TiDB Serverless 在 Sandisolar+ 的应用实践

本文介绍了 SandiSolar通过 TiDB Serverless 构建智慧新能源数据底座的思路与实践。作为一家致力于为全球提供清洁电力解决方案的新能源企业&#xff0c;SandiSolar面临着处理大量实时数据的挑战。为了应对这一问题&#xff0c;SandiSolar选择了 TiDB Serverless 作为他们的数据…

linux重定向符号

将ls命令执行结果重定向到a文件中 将错误ls命令执行结果重定向到a文件中&#xff08;这里用到前面的标准错误输出重定向&#xff09;

期货分账户软件|程序化软件|风控软件|资产管理软件开发用到哪些技术?

期货/股票资管分仓软件分账户系统APP的开发涉及多个技术领域&#xff0c;以确保软件的功能性、安全性和易用性。以下是一些在开发过程中可能需要用到的关键技术&#xff1a; 前端开发技术&#xff1a;前端部分主要负责用户界面的设计和实现。通常使用HTML、CSS和JavaScript等技…

Shoplazza闪耀Shoptalk 2024,新零售创新解决方案引领行业新篇章!

在近期举办的全球零售业瞩目盛事——Shoptalk 2024大会上,全球*的零售技术平台-店匠科技(Shoplazza)以其*的创新实力与前瞻的技术理念,成功吸引了与会者的广泛关注。此次盛会于3月17日至20日在拉斯维加斯曼德勒湾隆重举行,汇聚了逾万名行业精英。在这场零售业的盛大聚会上,Shop…

zookeeper解析

目录 zookeeper定义 zookeeper定义 Zookeeper是一个开源的分布式的&#xff0c;为分布式框架提供协调服务的Apache项目 Zookeeper工作机制 zookeeper从设计模式角度来理解&#xff1a; 是一个基于观察者模式设计的分布式服务管理框架&#xff0c;它负责存储和管理大家都关心…

JavaScript - 你知道Ajax的原理吗?如何封装一个Ajax

难度级别:中高级及以上 提问概率:75% 想要实现Ajax,就需要创建它的核心通信对象XMLHttpRequest,通过核心对象的open方法与服务端建立连接,核心对象的send方法可以将请求所需数据发送给服务端,服务端接收到请求并做出响应,我们通过核心对象…

JavaScript_语法--变量

1.4 变量 变量&#xff1a;一小块存储数据的内存空间 Java语言是强类型语言&#xff0c;而JavaScript是弱类型的语言 强类型&#xff1a; 在开辟变量存储空间时&#xff0c;定义了空间将来存储的数据的数据类型。只能存储固定类型的数据 弱类型&#xff1a; 在开辟变量存储空间…

【MATLAB源码-第180期】基于matlab的PTS,SLM,CPFilter三种降低OFDM系统的PAPR仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 限幅和滤波&#xff08;Clipping and Filtering&#xff09; 原理简介 限幅和滤波是一种基础且直观的方法&#xff0c;用于降低OFDM信号的PAPR。在限幅阶段&#xff0c;信号的幅度在达到设定阈值时会被削减&#xff0c;…

代码学习记录40---动态规划

随想录日记part40 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.04.10 主要内容&#xff1a;今天开始要学习动态规划的相关知识了&#xff0c;今天的内容主要涉及&#xff1a; 买卖股票的最佳时机加强版。 123.买卖股票的最佳时机III 188.买卖股票的最佳时机…

【深入理解计算机系统第3版】有符号数和无符号数转换以及移位运算练习题2.23

题目 考虑下面的C函数&#xff1a; int fun1(unsigned word) {return (int) ((word << 24) >> 24); }int fun2(unsigned word) {return ((int) word << 24) >> 24; } 假设一个采用补码运算的机器上以32位程序来执行这些函数。还假设有符号数值的右移…

git操作码云(gitee)创建仓库到上传到远程仓库

想必有的小伙伴在为上传到码云远程仓库而感到烦恼吧&#xff01;本篇为大家详细讲解实现过程&#xff0c;跟着我的步伐一步一步来。 我就当大家已经注册好了码云 一、在码云上需要的操作 接下来我们需要使用到 git 了 二、git 上的操作 到了咋们的git了&#xff0c;开整 首…