nginx创建n个工作子进程

nginx属于多进程方案,那么是怎么创建n个进程的呢??

1.1 linux中fork创建进程

linux下创建进程的系统调用是fork。其定义如下
#include <sys/types.h>
#include <unistd.h>
pid_t fork();
在循环中创建进程时,进程的个数是怎样的?
1、循环中没有任何父子进程的判断

#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
int main()
{pid_t pid;int idx = -1;for (int i = 0; i < 2; i++) {pid = fork();  }while (1);    exit(0) ;
}

输出为

可以看出总共有4个进程
其生成过程图如下所示

2、创建指定个数的子进程

在创建子进程后,根据fork的返回值判断是否是子进程,如果是子进程:
(1)退出循环,进入子进程的事件处理;(2)不退出循环,直接是子进程的事件处理,其中 事件处理是一个循环,所在循环退出前,子进程是不会执行for语句的,这也是nginx创建工作进程的方式
代码如下

int main()
{pid_t pid;int idx = -1;for (int i = 0; i < 2; i++) {pid = fork();if (pid < 0) {exit(-1);} else if (pid > 0) {continue;} else {idx = i;while (1) {printf("idx=%d\n", idx);}}}while (1);    exit(0) ;
}

输出为

可以看到有3个进程,两个子进程,一个父进程

其生成过程图如下所示

2.nginx中创建n个进程

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通过fork循环来创建进程,是如何控制work进程数目,而没有出现进程泛滥,达到2的n次方的进程数目呢?
原因:在fork完work进程后,调用work进程的死循环函数,在死循环中,如果收到quit命令,会直接exit(),不会在work进程中再次执行fork函数,所以子进程不会在创建子进程。

参考资料:

  1. https://blog.csdn.net/xiexingshishu/article/details/46398051
  2. https://blog.csdn.net/sohu_2011/article/details/62045496

nginx创建n个工作子进程相关推荐

  1. MFC多线程的创建,包括工作线程和用户界面线程

    MFC多线程的创建 1.MFC多线程简介 MFC对多线程进行了一层简单的封装,在Visual C++中每个线程都是从CWinThread类继承而来的.每一个应用程序的执行都有一个主线程,这个主线程也是 ...

  2. Nginx 与 FPM 的工作机制

    网络上有很多关于如何配置 Nginx + FPM 的文章,但它们更多从操作的角度出发,告诉我们怎么做,但却没有告诉我们为什么要这么做,本文从 Nginx 与 FPM 的工作机制出发,探讨配置背后的原理 ...

  3. ea如何创建程序流程图_免费流程图创建器和工作流程图应用程序–经理指南

    ea如何创建程序流程图 If you want to get more technical with your product management skills, being able to wor ...

  4. nginx基本功能和工作原理

    nginx能做什么 反向代理 正向代理 负载均衡 HTTP服务器(包含动静分离) 反向代理和正向代理 正向代理.简单的说,我是一个用户,我无法直接访问一个网站,但是我能访问一个代理服务器,这个代理服务 ...

  5. nginx php 协同工作,nginx和php之间工作原理

    当nginx接收到一个http请求时,通过配置文件找到对应的server.然后匹配server中的所有location,找到最匹配的.而在location中的命令会启动不同的模块去完成工作,比如rew ...

  6. 为nginx创建windows服务自启动

    1.下载最新版的 Windows Service Wrapper 程序,比如我下载的名称是 "winsw-1.9-bin.exe", 然后,把它命名成你想要的名字(比如: &quo ...

  7. 使用WSW将Nginx创建为Windows系统服务

    我们都知道Windows Service是一种特殊的应用程序,它的好处是可以一直在后台运行,相对来说,比较适合一些需要一直运行同时不需要过多用户干预的应用程序,这一类我们称之为"服务&quo ...

  8. 为 Nginx 创建 windows 服务自启动

    1.下载最新版的 Windows Service Wrapper 程序 下载地址:http://download.java.net/maven/2/com/sun/winsw/winsw/1.9/ 2 ...

  9. Nginx全局块的工作进程的两个指令

    work process指令 master_process:用来指定是否开启工作进程. 语法 master_process on|off; 默认值 master_process on; 位置 全局块 ...

  10. 11 个 Nginx 参数性能优化工作

    工作上,需要配置 Nginx,要投入生产使用,做了一点优化工作,加上以前也经常折腾 Nginx,故记下一些优化工作. 优化 Nginx 进程数量 配置参数如下: worker_processes 1; ...

最新文章

  1. java中collection方法_Java 8中的Collector toCollection()方法
  2. 支持向量机SVM模型中C和gamma参数分别是什么?对模型有什么影响?
  3. 自己做的一个小程序 可采集、导出、模板、配置
  4. 递归算法 流程图_什么是算法?如何学习算法?算法入门
  5. MySQL高可用--MGR入门(1)单主/多主模式搭建
  6. 500g linux怎么分区吗,500G的硬盘,怎么分区比较合理?
  7. 生成指定位数的坐标方法-2优化版本--建议使用的版本
  8. 计算机磁盘修复工具,电脑自带chkdsk磁盘修复工具使用教程
  9. 一文学懂经典算法系列之:直接选择排序(附讲解视频)
  10. 层次分析法(AHP)及源代码实现
  11. HP CQ40-512TX不刷BIOS安装XP系统
  12. Macbook Pro Air锁屏不进入睡眠
  13. 机器学习sklearn(13)层次聚类
  14. 公务员考试——申论2
  15. django mezzanine添加多语言支持
  16. 【文献阅读】StyleBERT: Chinese pretraining by font style information
  17. Java编程之英文单词首字母大写
  18. 关于AttributeError: module ‘torch.nn‘ has no attribute ‘Moudle‘的解决方法
  19. 利用简单的爬虫获取CV顶会论文
  20. 32位程序在64位系统上运行

热门文章

  1. Futter基础第21篇: 实现普通对话框、列表对话框、单选对话框、Toast提示
  2. 7-1 简化的插入排序 (15 分)
  3. js、jQuery实现自定义弹出框效果
  4. mmapcopy函数的编写
  5. ImportError: DLL load failed: %1 不是有效的 Win32 应用程序
  6. Cocos2d-JS特效
  7. 判断闰年的方法以及如何获得单链表的倒数第K个元素
  8. 3.求子数组的最大和
  9. hdu4727搜索+stl。轻微剪枝
  10. mysql 查询 int类型日期转换成datetime类型