那谁的技术博客

感兴趣领域:高性能服务器编程,存储,算法,Linux内核
随笔 - 210, 文章 - 0, 评论 - 1183, 引用 - 0
数据加载中……

Nginx0.7.61代码分析(一)--写在前面的话以及进程模型分析

写在前面的话
大概一年多以前,我看了一些ligty的代码,并且在这里给出了一些自己的分析,这部分应该到了状态机部分,后来由于我没有继续跟进ligty的代码,或者说,不再像最初那样对它感兴趣,所以也就没有再跟进了.
最近,我开始看一些nginx的代码,和当初阅读ligty一样,我不知道我会看到哪儿,分析的有多么深,所以,作为读者的您,还是把这一系列文章看作是个人的一些学习笔记好了,我随时看到一些我觉得可以分享的点,随时在这里更新一下,但是,我不能保证更新的频率和数量了.

顺便说一句,Nginx的更新似乎非常的频繁,隔个几天就有个新的版本,不知道为什么,这在我之前跟进过的开源代码中属于比较少见的了,而这里的分析,是基于0.7.61版本的代码.

============== 分割线 ==============
首先分析的是nginx中的进程管理部分.
之前分析过ligty的monitor+worker模型,简单的说就是主进程负责创建子进程,然后主进程就阻塞在wait函数上,一旦有子进程退出,这个函数会返回,然后再次创建出新的worker进程来.

Nginx中的进程管理与这个类似.同样是worker子进程负责真正的干活.但是,Nginx中,master进程(其实就是ligty中的monitor进程,也就是程序最开始启动时的进程,也就是所有worker进程的父进程)对子进程的控制更多,不仅仅关注子进程是否退出了,简单的总结如下:

1) 进程之间通过socketpair来进行通信,因此,每次创建了一个新的子进程之后,需要同时创建出对应的socketpair,还要把自己的socketpair告诉已经创建好的兄弟子进程.

2) master进程的主循环中主要完成以下几个工作:比如子进程退出,比如用户发出指令要求重新加载配置文件,比如用户发出指令说更新了新的二进制文件,等等,所有这些工作,其实都是以信号的形式来区分,发出不同的信号意味着不同的动作.Nginx中所谓的“热更新配置文件”,“热更新程序”等都是通过这个来实现的。

3) worker进程的主循环除了一般的监听网络I/O事件如客户端连接上来,可读/写之外,还需要将自己的socketpair加入到监听socket中,因为master进程就是通过向这些子进程的socketpair发送信号来通知子进程完成不同的操作.

以上,就是Nginx中进程管理的大致模型了,其实看明白了,也不复杂.
我不打算罗列代码了,在这里,有一份更加详细的涉及代码的分析.

可以看到,Nginx和ligty一样,都没有采用非常复杂的进程模型,都是多进程 + 非阻塞I/O + 多路复用I/O处理的网络模型,这在我之前提到半同步半异步模式时也提到过.

posted on 2009-11-26 19:06 那谁 阅读(7114) 评论(0)  编辑 收藏 引用 所属分类: 网络编程服务器设计Nginx


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理