【Linux】【网络】IO多路复用 select、poll、epoll

news2025/2/13 6:14:51

【Linux】【网络】IO多路复用 select、poll、epoll

IO 多路复用

进程或线程同时监控多个文件描述符,查看描述符上是否有事件发生,从而提高资源利用率和系统吞吐量。


1. select

int select(int maxfd, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct ti
meval *timeout);
  • 返回值代表多少个文件描述符上有事件

  • int maxfd 被监听的文件描述符的总数

  • fd_set *readfds 读事件

  • fd_set *writefds 写事件

  • fd_set *exceptfds 异常事件

  • struct timeval *timeout 超时时间

  • 基本原理

    • 使用固定大小的 fd_set(集合类型),每个代表一个文件描述符。 最多能够监听1024个文件描述符
    • 每次使用时,应用程序都需要将需要监控的文件描述符添加到fd_set集合中,然后调用系统调用 select()。
    • 内核在超时时间内轮询 fd_set,当检测到某个文件描述符发生指定的 I/O 事件select只有可读、可写、异常)时,返回就绪的文件描述符集合。
  • 工作流程

    1. 应用程序将需要监控的 fd 添加到 fd_set 通过**FD_SET()**设置对应的位中,并设置超时时间。
    2. 调用 select() 后,内核遍历整个 fd_set,检查每个文件描述符的状态。
    3. 如果有文件描述符处于就绪状态,select() 返回 fd_set中有事件的位为1 通过**FD_ISSET()**轮询检测;否则在超时后返回

2.poll

int poll(struct pollfd *fds, nfds_t nfds, int timeout);
  • pollfd *fds pollfd结构体数组指针
  • nfds_t nfds 结构体数组指针指向数组的元素个数
  • int timeout 超时时间
struct pollfd
{
int fd; // 文件描述符
short events; // 注册的关注事件类型  每一位可以代表一个类型 因此最多检测16个事件
short revents; // 实际发生的事件类型,由内核填充
};
  • fd 成员指定文件描述符
  • events 成员告诉 poll 监听 fd 上的哪些事件类型。它是一系列事件的按位&
  • revents 成员则由内核修改,通知应用程序 fd 上实际发生了哪些事件
  • 基本原理
    • poll 使用一个 pollfd 数组来描述需要监控的文件描述符及其关注的事件, 结构体数组可以开辟的很大,不受1024的限制
    • 事件类型可以更多
    • 事件和描述符封装在一起
  • 工作流程
    1. 应用程序填充一个 pollfd 数组,每个元素记录文件描述符和关注的事件(如 POLLIN、POLLOUT)。
    2. 调用 poll() 后,内核遍历数组,检查每个 fd 的状态。
    3. poll() 返回就绪的文件描述符个数,并通过 pollfd 数组的 revents 字段告知应用程序哪些事件发生了。

3.epoll

  • epoll 使用一组函数来完成任务,epoll 把用户关心的文件描述符上的事件放在内核里的一个事件表中。从而无需像 select 和 poll 那样每次调用都要重复传入文件描述符或事件集。

  • 但 epoll 需要使用一个额外的文件描述符,来唯一标识内核中的这个内核事件表

  • epoll_create()用于创建内核事件表

  • epoll_ctl()用于操作内核事件表

  • epoll_wait()用于在一段超时时间内等待一组文件描述符上的事件 //可能阻塞

  • 基本原理

    • epoll 是 Linux 特有的机制,其设计目标是高效处理大规模文件描述符。
    • epoll 将所有注册的文件描述符存储在内核内部的数据结构中(通常采用红黑树管理所有注册项),并维护一个就绪队列用于保存触发事件的 fd。
    • 应用程序通过 epoll_ctl() 添加、修改或删除文件描述符,通过 epoll_wait() 获取就绪事件。
  • 数据结构

    • 红黑树(rbtree):存储所有已注册的文件描述符(epitem),便于快速查找、添加和删除操作,时间复杂度 O(log N)。
    • 就绪链表(ready list):存储已经触发事件的 epitem,当调用 epoll_wait() 时,内核直接返回这个就绪链表中记录的文件描述符,时间复杂度与就绪 fd 数量相关,通常远小于所有注册 fd 数量。
  • 支持两种触发模式:

    • 水平触发(Level Triggered, LT):类似 poll,每次调用 epoll_wait() 都返回当前就绪的 fd。
    • 边缘触发(Edge Triggered, ET):仅在状态变化时通知,必须在一次性读取完数据,否则不会重复通知。

