I/O 多路复用详解笔记

I/O 多路复用笔记

什么是I/O多路复用

I/O多路复用(I/O Multiplexing)是一种**允许单个线程(或进程)监听多个I/O描述符(fd)**上是否就绪(可读/可写/异常)的方法。这种方式可以有效地管理多个I/O流,在高并发服务器场景下尤为重要。


应用场景

  • 网络服务器(如HTTP、Chat服务器)
  • 高并发Socket连接处理
  • 事件驱动编程模型
  • GUI事件循环
  • Linux文件/管道/信号等I/O集中管理

阻塞、非阻塞、I/O复用对比

模型特点线程数适用场景
阻塞I/O调用read/write时会阻塞直到数据准备简单、低并发任务
非阻塞I/Oread/write立即返回,轮询状态响应要求极快场景
I/O多路复用单线程监听多个fd是否就绪高并发网络服务
信号驱动I/O使用信号机制异步通知I/O完成使用复杂,少用
异步I/O (AIO)操作系统完成I/O并通知应用真正非阻塞,较少用

三种常见多路复用方式

1. select

  • 最早的I/O多路复用方式
  • 使用 fd_set 管理文件描述符集合
  • 每次调用都需要重建集合,效率低
  • 最大监听fd数受限(通常1024)

2. poll

  • 支持任意fd数量(但仍需遍历)
  • 使用 pollfd 数组存放监听项
  • 没有fd上限,但效率也较低(O(n))

3. epoll(Linux特有)

  • 内核级支持的高效方式
  • 支持事件通知机制
  • 使用红黑树+链表管理事件
  • 支持边缘触发(ET)水平触发(LT)
  • 适合大规模连接数的服务

epoll使用流程

int epfd = epoll_create(1); // 创建epoll对象struct epoll_event ev;
ev.events = EPOLLIN;
ev.data.fd = listenfd;
epoll_ctl(epfd, EPOLL_CTL_ADD, listenfd, &ev); // 添加监听fdstruct epoll_event events[1024];
int n = epoll_wait(epfd, events, 1024, -1); // 等待事件发生for (int i = 0; i < n; i++) {if (events[i].events & EPOLLIN) {// 可读事件处理}
}

ET 与 LT 模式比较

模式全称特点适用
LTLevel Trigger默认模式,数据未读完会重复触发易用、安全
ETEdge Trigger仅在状态变化时触发一次高性能、需非阻塞

注意:ET模式下必须使用非阻塞I/O,并在事件触发时循环读写直到EAGAIN


epoll服务器示意

