`

nginx 源码学习笔记(十五)—— ngx_master_process_cycle 多进程

 
阅读更多

了解core模块之前还应改学习ngx_start_worker_processes函数,今天我就来详细学一下这个方法,主要内容来自于http://blog.sina.com.cn/s/blog_677be95b0100iivk.html

nginx的进程启动过程是在ngx_master_process_cycle(src/os/unix/ngx_process_cycle.c)中完成的(单进程是通过ngx_single_process_cycle完成,这里只分析多进程的情况),在ngx_master_process_cycle中,会根据配置文件的worker_processes值创建多个子进程,即一个master进程和多个worker进程。进程之间、进程与外部之间保持通信,进程之间是通过socketpair进行通信的,socketpair是一对全双工的无名socket,可以当作管道使用,和管道不同的是,每条socket既可以读也可以写,而管道只能用于写或者用于读;进程与外部之间是通过信号通信的。

master进程主要进行一些全局性的初始化工作和管理worker的工作;事件处理是在worker中进行的。

进程启动的过程中,有一些重要的全局数据会被设置,最重要的是进程表ngx_processes,master每创建一个worker都会把一个设置好的ngx_process_t结构变量放入ngx_processes中,进程表长度为1024,刚创建的进程存放在ngx_process_slot位置,ngx_last_process是进程表中最后一个存量进程的下一个位置,ngx_process_t是进程在nginx中的抽象:


进程间通信是利用socketpair创建的一对socket进行的,通信中传输的是ngx_channel_t结构变量:


进程的启动过程是比较重要的一个环节,为了把这个过程分析透彻,下面会多采用首先分析ngx_master_process_cycle函数,可以分解为以下各步骤:

1、master设置一些需要处理的信号,这些信号包括

SIGCHLD,SIGALRM,SIGIO,SIGINT,NGX_RECONFIGURE_SIGNAL(SIGHUP),NGX_REOPEN_SIGNAL(SIGUSR1),
NGX_NOACCEPT_SIGNAL(SIGWINCH),NGX_TERMINATE_SIGNAL(SIGTERM),NGX_SHUTDOWN_SIGNAL(SIGQUIT),
NGX_CHANGEBIN_SIGNAL(SIGUSR2);




2、调用ngx_setproctilte设置进程标题,title = "master process" + ngx_argv[0] + ... + ngx_argv[ngx_argc-1];




3、调用ngx_start_worker_processes(cycle, ccf->worker_processes, NGX_PROCESS_RESPAWN)启动worker进程;




4、调用ngx_start_cache_manager_processes(cycle, 0)启动文件cache管理进程,有些模块需要文件cache,比如fastcgi模块,这些模块会把文件cache路径添加到cycle->paths中,文件cache管理进程会定期调用这些模块的文件cache处理钩子处理一下文件cache;


注释代码的方式分析。5、master循环处理信号量。


下一节,继续讲子进程创建,和所做的操作。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics