微信公众号:郑尔多斯
关注可了解更多的知识。任何问题或建议,请公众号留言;
关注公众号,有趣有内涵的文章第一时间送达!
内容回顾
前面的几篇文章中,我们介绍了的事件模块的基础知识。我们知道中包含了三个与事件相关的,分别为,,。我们也分别分析了这三个模块的配置文件的解析过程,从本篇文章开始,将详细分析的事件处理过程,比如如何添加事件,删除事件,处理事件等。
事件处理的概述
事件处理模块的主要解决的问题是如何收集,分发以及管理事件。在中,事件主要包含网络事件和定时器事件。当然还有其他事件,比如进程和进程通信也是使用事件机制来完成的,但是我们的关注点主要在前两种事件,第三种事件以后会分析。前面我们分析了是如何解析配置文件中与事件有关的配置项的,我们知道,当遇到的时候,表示开始处理事件配置项了。
事件和连接
作为web服务器,每一个用户请求至少对应一个连接,每个连接都包含一个毒事件和一个写事件。这样epoll就可以根据触发的事件类型来调度相应的模块进行处理。连接分为主动连接和被动连接。分别用和结构体来表示。
主动连接: 客户端发起,服务器被动接受的连接
被动连接: 作为客户端,向上游服务器发起的连接
本系列文章所介绍的连接都是被动连接,即作为服务器被动的接受客户端发起的连接。
Nginx连接池
为了提高效率,在启动的时候,会创建好连接池和对应的读写事件,并且将每个连接都和对应的读写事件对应起来。这样的话,在后面使用到连接的时候,只需要从连接池中获取一个空闲的连接就行了。那么是在什么时候创建了连接池和读写事件呢?
前面两篇文章我们介绍了, , 的配置项解析过程,以及, 方法。我们知道结构体有中有许多钩子函数,其中有一个钩子函数为,这个方法会在启动过程中调用。在模式下,当创建了进程之后,会在进程的初始化过程中调用。
通过源码可以发现,与事件机制相关的三个模块中,只有有一个钩子函数,为。其他两个模块都没有对应的钩子函数。
具体的调用过程如下:
调用init_process()方法
ngx_event_process_init
下面我们就分析一下这个这个方法。
这个函数的主要逻辑如下;
获取我们的全局配置结构体和事件模块的配置结构体
初始化和,这两个都是队列,用来保存需要滞后处理的连接和事件。
初始化时间红黑树
遍历所有的模块,找到我们选择的事件模块,比如模块,然后调用该事件模块的方法(该方法下一篇文件进行分析)
对时间参数进行处理(之后分析这部分)
, , 进行处理
对中的监听端口分配
下面我们看一下connectionread eventwrite event`的生成逻辑,如下:
上面的代码很简单,就是根据配置文件中的参数,生成对应数量的连接数,并根据下标将连接和读写事件相关联。并把空闲连接的放置在free_connection链表中
领取专属 10元无门槛券
私享最新 技术干货