4.性能比较

特性selectpollepoll
文件描述符数量限制受 FD_SETSIZE 限制(通常 1024 个)无固定限制,但效率随数组长度线性下降支持大量文件描述符,效率依赖于就绪事件数量
每次检查是否需要重新将数据拷贝给内核
扫描方式线性遍历整个 fd_set线性遍历 pollfd 数组内核通过红黑树查找 + 就绪链表遍历
内核检测就绪描述符时间复杂度O(N)O(N)O(1)
查找就绪描述符时间复杂度O(N)O(N)O(1)
触发模式仅支持水平触发仅支持水平触发支持水平触发和边缘触发
平台支持POSIX 标准,跨平台支持POSIX 标准,跨平台支持仅 Linux 支持

后续会详细写一下epoll 每个函数 以及内核实现方式 因为这个比较重要 以及libevent底层也是epoll

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

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

相关文章

麒麟信安系统隔核后iperf网络测试影响说明

1、背景介绍 采用麒麟信安系统,在飞腾平台(X86平台类似)上进行了系统核隔离,修改了grub.cfg配置文件中的启动项增加isolcpus2-63 操作,隔核后发现40G网络iperf测试存在影响。 测试命令 taskset -c 16-23 iperf -s -…

WPF进阶 | WPF 资源管理与本地化:多语言支持与资源复用

WPF进阶 | WPF 资源管理与本地化:多语言支持与资源复用 前言一、WPF 资源管理基础1.1 什么是 WPF 资源1.2 资源的定义与存储位置1.3 资源的引用方式 二、资源字典的深入应用2.1 创建资源字典2.2 在应用程序中合并资源字典2.3 资源字典的层级结构与合并顺序 三、WPF …

数据结构与算法-动态规划-区间dp(石子合并,环形石子合并,凸多边形的划分,加分二叉树,棋盘分割)

概念 区间动态规划(Interval Dynamic Programming)是动态规划的一个分支,它在处理一些与区间相关的最优解问题上非常有效。以下从基本概念、解题步骤、经典例题、优缺点等方面为你详细介绍: 基本概念:区间 DP 的核心…

32单片机学习记录4之串口通信

32单片机学习记录4之串口通信 前置 STM32的GPIO口有通用模式,复用模式,模拟模式三种,加上输入输出就是有6中对应的模式。 我学习了通用模式,会使用GPIO口使用一些简单外设,如LED,独立按键,红外…

开源、免费项目管理工具比较:2025最新整理30款

好用的开源、免费版项目管理系统有:1.Redmine;2. Taiga;3. OpenProject; 4.ProjectLibre; 5.GanttProject; 6.Tuleap; 7.Trac;8. Phabricator; 9.Notion; 10.…

Android10 音频参数导出合并

A10 设备录音时底噪过大,让音频同事校准了下,然后把校准好的参数需要导出来,集成到项目中,然后出包,导出方式在此记录 设备安装debug系统版本调试好后, adb root adb remount adb shell 进入设备目录 导…

在 Azure 上部署 DeepSeek 并集成 Open WebUI

DeepSeek 是杭州深度求索人工智能基础技术研究有限公司发布的开源大模型,最近是持续火爆,使得官方服务经常不可用。网上各种本地部署和私有部署的文章已经很多,这里我们提供一个全部基于 Azure 的私有部署方案。 使用 Azure AI Foundry 部署…

Springboot整合支付宝支付

支付宝支付功能 步骤一:沙箱配置支付宝沙箱配置 步骤二:使用内网穿透步骤三:开始对接SDK配置文件支付 步骤一:沙箱配置 支付宝沙箱配置 需要有支付宝沙箱:提供一个虚拟的支付环境,用于测验调试&#xff0…

deepseek+kimi一键生成PPT

