lighttpd代码阅读笔记(一) watcher-worker模式
2015-04-01 09:12
337 查看
lighttpd是当前众多开源的服务器中比较优秀的一个,虽然说国内的很多大型网站
如:新浪、淘宝等都没有采用,但是它的设计巧妙精简,效率高,整个项目代码大约在3.8w左右,是非常好的学习材料,
参考了一个不错的博客:lighttpd1.4.18代码分析
如:新浪、淘宝等都没有采用,但是它的设计巧妙精简,效率高,整个项目代码大约在3.8w左右,是非常好的学习材料,
/*lighttpd服务器采用的是watcher-worker模式,其中watcher是主进程,worker是由主进程fork的 子进程,watcher主要有2个作用, 第一:根据用户预先设定的最大worker值来fork子进程(worker),其中这个值是在配置文件中的 第二:监控worker进程的工作情况,如果有worker进程,那么watcher就会创建新的worker进程*/ /*此段代码在server.c文件的main函数中*/ #ifdef HAVE_FORK /* start watcher and workers */ num_childs = srv->srvconf.max_worker;/*num_childs保存了所要创建worker进程的数量*/ if (num_childs > 0) {/*num_childs>0,有需要创建的worker进程*/ int child = 0;/*child=0,表示是wather进程,即父进程*/ while (!child && !srv_shutdown && !graceful_shutdown) { if (num_childs > 0) { switch (fork()) { case -1: return -1; case 0: child = 1; break; default: num_childs--; break; } } else { int status; /*所有的worker进程已经创建完成,watcher进程调用wait函数进入阻塞状态*/ if (-1 != wait(&status)) { /** * one of our workers went away */ /*当离开阻塞状态的时候,表示有worker进程退出,num_childs++,由watcher进程在 创建一个worker进程*/ num_childs++; } else { /*受到中断信号的处理,可能是watcher收到了退出服务器的信号*/ switch (errno) { case EINTR: /** * if we receive a SIGHUP we have to close our logs ourself as we don't * have the mainloop who can help us here */ if (handle_sig_hup) { handle_sig_hup = 0; log_error_cycle(srv); /** * forward to all procs in the process-group * * we also send it ourself */ /*向所有的worker进程发送SIGHUP信号,这个信号由信号函数捕获并处理*/ if (!forwarded_sig_hup) { forwarded_sig_hup = 1; kill(0, SIGHUP); } } break; default: break; } } } } /** * for the parent this is the exit-point */ /*在正常的运行下,watcher进程不会执行到这里,执行到此处时,watcher即将退出,并在 退出之前做一些清理工作*/ if (!child) { /** * kill all children too */ if (graceful_shutdown) { kill(0, SIGINT); } else if (srv_shutdown) { kill(0, SIGTERM); } log_error_close(srv); network_close(srv); connections_free(srv); plugins_free(srv); server_free(srv); return 0; } } #endif /*lighttpd 由watcher(主进程)创建多个worker(子进程),之后,watcher一直监控worker的工作情况,并在 worker退出之后(可能是异常原因退出),worker再次创建worker,保证固定数量的worker,worker在创建之后就进行 自己的任务,与其他的worker互不干扰,才有这种watcher-worker多进程的方式,简化了编程的复杂性<span style="font-family: Arial, Helvetica, sans-serif;">,如果是采用</span>
多线程的方式,就必须得考虑同步异步情况*/
参考了一个不错的博客:lighttpd1.4.18代码分析
相关文章推荐
- lighttpd base.h 代码阅读笔记 (不断完善中。。。)
- lighttpd base.h 代码阅读笔记 (不断完善中。。。)
- Spark源码阅读笔记:Standalone模式集群核心角色代码浅析
- Discuz!NT代码阅读笔记(4)--一切皆可配置:页面的显示
- LUA垃圾回收部分代码阅读笔记
- 关于main参数和inp.c代码阅读的一点笔记
- linux蓝牙驱动代码阅读笔记
- gmf logic example 代码阅读笔记
- Discuz!NT代码阅读笔记(2)--网站安装自动化--论坛程序安装及初始化过程
- Singularity 代码阅读笔记[结构: Struct_Microsoft_Singularity_BootInfo]
- arcgis server 9.2代码阅读笔记二:在页面上动态加载图层
- uboot阅读笔记之cpu工作模式(SVC32)
- 代码阅读总结之ASP.NET StartKit TimeTracker(角色权限之捉虫笔记)
- 代码之美阅读笔记之--种群计数
- Java与模式阅读笔记(1)依赖倒转原则
- IPVS代码阅读笔记(三):调度算法
- ThunderBird, NewsBlog部分代码阅读笔记
- 代码阅读总结之ASP.NET StartKit TimeTracker(数据绑定之困惑笔记)
- [阅读笔记]仅用37行代码构造网站的全文检索
- arcgis server 9.2代码阅读笔记二:在页面上动态加载图层