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

相关推荐
Zixhy2 小时前
手撕Reactor模型实现同步高并发服务器及Muduo网络库深入解析
linux·服务器·网络·数据库·c++
迷途之人不知返2 小时前
【进程】-4-进程状态(2):Linux中的进程状态
linux
程序员清风9 小时前
Java 后端高并发设计:线程池、限流、熔断与降级
java·数据库·oracle
天衍四九-9 小时前
MySQL中如何定位慢查询?如果SQL语句执行很慢,如何分析和优化?
数据库·sql·mysql
尚久龙9 小时前
mysql-5.7.26-winx64的安装步骤
数据库·mysql
医疗信息化王工9 小时前
DataForge:基于 Python 的数据库批量导出 Excel 工具——从架构到部署的全流程实战
数据库·python·excel
实心儿儿9 小时前
MySQL 的安装
数据库·mysql·adb
bosins11 小时前
WSL 迁移指南:如何将 Linux 环境完整复制到另一台电脑
linux·运维·服务器
程序员阿鹏11 小时前
为什么MySQL InnoDB选择B+树?
数据结构·数据库·b树·sql·mysql·算法·缓存
瀚高PG实验室12 小时前
使用pg_stat_statements抓取数据库TOP SQL
数据库·sql·postgresql·瀚高数据库