一、为什么要写这篇?

在学习 C++ 服务端时,我一开始只是“能看懂 Reactor 代码”,但始终有几个疑问:

  • 为什么要用 epoll
  • 为什么要用 unordered_map
  • 为什么 handler 要做映射?
  • 为什么复杂度(O(1)、O(n))这么重要?

👉 本质问题:

缺少从“事件驱动模型”到“数据结构与性能”的完整认知链路

这篇文章就是把这一整条链路彻底打通。

二、Reactor 模型本质

1️⃣ 三层角色划分

epoll      → 发现事件(谁有数据)
Reactor    → 分发事件(交给谁处理)
handler    → 处理事件(具体逻辑)

2️⃣ Reactor 核心代码抽象

reactor.add(fd, events, handler);
reactor.loop();

3️⃣ 两个核心动作

🟢 add:注册规则
(fd, event) → handler
🔴 loop:执行规则
等待事件 → 拿到 fd → 查 handler → 执行

三、两个 add 的本质区别(关键)

1️⃣ 第一个 add

reactor.add(server_fd, EPOLLIN, accept_handler);

👉 作用:

监听新连接

2️⃣ 第二个 add

reactor.add(client_fd, EPOLLIN, read_handler);

👉 作用:

处理连接数据

✅ 核心总结

一个管接入,一个管通信

四、为什么 handler 里还能 add?

因为:

新连接 = 新 fd

👉 Reactor 是:

动态事件系统

👉 本质:

运行过程中不断注册新的事件处理规则

五、epoll 的核心机制(很多人会误解)

❗不是“来一个通知一次”

而是:

状态变化才通知

示例:

第1个连接 → 状态变为可读 → 通知
第2个连接 → 仍然可读 → 不通知
第3个连接 → 仍然可读 → 不通知

👉 所以必须:

while (accept(...) != -1) {}

✅ 核心总结

epoll 通知的是“有没有”,不是“有多少”

六、复杂度(最大突破)

1️⃣ 什么是复杂度?

数据变多时,程序变慢的程度

2️⃣ 三种核心复杂度

类型 含义 场景
O(1) 一步到位 哈希查找
O(log n) 快速缩小范围 树查找
O(n) 一个个找 遍历

七、为什么 Reactor 必须用 O(1)

❌ 如果用 if/else

逐个判断 fd → O(n)

❌ 如果用遍历

扫描所有连接 → O(n)

✅ 使用 unordered_map

handlers_[fd]

👉

直接定位 → O(1)

✅ 核心总结

Reactor 的高并发,本质依赖 O(1) 查找

八、map vs unordered_map(彻底搞懂)

1️⃣ 对比表

容器 底层结构 复杂度
unordered_map 哈希表 O(1)
map 红黑树 O(log n)

2️⃣ 一句话本质

unordered_map 是“算位置”,map 是“走路径”

九、红黑树本质(不用死磕细节)

1️⃣ 为什么需要红黑树?

普通二叉树可能变成:

链表 → O(n)

2️⃣ 红黑树做了什么?

自动调整 → 保持基本平衡

3️⃣ 核心一句话

红黑树是一种“不会长歪太严重”的二叉查找树


👉 保证:

O(log n)

十、Java Map 对应关系

Java C++
HashMap unordered_map
TreeMap map

一句话总结

HashMap 是哈希表实现(O(1)),TreeMap 是红黑树实现(O(log n)

十一、整条知识链(最重要🔥)

Reactor
   ↓
fd → handler(调度)
   ↓
unordered_map(O(1))
   ↓
复杂度(性能)
   ↓
数据结构(哈希 / 红黑树)
   ↓
高并发系统设计

👉 本质:

高并发 = 事件驱动 + O(1) 查找 + 数据结构支撑

十二、总结(你必须记住的三句话)

1️⃣ Reactor 是事件调度系统
2️⃣ epoll 负责发现事件,unordered_map 负责快速分发
3️⃣ 所有高性能系统,本质都在降低复杂度

十三、后续学习路线

🔥 优先级1

👉 哈希表原理(为什么 O(1))


🔥 优先级2

👉 线程池 + 并发模型


🔥 优先级3

👉 多 Reactor 架构

最后一句

当你开始从“复杂度”角度看代码时,才真正进入工程能力的门槛。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