单线程如何撑起百万连接?I/O多路复用:现代网络架构的基石

news/2025/10/17 20:46:11/文章来源:https://www.cnblogs.com/poemyang/p/19148798

单线程如何撑起百万连接?I/O多路复用:现代网络架构的基石

I/O多路复用(I/O Multiplexing)是一种允许单个线程同时监视多个文件描述符的I/O模型。其核心价值在于,它将应用程序从低效的I/O等待中解放出来,实现了“一次等待,响应多个事件”的高效并发模式。
要理解其优势,需要对比非阻塞I/O的局限性。虽然非阻塞I/O能避免线程在数据未就绪时阻塞,但它要求应用程序通过循环不断地主动轮询所有文件描述符,这会造成大量的处理器空转,浪费计算资源。
I/O多路复用则提供了一种优雅的解决方案:应用程序将监视任务委托给内核,然后阻塞在专门的事件等待调用上(如select, epoll_wait)。只有当一个或多个文件描述符就绪时,内核才会唤醒线程,使其仅对活跃的I/O进行处理。这是一种从“主动轮询”到“被动通知”的转变,极大地提升了系统效率。

image

I/O多路复用技术本身也经历了一场深刻的演进,从select、poll到epoll,其效率和设计哲学不断完善。作为早期的POSIX标准,select和poll引入了核心理念,但存在固有的性能缺陷。它们要求应用程序在每次调用时,都将整个待监视的文件描述符集合从用户空间完整地拷贝到内核空间,操作完成后再拷贝回来。更关键的是,内核需要以O(n)的线性复杂度遍历所有文件描述符来检查其状态,这意味着随着连接数的增长,系统开销会显著增加。此外,select还受限于FD_SETSIZE(通常为1024)的硬性数量限制,而poll虽解除了此限制,但并未改变其低效的内核扫描和数据拷贝机制。
真正的技术飞跃在Linux平台上以epoll的形式出现。epoll彻底重构了接口和内核实现,它通过epoll_create在内核中建立一个持久化的事件中心,应用程序只需通过epoll_ctl将文件描述符注册一次,后续便无需重复提交。其内部采用红黑树来高效管理文件描述符,并利用设备驱动的回调机制,在I/O就绪时主动将FD添加到一个“就绪队列”中。
因此,当应用程序调用epoll_wait时,内核只需返回这个就绪队列的内容,其时间复杂度为O(k)(k为活跃连接数),与被监视的文件描述符总数无关。这种设计不仅避免了无谓的数据拷贝,更将内核的查找效率提升到了极致。

image

此外,epoll还提供了水平触发(Level-Triggered, LT)和边缘触发(Edge-Triggered, ET)两种工作模式。LT模式是默认选项,只要缓冲区中存在数据,每次调用epoll_wait都会触发通知,编程模型更简单、容错性高。而ET模式则仅在FD状态发生变化(如数据从无到有)时通知一次,它要求应用程序必须一次性处理完所有数据,虽然编程复杂度更高,但能有效减少系统调用的次数。
从本质上看,I/O多路复用仍属于同步I/O,因为应用程序在调用epoll_wait时是阻塞的。但它的阻塞点是高效的事件等待,而非低效的I/O操作。
这种模型天然地催生了事件循环(Event Loop)这一经典并发模式。一个或少数几个事件循环线程负责等待I/O事件,并将就绪的任务分发给工作者线程池(Worker Threads)处理,实现了I/O操作与业务逻辑的解耦。这种流水线式的处理方式,可以充分利用多核处理器,进一步提升系统吞吐量。
以下伪代码展示了基于epoll的事件循环流程:

// 伪代码: I/O多路复用 (epoll)
epoll_fd = epoll_create();
// 1. 创建epoll实例
epoll_fd = epoll_create();// 2. 注册关心的文件描述符和事件
epoll_ctl(epoll_fd, ADD, socket1, READ_EVENT);
epoll_ctl(epoll_fd, ADD, socket2, READ_EVENT);// 3. 进入事件循环
while (true) {// 阻塞等待,直到有事件发生,仅返回就绪的事件列表ready_events = epoll_wait(epoll_fd); // 4. 处理所有就绪的事件for (event in ready_events) {if (event.is_readable()) {data = read(event.fd); // 此处read通常不会阻塞process(data);         // 交给业务逻辑处理}}
}

未完待续

很高兴与你相遇!如果你喜欢本文内容,记得关注哦

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

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

相关文章

10.17 CSP-S模拟33 改题记录

10.17HZOJ 写在前面 貌似没啥可写。。。大概就是二十多分钟写完T1然后写T2,一直想假一直写挂然后写了三个多小时,好在写出来了。T3看不上,T4正解需要的东西都写了然后喜提0pts,甚至不如输出0的37pts。《夜信》 今晚…

包装类(基本数据类型对应的引用数据类型)

包装类(基本数据类型对应的引用数据类型) Notice:基本数据类型存在栈里(基本类型基本没有属性和方法,所以基本类型的运算都靠Java提供的运算符) 引用数据类型存在堆里 所以栈里存的是堆里东西的地址NObject可统一…

luogu P7915 [CSP-S 2021] 回文

题目大意 给定一个长度为 \(2n\) 的序列 \(a\),要求每次取出其第一个数或者最后一个数,使得取出的数列 \(b\) 为一个回文数列。 注:回文数列即 \(\forall i\in \{ 1,n \}\) 都有 \(b_i=b_{2n-i+1}\) Sol 考虑第一步…