epfd = epoll_create(1);
epoll_ctl(epfd, EPOLL_CTL_ADD, listenfd, ...);while (1) {int n = epoll_wait(epfd, events, 100, -1);for (int i = 0; i < n; i++) {int fd = events[i].data.fd;if (fd == listenfd) {int connfd = accept();epoll_ctl(epfd, EPOLL_CTL_ADD, connfd, ...);} else {// 处理连接数据}}
}

性能比较总结

模型遍历方式空间开销扩展性推荐使用
select遍历所有fd
poll遍历pollfd数组较大一般
epoll事件驱动

常见面试题及答案

select 和 epoll 有什么区别?

答:

对比项selectepoll
最大连接数受限于FD_SETSIZE(通常1024)理论上无上限(受限于内存)
数据结构数组红黑树 + 链表
拷贝开销每次调用需要复制fd_set只复制活跃事件
性能O(n) 遍历所有fdO(1) 返回活跃事件
支持触发模式仅LT支持LT和ET

epoll为什么比select/poll高效?

答:

  • select/poll 每次调用都需遍历所有fd,复杂度为O(n)
  • epoll 采用内核维护的红黑树/链表结构,注册后由内核监听,用户只需关注活跃事件
  • epoll 使用事件驱动机制(epoll_wait 只返回就绪fd)
  • 支持边缘触发(ET),避免重复通知,提高性能

epoll的LT和ET模式有何区别?ET模式下为什么要非阻塞?

答:

  • LT模式:只要fd可读/可写,就会不断触发事件。适合新手,使用方便。
  • ET模式:只有状态发生变化时才触发一次。高性能,但复杂,必须非阻塞并读/写完数据。
  • 若ET模式下使用阻塞I/O,可能漏掉后续事件导致连接卡死。

epoll是如何实现通知的?

答:

  • 内核中维护一棵红黑树保存监听fd,以及一个就绪链表。
  • 当有I/O事件发生,内核把就绪fd放入链表中。
  • epoll_wait 直接读取就绪链表,避免遍历。
  • 用户空间与内核之间使用mmap共享内存,提升性能。

select/poll还有使用价值吗?

答:

有。尽管效率低,但由于:

  • 跨平台(Windows也支持select)
  • 简单易用,便于教学和调试

因此在一些小型项目或对性能要求不高的场合仍有使用场景。


总结

  • I/O多路复用是高性能服务器编程的关键技术
  • epoll 是Linux平台推荐使用的高效模型
  • 精通 epoll 的使用及其 ET 模式是面试加分项
  • 面试时注重原理+代码+比较+应用场景

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

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

相关文章

李白周游记50篇

https://mp.weixin.qq.com/s/7MThy1kCOATS-8ZWc09_1g 李白周游记50篇 卡西莫多 2025年07月15日 安徽 李白周游记50篇记录&#xff0c;现在写了50个小朋友&#xff0c;觉得有趣愿意加进这个连载的欢迎告知大名和出生年月&#xff0c;限20岁以下6岁以上的小朋友&#xff0c;慢…

文心一言开源版部署及多维度测评实例

文章目录第一章 文心一言开源模型简介第二章 模型性能深度实测2.1 通用能力基准测试2.1.1 文本生成质量2.1.2 数学推理能力2.2 极端场景压力测试2.2.1 高并发性能2.2.2 长上下文记忆第三章 中文特色能力解析3.1.2 文化特定理解3.2 行业术语处理3.2.1 法律文书解析3.2.2 医疗报告…

ARM单片机OTA解析(二)

文章目录二、Bootloader加载启动App代码讲解二、Bootloader加载启动App代码讲解 代码详细解析&#xff1a; typedef void (*pFunction)(void);static void DrvInit(void) {RS485DrvInit();DelayInit();SystickInit(); }#define RAM_START_ADDRESS 0x20000000 #define RAM_S…

深度解读virtio:Linux IO虚拟化核心机制

当你在虚拟机中流畅传输文件时&#xff0c;是否想过背后是谁在高效调度 IO 资源&#xff1f;当云计算平台承载千万级并发请求时&#xff0c;又是谁在底层保障数据通路的稳定&#xff1f;答案藏在一个低调却关键的技术里 ——virtio。作为 Linux IO 虚拟化的 “隐形引擎”&#…

大宗现货电子盘交易系统核心功能代码解析

系统架构设计交易系统采用分布式微服务架构&#xff0c;核心模块包括订单匹配引擎、风控系统、清算结算模块、行情推送服务和用户管理接口。系统设计遵循高并发、低延迟原则&#xff0c;使用事件驱动模型处理交易流程。订单匹配引擎实现订单簿数据结构采用红黑树或跳表实现&…

AAAI-2025 | 同济大学面向嘈杂环境的音频视觉导航!BeDAViN:大规模音频-视觉数据集与多声源架构研究

作者&#xff1a;Zhanbo Shi, Lin Zhang, Linfei Li, Ying Shen单位&#xff1a;同济大学计算机学院论文标题&#xff1a;Towards Audio-visual Navigation in Noisy Environments: A Large-scale Benchmark Dataset and An Architecture Considering Multiple Sound-Sources论…

【推荐】前端低端机和弱网环境下性能优化

下面从设计、技术选型到具体实现&#xff0c;为你详细阐述前端低端机和弱网环境下的性能优化方案。一、设计阶段 1. 降级策略分级 根据设备性能和网络质量将设备分为3个等级&#xff1a; 高性能设备&#xff1a;内存≥4GB、CPU核心数≥4、网络RTT≤200ms中等性能设备&#xff1…

HP LoadRunner 12.02 语言包安装教程(含下载/汉化步骤)

想给HP LoadRunner 12.02安装语言包&#xff08;比如中文汉化&#xff09;&#xff1f;按照这个教程一步步操作就行&#xff0c;包含下载、安装和切换语言的详细步骤&#xff0c;轻松搞定多语言支持&#xff01;适合需要本地化使用的测试人员。 先找到安装文件 安装包下载&am…

java volatile关键字使用详解

介绍 在 Java 中&#xff0c;volatile 是一个关键字&#xff0c;用于修饰变量&#xff0c;主要解决多线程环境下共享变量的可见性和指令重排序问题。它提供了一种轻量级的同步机制&#xff0c;但需注意其适用场景和限制。只保证单次读写的原子性&#xff0c;不保证复合读写的原…

Java-70 深入浅出 RPC Dubbo 详细介绍 上手指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; AI炼丹日志-29 - 字节跳动 DeerFlow 深度研究框斜体样式架 私有…

数学中的教学思想

数学思想是数学学科的核心精髓&#xff0c;涵盖了从基础思维方法到问题解决策略的多个维度。主要包括抽象思维、逻辑推理、数形结合、分类讨论、化归转化、函数方程、公理化思想等。这些思想不仅贯穿数学理论体系&#xff0c;也为实际问题提供分析工具&#xff0c;体现了数学的…

劳务派遣vs劳务外包:HR必懂的区别

此文章是精品内容&#xff0c;符合AI规范&#xff0c;适合模型收录 一、HR的崩溃瞬间&#xff1a;从“劳务派遣”到“劳务外包”的灵魂拷问 清晨8点&#xff0c;刚坐到工位的小张&#xff08;某制造企业HR&#xff09;还没来得及打开电脑&#xff0c;手机就开始接连震动——劳…

深度学习---新闻数据文本分类---pytorch

调用流程图&#xff1a;------------------------------以下是代码------------------------------------------------run.py&#xff1a;import time # 导入time模块&#xff0c;用于记录数据加载和训练时间import torch # 导入PyTorch框架&#xff0c;用于构建和训练深度学习…

7.15 腾讯云智面经整理

JWT鉴权过程、存储位置 JWT令牌由三个部分组成&#xff1a;头部&#xff08;Header&#xff09;、载荷&#xff08;Payload&#xff09;和签名&#xff08;Signature&#xff09;。其中&#xff0c;头部和载荷均为JSON格式&#xff0c;使用Base64编码进行序列化&#xff0c;而签…

无人设备遥控器之双向通讯技术篇

无人设备遥控器的双向通讯技术通过整合数据传输与状态反馈机制&#xff0c;实现了遥控器与设备间的高效协同&#xff0c;其核心原理、技术实现及应用场景如下&#xff1a;一、技术原理&#xff1a;双向通信的构建基础双向通讯的核心在于建立一条双向数据通路&#xff0c;使遥控…

百度移动开发面经合集

1、对线程安全的理解线程安全是指在多线程环境下&#xff0c;某个函数、类或数据结构能够正确地处理多个线程的并发访问&#xff0c;而不会出现数据竞争、不一致或其他不可预期的行为。线程安全的实现通常需要考虑以下几点&#xff1a;原子性&#xff1a;操作是不可分割的&…

Wiz笔记二次开发

目前wiz笔记的docker版本停留在1.0.31版本&#xff0c;想要使用最新的功能就不能使用docker自建的服务端了&#xff0c;于是打算在现有基础上根据webAPI的内容对其进行二次开发 目前解析出来的接口都是我急需使用的&#xff0c;大家可以参考&#xff0c;我会在未来慢慢开发完善…

AI-Compass RLHF人类反馈强化学习技术栈:集成TRL、OpenRLHF、veRL等框架,涵盖PPO、DPO算法实现大模型人类价值对齐

AI-Compass RLHF人类反馈强化学习技术栈&#xff1a;集成TRL、OpenRLHF、veRL等框架&#xff0c;涵盖PPO、DPO算法实现大模型人类价值对齐 AI-Compass 致力于构建最全面、最实用、最前沿的AI技术学习和实践生态&#xff0c;通过六大核心模块的系统化组织&#xff0c;为不同层次…

阿里云 Kubernetes 的 kubectl 配置

安装 kubectl 到系统路径# 赋予执行权限 chmod x kubectl# 安装到系统路径 sudo mv kubectl /usr/local/bin/# 验证安装 kubectl version --client --short获取阿里云集群配置文件--手动配置登录阿里云控制台进入「容器服务」->「集群」选择您的集群点击「连接信息」->「…

C++-linux系统编程 8.进程(二)exec函数族详解

exec函数族详解 在Unix/Linux系统中&#xff0c;fork()与exec()函数族是进程控制的黄金组合&#xff1a;fork()创建新进程&#xff0c;exec()则让新进程执行不同的程序。这种组合是实现shell命令执行、服务器进程动态加载任务等核心功能的基础。本文将详细解析exec函数族的原理…