Nginx源码剖析笔记之进程模型

Nginx进程模型分为两大类:监控进程(主进程)、工作进程(子进程);

多进程模型入口函数:ngx_master_process_cycle();主要任务:设置信号处理,然后调用ngx_start_worker_process()生成子进程,这时,主进程主要循环监听信号,而子进程主要循环监听连接。

主进程:在没有收到信号时,用suspend()进入睡眠状态,当有信号到达时,调用相应的信号处理函数ngx_signal_handler().该信号处理函数主要对信号旗标变量做修改,主要的信号处理逻辑代码还是要在主体内进行。在设置完旗标变量后,主体循环中检测有哪些旗标变量被改变,然后做出相应的处理,比如检测到ngx_reap则代表有子进程退出了,要做相关的回收处理,检测到ngx_terminate则代表要强行终止当前进程,检测到ngx_quit则代表要处理完子进程相关工作之后再完成退出工作,检测到ngx_reconfigure则代表要重新加载相关的配置。当处理完相关的信号之后,继续调用suspend进入睡眠,等待信号的到来。

void ngx_master_process_cycle(nginx_cycle_t cycle)
{
<span style="white-space:pre">	</span>for(;;){
  <span style="white-space:pre">	</span>  suspend(&set);
    <span style="white-space:pre">	</span>if(...){
     <span style="white-space:pre">	</span> ...
   <span style="white-space:pre">	</span> }
        }
}

这里的set是一个设置好的信号集,类型为sigset_t;

子进程:监听客户端和后端真实服务器的读写事件,进程阻塞点是I/O服用的调用处,比如select,epoll_wait等,真正的事件处理是通过ngx_process_events_and_timer()实现,假设以epoll_wait处理监听,那么该过程就是ngx_process_events_and_timer()->ngx_epoll_process()->epoll_wait();

如果Nginx开启了缓存功能,会创建两个相关的cache进程,cache manager process和cache loader process。其中cache manager process进程会嗲用每一个磁盘缓存管理对象的manager函数,比如检查一个缓存是否超过了缓存大小限制,如果超过了缓存限制,则删除缓存。管理进程不接受客户端请求,所以该进程关闭了套接字,并对事件对象设置了超时时间。

对于缓存加载进程则是加载缓存对象到内存,该过程是一次性的,在Nginx启动一段时间(一般是60s)之后加载缓存,然后就自动退出了.

Nginx的进程间通讯:(1)使用socketpair()来创建UNIX进程专用套接字管道,由于socketpair实现的管道是全双工的,并且在进程之间相同的描述符可能代表不同的文件,而用socketpair创建的管道则很好的解决了文件描述符的传递问题,所以用socketpair来实现具有亲缘关系的进程间的通讯是很有效的,但是nginx一般只使用socketpair来传递进程间的资源状态。

(2)共享内存

//nignx一块完整的共享内存结构

typedef ngx_shm_zone_s{
	void * 					data;
	ngx_shm_t				shm;
	nsg_shm—_zone_init_pt	init;
	void * 					tag	//用来标记是创建内存还是使用已有内存
}ngx_shm_zone_t;

//nginx在加载配置文件时,遇到limit_req_zone配置项,
//则将对应的ngx_shm_zone_t结构体变量加入全局链表内
//当全部的配置文件解析完毕后,会初始化该全局链表中所有的共享内存

//ngx_cycle.c

part = &cycle->shared_memory.part;
shm_zone = part->elts;

//遍历整个链表完成共享内存的初始化
for(i = 0;;++i){
	if(ngx_shm_aloc(&shm_zone[i].shm) != NGX_OK){...}
	//alloc指向实际的内存分配接口,可能是mmap也有可能是shmget
	if(ngx_init_zone_pool(cycle,&shm_zone[i]) != NGX_OK){...}
	//pool是ngx的独有内存管理机制
	if(shm_zone[i].init(&shm_zone[i],NULL) != NGX_OK){...}
}
时间: 2024-10-08 05:22:05

Nginx源码剖析笔记之进程模型的相关文章

菜鸟nginx源码剖析 配置与部署篇(一) 手把手实现nginx &quot;I love you&quot;

菜鸟nginx源码剖析 配置与部署篇(一) 手把手配置nginx "I love you" Author:Echo Chen(陈斌) Email:[email protected] Blog:Blog.csdn.net/chen19870707 Date:Nov 7th, 2014 还记得在前几年的CSDN泄漏账号事件中,统计发现程序员的账号中含有love的最多,这里我也俗套下,在这篇文章中将讲解如何 一步一步实用Nginx在一台机器上搭建一个最简单的显示"I love yo

菜鸟nginx源码剖析 框架篇(一) 从main函数看nginx启动流程(转)

