select、poll和epoll

80 阅读2分钟

1. select:传统点名法

假设你是一个服务员,餐厅有100张桌子(对应100个网络连接),但每次你都要挨个问每一桌:“需要点菜吗?”(检查是否有数据可读)。

  • 问题

    • 你最多只能管1024桌(文件描述符数量限制)。
    • 即使只有1桌要点菜,你也要问完100桌(遍历所有描述符)。
    • 每次问完都要拿本子重新记一遍桌号(每次调用要重新传参)。
  • 总结:效率低,适合小餐馆(连接数少)。


2. poll:升级版点名法

你还是服务员,但这次:

  • 不限制桌数(没有文件描述符数量限制)。

  • 仍然要挨个问每一桌,但改用小本本记录桌号(用链表存储描述符)。

  • 问题

    • 1000桌的话,每次还是得问1000次(时间复杂度O(n))。
    • 桌数越多,越累(性能线性下降)。
  • 总结:比select好一点,但大餐厅(高并发)依然顶不住。


3. epoll:智能叫号系统

餐厅装了一套智能系统,每桌有个按钮,客人按下按钮(数据就绪),系统直接通知你:“5号桌要点菜!”

  • 优势

    • 不用轮询:只关注被按按钮的桌子(事件驱动)。
    • 无数量限制:能管几万桌(支持海量连接)。
    • 高效通知:桌数再多,你只需处理“被按按钮”的桌子(时间复杂度O(1))。
  • 两种模式

    • 水平触发(LT)​:如果5号桌的菜没上完,系统一直提醒你。
    • 边缘触发(ET)​:只在客人第一次按按钮时提醒一次,漏单自己负责。

三者的核心区别

selectpollepoll
机制轮询所有描述符轮询所有描述符事件驱动(只通知就绪的)
效率O(n),随连接数下降O(n),同selectO(1),连接数不影响效率
最大连接数1024无限制无限制
适用场景低并发中低并发高并发(如百万连接)