字典树 Trie 乱讲

Trie 是什么 实际上它就是一颗像字典的树,支持插入单词和查询单词个数等操作。 它的边权是某个字符。比如上图,插入单词 aca 时,我们就可以在 \(5\) 号节点下新建一个节点,边权为 a。而查询是否单词 abs 时,答案为…

系统稳定性监控

系统监控告警在研发日常运营中扮演着关键角色。没有监控,线上应用的运行就如同一个黑盒,无法预知潜在问题,往往只能依靠客服或用户反馈来发现。但此时,可能已经错过了最佳解决时机,甚至导致用户流失。一:系统监控…

USACO 绿-蓝 思维题小记

P6005 [USACO20JAN] Time is Mooney G dj 跑最长路是错的,可以以经过边数为阶段 \(O(nm)\) dp P6149 [USACO20FEB] Triangles S 枚举每个点,四个象限分讨,前缀和+二分做完 P6278 [USACO20OPEN] Haircut G 我的想法是…

Day16-C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\classlei

Random()java.lang.Math.Random 调用这个Math.Random()能返回带正号的double值,该值[0.0,1.0),该返回值是一个伪随机选择的数,在该范围内近似均匀分布 public class random {public static void main(String[] args…

一个实用的短视频脚本创作指令分享

整理了一套结构化的AI指令,专门用来生成抖音短视频脚本。实测下来效果不错,这里分享给有需要的朋友。上周帮朋友优化了几个短视频脚本,发现很多人卡在"知道要拍什么,但不知道怎么拍"这个环节。于是整理了…

redis和mysql之间的数据一致性

解决双写一致性问题的主要策略 1、旁路缓存模式(Cache Aside Pattern) 在这个模式中,我们一般都是先更新数据库再删除旧缓存。 首先,为什么我们不选择先删除缓存再更新数据库,因为这样会导致在并发的情况下,假如A线…

ubuntu允许root登录桌面系统

1.设置root密码 sudo passwd root2.解锁root sudo passwd -u root 3.允许root登录 sudo nano /etc/gdm3/custom.conf# [Security] 下添加一下行AllowRoot=truesudo nano /etc/pam.d/gdm-password#注释或删掉以下行au…

申威(sw_64)架构下如何安装java-1.8.0-swjdk的rpm包?​

申威(sw_64)架构下如何安装java-1.8.0-swjdk的rpm包?​​ 专门为申威(sw_64)架构的电脑打造的Java 8运行环境。 ​1. 下载文件​ 安装包下载:https://pan.quark.cn/s/936281541bdf ,确保你已经下载了 java-1.8.…

AI协科学家:技术革命还是安全噩梦?

本期节目深入探讨AI协科学家如何推动科学突破,分析基于智能体架构中的安全黑洞问题,讨论人类是否准备好让AI处理所有日常任务,并揭示相关技术风险与挑战。在《两个漏洞之间》的这期特别节目中,我们紧接着上个月的内…

一个决定

一个决定在家毛了好几天了,一个原因是下雨,一个原因是家里有大显示器。 但是家里的效率奇差。 自己做饭,一日三餐得刷碗,然后吃饭得时候刷剧,吃完饭了,还很难抽离出来。 今天好了,炒白菜得时候加了两勺我妈今年…

详细介绍:k8s部署前后分离架构微服务——跨域和缓存问题

详细介绍:k8s部署前后分离架构微服务——跨域和缓存问题pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas…

npm镜像配置

npm全称Node Package Manager,是node.js的模块依赖管理工具。由于npm的源在国外,所以国内用户使用起来各种不方便。下面整理出了一部分国内优秀的npm镜像资源,国内用户可以选择使用。 国内优秀npm镜像淘宝npm镜像搜…

一些特性

原始字符串(Raw String Literals) C++ 11特性 一种所见即所得的东西,可以完美返回你想要的字符串,包括换行等等 大体长这样 R"()"使用方式如 string k = R"(asdfasd sd gf a)"; cout <<…

实用指南:计算机毕设java基于mybatis的医用器械管理系统 基于 SSM+JavaWeb 的医用器械全流程管理平台 Java+MySQL 的医疗物资一体化系统

实用指南:计算机毕设java基于mybatis的医用器械管理系统 基于 SSM+JavaWeb 的医用器械全流程管理平台 Java+MySQL 的医疗物资一体化系统2025-10-17 20:04 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: …

计算机视觉技术与应用深度解析

本文详细介绍了计算机视觉技术在电商推荐、无人机导航、广告生成等领域的实际应用,探讨了视觉语言模型的架构设计与抗幻觉技术,并分析了云端AI服务的三层技术栈构建原理。计算机视觉技术与应用深度解析 在今年的计算…

央链知播受权发布:图说《“可信资产 IPO + 数链金融 RWA” 链改 2.0 六方共识》 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

AGC 板刷记录1

准备板刷 \(\text{agc}\),顺便写一个做题记录 [AGC072A] Rhythm Game 感觉水黑吧,洛谷恶评。 一眼就能看出不是贪心就是 \(\text{dp}\),发现其实两者兼有,首先把这个题转化成:有若干个任务,第 \(i\) 个任务在 \(…