epoll 的实现

epoll 这么好,为什么迟至 2.6 版本的 kernel 才支持(epoll manual: The epoll API was introduced in Linux kernel 2.5.44.)?2.4 版本的 kernel 不支持 epoll?

原因很简单,epoll 没什么神奇的。在早期没有太多的并发连接要处理,select/poll 足以应对,遍历一遍又能怎样。而实现 epoll 的基础设施在早期内核里也没有,所以支不支持的,也不是什么大家关注的事。

epoll 依赖的内核基础设施只是一个 wakeup 时的 callback:
epoll 的实现_第1张图片

epoll 可注册一个 func callback,当 tcp_data_ready(也适用于其它协议) 被调用时,在该 func 中先将自己放进一个 ready list,再唤醒 epoll_wait,后者只要将 ready list 上报即可,省去了像 select/poll 那样自行遍历找活跃 socket,这就是 epoll 实现的精髓。

epoll 省去了遍历开销,这意味着并发连接越大且活跃连接越少,epoll 优势越大,反之,如果所有连接都是活跃连接,epoll 反而会损失性能,看看那一大堆代码就会明白,每一条指令都是要花费 CPU 时间的,select 受 1024 限制,poll 就挺好。

皮鞋没有蹬上,露着白袜子。

浙江温州皮鞋湿,下雨进水不会胖。

你可能感兴趣的:(epoll)