nginx源码分析(4)——事件模型
对于一个服务器来说,事件模型是至关重要的,nginx本身的高性能也要归功于其优秀的事件模型。一般地,nginx的事件模型是基于epoll的,而使用epoll需要调用epoll_create、epoll_ctl和epoll_wait三个函数。由于nginx本身的松耦合模块机制,这些函数的调用被隐藏在很难发现的地方,本篇文章就来介绍nginx的事件模型的初始化过程,从而大家可以清晰的知道epoll各个函数的具体调用位置。
1. 重要的数据结构1. ngx_event_actions_t
这个结构是nginx底层事件模型的抽象,具体的io模型会有自己的实现,比如epoll、select。通过这一层的抽象屏蔽了底层的不同实现,我们可以轻易从一种模型迁移至其他模型。这实际上就是C的面向接口编程,值得学习。在ngx_event.c中定义了全局变量ngx_event_actions,他指向具体的底层实现,在底层模型init函数中被赋值。
if (ngx_posted_events) { if (ngx_threaded) { ngx_wakeup_worker_thread(cycle); } else { ngx_event_process_posted(cycle, &ngx_posted_events); } }在执行完ngx_process_events_and_timers后,会继续worker进程的主循环,然后一直不停的调用ngx_process_events_and_timers,让进程阻塞在epoll_wait上直到有事件发生,这个循环会一直不停,周而复始直到worker进程退出。 上面在介绍事件模型初始化时,并没有提到监听socket的创建和初始化过程,还有一旦accept到新的连接,那么调用ngx_event_accpet后又会发生什么。这些内容会在后面的源码分析文章中一一介绍。