}
正常情况下,记分板应该作为共享内存存在从而被访问,但是并不是所有的操作系统都支持共享内存的操作。因此不同的操作系统,可能会采取不同的措施。
对于那些不支持共享内存的操作系统,Apache只是简单的调用calloc函数分配scoreboard_size大小的内存块,同时调用ap_init_scoreboard对其进行初始化而已;如果操作系统支持共享内存,那么Apache将采用IPC技术创建一块共享内存,同时使用apr_shm_baseaddr_get得到该共享内存的首地址,并对其进行初始化。
ap_scoreboard_image->global->sb_type = sb_type;
ap_scoreboard_image->global->running_generation = running_gen;
ap_scoreboard_image->global->restart_time = apr_time_now();
apr_pool_cleanup_reGISter(p, NULL, ap_cleanup_scoreboard, apr_pool_cleanup_null);
在整个记分板创建完毕之后,对global中的全局属性进行设定,同时在内存池销毁链表中注册清除函数。当内存池被销毁的时候,其将调用ap_cleanup_scoreboard对记分板进行清除。
现在我们再回头看看共享内存的初始化函数ap_init_scoreboard(),该函数主要用于对给定的共享内存块进行初始化,只有了解ap_init_scoreboard函数的初始化细节我们才能够明白记分板的内存布局状况。
在初始化的过程中一直存在两个内存块:一个是记分板本身的的内存块,即scoreboard数据结构内存块;一个是分配的共享内存块,其中保存实际的进程以及线程信息。初始化的任务实际上就是将记分板结构中的各个指针指向共享内存块中的相应的位置。
void ap_init_scoreboard(void *shared_score)
{
char *more_storage;
int i;
ap_calc_scoreboard_size();
ap_scoreboard_image = calloc(1, sizeof(scoreboard) server_limit * sizeof(worker_score *)
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




