当前位置: 首页 > news >正文

I/O 多路复用器(select、poll、epoll)与 Reactor 模式详解

I/O 多路复用器(select、poll、epoll)与 Reactor 模式详解

在这里插入图片描述

1. I/O 多路复用器(Multiplexer)

I/O 多路复用器允许一个线程同时监控多个文件描述符(fd),并在它们就绪时进行读写操作。常见的三种多路复用器是 select、poll、epoll

特性selectpollepoll
工作原理轮询所有 fd轮询所有 fd事件驱动(回调)
最大 fd 数量1024(固定)无限制(系统资源限制)无限制(系统资源限制)
效率O(n),遍历所有 fdO(n),遍历所有 fdO(1),仅处理就绪 fd
适用场景fd 数量少且活跃度高fd 数量较多但活跃度一般fd 数量大且活跃度低
内存拷贝每次调用需拷贝 fd 集合每次调用需拷贝 fd 数组仅注册一次,无额外拷贝
触发模式水平触发(LT)水平触发(LT)支持水平触发(LT)和边缘触发(ET)

总结:

  • select:适用于 fd 数量少(≤1024)且活跃比例高的场景,如小型服务器。
  • poll:适用于 fd 数量较多但活跃比例一般的场景,相比 select 无数量限制。
  • epoll:适用于高并发场景(fd 数量大且活跃比例低),如 Nginx、Redis。

2. Reactor 模式

Reactor 模式是一种 事件驱动 的设计模式,用于高效处理大量并发 I/O 请求。它基于 I/O 多路复用器(如 epoll)实现,核心思想是 “事件分发 + 回调”

Reactor 的核心组件:

  1. Reactor(反应器)
    • 负责监听 I/O 事件(如 epoll_wait)。
    • 当事件就绪时,分发给对应的处理器(Handler)。
  2. Handler(事件处理器)
    • 处理具体的事件(如 acceptreadwrite)。
    • 通常以回调函数的形式注册到 Reactor 中。
  3. Demultiplexer(多路复用器)
    • 底层使用 select/poll/epoll 监听 fd 状态。
    • 当 fd 就绪时,通知 Reactor。

Reactor 的工作流程:

  1. 注册事件处理器
    • 应用程序向 Reactor 注册 fd 及其对应的事件处理器(Handler)。
    • 例如:监听 socket 注册 EPOLLIN 事件,回调 accept_handler
  2. 事件循环(Event Loop)
    • Reactor 调用 epoll_wait 等待事件发生。
    • 当某个 fd 就绪时,Reactor 根据事件类型调用对应的 Handler。
  3. 处理事件
    • Handler 执行具体的业务逻辑(如读取数据、发送响应)。
    • 处理完成后,可以继续注册新的事件(如 EPOLLOUT 写事件)。

Reactor 的优点:

  • 单线程高并发:一个线程可以处理成千上万的连接。
  • 低资源消耗:避免多线程的上下文切换开销。
  • 事件驱动:只处理就绪的 fd,不浪费 CPU 时间。

Reactor 的缺点:

  • 编程复杂度高:需要管理回调函数和事件状态。
  • 不适合 CPU 密集型任务:长时间的计算会阻塞事件循环。

3. Reactor 与多路复用器的关系

  • Reactor 是模式epoll 是实现
    • Reactor 是一种设计模式,定义了事件分发和处理的框架。
    • epoll 是 Linux 提供的 I/O 多路复用机制,用于实现 Reactor 的事件监听部分。
  • Reactor 可以基于不同的多路复用器
    • 可以用 selectpollepoll 作为 Reactor 的底层 Demultiplexer。
    • epoll 是最适合 Reactor 的高性能实现,因为它的事件驱动机制与 Reactor 完美契合。

示例:Reactor + epoll 的工作流程

注册事件处理器
epoll_ctl
epoll_wait
分发事件
处理数据
应用程序
Reactor
epoll 内核
Handler

4. 总结

