参考链接
我的疑问和这个链接下的高票回答下的评论中提到的差不多,其实题主是想问select代理或者epoll代理是怎么同时处理多个流的,也是轮询吗?那这和在用户代码中轮询有什么区别?
看一些入门的视频说,其实epoll比用户自定义的轮询快,有两个原因:1是用户的程序是在用户态,通过轮询判断文件句柄fs是不是满足可读,这个过程需要复制文件句柄到内核态,内核态查询之后告诉用户态的程序,这个复制过程就很浪费资源,所以epoll在内核态和用户态之间定义了个“中间态”,可以让用户态程序和内核态程序共用,就可以免除复制文件句柄的开销;2是通知机制,也就是大家通常提到的,epoll监控的一堆文件句柄,当有某个满足可读条件,会通知用户程序是哪个文件句柄,就不用轮询从里面挑具体是哪个。而第2个方法,是不是轮询?只知道epoll创建监控的文件句柄时,会创建一个红黑树,添加或删除监控的文件句柄就是对红黑树的操作。具体怎么实现的就不清楚了。这些高赞回答也没说出具体的道理…希望了解比较透彻的能解答一下困惑…
- 总结来说,用户程序是用户态,epoll 是用户态和内核态之间的中间态,速度快。
- epoll 用到了红黑树。