什么是Redis的 IO 多路复用

IO多路复用 & epoll 面试完整版

一、基础概念

1. 什么是 IO 多路复用

IO 多路复用 :一个线程通过单个系统调用 ,同时监听多个文件描述符(FD),当任意一个 FD 有可读/可写/异常事件时,内核通知线程,线程再去处理对应 IO。

核心价值:单线程高效管理大量连接,避免多线程模型的线程创建、切换、锁竞争开销,是高并发网络服务的核心基础。

常见实现:Linux 下 selectpollepoll;Windows 下 IOCP。Redis、Nginx、Tomcat 均基于该技术。


2. epoll 详细原理(Linux 主流实现)

epoll 是 Linux 高性能 IO 多路复用模型,分为水平触发(LT)边缘触发(ET),整体分三步使用:

(1)三大核心系统调用

  1. epoll_create

    创建一个 epoll 实例,返回 epoll 文件描述符,内核会分配专属内存空间,用于存放待监听的 FD 和事件。

  2. epoll_ctl

    向 epoll 实例增/删/改 要监听的文件描述符(比如客户端连接 Socket),并绑定监听事件(读、写、异常)。

    内核会把这些 FD 挂载到红黑树 中管理,同时维护一个就绪链表,专门存放已经产生事件的 FD。

  3. epoll_wait

    线程阻塞等待事件,内核扫描就绪链表,直接把已经就绪的 FD 列表返回给用户态线程。线程遍历列表,逐个处理 IO 读写。

(2)两大触发模式

  • 水平触发 LT(默认) :只要 FD 还有数据未读完,每次 epoll_wait 都会持续通知,兼容性好,Redis 默认使用。
  • 边缘触发 ET :仅在状态第一次变化时通知一次,必须一次性把数据读完,要求代码严谨,性能略高。

(3)相比 select/poll 的核心优势

  1. 文件描述符无上限:select 有最大 FD 限制,epoll 仅受系统资源限制;
  2. 时间复杂度更低:select/poll 遍历全部 FD(O(n)),epoll 只遍历就绪 FD(O(1));
  3. 内存拷贝优化:epoll 采用内存映射,减少用户态与内核态之间的数据拷贝开销。

二、标准面试口述回答(分版本,直接背诵)

版本1(常规完整版,面试通用)

IO 多路复用是用一个线程监听多个IO连接,有事件到达再进行处理,提升并发能力。

Linux 下主流实现是 epoll,它通过 epoll_create 创建实例,epoll_ctl 管理监听的文件描述符,内核用红黑树维护所有监听FD、就绪链表存放有事件的FD;最后通过 epoll_wait 阻塞获取就绪事件。

epoll 分为水平触发和边缘触发,相比 select/poll,它没有连接数上限,且只遍历就绪连接,高并发场景性能优势明显,Redis、Nginx 等高并发中间件都基于 epoll 实现网络模型。

版本2(精简版,短问答使用)

IO多路复用让单线程监听多个网络连接。epoll 是Linux高性能实现,依靠红黑树管理监听连接、就绪链表返回事件,时间复杂度低、连接数无上限,支持两种触发模式,是高并发服务的底层网络基础。


三、一句话总结(收尾必背)

epoll 是 Linux 下高性能 IO 多路复用实现,依靠内核红黑树与就绪链表,让单线程高效监听海量网络连接,支撑高并发网络服务。

相关推荐
Java牛马10 小时前
Caffeine 缓存及其应用相关总结
java·redis·缓存·caffeine·数据一致性·本地缓存
xiaojiaohuazi10 小时前
国产安陆EG4S20 FPGA实现千兆以太网TCP/IP:AD7606C 8通道1 MSPS采集、SDRAM缓存与Python上位机
tcp/ip·缓存·fpga开发
Nil20811 小时前
leetcode 146LRU缓存
算法·leetcode·缓存
李可以量化11 小时前
Redis 从了解到精通(三)上:量化交易场景下的数据备份与安全配置
redis·python·安全·qmt·ptrade
BK贝壳12 小时前
Python底层:1亿个布尔值缓存失效标记,list爆内存numpy爆拷贝,bool-hybrid-array混合存储实测
数据结构·python·缓存·性能优化·list·numpy
mmsx12 小时前
置灰按钮为什么自己又“亮“了?一次状态缓存“双写冲突“的排查记录
java·缓存·bug·livedata
音符犹如代码13 小时前
Varnish Cache 实战:反向代理缓存原理与 VCL 配置
java·spring·缓存
liangshanbo121513 小时前
前端工程化面试题:打包文件名Hash与浏览器缓存机制
前端·缓存·哈希算法
2602_9599609214 小时前
电商场景Java面试:Spring Boot、JVM、Redis、Kafka、微服务与分布式事务考点解析——谢飞机的作死面试记
java·jvm·spring boot·redis·面试题
蒸蒸yyyyzwd14 小时前
cpp 选手备战秋招学习笔记 day11
redis·笔记·求职招聘