作者回复: 当需要监控某个事件时,用户进程要把它加到树中;当某个事件发生时,系统把它加入到链表中。
作者回复: 对的,而且65535只是限制了nginx与一个上游服务端口之间的连接数。
作者回复: 一个TCP连接是四元组,所以nginx对下游虽然只开放一个端口例如80,IP地址也只有1个,但下游服务器每台可以对该nginx最多建立6万多连接,只要15台下游服务器,就能建立百万并发连接了。
作者回复: 这么理解没问题,上游服务器的总连接数限制了作为反向代理的nginx的并发上限。
作者回复: 1、链表中存放的是活跃的事件; 2、网卡收到报文形成事件,放入该链表; 3、二叉树是事件全集,包括不活跃事件。它相当于链表的字典,用于快速查询。
作者回复: 1、红黑树用于快速操作,例如增删改查 2、链表用于epoll_wait系统调用,快速返回活跃事件
作者回复: 1、基于epoll的事件多路复用减少了进程间切换的次数,使得操作系统少做了相对于用户任务来说的无用功。 2、epoll比select等多路复用方式来说,减少了遍历循环及内存拷贝的工作量,因为活跃连接只占总并发连接的很小一部分。
作者回复: select和poll最大的问题是,每次都需要传递全部并发fd,而实际只有少量fd有数据需要处理,所以效率低下。而epoll通过epoll_ctl和epoll_wait分解了这个问题,效率大幅提高。
作者回复: 先讲下什么叫不活跃连接,比如: 1、有些TCP连接网速很慢,只有几B/S; 2、有些客户端很慢,它的CPU 100%了; 3、有些业务应用需要用户做输入后,才会在TCP连接上继续发送消息。 我就不穷举了。这些TCP连接,在某个1秒内都没有任何事件,就叫不活跃链接。 反之叫活跃链接
作者回复: 1、变成活跃,通常是因为网卡收到报文,而从报文的端口和IP可以快速关系到socket,再把这个socket直接放到链表即可,不需要遍历全部连接。 2、红黑树的查找效率是O(logN)的复杂度,比队列的O(N)好得多