1、deepseek生成大纲内容 访问deepseek官方网站:https://www.deepseek.com/ 将你想要编写的PPT内容输入到对话框,点击【蓝色】发送按钮,让deepseek生成内容大纲,并以markdown形式输出。 等待deepseek生成内容完毕后&#xff0c…

基于ssm的超市订单管理系统

一、系统架构 前端:jsp | web components | jquery | css | ajax 后端:spring | springmvc | mybatis 环境:jdk1.8 | mysql | maven | tomcat 二、代码及数据 三、功能介绍 01. 登录 02. 首页 03. 订单管理 04. 供应…

AnyPlace:学习机器人操作的泛化目标放置

25年2月来自多伦多大学、Vector Inst、上海交大等机构的论文“AnyPlace: Learning Generalized Object Placement for Robot Manipulation”。 由于目标几何形状和放置的配置多种多样,因此在机器人任务中放置目标本身就具有挑战性。为了解决这个问题,An…

【DeepSeek】在本地计算机上部署DeepSeek-R1大模型实战(完整版)

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈人工智能与大模型应用 ⌋ ⌋ ⌋ 人工智能(AI)通过算法模拟人类智能,利用机器学习、深度学习等技术驱动医疗、金融等领域的智能化。大模型是千亿参数的深度神经网络(如ChatGPT&…

基于全志T507的边缘计算机,推动光伏电站向智能运维转型

智能监控与维护 光伏电站通常分布在广阔的地域内,传统的监控方式往往需要大量的人力物力进行现场检查和数据采集。采用全志T507为核心的嵌入式工控机或边缘计算控制器可以实现光伏电站的实时监测,通过连接传感器网络收集电站各个组件的工作状态信息&…

用户认证练习实验

一.拓扑 二.sw2配置 三.ip配置 四.dhcp分配IP地址 五.安全区域配置 六.防火墙地址组信息 七.管理员 创建管理员角色 创建管理员 启动tenlnet 八.用户认证配置 认证策略 九.安全策略配置

【登录认证】

目录 一. 会话技术1.1 cookie1.2 session1.3 令牌方案 二. JWT令牌三. 过滤器Filter四. 拦截器Interceptor \quad 一. 会话技术 \quad \quad 1.1 cookie \quad \quad 1.2 session \quad \quad 1.3 令牌方案 \quad \quad 二. JWT令牌 \quad \quad 三. 过滤器Filter \quad \quad …

DeepSeek 赋能智慧教育 | 讯方“教学有方”大模型全面接入 DeepSeek!

国产 DeepSeek 大模型以强大的深度学习能力和广泛应用场景迅速火爆全球,其在智能对话、文本创作、语义解析、计算推理、代码生成与补全等多个应用领域,展现出了无与伦比的实力和魅力。2月10日 ,由讯方技术自研的教育行业大模型“教学有方”全…

Unity中自定义协程的简单实现

在 Unity 中,协程(Coroutine)是一种非常强大的工具,它允许我们在不阻塞主线程的情况下,将代码的执行分成多个步骤,在不同的帧中执行。 Unity中协程实现原理 迭代器与状态机:本质上是基于C#的迭…

打开Visual Studio Code的时候发现未检测到适用于linux的windows子系统,那么该问题要如何解决?

两个月没有使用vscode编写代码,今天使用的时候发现了以上的问题导致我的vscode无法编写程序,接下来我将本人解决该问题的思路分享给大家。 首先我们要清楚WSL是适用于linux的window的子系统,是一个在Windows 10\11上能够运行原生Linux二进制可…

Linux(socket网络编程)TCP连接

Linux(socket网络编程)TCP连接 基础文件目录函数系统进程控制函数fork()exec系列函数void abort(void)void assert(int expression)void exit(int status)void _exit(int status)int atexit(void (*func)(void))int on_exit(void (*function)(int,void*)…

Rust学习总结之所有权(一)

不管是计算机的哪种语言,都有内存的管理方式。主流有两种,一是以C为代表的由开发者来决定申请和释放内存,二是以Python为代表的通过语言本身的垃圾回收机制来自动管理内存。Rust开辟了第三种方式,通过所有权系统管理内存。 Rust所…