epoll——I/O多路复用技术

Linux 下实现 I/O 多路复用的系统调用有 select、poll、epoll。其中 epoll 是性能最好、最适合高并发场景的。

1.I/O多路复用

要搞懂epoll,就得先明白什么是多路复用技术。

它的本质其实很简单,用一个内核维护的监控集合(如 epoll)存储所有已连接的客户端 socket,主线程阻塞在 epoll_wait 上(没有时间时线程挂起,不会占用cpu,有事件时内核才会唤醒它)。

等待内核通知哪些 socket 真的有了 I/O 事件(数据到达/可写/新连接),

然后主线程逐个串行(一个一个)处理这些就绪的 socket。

在 Redis 中,因为处理是内存操作且极快,单个线程就能支撑 10 万+ 连接。

关于这词分开解释:

I/O:输入/输出,这里特指网络 I/O(socket 的读和写)。

多路:多个网络连接(很多个 socket)。

复用:复用同一个线程(或进程)来管理所有这些连接。

合起来:

用一个线程,通过一种机制(如 epoll/select/poll)来同时监控多个 socket,只处理那些已经准备好(可读/可写/异常)的 socket。

核心优势:

  • 不需要为每个连接创建一个线程(省内存、省切换开销)。
  • 线程不会被空闲连接阻塞,可以随时去处理就绪的连接。

2.epoll本身是什么?

epoll 本身就是一个事件通知接口,它允许用户态程序向内核注册一批 socket,然后让内核帮忙监控这些 socket 上是否有 I/O 事件发生,并在事件发生时通知程序。

想象你是一个仓库管理员(主线程),你需要照看 1 万个货架(客户端连接)。

  • select/poll:你每次都要从头走到尾,问每个货架"你有没有货要出?"(轮询)。
  • epoll 是更聪明的系统:
    你给每个货架装一个呼叫按钮,然后你坐在监控室(epoll 实例)里,里面有一个登记本(红黑树) 记下所有货架的位置。当货架有货时,按钮会点亮,监控室的待办白板(就绪链表) 上就会自动写上货架号。你只需要看白板(epoll_wait),然后去处理白板上的货架。

这个"监控室 + 登记本 + 白板"就是内核中 epoll 实例所做的事情。

相关推荐
lsh曙光18 小时前
延时at指令和定时cron指令
linux·服务器·网络
圆山猫18 小时前
[Virtualization](四):Linux KVM/RISC-V 的 vCPU 运行路径
java·linux·risc-v
天桥下的卖艺者19 小时前
使用scitable包,两步生成逆概率删失权重(IPCW)
数据库·r语言
似的83519 小时前
一步一步学习使用FireMonkey动画() 使用TAnimator类创建动画
linux·学习·nginx
隔窗听雨眠19 小时前
AI原生数据库浪潮:国产数据库的架构重构与路径之争
数据库
数据库小学妹19 小时前
数据库选型实战:从数据类型到TCO成本,五维决策框架+九款产品横评
数据库·信创·国产数据库·数据库选型·oracle迁移
我不管我就要叫小猪20 小时前
嵌入式Linux----网络通信
linux·运维·服务器
神龙天舞200120 小时前
MySQL 备库为什么会延迟好几个小时
android·数据库·mysql
泡沫冰@21 小时前
ECS 的介绍和使用
linux·服务器·网络
姜太小白21 小时前
【Linux】df -h 卡住问题的通用排查与解决方案总结
linux·运维·php