📋 第 4 章 · poll 详解

pollfd 数组操作 · select vs poll 对比 · 大规模 fd 性能模拟

① pollfd 数组交互演示

添加 / 删除 fd 体验"紧凑数组"管理;点击「模拟 poll 返回」观察 events 与 revents 如何分离。

→ 当前数组状态会显示在这里

② select vs poll 同维度对比

📊 select (1983, BSD)

fd 上限: 1024(编译期硬限)
数据结构: 3 个 fd_set 位图(读 / 写 / 错)
内存占用: 永远 384 字节 (3×128B),与 fd 数无关
事件区分: 用 3 张表分开
input/output: 同一变量,会被改写(必须 master/working)
跨平台: 所有 Unix-like + Windows
性能: O(n) — 拷贝 + 遍历都是
typical 写法: 多了一份 fd_set 拷贝

📋 poll (1986, System V)

fd 上限: 无(仅受 ulimit -n)
数据结构: pollfd 结构体数组
内存占用: 8B × N(线性增长)
事件区分: events 字段位掩码
input/output: events / revents 分离,干净
跨平台: Unix-like 有 / Windows 没有
性能: O(n) — 拷贝 + 遍历都是(同 select)
typical 写法: 单数组,紧凑维护
💡 结论poll 在易用性上完胜,但性能本质没变。要质变还得等下一章的 epoll——它把 O(n) 干到了 O(1)。

③ 大规模 fd 性能模拟(select / poll vs 理想方案)

拖动滑块改变监听的 fd 数量,观察 select / poll 的"伪并发开销"。就绪率表示这次 poll/select 实际有多少 fd 真就绪。



💡 看到没?当 fd 多但就绪少时(最常见的真实场景),select 和 poll 都浪费了大量 CPU 在"看那些根本没动静的 fd"。这正是 epoll 设计的核心动机。