nginx创建n个工作子进程
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函数,所以子进程不会在创建子进程。
参考资料:
- https://blog.csdn.net/xiexingshishu/article/details/46398051
- https://blog.csdn.net/sohu_2011/article/details/62045496
nginx创建n个工作子进程相关推荐
- MFC多线程的创建,包括工作线程和用户界面线程
MFC多线程的创建 1.MFC多线程简介 MFC对多线程进行了一层简单的封装,在Visual C++中每个线程都是从CWinThread类继承而来的.每一个应用程序的执行都有一个主线程,这个主线程也是 ...
- Nginx 与 FPM 的工作机制
网络上有很多关于如何配置 Nginx + FPM 的文章,但它们更多从操作的角度出发,告诉我们怎么做,但却没有告诉我们为什么要这么做,本文从 Nginx 与 FPM 的工作机制出发,探讨配置背后的原理 ...
- ea如何创建程序流程图_免费流程图创建器和工作流程图应用程序–经理指南
ea如何创建程序流程图 If you want to get more technical with your product management skills, being able to wor ...
- nginx基本功能和工作原理
nginx能做什么 反向代理 正向代理 负载均衡 HTTP服务器(包含动静分离) 反向代理和正向代理 正向代理.简单的说,我是一个用户,我无法直接访问一个网站,但是我能访问一个代理服务器,这个代理服务 ...
- nginx php 协同工作,nginx和php之间工作原理
当nginx接收到一个http请求时,通过配置文件找到对应的server.然后匹配server中的所有location,找到最匹配的.而在location中的命令会启动不同的模块去完成工作,比如rew ...
- 为nginx创建windows服务自启动
1.下载最新版的 Windows Service Wrapper 程序,比如我下载的名称是 "winsw-1.9-bin.exe", 然后,把它命名成你想要的名字(比如: &quo ...
- 使用WSW将Nginx创建为Windows系统服务
我们都知道Windows Service是一种特殊的应用程序,它的好处是可以一直在后台运行,相对来说,比较适合一些需要一直运行同时不需要过多用户干预的应用程序,这一类我们称之为"服务&quo ...
- 为 Nginx 创建 windows 服务自启动
1.下载最新版的 Windows Service Wrapper 程序 下载地址:http://download.java.net/maven/2/com/sun/winsw/winsw/1.9/ 2 ...
- Nginx全局块的工作进程的两个指令
work process指令 master_process:用来指定是否开启工作进程. 语法 master_process on|off; 默认值 master_process on; 位置 全局块 ...
- 11 个 Nginx 参数性能优化工作
工作上,需要配置 Nginx,要投入生产使用,做了一点优化工作,加上以前也经常折腾 Nginx,故记下一些优化工作. 优化 Nginx 进程数量 配置参数如下: worker_processes 1; ...
最新文章
- java中collection方法_Java 8中的Collector toCollection()方法
- 支持向量机SVM模型中C和gamma参数分别是什么?对模型有什么影响?
- 自己做的一个小程序 可采集、导出、模板、配置
- 递归算法 流程图_什么是算法?如何学习算法?算法入门
- MySQL高可用--MGR入门(1)单主/多主模式搭建
- 500g linux怎么分区吗,500G的硬盘,怎么分区比较合理?
- 生成指定位数的坐标方法-2优化版本--建议使用的版本
- 计算机磁盘修复工具,电脑自带chkdsk磁盘修复工具使用教程
- 一文学懂经典算法系列之:直接选择排序(附讲解视频)
- 层次分析法(AHP)及源代码实现
- HP CQ40-512TX不刷BIOS安装XP系统
- Macbook Pro Air锁屏不进入睡眠
- 机器学习sklearn(13)层次聚类
- 公务员考试——申论2
- django mezzanine添加多语言支持
- 【文献阅读】StyleBERT: Chinese pretraining by font style information
- Java编程之英文单词首字母大写
- 关于AttributeError: module ‘torch.nn‘ has no attribute ‘Moudle‘的解决方法
- 利用简单的爬虫获取CV顶会论文
- 32位程序在64位系统上运行