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 实例所做的事情。

相关推荐
jieyucx7 分钟前
Windows11 & Linux 环境Docker部署与镜像拉取效率优化实战指南
linux·运维·docker
weixin_3077791334 分钟前
Linux下ClickHouse数据仓库故障系统化诊断脚本
linux·运维·clickhouse·自动化·数据库开发
记忆停留w11 小时前
从单体到微服务:Redis 协同 MySQL、Milvus、MinIO 搭建企业级RAG/AI Agent脚手架架构
大数据·人工智能·redis·微服务·ai·架构·milvus
小二·11 小时前
RAG + 向量数据库实战:ChromaDB / Milvus / FAISS 选型与性能横评
数据库·milvus·faiss
矜持的左手11 小时前
电子小白的枕边书:电子学(The Art of Electronics)
数据库·restful
吴声子夜歌11 小时前
Redis 5.x——布隆过滤器
数据库·redis·缓存
RisunJan12 小时前
Linux命令-rlogin(远程登录)
linux·运维
蓝天下的守望者12 小时前
svt_apb_if里的宏定义问题
运维·服务器·数据库
上海云盾-小余12 小时前
网站频繁遭遇 SQL 注入溯源与原生漏洞修复全流程总结
数据库·sql