nginx中关于创建work进程数目问题的心得
2017-03-14 17:07
302 查看
nginx创建work进程是在一个循环中进行的;
static void
ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n, ngx_int_t type)
{
for (i = 0; i < n; i++) {
//省略
ngx_spawn_process(cycle, ngx_worker_process_cycle, NULL,
"worker process", type);
//省略若干
}
}
ngx_pid_t
ngx_spawn_process(ngx_cycle_t *cycle, ngx_spawn_proc_pt proc, void *data,
char *name, ngx_int_t respawn)
{
//省略若干
pid = fork();
switch (pid) {
case -1:
//省略若干
case 0:
ngx_pid = ngx_getpid();
proc(cycle, data);
break;
default:
break;
}
//省略若干
}
我们知道,fork在循环中创建子进程的个数是与循环个数n不等的,例如:
for(int i = 0; i < 3; ++i)
{
pid = fork();
if(pid > 0)
{
//父进程
}
else if(pid == 0)
{
//子进程
}
else
{
//error
}
}
上面的代码运行后,总共的进程数为2的3次方个,即8个进程;
那么问题来了,nginx也是通过for来创建work进程,如何控制work进程数目的呢?一值比较疑惑,通过仔细检查代码,发现原因这样的;
nginx在fork后,会运行 proc(cycle, data); proc就是ngx_worker_process_cycle函数;
static void
ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
{
for ( ;; ) {
//省略若干
ngx_worker_process_exit(cycle);
//省略若干
}
}
在这个函数中,如果退出,最终会调用ngx_worker_process_exit(cycle);
static void
ngx_worker_process_exit(ngx_cycle_t *cycle)
{
//省略若干
exit(0);
}
看到没有,这个函数最后会调用exit(0); 直接退出进程;所以整个过程明了了;
总结:
nginx通过for循环来创建进程,是如何控制work进程数目,而没有出现进程泛滥,达到2的n次方个进程的?
原因是:在fork完work进程之后,会调用work进程的死循环函数,在死循环函数中,如果收到quit命令,会直接exit(), 不会再work进程中再次fork work进程的情况出现;
static void
ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n, ngx_int_t type)
{
for (i = 0; i < n; i++) {
//省略
ngx_spawn_process(cycle, ngx_worker_process_cycle, NULL,
"worker process", type);
//省略若干
}
}
ngx_pid_t
ngx_spawn_process(ngx_cycle_t *cycle, ngx_spawn_proc_pt proc, void *data,
char *name, ngx_int_t respawn)
{
//省略若干
pid = fork();
switch (pid) {
case -1:
//省略若干
case 0:
ngx_pid = ngx_getpid();
proc(cycle, data);
break;
default:
break;
}
//省略若干
}
我们知道,fork在循环中创建子进程的个数是与循环个数n不等的,例如:
for(int i = 0; i < 3; ++i)
{
pid = fork();
if(pid > 0)
{
//父进程
}
else if(pid == 0)
{
//子进程
}
else
{
//error
}
}
上面的代码运行后,总共的进程数为2的3次方个,即8个进程;
那么问题来了,nginx也是通过for来创建work进程,如何控制work进程数目的呢?一值比较疑惑,通过仔细检查代码,发现原因这样的;
nginx在fork后,会运行 proc(cycle, data); proc就是ngx_worker_process_cycle函数;
static void
ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
{
for ( ;; ) {
//省略若干
ngx_worker_process_exit(cycle);
//省略若干
}
}
在这个函数中,如果退出,最终会调用ngx_worker_process_exit(cycle);
static void
ngx_worker_process_exit(ngx_cycle_t *cycle)
{
//省略若干
exit(0);
}
看到没有,这个函数最后会调用exit(0); 直接退出进程;所以整个过程明了了;
总结:
nginx通过for循环来创建进程,是如何控制work进程数目,而没有出现进程泛滥,达到2的n次方个进程的?
原因是:在fork完work进程之后,会调用work进程的死循环函数,在死循环函数中,如果收到quit命令,会直接exit(), 不会再work进程中再次fork work进程的情况出现;
相关文章推荐
- nginx怪异问题之work进程
- 关于进程创建时在驱动下获取命令行参数的问题
- nginx的worker数目进程设置问题
- 关于判断CreateProcess创建的子进程何时退出和CRichEditCtrl::FindText()一直返回-1的问题解决。
- 补充一个小问题:关于国嵌视频里面的进程创建例程的小错误
- 关于学习MSDN中"创建自定义字段类型和字段控件"的一些心得跟问题。
- 关于Python3中多次fork创建进程的问题
- 关于系统进程lsass.exe的病毒问题
- 关于释放ASPNET进程的内存占用问题.
- 心得体会:关于开发效率和项目周期的问题
- 关于病毒模块插入系统、应用程序进程的问题
- 关于创建跨多列、多行表头的DataGrid的一些问题
- 关于spoolsv.exe进程耗尽CPU资源问题的解决方法
- 关于病毒模块插入系统、应用程序进程的问题
- 关于使用WindowsUpdate 或 Windows 自动升级时碰到的 svchost.exe 进程 CPU 资源占用过高的问题的相关信息
- 学习心得:关于C#中Queue的线程安全问题
- 心得体会:关于开发效率和项目周期的问题
- 关于如何从多个项目创建 ASP.NET 应用程序以进行组开发问题
- 有关于在Java 类的静态初始化块中创建一个自身实例的问题。
- 关于病毒模块插入系统、应用程序进程的问题