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

相关推荐
暴力求解1 小时前
MySQL操作库
数据库·mysql
Rick19931 小时前
线上慢SQL排查完整实战案例
数据库·sql
浮生若城1 小时前
Linux库制作与原理(1):静态库、动态库和ELF文件
linux·运维·服务器
努力努力再努力wz1 小时前
【Qt入门系列】:QLabel控件详解:从文本显示到图片展示,再到内容布局与伙伴机制
android·开发语言·数据结构·数据库·c++·qt·mysql
Volunteer Technology1 小时前
Flink编程模型与API(二)
大数据·数据库·flink
文青小兵1 小时前
Linux云计算——docker部分技术、命令 (一)
linux·docker·云计算
文青小兵2 小时前
Linux云计算——docker 监控(五)
linux·docker·云计算·grafana·prometheus
流星白龙2 小时前
【MySQL高阶】9.在一台机器上运行多个MySQL实例
数据库·mysql·adb
Rick19932 小时前
MySQL 优化器会选择【最小、最精准、最高效】的索引
数据库·mysql