news 2026/6/9 23:57:49

I/O多路复用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
I/O多路复用

一.什么是I/O多路复用

核心思想:通过一个线程同时管理多个 Socket(文件描述符),在一个线程内同时检测 多个连接的状态(如是否可读/可写),从而实现高效的并发处理。在 Linux中,常见的 I/O 多路复用技术包括selectpollepoll

二.为什么要使用I/O多路复用

1.最基础的TCP Socket编程使用的是阻塞I/O模型:每次进行I/O操作(如读 写数据),调用的线程会被阻塞,直到操作完成为止。在这种模型下,一个线程 只能处理一个客户端的请求,也就是“一对一通信。如果需要同时处理多个客户 \端连接,就必须为每个连接创建一个独立的线程或进程。当客户端数量很少时, 这种方式是可行的。但如果有成千上万个客户端(如 C10K问题,1万个并发客 户端连接),线程/进程的调度和资源占用(如内存)会成为瓶颈。

2.在传统的多线程/多进程模型中:每个客户端连接对应一个独立的线程或进程。 当有数据读写时,线程阻塞在对应的 Socket上,直到数据准备好。当客户端数 量很少时,这种方式是可行的,但如果有成千上万个客户端(如 C10K问题,1 万个并发客户端连接),线程/进程上下文切换开销会很大,且每个线程/进程都有一定的内存开销(如栈内存、线程控制块等),此时内存和调度开销的将变得不可接受。

三.selectpoll的工作原理

1.select 实现多路复用的方式是,将已连接的Socket(文件描述符)都放到一个文件描述 符集合,然后调用select函数将文件描述符集合拷贝到内核里,让内核遍历整个文件描述 符集合,检测每个Socket的状态,如果某些Socket有事件(如数据到达或可写),内核会设置对应的状态。接着内核将检测结果(整个 Socket集合)拷贝回用户态,用户程序需要再次遍历整个集合,找到可读或可写的 Socket,对其处理。

缺点:需要进行2次「遍历」文件描述符集合,一次是在内核态里,一个次是在用户态里 ,而且还会发生2次「拷贝」文件描述符集合,先从用户空间传入内核空间,由内核修改后,再传出到用户空间中。

2.selectpoll的区别:select使用固定长度的BitsMap,表示文件描述符集合,而且所支持的文件描述符的个数是有限制的,poll使用动态数组,以链表形式来组织,突破了select 的文件描述符个数限制,当然还会受到系统文件描述符限制。 但是 pollselect并没有太大的本质区别,都是使用「线性结构」存储进程关注的Socket集合,因此都需要遍历文件描述符集合来找到可读或可写的Socket,时间复杂度为O(n),而且也需要在用户态与内核态之间拷贝文件描述符集合,这种方式随着并发数上来,性能的损耗会呈指数级增长。

3.epoll的工作原理

epoll的改进:

1. 高效的红黑树管理: epoll 在内核中使用红黑树存储待监控的Socket集合。 优势: 插入、删除、修改 Socket的时间复杂度为O(log n)。 相比于 select/poll每次都拷贝整个Socket集合, epoll 只需在第一次时添加到红黑树即可,无需重复拷贝,红黑树会一直维护这些描述符,直到显式地移除它们。

2. 事件驱动机制:epoll 使用事件驱动机制,即内核会监听事件的发生链表记录就绪事件: 内核会将发生事件的 Socket(如有数据到达或可写的Socket)通过回调函数加入到一个就绪链表中。应用程序只需要处理这个链表中的 Socket,无需遍历整个集合。

epoll支持两种事件触发模式:水平触发:默认模式,和select/poll一样。当被监控的Socket上有可读事件发生时,内核会一直通知应用程序,直到数据被read函数完全读取。边缘触发:当被监控的Socket描述符上有可读事件发生时,内核只会通知应用程序一 次,需要应用程序收到通知后尽可能一次读取完所有数据,以免错失读写机会。所以,程序会循环从socket中读写数据,那么如果文件描述符是阻塞的,没有数据可读写时,进程会阻塞在读写函数那里,程序就没办法继续往下执。所以,边缘触发模式一般和非阻塞I/O搭配使用。

一般来说,边缘触发的效率比水平触发的效率要高,因为边缘触发可以减少系统调用次
数。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 11:26:44

AI伦理风险防控与治理体系构建 守护技术向善之路

人工智能的飞速发展在推动社会进步的同时,也催生了一系列伦理风险,数据泄露、算法偏见、责任认定难题等问题逐渐凸显,对社会公平和个体权益构成挑战。如何防范伦理风险,构建科学有效的治理体系,引导AI技术“向善”发展…

作者头像 李华
网站建设 2026/6/10 11:27:25

什么是八股文?Java程序员春招如何提前储备?拿高薪offer?

八股文与Java程序员春招备战指南什么是八股文?八股文原指中国古代科举考试中一种固定格式的应试文体,在现代互联网行业面试场景中,特指技术面试中常见的标准化问题和考察点。对于Java程序员而言,八股文通常包括:Java基…

作者头像 李华
网站建设 2026/6/10 14:42:39

跨境电子商务综合试验区DID(内含七批试验区名单)

数据简介 跨境电子商务综合试验区作为一类独具特色的经济功能区域,其核心使命在于加速国际跨境电子商务领域的拓展步伐与创新进程。这类试验区一般由国家或地方政府主导设立,致力于推动电子商务贸易、数字经济及国际贸易的整体跃升。 跨境电子商务综合…

作者头像 李华
网站建设 2026/6/10 11:44:37

Java计算机毕设之基于springboot的泳衣泳帽游泳用品专卖店系统的设计与实现基于springboot的游泳用品专卖店系统的设计与实现(完整前后端代码+说明文档+LW,调试定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/6/10 11:27:15

BNO055九轴传感器原理图设计,已量产(加速度传感器)

目录 1、电源:传感器对噪声 “零容忍”,近件去耦是关键 2、配置引脚:别漏了上拉,不然芯片 “启动失常” 3、时钟:32.768KHz 晶振,负载电容必须 “对号入座” 4、复位:RC 上电复位,时间常数要 “够稳” 5、通信与中断:I2C 地址可配置,中断省掉轮询 6、SOC 传感器…

作者头像 李华
网站建设 2026/6/10 11:16:54

大学生必备6个AI论文工具:轻松搞定论文效率飙升告别熬夜!

如果你是正在为毕业论文熬夜、被导师催稿、对着查重报告唉声叹气的大学生或研究生,请停下来!你不是一个人在战斗。我们深知你的痛苦:选题毫无头绪、文献综述无从下笔、问卷数据一团糟、导师的修改意见像天书,更别提那令人心梗的查…

作者头像 李华