概念作用适用场景
select轮询所有 fd,简单但效率低fd 数量少(≤1024),活跃度高
poll改进版 select,无数量限制fd 数量较多,活跃度一般
epoll事件驱动,高效处理高并发fd 数量大(>1024),活跃度低
Reactor事件驱动框架,基于多路复用器高并发服务器(Nginx、Redis)

结论:

  • 小型服务器(连接数少):selectpoll 足够。
  • 高并发服务器(连接数多):epoll + Reactor 是最佳选择。
  • Reactor 模式 的核心是 事件驱动 + 回调epoll 是其最佳搭档。

文章转载自:

http://FWnLpJJD.bpmdx.cn
http://17oybyAW.bpmdx.cn
http://uW5VS7zk.bpmdx.cn
http://M9B0nFhQ.bpmdx.cn
http://PmCVUf63.bpmdx.cn
http://c4UugjGo.bpmdx.cn
http://mCpyqVwq.bpmdx.cn
http://VBENSj8p.bpmdx.cn
http://ls3PZHgG.bpmdx.cn
http://qtprOO6C.bpmdx.cn
http://647aHs0O.bpmdx.cn
http://3q8wPekX.bpmdx.cn
http://cjc6jEr7.bpmdx.cn
http://KVZIHY2c.bpmdx.cn
http://qDMTH3Xy.bpmdx.cn
http://rsPcyH4D.bpmdx.cn
http://A6kEF0VR.bpmdx.cn
http://UKiyL8bi.bpmdx.cn
http://kcxUsKY0.bpmdx.cn
http://zlpP3mQB.bpmdx.cn
http://MkgBQ0SK.bpmdx.cn
http://k9SqsIp7.bpmdx.cn
http://74BXRgW9.bpmdx.cn
http://biWO6U0D.bpmdx.cn
http://EUPjLMFD.bpmdx.cn
http://OhQrGYLn.bpmdx.cn
http://kLGyx8GO.bpmdx.cn
http://toPdUNMq.bpmdx.cn
http://UoocWAWQ.bpmdx.cn
http://hA8DmfYW.bpmdx.cn
http://www.dtcms.com/a/387635.html

相关文章:

  • pytorch自定义算子转tensorrt
  • Springboots上传文件的同时传递参数用对象接收
  • Next.js 中表单处理与校验:React Hook Form 实战
  • 国标GB28181视频平台EasyGBS如何解决安防视频融合与级联管理的核心痛点?
  • Web 页面 SEO 审计自动化 - 基于 n8n 和 Firecrawl
  • arcgis文件导出显示导出对象错误
  • PPT中将图片按比例裁剪
  • React + Zustand 状态管理
  • 复位开关芯片 EY412-A07E50国产低功耗延时芯片方案超低功耗
  • 动态规划-详解回文串系列问题
  • C语言基础学习(五)——进制
  • 如何在C#中将 Excel 文件(XLS/XLSX)转换为 PDF
  • 【Error】django-debug-toolbar不显示:Failed to load module script
  • Windows 版本 WDK 版本 Windows SDK Visual Studio各版本对应关系
  • WPF 快速布局技巧
  • K8S YAML 功能详解:让容器配置更灵活
  • CAD迷你看图下载安装教程(2025最新版)
  • 根据文本区域`textarea`的内容调整大小`field-sizing:content`
  • avcodec_send_packet闪退问题
  • ftrace的trace_marker使用
  • ★基于FPGA的通信基础链路开发项目汇集目录
  • SpringBoot中@Value注入失败问题解决
  • DotCore进程CPU飙高跟踪处理方案
  • PantherX2黑豹X2 armbian 编译rkmpp ffmpeg 实现CPU视频转码
  • 2、Logstash与FileBeat详解以及ELK整合详解(Logstash安装及简单实战使用)
  • ENVI系列教程(六)——自动采集控制点的 RPC 正射校正
  • 多可见光线索引导的热红外无人机图像超分辨率重建
  • CE-RED 是什么?
  • Win10上VScode 进行ssh登录服务器时免密登录
  • AWS Global Accelerator 详解:比传统 CDN 更快的全球加速方案