Posted on 2011-09-27 11:26
冷锋 阅读(2211)
评论(0) 编辑 收藏 引用 所属分类:
linux
由于工作需要,分析了nginx的连接层事件处理模块,只是初步的大体分析。
mian函数(nginx.c)里面做一些初始化的工作,最主要的部分,是调用ngx_init_cycle,ngx_master_process_cycle(主进程循环),
ngx_init_cycle主要是做一些初始化的工作,包括调用ngx_open_listening_sockets打开socket端口监听等。
ngx_master_process_cycle函数中,先设置一下需要阻塞的信号,然后是调用ngx_start_worker_processes函数创建worker进程,然后进入一个死循环。里面应该是管理worker进程的,主循环里面调用了sigsuspend函数挂起等待信号,具体怎么管理还没研究。
ngx_start_worker_processes:调用ngx_spawn_process,循环创建N个worker进程
ngx_spawn_process:调用socketpair创建用于父子进程通信的socket,里面进行了一大堆socket参数设置,然后调用worker进程的主循环ngx_worker_process_cycle,
然后主进程设置进程表相应信息。
ngx_worker_process_cycle:先调用ngx_worker_process_init初始化进程,里面应该是设置成守护进程等等,有初始化模块信息,关闭对等socket的其中一个channel,其中比较关键的是调用ngx_add_channel_event。里面调用ngx_get_connection返回一个free的ngx_connection_t,最关键的是ngx_add_conn,其对应到epoll模块的ngx_epoll_add_connection,在这里就是添加相应的监听socket进监听队列,并设置连接为激活状态,可以看到这里epoll是用的ET模式。
接下来在ngx_worker_process_cycle中,检查是否配置了多线程模式,如果有,就创建多线程,我只关注多进程,因此先无视它,关键点是调用ngx_process_events_and_timers函数,
ngx_process_events_and_timers:调用ngx_process_events和ngx_event_process_posted,
ngx_process_events对应是ngx_epoll_process_events,这里会调用epoll_wait,就跟平常的epoll使用一样。
ngx_event_process_posted(cycle, &ngx_posted_accept_events);处理accept队列中所有事件,ngx_posted_accept_events没有找到初始化的地方,估计是编译脚本自动生成的,估计会对应到ngx_event_accept函数进行处理,里面就是普通的accept操作,返回fd,并生成一条ngx connection,然后调用ngx_add_conn加入epoll监听队列。
至此,整个流程完成。
虽然还有很多地方不懂,但总算了解了大体流程了。以上分析不保证正确,仅供参考,仅作为个人学习笔记,欢迎指正。