1. select:传统点名法
假设你是一个服务员,餐厅有100张桌子(对应100个网络连接),但每次你都要挨个问每一桌:“需要点菜吗?”(检查是否有数据可读)。
-
问题:
- 你最多只能管1024桌(文件描述符数量限制)。
- 即使只有1桌要点菜,你也要问完100桌(遍历所有描述符)。
- 每次问完都要拿本子重新记一遍桌号(每次调用要重新传参)。
-
总结:效率低,适合小餐馆(连接数少)。
2. poll:升级版点名法
你还是服务员,但这次:
-
不限制桌数(没有文件描述符数量限制)。
-
仍然要挨个问每一桌,但改用小本本记录桌号(用链表存储描述符)。
-
问题:
- 1000桌的话,每次还是得问1000次(时间复杂度O(n))。
- 桌数越多,越累(性能线性下降)。
-
总结:比select好一点,但大餐厅(高并发)依然顶不住。
3. epoll:智能叫号系统
餐厅装了一套智能系统,每桌有个按钮,客人按下按钮(数据就绪),系统直接通知你:“5号桌要点菜!”
-
优势:
- 不用轮询:只关注被按按钮的桌子(事件驱动)。
- 无数量限制:能管几万桌(支持海量连接)。
- 高效通知:桌数再多,你只需处理“被按按钮”的桌子(时间复杂度O(1))。
-
两种模式:
- 水平触发(LT):如果5号桌的菜没上完,系统一直提醒你。
- 边缘触发(ET):只在客人第一次按按钮时提醒一次,漏单自己负责。
三者的核心区别
| select | poll | epoll | |
|---|---|---|---|
| 机制 | 轮询所有描述符 | 轮询所有描述符 | 事件驱动(只通知就绪的) |
| 效率 | O(n),随连接数下降 | O(n),同select | O(1),连接数不影响效率 |
| 最大连接数 | 1024 | 无限制 | 无限制 |
| 适用场景 | 低并发 | 中低并发 | 高并发(如百万连接) |