if (lb_limit) {
memset(ap_scoreboard_image->balancers, 0, sizeof(lb_score) * lb_limit);
}
return OK;
}
公告板的创建与几个系统值密切相关的,比如server_limit和thread_limit。server_limit描述了允许同时存在的进程的最大极限,包括父进程和子进程,每一个进程通常都是用上面的process_score数据结构进行描述;而thread_limit则是每一个子进程又允许生成的子线程的数目,这些子线程用worker_score进行描述。因此创建记分板的一个重要的步骤就是分配足够的插槽。由于Apache需要记录每一个进程以及进程中的每一个线程的运行信息,因此,创建记分板之前必须能够分配足够多的空间以容纳process_score和worker_score结构。
正如前面描述,系统中允许存在server_limit个进程,它们中的每一个都必须在记分板中拥有一个插槽,因此我们至少必须分配sizeof(process_score)*server_limit大小的内存空间,同时使用ap_scoreboard_image->parent指向该空间。
同时对于server_limit个进程中的每一个进程,他们可能产生的线程数为thread_limit,这些线程也必须在记分板中拥有相应的插槽,为此共分配server_limit*sizeof(worker_score)*thread_limit的内存大小。
Apache按照最大化的原则进行分配,一旦分配完毕肯定能够保证需要。不过这样的话可能存在很多的空闲插槽。因为即使只有一个进程和一个线程存在,Apache也是会分配所有的内存的。
现在回到上面的代码中。如果是平稳启动,那么在创建新的记分板之前系统中应该已经存在一个旧的记分板(ap_scoreboard_image不为NULL)。在这种情况下,Apache首先得到当前记分板的家族号,同时重新设置启动时间。另外一个重要的任务就是清理初始化记分板上的数据,将其全部清零,彻底扫荡前一个家族的所有信息,并将其返回出去供使用。
ap_calc_scoreboard_size();
如果创建的时候发现公告板不存在,那么这意味着这是Apache启动以来的第一次记分板创建。因此创建之前必须计算记分板分配的空间大小。创建记分板的内存大小由函数ap_calc_scoreboard_size()函数完成:
AP_DECLARE(int) ap_calc_scoreboard_size(void)
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