俗话说的好,牵牛要牵牛鼻子 驾车顶牛,处理复杂的东西,只要抓住重点,才能理清脉络,不至于深陷其中,不能自拔.对复杂的nginx而言,main函数就是“牛之鼻”,只要能理清main函数,就一定能理解其中的奥秘,下面我们就一起来研究一下nginx的main函数. 1.nginx的main函数解读 nginx启动显然是由main函数驱动的,main函数在在core/nginx.c文件中,其源代码解析如下,涉及到的数据结构在本节仅指出其作用,将在第二节中详细解释. nginx main函数的流程图如下:

Python源码剖析笔记3-Python执行原理初探

Python源码剖析笔记3-Python执行原理初探 本文简书地址:http://www.jianshu.com/p/03af86845c95 之前写了几篇源码剖析笔记,然而慢慢觉得没有从一个宏观的角度理解python执行原理的话,从底向上分析未免太容易让人疑惑,不如先从宏观上对python执行原理有了一个基本了解,再慢慢探究细节,这样也许会好很多.这也是最近这么久没有更新了笔记了,一直在看源码剖析书籍和源码,希望能够从一个宏观层面理清python执行原理.人说读书从薄读厚,再从厚读薄方是理解了

菜鸟nginx源码剖析数据结构篇(十一) 共享内存ngx_shm_t[转]

菜鸟nginx源码剖析数据结构篇(十一) 共享内存ngx_shm_t Author:Echo Chen(陈斌) Email:[email protected] Blog:Blog.csdn.net/chen19870707 Date:Nov 14th, 2014 1.共享内存 共享内存是Linux下提供的最基本的进程通信方法,它通过mmap或者shmget系统调用在内存中创建了一块连续的线性地址空间,而通过munmap或者shmdt系统调用释放这块内存,使用共享内存的好处是多个进程使用同一块内存

菜鸟nginx源码剖析数据结构篇(八) 缓冲区链表ngx_chain_t[转]

菜鸟nginx源码剖析数据结构篇(八) 缓冲区链表 ngx_chain_t Author:Echo Chen(陈斌) Email:[email protected] Blog:Blog.csdn.net/chen19870707 Date:Nov 6th, 2014 1.缓冲区链表结构ngx_chain_t和ngx_buf_t nginx的缓冲区链表如下图所示,ngx_chain_t为链表,ngx_buf_t为缓冲区结点: 2.源代码位置 头文件:http://trac.nginx.org/ng

菜鸟nginx源码剖析数据结构篇(八) 缓冲区链表ngx_chain_t

菜鸟nginx源码剖析数据结构篇(八) 缓冲区链表 ngx_chain_t Author:Echo Chen(陈斌) Email:[email protected] Blog:Blog.csdn.net/chen19870707 Date:Nov 6th, 2014 1.缓冲区链表结构ngx_chain_t和ngx_buf_t nginx的缓冲区链表如下图所示,ngx_chain_t为链表,ngx_buf_t为缓冲区结点: 2.源代码位置 头文件:http://trac.nginx.org/ng

NGINX源码剖析 之 CPU绑定(CPU亲和性)

作者:邹祁峰 邮箱:[email protected] 博客:http://blog.csdn.net/qifengzou 日期:2014.06.12 18:44 转载请注明来自"祁峰"的CSDN博客 1 引言   非统一内存访问(NUMA)是一种用于多处理器的电脑记忆体设计,内存访问时间取决于处理器的内存位置. 在NUMA下,处理器访问它自己的本地存储器的速度比非本地存储器(存储器的地方到另一个处理器之间共享的处理器或存储器)快一些. 针对NUMA架构系统的特点,可以通过将进程/线程

菜鸟nginx源码剖析数据结构篇(六) 哈希表 ngx_hash_t(上)

Author:Echo Chen(陈斌) Email:[email protected] Blog:Blog.csdn.net/chen19870707 Date:October 31h, 2014 1.哈希表ngx_hash_t的优势和特点 哈希表是一种典型的以空间换取时间的数据结构,在没有冲突的情况下,对任意元素的插入.索引.删除的时间复杂度都是O(1).这样优秀的时间复杂度是通过将元素的key值以hash方法f映射到哈希表中的某一个位置来访问记录来实现的,即键值为key的元素必定存储在哈希

Python源码剖析笔记0 ——C语言基础

python源码剖析笔记0--C语言基础回顾 要分析python源码,C语言的基础不能少,特别是指针和结构体等知识.这篇文章先回顾C语言基础,方便后续代码的阅读. 1 关于ELF文件 linux中的C编译得到的目标文件和可执行文件都是ELF格式的,可执行文件中以segment来划分,目标文件中,我们是以section划分.一个segment包含一个或多个section,通过readelf命令可以看到完整的section和segment信息.看一个栗子: char pear[40]; static