您的位置:首页 > 理论基础 > 计算机网络

lighttpd代码阅读笔记(一) watcher-worker模式

2015-04-01 09:12 337 查看
lighttpd是当前众多开源的服务器中比较优秀的一个,虽然说国内的很多大型网站

如:新浪、淘宝等都没有采用,但是它的设计巧妙精简,效率高,整个项目代码大约在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代码分析
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: