Nginx之epoll和select poll教程
epoll和 select poll 都是做I/O多路复用的。
区别在于:
epoll较灵活,如果有一百万个链接状态同时保持,但是在某个时刻,只有几百个链接是活跃的。epoll的处理是通过epoll\_create()创建对象,epoll\_ctl()收集所有的套接字添加到epoll对象,epoll\_wait()收集所有发生事件也就是所谓的活跃的链接,并收集到一个List链表中,这样只需要遍历这些List链表里的数据,而不用遍历一百万个链接。 而后者select poll则是每次收集事件时,将这一百万个链接都传给操作系统,再由操作系统内核上判断某些链接产生了事件,造成了巨大的资源浪费(大批量的不同态内存复制)。
为什么epoll效率比较高:
epoll 在epoll\_create 时,就已经建立好了一个file节点。创建epoll对象, 同时,在内核cache里建立了一个红黑树,用于存储后续epoll\_ctl传来的socket连接。再同时,又建立了一个list链表,用于存储准备就绪的事件。 等到epoll\_wait()调用的时候,只需要观察list链表里有没有数据就可以,有数据就返回,没数据就sleep。等到timeout后,及时没数据,也返回了。所以epoll\_wait会非常高效